]> git.ipfire.org Git - collecty.git/commitdiff
metrics: Add support for bool
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Oct 2025 17:41:53 +0000 (17:41 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Oct 2025 17:41:53 +0000 (17:41 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/daemon/metrics.c
src/daemon/metrics.h

index 1e90d3d823748a8a3883dbb872d2246bf7a3d630..e61ff682e74dd24b97ba2e40a4cce0bde33eedd0 100644 (file)
@@ -37,6 +37,9 @@ typedef struct td_metric {
 
        // Value
        union {
+               // TD_METRIC_BOOL
+               int _bool;
+
                // TD_METRIC_INT64
                int64_t _int64;
 
@@ -238,6 +241,12 @@ static int __td_metrics_format_value(td_metrics* self,
                case TD_METRIC_UNKNOWN:
                        return __td_string_set(value, length, "U");
 
+               case TD_METRIC_BOOL:
+                       if (metric->value._bool)
+                               return __td_string_set(value, length, "1");
+                       else
+                               return __td_string_set(value, length, "0");
+
                case TD_METRIC_INT64:
                        return __td_string_format(value, length, "%ld", metric->value._int64);
 
@@ -336,6 +345,10 @@ static int td_metrics_push_value(td_metrics* self,
                case TD_METRIC_UNKNOWN:
                        break;
 
+               case TD_METRIC_BOOL:
+                       metric->value._bool = *(int*)value;
+                       break;
+
                case TD_METRIC_INT64:
                        metric->value._int64 = *(int64_t*)value;
                        break;
@@ -352,6 +365,10 @@ static int td_metrics_push_value(td_metrics* self,
        return 0;
 }
 
+int td_metrics_push_bool(td_metrics* self, const char* field, int value) {
+       return td_metrics_push_value(self, field, TD_METRIC_BOOL, &value);
+}
+
 int td_metrics_push_int64(td_metrics* self, const char* field, int64_t value) {
        return td_metrics_push_value(self, field, TD_METRIC_INT64, &value);
 }
@@ -406,6 +423,10 @@ int __td_metrics_serialize(td_metrics* self, char* buffer, size_t length) {
                                bytes_written = snprintf(p, bytes_left, ":U");
                                break;
 
+                       case TD_METRIC_BOOL:
+                               bytes_written = snprintf(p, bytes_left, ":%c", (metric->value._bool) ? '1' : '0');
+                               break;
+
                        case TD_METRIC_INT64:
                                bytes_written = snprintf(p, bytes_left, ":%ld", metric->value._int64);
                                break;
index 046f966cf6562f0c9b5b6df5946884145f950458..e70d7be895d904256bf42405c62ae6e2c2d86eac 100644 (file)
@@ -25,6 +25,7 @@ typedef struct td_metrics td_metrics;
 
 typedef enum td_metric_type {
        TD_METRIC_UNKNOWN = 0,
+       TD_METRIC_BOOL,
        TD_METRIC_INT64,
        TD_METRIC_UINT64,
        TD_METRIC_FLOAT,
@@ -44,6 +45,7 @@ typedef struct td_metric_value {
 #define VALUES(...)                                    ((const td_metric_value[]) { __VA_ARGS__, { NULL } })
 
 #define VALUE(field, type, value)      { field, type, value }
+#define VALUE_BOOL(field, value)       VALUE(field, TD_METRIC_BOOL, 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)
@@ -63,6 +65,7 @@ const struct timeval* td_metrics_get_time(td_metrics* self);
 
 int td_metrics_dump(td_metrics* self);
 
+int td_metrics_push_bool(td_metrics* self, const char* field, int value);
 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);