From 4849fd16bbf58153bd70f0f8b460ec1a00567146 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Wed, 1 Jul 2020 22:19:15 +0200 Subject: [PATCH] write_stackdriver plugin: Implement support for metric_family_t. --- src/write_stackdriver.c | 110 ++++++++++++++++++++++------------------ 1 file changed, 60 insertions(+), 50 deletions(-) diff --git a/src/write_stackdriver.c b/src/write_stackdriver.c index dfa1d7c07..f540f92f7 100644 --- a/src/write_stackdriver.c +++ b/src/write_stackdriver.c @@ -395,36 +395,65 @@ static void wg_callback_free(void *data) /* {{{ */ sfree(cb); } /* }}} void wg_callback_free */ -static int wg_metric_descriptors_create(wg_callback_t *cb, const data_set_t *ds, - const value_list_t *vl) { +static int wg_metric_descriptors_create(wg_callback_t *cb, metric_t const *m) { /* {{{ */ - for (size_t i = 0; i < ds->ds_num; i++) { - char buffer[4096]; + strbuf_t buf = STRBUF_CREATE; + int status = sd_format_metric_descriptor(&buf, m); + if (status != 0) { + ERROR("write_stackdriver plugin: sd_format_metric_descriptor failed with " + "status %d", + status); + STRBUF_DESTROY(buf); + return status; + } - int status = sd_format_metric_descriptor(buffer, sizeof(buffer), ds, vl, i); - if (status != 0) { - ERROR("write_stackdriver plugin: sd_format_metric_descriptor failed " - "with status " - "%d", - status); - return status; - } + status = wg_call_metricdescriptor_create(cb, buf.ptr); + if (status != 0) { + ERROR("write_stackdriver plugin: wg_call_metricdescriptor_create failed " + "with status %d", + status); + STRBUF_DESTROY(buf); + return status; + } - status = wg_call_metricdescriptor_create(cb, buffer); - if (status != 0) { - ERROR("write_stackdriver plugin: wg_call_metricdescriptor_create failed " - "with " - "status %d", - status); + STRBUF_DESTROY(buf); + return sd_output_register_metric(cb->formatter, m); +} /* }}} int wg_metric_descriptors_create */ + +static int wg_output_add(wg_callback_t *cb, metric_t const *m) { + while (42) { + int status = sd_output_add(cb->formatter, m); + switch (status) { + case 0: { /* success */ + cb->timeseries_count++; + return 0; + } + case ENOBUFS: { /* success, flush */ + cb->timeseries_count++; + wg_flush_nolock(0, cb); + return 0; + } + case EEXIST: { + /* metric already in the buffer; flush and retry */ + wg_flush_nolock(0, cb); + break; + } + case ENOENT: { + /* new metric, create metric descriptor first */ + int status = wg_metric_descriptors_create(cb, m); + if (status != 0) { + return status; + } + break; + } + default: return status; } } +} - return sd_output_register_metric(cb->formatter, ds, vl); -} /* }}} int wg_metric_descriptors_create */ - -static int wg_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */ - user_data_t *user_data) { +static int wg_write(metric_family_t const *fam, + user_data_t *user_data) { /* {{{ */ wg_callback_t *cb = user_data->data; if (cb == NULL) return EINVAL; @@ -440,37 +469,18 @@ static int wg_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */ } } - int status; - while (42) { - status = sd_output_add(cb->formatter, ds, vl); - if (status == 0) { /* success */ - break; - } else if (status == ENOBUFS) { /* success, flush */ - wg_flush_nolock(0, cb); - status = 0; - break; - } else if (status == EEXIST) { - /* metric already in the buffer; flush and retry */ - wg_flush_nolock(0, cb); - continue; - } else if (status == ENOENT) { - /* new metric, create metric descriptor first */ - status = wg_metric_descriptors_create(cb, ds, vl); - if (status != 0) { - break; - } - continue; - } else { - break; - } - } + int ret = 0; + for (size_t i = 0; i < fam->metric.num; i++) { + metric_t const *m = fam->metric.ptr + i; - if (status == 0) { - cb->timeseries_count++; + int status = wg_output_add(cb, m); + if (ret == 0) { + ret = status; + } } pthread_mutex_unlock(&cb->lock); - return status; + return ret; } /* }}} int wg_write */ static void wg_check_scope(char const *email) /* {{{ */ -- 2.47.2