]> git.ipfire.org Git - oddments/collecty.git/commitdiff
metrics: Create a shorthand to submit stats with less code
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Oct 2025 16:55:15 +0000 (16:55 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Oct 2025 16:55:15 +0000 (16:55 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/daemon/metrics.c
src/daemon/metrics.h
src/daemon/source.c
src/daemon/source.h
src/daemon/sources/uptime.c

index 8fc9722ed378044b41d4042a2e303a2dfff150c6..1e90d3d823748a8a3883dbb872d2246bf7a3d630 100644 (file)
 // being represented as a string is 24 bytes. This should give us some extra space.
 #define VALUE_MAX 32
 
-typedef enum td_metric_type {
-       TD_METRIC_UNKNOWN = 0,
-       TD_METRIC_INT64,
-       TD_METRIC_UINT64,
-       TD_METRIC_FLOAT,
-} td_metric_type;
-
 typedef struct td_metric {
        // Type
        td_metric_type type;
@@ -371,6 +364,19 @@ int td_metrics_push_float(td_metrics* self, const char* field, double value) {
        return td_metrics_push_value(self, field, TD_METRIC_FLOAT, &value);
 }
 
+int td_metrics_set(td_metrics* self, const td_metric_value* values) {
+       int r;
+
+       // Push all values
+       for (const td_metric_value* value = values; value->field; value++) {
+               r = td_metrics_push_value(self, value->field, value->type, value->value);
+               if (r < 0)
+                       return r;
+       }
+
+       return 0;
+}
+
 int __td_metrics_serialize(td_metrics* self, char* buffer, size_t length) {
        td_metric* metric = NULL;
        ssize_t bytes_written = 0;
index 198d026ac60e60f72259e72b1b7483af36fc1491..046f966cf6562f0c9b5b6df5946884145f950458 100644 (file)
 
 typedef struct td_metrics td_metrics;
 
+typedef enum td_metric_type {
+       TD_METRIC_UNKNOWN = 0,
+       TD_METRIC_INT64,
+       TD_METRIC_UINT64,
+       TD_METRIC_FLOAT,
+} td_metric_type;
+
+typedef struct td_metric_value {
+       // Field
+       const char* field;
+
+       // Type
+       td_metric_type type;
+
+       // Value
+       void* value;
+} td_metric_value;
+
+#define VALUES(...)                                    ((const td_metric_value[]) { __VA_ARGS__, { NULL } })
+
+#define VALUE(field, type, value)      { field, type, value }
+#define VALUE_INT64(field, value)      VALUE(field, TD_METRIC_INT64, value)
+#define VALUE_UINT64(field, value)     VALUE(field, TD_METRIC_UINT64, value)
+#define VALUE_FLOAT(field, value)      VALUE(field, TD_METRIC_FLOAT, value)
+
 #include "ctx.h"
 #include "source.h"
 
@@ -42,6 +67,8 @@ int td_metrics_push_int64(td_metrics* self, const char* field, int64_t value);
 int td_metrics_push_uint64(td_metrics* self, const char* field, uint64_t value);
 int td_metrics_push_float(td_metrics* self, const char* field, double value);
 
+int td_metrics_set(td_metrics* self, const td_metric_value* values);
+
 #define td_metrics_serialize(metrics, buffer) \
        __td_metrics_serialize(metrics, buffer, sizeof(buffer))
 
index 10af939e09fc2916b1eb81e5507f318bc0a92283..1f8f237a3d0b57960c3d220454649cebde505687 100644 (file)
@@ -524,6 +524,31 @@ int td_source_submit(td_source* self,
        return td_daemon_submit(self->daemon, self, object, value);
 }
 
+int td_source_submit_values(td_source* self,
+               const char* object, const td_metric_value* values) {
+       td_metrics* metrics = NULL;
+       int r;
+
+       // Create a new metrics object
+       r = td_source_create_metrics(self, &metrics, object);
+       if (r < 0)
+               goto ERROR;
+
+       // Set all values
+       r = td_metrics_set(metrics, values);
+       if (r < 0)
+               goto ERROR;
+
+       // Submit the metrics
+       r = td_source_submit_metrics(self, metrics);
+
+ERROR:
+       if (metrics)
+               td_metrics_unref(metrics);
+
+       return r;
+}
+
 int td_source_submit_metrics(td_source* self, td_metrics* metrics) {
        return td_daemon_submit_metrics(self->daemon, metrics);
 }
index d08691b888d2fd813312b4798bb72b10d7df157d..b04c14af4ce8e9926619a1e20232fc62d9422924 100644 (file)
@@ -93,6 +93,8 @@ int td_source_create_command(td_source* self, td_command** command);
 int td_source_submit(td_source* self, const char* object,
        const char* format, ...) __attribute__((format(printf, 3, 4)));
 int td_source_submit_metrics(td_source* self, td_metrics* metrics);
+int td_source_submit_values(td_source* self,
+       const char* object, const td_metric_value* values);
 
 int td_source_commit(td_source* self,
        const char* object, unsigned int num_samples, const char** samples);
index f37f2354d365d3d59efa53c47a8e1ddf7d72a980..8e67003393bfb89ca40b77c4b0aa9e5f3faecbe1 100644 (file)
@@ -26,7 +26,6 @@
 #include "uptime.h"
 
 static int uptime_heartbeat(td_ctx* ctx, td_source* source) {
-       td_metrics* metrics = NULL;
        struct sysinfo info = {};
        int r;
 
@@ -35,26 +34,9 @@ static int uptime_heartbeat(td_ctx* ctx, td_source* source) {
        if (r < 0)
                return -errno;
 
-       // Create metrics
-       r = td_source_create_metrics(source, &metrics, NULL);
-       if (r < 0)
-               goto ERROR;
-
-       // Push uptime
-       r = td_metrics_push_int64(metrics, "uptime", info.uptime);
-       if (r < 0)
-               goto ERROR;
-
-       // Submit the metrics
-       r = td_source_submit_metrics(source, metrics);
-       if (r < 0)
-               goto ERROR;
-
-ERROR:
-       if (metrics)
-               td_metrics_unref(metrics);
-
-       return r;
+       return td_source_submit_values(source, NULL, VALUES(
+               VALUE_UINT64("uptime", &info.uptime)
+       ));
 }
 
 const td_source_impl uptime_source = {