From 0404ff4688c36eb0397e6c18a87caee01f52dbb7 Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Wed, 28 Dec 2022 23:12:44 +0800 Subject: [PATCH] feat(monitor): add disk usage metrics --- include/neuron/metrics.h | 3 +++ plugins/monitor/metric_handle.c | 13 ++++++++++++- src/base/metrics.c | 27 +++++++++++++++++++++++---- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/include/neuron/metrics.h b/include/neuron/metrics.h index 5ff9d89c..8efea8a9 100644 --- a/include/neuron/metrics.h +++ b/include/neuron/metrics.h @@ -142,6 +142,9 @@ typedef struct { char kernel[32]; size_t mem_total_bytes; size_t mem_used_bytes; + size_t disk_size_gibibytes; + size_t disk_used_gibibytes; + size_t disk_avail_gibibytes; bool core_dumped; uint64_t uptime_seconds; size_t north_nodes; diff --git a/plugins/monitor/metric_handle.c b/plugins/monitor/metric_handle.c index 9961f561..6b04d084 100644 --- a/plugins/monitor/metric_handle.c +++ b/plugins/monitor/metric_handle.c @@ -41,6 +41,15 @@ "# HELP mem_used_bytes Used memory in bytes\n" \ "# TYPE mem_used_bytes gauge\n" \ "mem_used_bytes %zu\n" \ + "# HELP disk_size_gibibytes Disk size in gibibytes\n" \ + "# TYPE disk_size_gibibytes counter\n" \ + "disk_size_gibibytes %zu\n" \ + "# HELP disk_used_gibibytes Used disk size in gibibytes\n" \ + "# TYPE disk_used_gibibytes gauge\n" \ + "disk_used_gibibytes %zu\n" \ + "# HELP disk_avail_gibibytes Available disk size in gibibytes\n" \ + "# TYPE disk_avail_gibibytes gauge\n" \ + "disk_avail_gibibytes %zu\n" \ "# HELP core_dumped Whether there is any core dump\n" \ "# TYPE core_dumped gauge\n" \ "core_dumped %d\n" \ @@ -126,7 +135,9 @@ static inline void gen_global_metrics(const neu_metrics_t *metrics, { fprintf(stream, METRIC_GLOBAL_TMPL, metrics->distro, metrics->kernel, metrics->mem_total_bytes, metrics->mem_used_bytes, - metrics->core_dumped, metrics->uptime_seconds, metrics->north_nodes, + 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); diff --git a/src/base/metrics.c b/src/base/metrics.c index 1b68044a..c9e10b21 100644 --- a/src/base/metrics.c +++ b/src/base/metrics.c @@ -19,6 +19,7 @@ #include #include +#include #include #include "adapter.h" @@ -99,6 +100,19 @@ static inline size_t memory_used() return parse_memory_fields(3); } +static inline int disk_usage(size_t *size_p, size_t *used_p, size_t *avail_p) +{ + struct statvfs buf = {}; + if (0 != statvfs(".", &buf)) { + return -1; + } + + *size_p = (double) buf.f_frsize * buf.f_blocks / (1 << 30); + *used_p = (double) buf.f_frsize * (buf.f_blocks - buf.f_bfree) / (1 << 30); + *avail_p = (double) buf.f_frsize * buf.f_bavail / (1 << 30); + return 0; +} + static bool has_core_dumps() { DIR *dp = opendir("core"); @@ -214,13 +228,18 @@ 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 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_.mem_used_bytes = mem_used; - g_metrics_.core_dumped = core_dumped; - g_metrics_.uptime_seconds = uptime_seconds; + g_metrics_.mem_used_bytes = mem_used; + g_metrics_.disk_size_gibibytes = disk_size; + g_metrics_.disk_used_gibibytes = disk_used; + g_metrics_.disk_avail_gibibytes = disk_avail; + g_metrics_.core_dumped = core_dumped; + g_metrics_.uptime_seconds = uptime_seconds; g_metrics_.north_nodes = 0; g_metrics_.north_running_nodes = 0;