MINOR: contrib/prometheus-exporter: Add a param to ignore servers in maintenance
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.
(cherry picked from commit eba2294e5b82931fd2e74f829e8092366728a6af)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/contrib/prometheus-exporter/README b/contrib/prometheus-exporter/README
index 84ae8e2..b19acc1 100644
--- a/contrib/prometheus-exporter/README
+++ b/contrib/prometheus-exporter/README
@@ -73,6 +73,14 @@
/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
------------------
diff --git a/contrib/prometheus-exporter/service-prometheus.c b/contrib/prometheus-exporter/service-prometheus.c
index ef25434..56d49a3 100644
--- a/contrib/prometheus-exporter/service-prometheus.c
+++ b/contrib/prometheus-exporter/service-prometheus.c
@@ -68,6 +68,7 @@
#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 @@
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 @@
if (!promex_dump_metric(appctx, htx, prefix, &metric, &out, max))
goto full;
+ next_sv:
appctx->ctx.stats.sv = sv->next;
}
@@ -2271,6 +2276,10 @@
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 != '&')