// 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;
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;
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"
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))
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);
}
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);
#include "uptime.h"
static int uptime_heartbeat(td_ctx* ctx, td_source* source) {
- td_metrics* metrics = NULL;
struct sysinfo info = {};
int r;
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 = {