mirror of
https://github.com/emqx/neuron.git
synced 2026-10-27 04:19:50 +08:00
Merge pull request #1010 from eeff/eeff/dev
feat(monitor): add cpu utilisation metric
This commit is contained in:
@@ -140,6 +140,7 @@ typedef struct {
|
||||
typedef struct {
|
||||
char distro[32];
|
||||
char kernel[32];
|
||||
unsigned cpu_percent;
|
||||
size_t mem_total_bytes;
|
||||
size_t mem_used_bytes;
|
||||
size_t disk_size_gibibytes;
|
||||
|
||||
@@ -35,6 +35,9 @@
|
||||
"distro %s\n" \
|
||||
"# HELP kernel OS kernel version\n" \
|
||||
"kernel %s\n" \
|
||||
"# HELP cpu_percent Total CPU utilisation percentage\n" \
|
||||
"# TYPE cpu_percent gauge\n" \
|
||||
"cpu_percent %u\n" \
|
||||
"# HELP mem_total_bytes Total installed memory in bytes\n" \
|
||||
"# TYPE mem_total_bytes counter\n" \
|
||||
"mem_total_bytes %zu\n" \
|
||||
@@ -134,10 +137,10 @@ static inline void gen_global_metrics(const neu_metrics_t *metrics,
|
||||
FILE * stream)
|
||||
{
|
||||
fprintf(stream, METRIC_GLOBAL_TMPL, metrics->distro, metrics->kernel,
|
||||
metrics->mem_total_bytes, metrics->mem_used_bytes,
|
||||
metrics->disk_size_gibibytes, metrics->disk_used_gibibytes,
|
||||
metrics->disk_avail_gibibytes, metrics->core_dumped,
|
||||
metrics->uptime_seconds, metrics->north_nodes,
|
||||
metrics->cpu_percent, metrics->mem_total_bytes,
|
||||
metrics->mem_used_bytes, metrics->disk_size_gibibytes,
|
||||
metrics->disk_used_gibibytes, metrics->disk_avail_gibibytes,
|
||||
metrics->core_dumped, metrics->uptime_seconds, metrics->north_nodes,
|
||||
metrics->north_running_nodes, metrics->north_disconnected_nodes,
|
||||
metrics->south_nodes, metrics->south_running_nodes,
|
||||
metrics->south_disconnected_nodes);
|
||||
|
||||
+49
-2
@@ -113,6 +113,51 @@ static inline int disk_usage(size_t *size_p, size_t *used_p, size_t *avail_p)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned cpu_usage()
|
||||
{
|
||||
int ret = 0;
|
||||
unsigned long long user1 = 0, nice1 = 0, sys1 = 0, idle1 = 0, iowait1 = 0,
|
||||
irq1 = 0, softirq1 = 0;
|
||||
unsigned long long user2 = 0, nice2 = 0, sys2 = 0, idle2 = 0, iowait2 = 0,
|
||||
irq2 = 0, softirq2 = 0;
|
||||
unsigned long long work = 0, total = 0;
|
||||
struct timespec tv = {
|
||||
.tv_sec = 0,
|
||||
.tv_nsec = 50000000,
|
||||
};
|
||||
FILE *f = NULL;
|
||||
|
||||
f = fopen("/proc/stat", "r");
|
||||
if (NULL == f) {
|
||||
nlog_error("open /proc/stat fail");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = fscanf(f, "cpu %llu %llu %llu %llu %llu %llu %llu", &user1, &nice1,
|
||||
&sys1, &idle1, &iowait1, &irq1, &softirq1);
|
||||
if (7 != ret) {
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
nanosleep(&tv, NULL);
|
||||
|
||||
rewind(f);
|
||||
ret = fscanf(f, "cpu %llu %llu %llu %llu %llu %llu %llu", &user2, &nice2,
|
||||
&sys2, &idle2, &iowait2, &irq2, &softirq2);
|
||||
if (7 != ret) {
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
fclose(f);
|
||||
|
||||
work = (user2 - user1) + (nice2 - nice1) + (sys2 - sys1);
|
||||
total = work + (idle2 - idle1) + (iowait2 - iowait1) + (irq2 - irq1) +
|
||||
(softirq2 - softirq1);
|
||||
|
||||
return (double) work / total * 100.0 * sysconf(_SC_NPROCESSORS_CONF);
|
||||
}
|
||||
|
||||
static bool has_core_dumps()
|
||||
{
|
||||
DIR *dp = opendir("core");
|
||||
@@ -228,12 +273,14 @@ void neu_metrics_unregister_entry(const char *name)
|
||||
|
||||
void neu_metrics_visist(neu_metrics_cb_t cb, void *data)
|
||||
{
|
||||
size_t mem_used = memory_used();
|
||||
size_t disk_size = 0, disk_used = 0, disk_avail = 0;
|
||||
unsigned cpu = cpu_usage();
|
||||
size_t mem_used = memory_used();
|
||||
size_t disk_size = 0, disk_used = 0, disk_avail = 0;
|
||||
disk_usage(&disk_size, &disk_used, &disk_avail);
|
||||
bool core_dumped = has_core_dumps();
|
||||
uint64_t uptime_seconds = (neu_time_ms() - g_start_ts_) / 1000;
|
||||
pthread_rwlock_rdlock(&g_metrics_mtx_);
|
||||
g_metrics_.cpu_percent = cpu;
|
||||
g_metrics_.mem_used_bytes = mem_used;
|
||||
g_metrics_.disk_size_gibibytes = disk_size;
|
||||
g_metrics_.disk_used_gibibytes = disk_used;
|
||||
|
||||
Reference in New Issue
Block a user