32namespace resource_statistic {
36 if (!GetUsage(cpu_metric)) {
39 if (!GetTemperature(cpu_metric)) {
45bool CpuResourceStatistic::GetUsage(
CpuMetric* cpu_metric) {
46 static uint64_t prev_jiffies = 0, prev_work_jiffies = 0;
47 static const std::string system_cpu_stat_file =
"/proc/stat";
48 const int users = 1, system = 3, total = 7;
49 static constexpr int kSystemCpuInfo = 0;
50 const auto stat_lines =
GetStatsLines(system_cpu_stat_file, kSystemCpuInfo + 1);
51 if (stat_lines.size() <= kSystemCpuInfo) {
52 AERROR <<
"failed to load contents from " << system_cpu_stat_file;
55 const std::vector<std::string> jiffies_stats
56 = absl::StrSplit(stat_lines[kSystemCpuInfo],
' ', absl::SkipWhitespace());
57 if (jiffies_stats.size() <= total) {
58 AERROR <<
"failed to get system CPU info from " << system_cpu_stat_file;
61 uint64_t jiffies = 0, work_jiffies = 0;
62 for (
int cur_stat = users; cur_stat <= total; ++cur_stat) {
63 const auto cur_stat_value = std::stoll(jiffies_stats[cur_stat]);
64 jiffies += cur_stat_value;
65 if (cur_stat <= system) {
66 work_jiffies += cur_stat_value;
69 const uint64_t tmp_prev_jiffies = prev_jiffies;
70 const uint64_t tmp_prev_work_jiffies = prev_work_jiffies;
71 prev_jiffies = jiffies;
72 prev_work_jiffies = work_jiffies;
73 if (tmp_prev_jiffies == 0) {
74 cpu_metric->set_usage(0.f);
76 cpu_metric->set_usage(
77 100.f * (
static_cast<float>(work_jiffies - tmp_prev_work_jiffies) / (jiffies - tmp_prev_jiffies)));
82bool CpuResourceStatistic::GetTemperature(CpuMetric* cpu_metric) {
83 static const std::string cpu_temp_files_path =
"/sys/class/hwmon/hwmon*/temp*_input";
85 if (temp_files.empty()) {
86 AERROR <<
"temperature files not found!";
89 float temperature = 0;
90 for (
auto& temp_input : temp_files) {
93 temperature = std::max(std::stof(temp), temperature);
96 cpu_metric->set_temperature(temperature);