From: Timo Sirainen Date: Thu, 29 Aug 2024 11:02:14 +0000 (+0300) Subject: stats: http post event exporter - Convert to using global settings X-Git-Tag: 2.4.0~446 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=93aa6077b9da262e138f7235a33f89e383a32f11;p=thirdparty%2Fdovecot%2Fcore.git stats: http post event exporter - Convert to using global settings --- diff --git a/src/stats/event-exporter-transport-http-post.c b/src/stats/event-exporter-transport-http-post.c index 0674e1e264..505c83eb5b 100644 --- a/src/stats/event-exporter-transport-http-post.c +++ b/src/stats/event-exporter-transport-http-post.c @@ -11,14 +11,74 @@ #include "master-service-settings.h" #include "stats-common.h" -/* the http client used to export all events with exporter=http-post */ -static struct http_client *exporter_http_client; +struct http_post_event_exporter { + struct event_exporter exporter; + const struct event_exporter_http_post_settings *set; + struct http_client *client; +}; + +struct event_exporter_http_post_settings { + pool_t pool; + + const char *event_exporter_http_post_url; +}; + +#undef DEF +#define DEF(type, name) \ + SETTING_DEFINE_STRUCT_##type(#name, name, struct event_exporter_http_post_settings) + +static const struct setting_define event_exporter_http_post_setting_defines[] = { + { .type = SET_FILTER_NAME, .key = "event_exporter_http_post", }, + DEF(STR, event_exporter_http_post_url), + + SETTING_DEFINE_LIST_END +}; + +static const struct event_exporter_http_post_settings event_exporter_http_post_default_settings = { + .event_exporter_http_post_url = "", +}; + +static const struct setting_keyvalue event_exporter_http_post_default_settings_keyvalue[] = { + { "event_exporter_http_post/http_client_request_absolute_timeout", "250ms" }, + { NULL, NULL } +}; + +const struct setting_parser_info event_exporter_http_post_setting_parser_info = { + .name = "event_exporter_http_post", + + .defines = event_exporter_http_post_setting_defines, + .defaults = &event_exporter_http_post_default_settings, + .default_settings = event_exporter_http_post_default_settings_keyvalue, + + .struct_size = sizeof(struct event_exporter_http_post_settings), + .pool_offset1 = 1 + offsetof(struct event_exporter_http_post_settings, pool), +}; + +static int +event_exporter_http_post_init(pool_t pool, struct event *event, + struct event_exporter **exporter_r, + const char **error_r) +{ + struct http_post_event_exporter *exporter = + p_new(pool, struct http_post_event_exporter, 1); + if (settings_get(event, &event_exporter_http_post_setting_parser_info, + 0, &exporter->set, error_r) < 0) + return -1; + if (http_client_init_auto(event, &exporter->client, error_r) < 0) + return -1; + *exporter_r = &exporter->exporter; + return 0; +} static void -event_exporter_http_post_deinit(struct event_exporter *exporter ATTR_UNUSED) +event_exporter_http_post_deinit(struct event_exporter *_exporter) { - if (exporter_http_client != NULL) - http_client_deinit(&exporter_http_client); + struct http_post_event_exporter *exporter = + container_of(_exporter, struct http_post_event_exporter, + exporter); + + http_client_deinit(&exporter->client); + settings_free(exporter->set); } static void response_fxn(const struct http_response *response, @@ -47,31 +107,27 @@ static void response_fxn(const struct http_response *response, } static void -event_exporter_http_post_send(struct event_exporter *exporter, +event_exporter_http_post_send(struct event_exporter *_exporter, const buffer_t *buf) { + struct http_post_event_exporter *exporter = + container_of(_exporter, struct http_post_event_exporter, + exporter); struct http_client_request *req; - if (exporter_http_client == NULL) { - static struct http_client_settings set; - http_client_settings_init(null_pool, &set); - set.dns_client_socket_path = "dns-client"; - exporter_http_client = http_client_init(&set, NULL); - } - - req = http_client_request_url_str(exporter_http_client, "POST", - exporter->transport_args, - response_fxn, NULL); - http_client_request_add_header(req, "Content-Type", exporter->format_mime_type); + req = http_client_request_url_str(exporter->client, "POST", + exporter->set->event_exporter_http_post_url, + response_fxn, NULL); + http_client_request_add_header(req, "Content-Type", _exporter->format_mime_type); http_client_request_set_payload_data(req, buf->data, buf->used); - http_client_request_set_timeout_msecs(req, exporter->transport_timeout); http_client_request_submit(req); } const struct event_exporter_transport event_exporter_transport_http_post = { .name = "http-post", + .init = event_exporter_http_post_init, .deinit = event_exporter_http_post_deinit, .send = event_exporter_http_post_send, };