diff --git a/bin/atlas-agent.cc b/bin/atlas-agent.cc index 20b5c4c..5da976b 100644 --- a/bin/atlas-agent.cc +++ b/bin/atlas-agent.cc @@ -66,6 +66,7 @@ static void gather_slow_titus_metrics(CGroup* cGroup, Proc* proc, Disk* disk, Aw proc->network_stats(); proc->process_stats(); proc->snmp_stats(); + proc->uptime_stats(); } #else static void gather_peak_system_metrics(Proc* proc) { proc->peak_cpu_stats(); } @@ -89,6 +90,7 @@ static void gather_slow_system_metrics(Proc* proc, Disk* disk, Ethtool* ethtool, proc->process_stats(); proc->snmp_stats(); proc->socket_stats(); + proc->uptime_stats(); proc->vmstats(); } #endif diff --git a/lib/internal/proc.inc b/lib/internal/proc.inc index 3a2a4de..d594dd4 100644 --- a/lib/internal/proc.inc +++ b/lib/internal/proc.inc @@ -554,6 +554,15 @@ inline void set_if_present(const std::unordered_map& stats } } +template +void Proc::uptime_stats() noexcept { + static auto sys_uptime = registry_->GetGauge("sys.uptime"); + // uptime values are in seconds, reported as doubles, but given how large they will be over + // time, the 10ths of a second will not matter for the purpose of producing this metric + auto uptime_seconds = read_num_vector_from_file(path_prefix_, "uptime"); + sys_uptime->Set(uptime_seconds[0]); +} + template void Proc::vmstats() noexcept { static auto processes = registry_->GetMonotonicCounter("vmstat.procs.count"); diff --git a/lib/proc.h b/lib/proc.h index 01c2fe4..ba9e7b4 100644 --- a/lib/proc.h +++ b/lib/proc.h @@ -18,6 +18,7 @@ class Proc { void memory_stats() noexcept; void process_stats() noexcept; void socket_stats() noexcept; + void uptime_stats() noexcept; void vmstats() noexcept; [[nodiscard]] bool is_container() const noexcept; diff --git a/lib/proc_test.cc b/lib/proc_test.cc index ea06e5f..37d30e3 100644 --- a/lib/proc_test.cc +++ b/lib/proc_test.cc @@ -172,6 +172,17 @@ TEST(Proc, CpuStats) { EXPECT_EQ(17, ms2.size()); } +TEST(Proc, UptimeStats) { + Registry registry; + spectator::Tags extra{{"nf.test", "extra"}}; + Proc proc{®istry, extra, "testdata/resources/proc"}; + proc.uptime_stats(); + auto ms = my_measurements(®istry); + auto ms_map = measurements_to_map(ms, "proto"); + expect_value(&ms_map, "sys.uptime|gauge", 517407); + EXPECT_TRUE(ms_map.empty()); +} + TEST(Proc, VmStats) { Registry registry; spectator::Tags extra{{"nf.test", "extra"}}; diff --git a/testdata/resources/proc/uptime b/testdata/resources/proc/uptime new file mode 100644 index 0000000..699ee4c --- /dev/null +++ b/testdata/resources/proc/uptime @@ -0,0 +1 @@ +517407.10 4128064.05 \ No newline at end of file