]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
stats: http post event exporter - Convert to using global settings
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 29 Aug 2024 11:02:14 +0000 (14:02 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:39:59 +0000 (10:39 +0200)
src/stats/event-exporter-transport-http-post.c

index 0674e1e26493427c8211f9aa1a7139012f4d9bb6..505c83eb5b518df9cde5bc54e3781567c5facd07 100644 (file)
 #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,
 };