]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: contrib/prometheus-exporter: Add a param to ignore servers in maintenance
authorChristopher Faulet <cfaulet@haproxy.com>
Tue, 19 Nov 2019 13:18:24 +0000 (14:18 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 20 Nov 2019 13:11:47 +0000 (14:11 +0100)
By passing the parameter "no-maint" in the query-string, it is now possible to
ignore servers in maintenance. It means that the metrics for servers in this
state will not be exported.

contrib/prometheus-exporter/README
contrib/prometheus-exporter/service-prometheus.c

index 84ae8e27e771c4f03d8e73fcfa1ec20d3b4c3120..b19acc1bdb10dd40efa816c926a389e6bef849e0 100644 (file)
@@ -73,6 +73,14 @@ exported. Here are examples:
   /metrics?scope=*&scope=               # ==> no metrics will be exported
   /metrics?scope=&scope=global          # ==> global metrics will be exported
 
+* Filtering on servers state
+
+It is possible to exclude from returned metrics all servers in maintenance mode
+passing the parameter "no-maint" in the query-string. This parameter may help to
+solve performance issues of configuration that use the server templates to
+manage dynamic provisionning. Note there is no consistency check on the servers
+state. So, if the state of a server changes while the exporter is running, only
+a part of the metrics for this server will be dumped.
 
 Exported metrics
 ------------------
index c70daa9057cd98bc5cf642e0eabc0f7c3ac4296d..45a4b7aab603ff786f4b9817923dae2909abd1f7 100644 (file)
@@ -68,6 +68,7 @@ enum {
 #define PROMEX_FL_SCOPE_FRONT   0x00000010
 #define PROMEX_FL_SCOPE_BACK    0x00000020
 #define PROMEX_FL_SCOPE_SERVER  0x00000040
+#define PROMEX_FL_NO_MAINT_SRV  0x00000080
 
 #define PROMEX_FL_SCOPE_ALL (PROMEX_FL_SCOPE_GLOBAL|PROMEX_FL_SCOPE_FRONT|PROMEX_FL_SCOPE_BACK|PROMEX_FL_SCOPE_SERVER)
 
@@ -1905,6 +1906,9 @@ static int promex_dump_srv_metrics(struct appctx *appctx, struct htx *htx)
                        while (appctx->ctx.stats.sv) {
                                sv = appctx->ctx.stats.sv;
 
+                               if ((appctx->ctx.stats.flags & PROMEX_FL_NO_MAINT_SRV) && (sv->cur_admin & SRV_ADMF_MAINT))
+                                       goto next_sv;
+
                                switch (appctx->st2) {
                                        case ST_F_STATUS:
                                                metric = mkf_u32(FO_STATUS, promex_srv_status(sv));
@@ -2075,6 +2079,7 @@ static int promex_dump_srv_metrics(struct appctx *appctx, struct htx *htx)
                                if (!promex_dump_metric(appctx, htx, prefix, &metric, &out, max))
                                        goto full;
 
+                         next_sv:
                                appctx->ctx.stats.sv = sv->next;
                        }
 
@@ -2271,6 +2276,10 @@ static int promex_parse_uri(struct appctx *appctx, struct stream_interface *si)
 
                        p += len;
                }
+               else if (*p == 'n' && (end-p) >= 8 && !memcmp(p, "no-maint", 8)) {
+                       appctx->ctx.stats.flags |= PROMEX_FL_NO_MAINT_SRV;
+                       p += 8;
+               }
                else {
                        /* ignore all other params for now */
                        while (p < end && *p != '&')