blob: fdbc502032c634c4b909c6034741d69ebf167f0d [file] [log] [blame]
Christopher Fauletf959d082019-02-07 15:38:42 +01001PROMEX: A Prometheus exporter for HAProxy
2-------------------------------------------
3
4Prometheus is a monitoring and alerting system. More and more people use it to
5monitor their environment (this is written February 2019). It collects metrics
6from monitored targets by scraping metrics HTTP endpoints on these targets. For
Ilya Shipitsin1fae8db2020-03-14 17:47:28 +05007HAProxy, The Prometheus team officially supports an exporter written in Go
Christopher Fauletf959d082019-02-07 15:38:42 +01008(https://github.com/prometheus/haproxy_exporter). But it requires an extra
9software to deploy and monitor. PROMEX, on its side, is a built-in Prometheus
10exporter for HAProxy. It was developed as a service and is directly available in
11HAProxy, like the stats applet.
12
13However, PROMEX is not built by default with HAProxy. It is provided as an extra
Ilya Shipitsin1fae8db2020-03-14 17:47:28 +050014component for everyone want to use it. So you need to explicitly build HAProxy
Christopher Fauletf959d082019-02-07 15:38:42 +010015with the PROMEX service, using the Makefile variable "EXTRA_OBJS". For instance:
16
Willy Tarreaud254aa82019-06-14 18:40:48 +020017 > make TARGET=linux-glibc EXTRA_OBJS="contrib/prometheus-exporter/service-prometheus.o"
Christopher Fauletf959d082019-02-07 15:38:42 +010018
19if HAProxy provides the PROMEX service, the following build option will be
20reported by the command "haproxy -vv":
21
22 Built with the Prometheus exporter as a service
23
24To be used, it must be enabled in the configuration with an "http-request" rule
25and the corresponding HTTP proxy must enable the HTX support. For instance:
26
27 frontend test
28 mode http
29 ...
Christopher Fauletf959d082019-02-07 15:38:42 +010030 http-request use-service prometheus-exporter if { path /metrics }
31 ...
32
33
34This service has been developed as a third-party component because it could
35become obsolete, depending on how much time Prometheus will remain heavily
36used. This is said with no ulterior motive of course. Prometheus is a great
37software and I hope all the well for it. But we involve in a environment moving
38quickly and a solution may be obvious today could be deprecated the next
39year. And because PROMEX is not integrated by default into the HAProxy codebase,
40it will need some interest to be actively supported. All contribution of any
41kind are welcome.
42
43You must also be careful if you use with huge configurations. Unlike the stats
44applet, all metrics are not grouped by service (proxy, listener or server). With
45PROMEX, all lines for a given metric are provided as one single group. So
46instead of collecting all metrics for a proxy before moving to the next one, we
47must loop on all proxies for each metric. Same for the servers. Thus, it will
Ilya Shipitsin1fae8db2020-03-14 17:47:28 +050048spend much more resources to produce the Prometheus metrics than the CSV export
Christopher Fauletf959d082019-02-07 15:38:42 +010049through the stats page. To give a comparison order, quick benchmarks shown that
50a PROMEX dump is 5x slower and 20x more verbose than a CSV export.
51
Christopher Faulet78407ce2019-11-18 14:47:08 +010052
53metrics filtering
54-------------------
55
56It is possible to dynamically select the metrics to export if you don't use all
57of them passing parameters in the query-string.
58
59* Filtering on scopes
60
61The metrics may be filtered by scopes. Multiple parameters with "scope" as name
62may be passed in the query-string to filter exported metrics, with one of those
63values: global, frontend, backend, server or '*' (means all). A scope parameter
64with no value means to filter out all scopes (nothing is returned). The scope
65parameters are parsed in their appearance order in the query-string. So an empty
66scope will reset all scopes already parsed. But it can be overridden by
67following scope parameters in the query-string. By default everything is
68exported. Here are examples:
69
70 /metrics?scope=server # ==> server metrics will be exported
71 /metrics?scope=frontend&scope=backend # ==> Frontend and backend metrics will be exported
William Dauchye3f7bd52021-02-14 23:22:56 +010072 /metrics?scope=listener # ==> listener metrics will be exported
Christopher Faulet78407ce2019-11-18 14:47:08 +010073 /metrics?scope=*&scope= # ==> no metrics will be exported
74 /metrics?scope=&scope=global # ==> global metrics will be exported
William Dauchy69164222021-02-07 20:42:38 +010075 /metrics?scope=sticktable # ==> stick tables metrics will be exported
Christopher Faulet78407ce2019-11-18 14:47:08 +010076
William Dauchyde3c3262021-02-01 13:11:51 +010077* How do I prevent my prometheus instance to explode?
78
79** Filtering on servers state
Christopher Fauleteba22942019-11-19 14:18:24 +010080
81It is possible to exclude from returned metrics all servers in maintenance mode
82passing the parameter "no-maint" in the query-string. This parameter may help to
83solve performance issues of configuration that use the server templates to
84manage dynamic provisionning. Note there is no consistency check on the servers
85state. So, if the state of a server changes while the exporter is running, only
86a part of the metrics for this server will be dumped.
Christopher Faulet78407ce2019-11-18 14:47:08 +010087
William Dauchyde3c3262021-02-01 13:11:51 +010088prometheus example config:
89
90For server-template users:
91- <job>
92 params:
93 no-maint:
94 - empty
95
96** Scrap server health checks only
97
98All health checks status are dump through `state` label values. If you want to
99scrap server health check status but prevent all server metrics to be saved,
100except the server_check_status, you may configure prometheus that way:
101
102- <job>
103 metric_relabel_configs:
104 - source_labels: ['__name__']
William Dauchye3f7bd52021-02-14 23:22:56 +0100105 regex: 'haproxy_(process_|frontend_|listener_|backend_|server_check_status).*'
William Dauchyde3c3262021-02-01 13:11:51 +0100106 action: keep
107
Christopher Fauletf959d082019-02-07 15:38:42 +0100108Exported metrics
109------------------
110
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100111See prometheus export for the description of each field.
112
Christopher Fauletf959d082019-02-07 15:38:42 +0100113* Globals metrics
114
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100115+------------------------------------------------+
116| Metric name |
117+------------------------------------------------+
118| haproxy_process_nbthread |
119| haproxy_process_nbproc |
120| haproxy_process_relative_process_id |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100121| haproxy_process_uptime_seconds |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100122| haproxy_process_pool_failures_total |
123| haproxy_process_max_fds |
124| haproxy_process_max_sockets |
125| haproxy_process_max_connections |
126| haproxy_process_hard_max_connections |
127| haproxy_process_current_connections |
128| haproxy_process_connections_total |
129| haproxy_process_requests_total |
130| haproxy_process_max_ssl_connections |
131| haproxy_process_current_ssl_connections |
132| haproxy_process_ssl_connections_total |
133| haproxy_process_max_pipes |
134| haproxy_process_pipes_used_total |
135| haproxy_process_pipes_free_total |
136| haproxy_process_current_connection_rate |
137| haproxy_process_limit_connection_rate |
138| haproxy_process_max_connection_rate |
139| haproxy_process_current_session_rate |
140| haproxy_process_limit_session_rate |
141| haproxy_process_max_session_rate |
142| haproxy_process_current_ssl_rate |
143| haproxy_process_limit_ssl_rate |
144| haproxy_process_max_ssl_rate |
145| haproxy_process_current_frontend_ssl_key_rate |
146| haproxy_process_max_frontend_ssl_key_rate |
147| haproxy_process_frontend_ssl_reuse |
148| haproxy_process_current_backend_ssl_key_rate |
149| haproxy_process_max_backend_ssl_key_rate |
150| haproxy_process_ssl_cache_lookups_total |
151| haproxy_process_ssl_cache_misses_total |
152| haproxy_process_http_comp_bytes_in_total |
153| haproxy_process_http_comp_bytes_out_total |
154| haproxy_process_limit_http_comp |
155| haproxy_process_current_zlib_memory |
156| haproxy_process_max_zlib_memory |
157| haproxy_process_current_tasks |
158| haproxy_process_current_run_queue |
159| haproxy_process_idle_time_percent |
160| haproxy_process_stopping |
161| haproxy_process_jobs |
162| haproxy_process_unstoppable_jobs |
163| haproxy_process_listeners |
164| haproxy_process_active_peers |
165| haproxy_process_connected_peers |
166| haproxy_process_dropped_logs_total |
167| haproxy_process_busy_polling_enabled |
168| haproxy_process_failed_resolutions |
169| haproxy_process_bytes_out_total |
170| haproxy_process_spliced_bytes_out_total |
171| haproxy_process_bytes_out_rate |
172| haproxy_process_recv_logs_total |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100173| haproxy_process_build_info |
174| haproxy_process_max_memory_bytes |
175| haproxy_process_pool_allocated_bytes |
176| haproxy_process_pool_used_bytes |
177| haproxy_process_start_time_seconds |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100178+------------------------------------------------+
Christopher Fauletf959d082019-02-07 15:38:42 +0100179
180* Frontend metrics
181
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100182+-------------------------------------------------+
183| Metric name |
184+-------------------------------------------------+
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100185| haproxy_frontend_current_sessions |
186| haproxy_frontend_max_sessions |
187| haproxy_frontend_limit_sessions |
188| haproxy_frontend_sessions_total |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100189| haproxy_frontend_bytes_in_total |
190| haproxy_frontend_bytes_out_total |
191| haproxy_frontend_requests_denied_total |
192| haproxy_frontend_responses_denied_total |
193| haproxy_frontend_request_errors_total |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100194| haproxy_frontend_status |
195| haproxy_frontend_limit_session_rate |
196| haproxy_frontend_max_session_rate |
197| haproxy_frontend_http_responses_total |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100198| haproxy_frontend_http_requests_rate_max |
199| haproxy_frontend_http_requests_total |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100200| haproxy_frontend_http_comp_bytes_in_total |
201| haproxy_frontend_http_comp_bytes_out_total |
202| haproxy_frontend_http_comp_bytes_bypassed_total |
203| haproxy_frontend_http_comp_responses_total |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100204| haproxy_frontend_connections_rate_max |
205| haproxy_frontend_connections_total |
206| haproxy_frontend_intercepted_requests_total |
207| haproxy_frontend_denied_connections_total |
208| haproxy_frontend_denied_sessions_total |
209| haproxy_frontend_failed_header_rewriting_total |
210| haproxy_frontend_http_cache_lookups_total |
211| haproxy_frontend_http_cache_hits_total |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100212| haproxy_frontend_internal_errors_total |
213+-------------------------------------------------+
Christopher Fauletf959d082019-02-07 15:38:42 +0100214
William Dauchye3f7bd52021-02-14 23:22:56 +0100215* Listener metrics
216
217+-------------------------------------------------+
218| Metric name |
219+-------------------------------------------------+
220| haproxy_listener_current_sessions |
221| haproxy_listener_max_sessions |
222| haproxy_listener_limit_sessions |
223| haproxy_listener_sessions_total |
224| haproxy_listener_bytes_in_total |
225| haproxy_listener_bytes_out_total |
226| haproxy_listener_requests_denied_total |
227| haproxy_listener_responses_denied_total |
228| haproxy_listener_request_errors_total |
229| haproxy_listener_status |
230| haproxy_listener_denied_connections_total |
231| haproxy_listener_denied_sessions_total |
232| haproxy_listener_failed_header_rewriting_total |
233| haproxy_listener_internal_errors_total |
234+-------------------------------------------------+
235
Rick Rackow35efbe22019-10-08 11:28:06 +0200236* Backend metrics
Christopher Fauletf959d082019-02-07 15:38:42 +0100237
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100238+-----------------------------------------------------+
239| Metric name |
240+-----------------------------------------------------+
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100241| haproxy_backend_current_queue |
242| haproxy_backend_max_queue |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100243| haproxy_backend_current_sessions |
244| haproxy_backend_max_sessions |
245| haproxy_backend_limit_sessions |
246| haproxy_backend_sessions_total |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100247| haproxy_backend_bytes_in_total |
248| haproxy_backend_bytes_out_total |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100249| haproxy_backend_requests_denied_total |
250| haproxy_backend_responses_denied_total |
251| haproxy_backend_connection_errors_total |
252| haproxy_backend_response_errors_total |
253| haproxy_backend_retry_warnings_total |
254| haproxy_backend_redispatch_warnings_total |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100255| haproxy_backend_status |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100256| haproxy_backend_weight |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100257| haproxy_backend_active_servers |
258| haproxy_backend_backup_servers |
259| haproxy_backend_check_up_down_total |
260| haproxy_backend_check_last_change_seconds |
261| haproxy_backend_downtime_seconds_total |
262| haproxy_backend_loadbalanced_total |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100263| haproxy_backend_max_session_rate |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100264| haproxy_backend_http_responses_total |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100265| haproxy_backend_http_requests_total |
266| haproxy_backend_client_aborts_total |
267| haproxy_backend_server_aborts_total |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100268| haproxy_backend_http_comp_bytes_in_total |
269| haproxy_backend_http_comp_bytes_out_total |
270| haproxy_backend_http_comp_bytes_bypassed_total |
271| haproxy_backend_http_comp_responses_total |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100272| haproxy_backend_last_session_seconds |
273| haproxy_backend_queue_time_average_seconds |
274| haproxy_backend_connect_time_average_seconds |
275| haproxy_backend_response_time_average_seconds |
276| haproxy_backend_total_time_average_seconds |
277| haproxy_backend_failed_header_rewriting_total |
278| haproxy_backend_connection_attempts_total |
279| haproxy_backend_connection_reuses_total |
280| haproxy_backend_http_cache_lookups_total |
281| haproxy_backend_http_cache_hits_total |
282| haproxy_backend_max_queue_time_seconds |
283| haproxy_backend_max_connect_time_seconds |
284| haproxy_backend_max_response_time_seconds |
285| haproxy_backend_max_total_time_seconds |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100286| haproxy_backend_internal_errors_total |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100287| haproxy_backend_uweight |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100288+-----------------------------------------------------+
Christopher Fauletf959d082019-02-07 15:38:42 +0100289
290* Server metrics
291
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100292+----------------------------------------------------+
293| Metric name |
294+----------------------------------------------------+
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100295| haproxy_server_current_queue |
296| haproxy_server_max_queue |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100297| haproxy_server_current_sessions |
298| haproxy_server_max_sessions |
299| haproxy_server_limit_sessions |
300| haproxy_server_sessions_total |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100301| haproxy_server_bytes_in_total |
302| haproxy_server_bytes_out_total |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100303| haproxy_server_responses_denied_total |
304| haproxy_server_connection_errors_total |
305| haproxy_server_response_errors_total |
306| haproxy_server_retry_warnings_total |
307| haproxy_server_redispatch_warnings_total |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100308| haproxy_server_status |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100309| haproxy_server_weight |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100310| haproxy_server_check_failures_total |
311| haproxy_server_check_up_down_total |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100312| haproxy_server_check_last_change_seconds |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100313| haproxy_server_downtime_seconds_total |
314| haproxy_server_queue_limit |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100315| haproxy_server_current_throttle |
316| haproxy_server_loadbalanced_total |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100317| haproxy_server_max_session_rate |
318| haproxy_server_check_status |
319| haproxy_server_check_code |
320| haproxy_server_check_duration_seconds |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100321| haproxy_server_http_responses_total |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100322| haproxy_server_client_aborts_total |
323| haproxy_server_server_aborts_total |
324| haproxy_server_last_session_seconds |
325| haproxy_server_queue_time_average_seconds |
326| haproxy_server_connect_time_average_seconds |
327| haproxy_server_response_time_average_seconds |
328| haproxy_server_total_time_average_seconds |
329| haproxy_server_failed_header_rewriting_total |
330| haproxy_server_connection_attempts_total |
331| haproxy_server_connection_reuses_total |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100332| haproxy_server_idle_connections_current |
333| haproxy_server_idle_connections_limit |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100334| haproxy_server_max_queue_time_seconds |
335| haproxy_server_max_connect_time_seconds |
336| haproxy_server_max_response_time_seconds |
337| haproxy_server_max_total_time_seconds |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100338| haproxy_server_internal_errors_total |
339| haproxy_server_unsafe_idle_connections_current |
340| haproxy_server_safe_idle_connections_current |
341| haproxy_server_used_connections_current |
342| haproxy_server_need_connections_current |
Christopher Faulet1a68cd02021-02-01 14:50:30 +0100343| haproxy_server_uweight |
William Dauchy4b7bf7e2021-02-01 13:12:00 +0100344+----------------------------------------------------+
William Dauchy69164222021-02-07 20:42:38 +0100345
346* Stick table metrics
347
348+----------------------------------------------------+
349| Metric name |
350+----------------------------------------------------+
351| haproxy_sticktable_size |
352| haproxy_sticktable_used |
353+----------------------------------------------------+