]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
metrics/report: add log messages, do not hang if no metrics are found 40568/head
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 4 Feb 2026 17:20:11 +0000 (18:20 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 4 Feb 2026 17:20:11 +0000 (18:20 +0100)
If the directory existed but was empty, we'd hang in the event loop.

src/report/report.c

index 42819ae29b87e5648098ac46cd040d5c7501f2e9..dcaf91c2388630e22014e72ad7ba08207023a1cb 100644 (file)
@@ -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);