From: Zbigniew Jędrzejewski-Szmek Date: Wed, 4 Feb 2026 17:20:11 +0000 (+0100) Subject: metrics/report: add log messages, do not hang if no metrics are found X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dffcb61f7f74fe2f4a227be89a9718276f4b38c8;p=thirdparty%2Fsystemd.git metrics/report: add log messages, do not hang if no metrics are found If the directory existed but was empty, we'd hang in the event loop. --- diff --git a/src/report/report.c b/src/report/report.c index 42819ae29b8..dcaf91c2388 100644 --- a/src/report/report.c +++ b/src/report/report.c @@ -108,7 +108,7 @@ static int metrics_call(const char *path, sd_event *event, sd_varlink **ret, Con r = sd_varlink_connect_address(&vl, path); if (r < 0) - return log_debug_errno(r, "Unable to connect to %s: %m", path); + return log_error_errno(r, "Unable to connect to %s: %m", path); (void) sd_varlink_set_userdata(vl, context); @@ -118,15 +118,15 @@ static int metrics_call(const char *path, sd_event *event, sd_varlink **ret, Con r = sd_varlink_attach_event(vl, event, SD_EVENT_PRIORITY_NORMAL); if (r < 0) - return log_debug_errno(r, "Failed to attach varlink connection to event loop: %m"); + return log_error_errno(r, "Failed to attach varlink connection to event loop: %m"); r = sd_varlink_bind_reply(vl, metrics_on_query_reply); if (r < 0) - return log_debug_errno(r, "Failed to bind reply callback: %m"); + return log_error_errno(r, "Failed to bind reply callback: %m"); r = sd_varlink_observe(vl, "io.systemd.Metrics.List", /* parameters= */ NULL); if (r < 0) - return log_debug_errno(r, "Failed to issue io.systemd.Metrics.List call: %m"); + return log_error_errno(r, "Failed to issue io.systemd.Metrics.List call: %m"); *ret = TAKE_PTR(vl); @@ -161,6 +161,9 @@ static void metrics_output_sorted(Context *context) { SD_JSON_FORMAT_PRETTY_AUTO | SD_JSON_FORMAT_COLOR_AUTO | SD_JSON_FORMAT_FLUSH, stdout, NULL); + + if (context->n_metrics == 0) + log_warning("No reporting sockets found."); } static int metrics_query(void) { @@ -171,13 +174,12 @@ static int metrics_query(void) { if (r < 0) return log_error_errno(r, "Failed to determine metrics directory path: %m"); - _cleanup_closedir_ DIR *d = opendir(metrics_path); - if (!d) { - if (errno == ENOENT) - return 0; + log_debug("Looking for reports in %s/", metrics_path); - return log_error_errno(errno, "Failed to open directory %s: %m", metrics_path); - } + _cleanup_closedir_ DIR *d = opendir(metrics_path); + if (!d) + return log_full_errno(errno == ENOENT ? LOG_WARNING : LOG_ERR, errno, + "Failed to open metrics directory %s: %m", metrics_path); _cleanup_(sd_event_unrefp) sd_event *event = NULL; r = sd_event_default(&event); @@ -191,13 +193,14 @@ static int metrics_query(void) { size_t n_varlinks = MAX_CONCURRENT_METRICS_SOCKETS; sd_varlink **varlinks = new0(sd_varlink *, n_varlinks); if (!varlinks) - return log_error_errno(ENOMEM, "Failed to allocate varlinks array: %m"); + return log_oom(); CLEANUP_ARRAY(varlinks, n_varlinks, sd_varlink_unref_many); _cleanup_(context_done) Context context = {}; - FOREACH_DIRENT(de, d, return -errno) { + FOREACH_DIRENT(de, d, + return log_warning_errno(errno, "Failed to read %s: %m", metrics_path)) { if (!IN_SET(de->d_type, DT_SOCK, DT_UNKNOWN)) continue; @@ -207,10 +210,8 @@ static int metrics_query(void) { return log_oom(); r = metrics_call(p, event, &varlinks[context.n_open_connections], &context); - if (r < 0) { - log_error_errno(r, "Failed to connect to %s: %m", p); + if (r < 0) continue; - } if (++context.n_open_connections >= MAX_CONCURRENT_METRICS_SOCKETS) { log_warning("Too many concurrent metrics sockets, stop iterating"); @@ -218,9 +219,11 @@ static int metrics_query(void) { } } - r = sd_event_loop(event); - if (r < 0) - return log_error_errno(r, "Failed to run event loop: %m"); + if (context.n_open_connections > 0) { + r = sd_event_loop(event); + if (r < 0) + return log_error_errno(r, "Failed to run event loop: %m"); + } metrics_output_sorted(&context);