From: Michael Tremer Date: Wed, 22 Oct 2025 16:55:15 +0000 (+0000) Subject: metrics: Create a shorthand to submit stats with less code X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=671b0919212151698b9d588e9c05ad394555b476;p=telemetry.git metrics: Create a shorthand to submit stats with less code Signed-off-by: Michael Tremer --- diff --git a/src/daemon/metrics.c b/src/daemon/metrics.c index 8fc9722..1e90d3d 100644 --- a/src/daemon/metrics.c +++ b/src/daemon/metrics.c @@ -31,13 +31,6 @@ // 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; diff --git a/src/daemon/metrics.h b/src/daemon/metrics.h index 198d026..046f966 100644 --- a/src/daemon/metrics.h +++ b/src/daemon/metrics.h @@ -23,6 +23,31 @@ 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)) diff --git a/src/daemon/source.c b/src/daemon/source.c index 10af939..1f8f237 100644 --- a/src/daemon/source.c +++ b/src/daemon/source.c @@ -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); } diff --git a/src/daemon/source.h b/src/daemon/source.h index d08691b..b04c14a 100644 --- a/src/daemon/source.h +++ b/src/daemon/source.h @@ -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); diff --git a/src/daemon/sources/uptime.c b/src/daemon/sources/uptime.c index f37f235..8e67003 100644 --- a/src/daemon/sources/uptime.c +++ b/src/daemon/sources/uptime.c @@ -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 = {