commit c55a626217a7e676e1cc ("MINOR: contrib/prometheus-exporter: Add missing global and per-server metrics") is renaming two metrics between v2.2 and v2.3: server_idle_connections_current server_idle_connections_limit
It is breaking some tools which are making use of those metrics while supporting several haproxy versions. This build_info will permit tools which make use of metrics to be able to match the haproxy version and change the list of expected metrics. This was possible using the haproxy stats socket but not with prometheus export. This patch follows prometheus best pratices to export specific software informations. While being there, I added compiler and release date. Even though it is not a bugfix, this patch will make more sense when backported up to >= 2.0 Signed-off-by: William Dauchy <wdau...@gmail.com> --- .../prometheus-exporter/service-prometheus.c | 33 ++++++++++++------- include/haproxy/stats-t.h | 1 + 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/contrib/prometheus-exporter/service-prometheus.c b/contrib/prometheus-exporter/service-prometheus.c index b6c38eb57..1f4922b08 100644 --- a/contrib/prometheus-exporter/service-prometheus.c +++ b/contrib/prometheus-exporter/service-prometheus.c @@ -38,6 +38,7 @@ #include <haproxy/stream.h> #include <haproxy/stream_interface.h> #include <haproxy/task.h> +#include <haproxy/version.h> /* Prometheus exporter applet states (appctx->st0) */ enum { @@ -82,12 +83,23 @@ enum { */ #define PROMEX_MAX_METRIC_LENGTH 512 +/* Some labels for build_info */ +#define PROMEX_VERSION_LABEL "version=\"" HAPROXY_VERSION "\"" +#define PROMEX_RELEASEDATE_LABEL "releasedate=\"" HAPROXY_DATE "\"" +#if defined(__clang_version__) +# define PROMEX_COMPILER_VERSION_LABEL "clangversion=\"" __clang_version__ "\"" +#elif defined(__VERSION__) +# define PROMEX_COMPILER_VERSION_LABEL "gccversion=\"" __VERSION__ "\"" +#endif +#define PROMEX_BUILDINFO_LABEL PROMEX_VERSION_LABEL "," \ + PROMEX_RELEASEDATE_LABEL "," \ + PROMEX_COMPILER_VERSION_LABEL + /* Matrix used to dump global metrics. Each metric points to the next one to be * processed or 0 to stop the dump. */ const int promex_global_metrics[INF_TOTAL_FIELDS] = { - [INF_NAME] = INF_NBTHREAD, - [INF_VERSION] = 0, - [INF_RELEASE_DATE] = 0, + [INF_NAME] = INF_BUILD_INFO, + [INF_BUILD_INFO] = INF_NBTHREAD, [INF_NBTHREAD] = INF_NBPROC, [INF_NBPROC] = INF_PROCESS_NUM, [INF_PROCESS_NUM] = INF_UPTIME_SEC, @@ -467,8 +479,7 @@ const int promex_srv_metrics[ST_F_TOTAL_FIELDS] = { /* Name of all info fields */ const struct ist promex_inf_metric_names[INF_TOTAL_FIELDS] = { [INF_NAME] = IST("name"), - [INF_VERSION] = IST("version"), - [INF_RELEASE_DATE] = IST("release_date"), + [INF_BUILD_INFO] = IST("build_info"), [INF_NBTHREAD] = IST("nbthread"), [INF_NBPROC] = IST("nbproc"), [INF_PROCESS_NUM] = IST("relative_process_id"), @@ -639,8 +650,7 @@ const struct ist promex_st_metric_names[ST_F_TOTAL_FIELDS] = { /* Description of all info fields */ const struct ist promex_inf_metric_desc[INF_TOTAL_FIELDS] = { [INF_NAME] = IST("Product name."), - [INF_VERSION] = IST("HAProxy version."), - [INF_RELEASE_DATE] = IST("HAProxy release date."), + [INF_BUILD_INFO] = IST("HAProxy build info."), [INF_NBTHREAD] = IST("Configured number of threads."), [INF_NBPROC] = IST("Configured number of processes."), [INF_PROCESS_NUM] = IST("Relative process id, starting at 1."), @@ -811,8 +821,7 @@ const struct ist promex_st_metric_desc[ST_F_TOTAL_FIELDS] = { /* Specific labels for all info fields. Empty by default. */ const struct ist promex_inf_metric_labels[INF_TOTAL_FIELDS] = { [INF_NAME] = IST(""), - [INF_VERSION] = IST(""), - [INF_RELEASE_DATE] = IST(""), + [INF_BUILD_INFO] = IST(PROMEX_BUILDINFO_LABEL), [INF_NBTHREAD] = IST(""), [INF_NBPROC] = IST(""), [INF_PROCESS_NUM] = IST(""), @@ -976,8 +985,7 @@ const struct ist promex_st_metric_labels[ST_F_TOTAL_FIELDS] = { /* Type for all info fields. "untyped" is used for unsupported field. */ const struct ist promex_inf_metric_types[INF_TOTAL_FIELDS] = { [INF_NAME] = IST("untyped"), - [INF_VERSION] = IST("untyped"), - [INF_RELEASE_DATE] = IST("untyped"), + [INF_BUILD_INFO] = IST("gauge"), [INF_NBTHREAD] = IST("gauge"), [INF_NBPROC] = IST("gauge"), [INF_PROCESS_NUM] = IST("gauge"), @@ -1327,6 +1335,9 @@ static int promex_dump_global_metrics(struct appctx *appctx, struct htx *htx) #endif while (appctx->st2 && appctx->st2 < INF_TOTAL_FIELDS) { switch (appctx->st2) { + case INF_BUILD_INFO: + metric = mkf_u32(FN_GAUGE, 1); + break; case INF_NBTHREAD: metric = mkf_u32(FO_CONFIG|FS_SERVICE, global.nbthread); break; diff --git a/include/haproxy/stats-t.h b/include/haproxy/stats-t.h index 70d8b489a..8e8a10e4b 100644 --- a/include/haproxy/stats-t.h +++ b/include/haproxy/stats-t.h @@ -259,6 +259,7 @@ enum field_scope { enum info_field { INF_NAME, INF_VERSION, + INF_BUILD_INFO, INF_RELEASE_DATE, INF_NBTHREAD, INF_NBPROC, -- 2.29.2