From: Michael Tremer Date: Wed, 25 Jun 2025 16:49:35 +0000 (+0000) Subject: builder: Move sending stats X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a7dd42f110aed6484cf0432fc2ff8c1b2cc846b0;p=pakfire.git builder: Move sending stats Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/builder.c b/src/pakfire/builder.c index 70f873ac..5a9157fc 100644 --- a/src/pakfire/builder.c +++ b/src/pakfire/builder.c @@ -164,6 +164,11 @@ static int pakfire_builder_schedule_stats(struct pakfire_builder* self, uint64_t static int pakfire_builder_submit_stats(sd_event_source* event, uint64_t usec, void* data) { struct pakfire_builder* self = data; + struct pakfire_cpustat cpustat = {}; + struct pakfire_loadavg loadavg = {}; + struct pakfire_meminfo meminfo = {}; + struct json_object* stats = NULL; + struct json_object* p = NULL; int r; // Log action @@ -172,9 +177,199 @@ static int pakfire_builder_submit_stats(sd_event_source* event, uint64_t usec, v // Submit stats again soon... r = pakfire_builder_schedule_stats(self, PAKFIRE_STATS_TIMER); if (r < 0) - return r; + goto ERROR; - return 0; + // Fetch CPU stats + r = pakfire_cpustat(&cpustat); + if (r < 0) { + ERROR(self->ctx, "Failed to fetch CPU stats: %s\n", strerror(-r)); + goto ERROR; + } + + // Fetch load average + r = pakfire_loadavg(&loadavg); + if (r < 0) { + ERROR(self->ctx, "Failed to fetch load average: %s\n", strerror(-r)); + goto ERROR; + } + + // Fetch meminfo + r = pakfire_meminfo(&meminfo); + if (r < 0) { + ERROR(self->ctx, "Failed to fetch meminfo: %s\n", strerror(-r)); + goto ERROR; + } + + // Create new data object + r = pakfire_json_new_object(&p); + if (r < 0) + goto ERROR; + + // CPU Stats: User + r = pakfire_json_add_double(p, "cpu_user", cpustat.user); + if (r < 0) + goto ERROR; + + // CPU Stats: Nice + r = pakfire_json_add_double(p, "cpu_nice", cpustat.nice); + if (r < 0) + goto ERROR; + + // CPU Stats: System + r = pakfire_json_add_double(p, "cpu_system", cpustat.system); + if (r < 0) + goto ERROR; + + // CPU Stats: Idle + r = pakfire_json_add_double(p, "cpu_idle", cpustat.idle); + if (r < 0) + goto ERROR; + + // CPU Stats: IO Wait + r = pakfire_json_add_double(p, "cpu_iowait", cpustat.iowait); + if (r < 0) + goto ERROR; + + // CPU Stats: IRQ + r = pakfire_json_add_double(p, "cpu_irq", cpustat.irq); + if (r < 0) + goto ERROR; + + // CPU Stats: Soft IRQ + r = pakfire_json_add_double(p, "cpu_softirq", cpustat.softirq); + if (r < 0) + goto ERROR; + + // CPU Stats: Steal + r = pakfire_json_add_double(p, "cpu_steal", cpustat.steal); + if (r < 0) + goto ERROR; + + // CPU Stats: Guest + r = pakfire_json_add_double(p, "cpu_guest", cpustat.guest); + if (r) + goto ERROR; + + // CPU Stats: Guest Nice + r = pakfire_json_add_double(p, "cpu_guest_nice", cpustat.guest_nice); + if (r < 0) + goto ERROR; + + // Load Average: 1 + r = pakfire_json_add_double(p, "loadavg1", loadavg.load1); + if (r < 0) + goto ERROR; + + // Load Average: 5 + r = pakfire_json_add_double(p, "loadavg5", loadavg.load5); + if (r < 0) + goto ERROR; + + // Load Average: 15 + r = pakfire_json_add_double(p, "loadavg15", loadavg.load15); + if (r < 0) + goto ERROR; + + // Memory: Total + r = pakfire_json_add_uint64(p, "mem_total", meminfo.total); + if (r < 0) + goto ERROR; + + // Memory: Available + r = pakfire_json_add_uint64(p, "mem_available", meminfo.available); + if (r < 0) + goto ERROR; + + // Memory: Used + r = pakfire_json_add_int64(p, "mem_used", meminfo.used); + if (r < 0) + goto ERROR; + + // Memory: Free + r = pakfire_json_add_uint64(p, "mem_free", meminfo.free); + if (r < 0) + goto ERROR; + + // Memory: Active + r = pakfire_json_add_uint64(p, "mem_active", meminfo.active); + if (r < 0) + goto ERROR; + + // Memory: Inactive + r = pakfire_json_add_uint64(p, "mem_inactive", meminfo.inactive); + if (r < 0) + goto ERROR; + + // Memory: Buffers + r = pakfire_json_add_uint64(p, "mem_buffers", meminfo.buffers); + if (r < 0) + goto ERROR; + + // Memory: Cached + r = pakfire_json_add_uint64(p, "mem_cached", meminfo.cached); + if (r < 0) + goto ERROR; + + // Memory: Shared + r = pakfire_json_add_uint64(p, "mem_shared", meminfo.shared); + if (r < 0) + goto ERROR; + + // Swap: Total + r = pakfire_json_add_uint64(p, "swap_total", meminfo.swap_total); + if (r < 0) + goto ERROR; + + // Swap: Used + r = pakfire_json_add_uint64(p, "swap_used", meminfo.swap_used); + if (r < 0) + goto ERROR; + + // Swap: Free + r = pakfire_json_add_uint64(p, "swap_free", meminfo.swap_free); + if (r < 0) + goto ERROR; + + // Create a new stats object + r = pakfire_json_new_object(&stats); + if (r < 0) + goto ERROR; + + // Set type + r = pakfire_json_add_string(stats, "type", "stats"); + if (r < 0) + goto ERROR; + + // Set data + r = json_object_object_add(stats, "data", p); + if (r < 0) + goto ERROR; + + // Dereference data so it won't be double-freed later + data = NULL; + + // Send the message + r = pakfire_builder_send_message(self, stats); + if (r < 0) { + switch (-r) { + // Ignore if we are not connected + case ENOTCONN: + r = 0; + break; + + // Raise anything else + default: + goto ERROR; + } + } + +ERROR: + if (stats) + json_object_put(stats); + if (p) + json_object_put(p); + + return r; } int pakfire_builder_connected(struct pakfire_xfer* xfer, void* data) { diff --git a/src/pakfire/daemon.c b/src/pakfire/daemon.c index 5e51c3e6..0ed5c6ed 100644 --- a/src/pakfire/daemon.c +++ b/src/pakfire/daemon.c @@ -116,231 +116,6 @@ static int pakfire_daemon_terminate(sd_event_source* source, return sd_event_exit(sd_event_source_get_event(source), 0); } -#if 0 -static int pakfire_daemon_submit_stats(sd_event_source* s, uint64_t usec, void* p) { - struct pakfire_daemon* daemon = p; - struct pakfire_cpustat cpustat = {}; - struct pakfire_loadavg loadavg = {}; - struct pakfire_meminfo meminfo = {}; - struct json_object* stats = NULL; - struct json_object* data = NULL; - int r; - - // If we have any jobs running, we will submit our stats - // every five seconds, otherwise 30 seconds is enough. - uint64_t next = (daemon->running_jobs > 0) ? PAKFIRE_STATS_WHEN_BUSY : PAKFIRE_STATS_WHEN_IDLE; - - // Reset the timer - r = sd_event_source_set_time_relative(daemon->stats_timer, next); - if (r < 0) { - ERROR(daemon->ctx, "Could not set the stat timer: %s\n", strerror(-r)); - return r; - } - - // Don't do anything if we don't have a control connection - if (!daemon->control) { - DEBUG(daemon->ctx, "Won't send stats without a control connection\n"); - return 0; - } - - DEBUG(daemon->ctx, "Submitting stats...\n"); - - // Fetch CPU stats - r = pakfire_cpustat(&cpustat); - if (r) { - ERROR(daemon->ctx, "Failed to fetch CPU stats: %s\n", strerror(-r)); - goto ERROR; - } - - // Fetch load average - r = pakfire_loadavg(&loadavg); - if (r) { - ERROR(daemon->ctx, "Failed to fetch load average: %s\n", strerror(-r)); - goto ERROR; - } - - // Fetch meminfo - r = pakfire_meminfo(&meminfo); - if (r) { - ERROR(daemon->ctx, "Failed to fetch meminfo: %s\n", strerror(-r)); - goto ERROR; - } - - // Create new data object - data = json_object_new_object(); - if (!data) - goto ERROR; - - // CPU Stats: User - r = pakfire_json_add_double(data, "cpu_user", cpustat.user); - if (r) - goto ERROR; - - // CPU Stats: Nice - r = pakfire_json_add_double(data, "cpu_nice", cpustat.nice); - if (r) - goto ERROR; - - // CPU Stats: System - r = pakfire_json_add_double(data, "cpu_system", cpustat.system); - if (r) - goto ERROR; - - // CPU Stats: Idle - r = pakfire_json_add_double(data, "cpu_idle", cpustat.idle); - if (r) - goto ERROR; - - // CPU Stats: IO Wait - r = pakfire_json_add_double(data, "cpu_iowait", cpustat.iowait); - if (r) - goto ERROR; - - // CPU Stats: IRQ - r = pakfire_json_add_double(data, "cpu_irq", cpustat.irq); - if (r) - goto ERROR; - - // CPU Stats: Soft IRQ - r = pakfire_json_add_double(data, "cpu_softirq", cpustat.softirq); - if (r) - goto ERROR; - - // CPU Stats: Steal - r = pakfire_json_add_double(data, "cpu_steal", cpustat.steal); - if (r) - goto ERROR; - - // CPU Stats: Guest - r = pakfire_json_add_double(data, "cpu_guest", cpustat.guest); - if (r) - goto ERROR; - - // CPU Stats: Guest Nice - r = pakfire_json_add_double(data, "cpu_guest_nice", cpustat.guest_nice); - if (r) - goto ERROR; - - // Load Average: 1 - r = pakfire_json_add_double(data, "loadavg1", loadavg.load1); - if (r) - goto ERROR; - - // Load Average: 5 - r = pakfire_json_add_double(data, "loadavg5", loadavg.load5); - if (r) - goto ERROR; - - // Load Average: 15 - r = pakfire_json_add_double(data, "loadavg15", loadavg.load15); - if (r) - goto ERROR; - - // Memory: Total - r = pakfire_json_add_uint64(data, "mem_total", meminfo.total); - if (r) - goto ERROR; - - // Memory: Available - r = pakfire_json_add_uint64(data, "mem_available", meminfo.available); - if (r) - goto ERROR; - - // Memory: Used - r = pakfire_json_add_int64(data, "mem_used", meminfo.used); - if (r) - goto ERROR; - - // Memory: Free - r = pakfire_json_add_uint64(data, "mem_free", meminfo.free); - if (r) - goto ERROR; - - // Memory: Active - r = pakfire_json_add_uint64(data, "mem_active", meminfo.active); - if (r) - goto ERROR; - - // Memory: Inactive - r = pakfire_json_add_uint64(data, "mem_inactive", meminfo.inactive); - if (r) - goto ERROR; - - // Memory: Buffers - r = pakfire_json_add_uint64(data, "mem_buffers", meminfo.buffers); - if (r) - goto ERROR; - - // Memory: Cached - r = pakfire_json_add_uint64(data, "mem_cached", meminfo.cached); - if (r) - goto ERROR; - - // Memory: Shared - r = pakfire_json_add_uint64(data, "mem_shared", meminfo.shared); - if (r) - goto ERROR; - - // Swap: Total - r = pakfire_json_add_uint64(data, "swap_total", meminfo.swap_total); - if (r) - goto ERROR; - - // Swap: Used - r = pakfire_json_add_uint64(data, "swap_used", meminfo.swap_used); - if (r) - goto ERROR; - - // Swap: Free - r = pakfire_json_add_uint64(data, "swap_free", meminfo.swap_free); - if (r) - goto ERROR; - - // Create a new stats object - stats = json_object_new_object(); - if (!stats) { - r = -errno; - goto ERROR; - } - - // Set type - r = pakfire_json_add_string(stats, "type", "stats"); - if (r) - goto ERROR; - - // Set data - r = json_object_object_add(stats, "data", data); - if (r) - goto ERROR; - - // Dereference data so it won't be double-freed later - data = NULL; - - // Send the message - r = pakfire_daemon_send_message(daemon, stats); - if (r < 0) { - switch (-r) { - // Ignore if we are not connected - case ENOTCONN: - r = 0; - break; - - // Raise anything else - default: - goto ERROR; - } - } - -ERROR: - if (stats) - json_object_put(stats); - if (data) - json_object_put(data); - - return r; -} -#endif - /* * Prevents that the system can be shut down when there are jobs running... */