| PROMEX: A Prometheus exporter for HAProxy |
| ------------------------------------------- |
| |
| Prometheus is a monitoring and alerting system. More and more people use it to |
| monitor their environment (this is written February 2019). It collects metrics |
| from monitored targets by scraping metrics HTTP endpoints on these targets. For |
| HAProxy, The Prometheus team officially supports an exporter written in Go |
| (https://github.com/prometheus/haproxy_exporter). But it requires an extra |
| software to deploy and monitor. PROMEX, on its side, is a built-in Prometheus |
| exporter for HAProxy. It was developed as a service and is directly available in |
| HAProxy, like the stats applet. |
| |
| However, PROMEX is not built by default with HAProxy. It is provided as an extra |
| component for everyone want to use it. So you need to explicitly build HAProxy |
| with the PROMEX service, using the Makefile variable "EXTRA_OBJS". For instance: |
| |
| > make TARGET=linux-glibc EXTRA_OBJS="contrib/prometheus-exporter/service-prometheus.o" |
| |
| if HAProxy provides the PROMEX service, the following build option will be |
| reported by the command "haproxy -vv": |
| |
| Built with the Prometheus exporter as a service |
| |
| To be used, it must be enabled in the configuration with an "http-request" rule |
| and the corresponding HTTP proxy must enable the HTX support. For instance: |
| |
| frontend test |
| mode http |
| ... |
| option http-use-htx |
| http-request use-service prometheus-exporter if { path /metrics } |
| ... |
| |
| |
| This service has been developed as a third-party component because it could |
| become obsolete, depending on how much time Prometheus will remain heavily |
| used. This is said with no ulterior motive of course. Prometheus is a great |
| software and I hope all the well for it. But we involve in a environment moving |
| quickly and a solution may be obvious today could be deprecated the next |
| year. And because PROMEX is not integrated by default into the HAProxy codebase, |
| it will need some interest to be actively supported. All contribution of any |
| kind are welcome. |
| |
| You must also be careful if you use with huge configurations. Unlike the stats |
| applet, all metrics are not grouped by service (proxy, listener or server). With |
| PROMEX, all lines for a given metric are provided as one single group. So |
| instead of collecting all metrics for a proxy before moving to the next one, we |
| must loop on all proxies for each metric. Same for the servers. Thus, it will |
| spend much more resources to produce the Prometheus metrics than the CSV export |
| through the stats page. To give a comparison order, quick benchmarks shown that |
| a PROMEX dump is 5x slower and 20x more verbose than a CSV export. |
| |
| |
| metrics filtering |
| ------------------- |
| |
| It is possible to dynamically select the metrics to export if you don't use all |
| of them passing parameters in the query-string. |
| |
| * Filtering on scopes |
| |
| The metrics may be filtered by scopes. Multiple parameters with "scope" as name |
| may be passed in the query-string to filter exported metrics, with one of those |
| values: global, frontend, backend, server or '*' (means all). A scope parameter |
| with no value means to filter out all scopes (nothing is returned). The scope |
| parameters are parsed in their appearance order in the query-string. So an empty |
| scope will reset all scopes already parsed. But it can be overridden by |
| following scope parameters in the query-string. By default everything is |
| exported. Here are examples: |
| |
| /metrics?scope=server # ==> server metrics will be exported |
| /metrics?scope=frontend&scope=backend # ==> Frontend and backend metrics will be exported |
| /metrics?scope=*&scope= # ==> no metrics will be exported |
| /metrics?scope=&scope=global # ==> global metrics will be exported |
| |
| * How do I prevent my prometheus instance to explode? |
| |
| ** 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. |
| |
| prometheus example config: |
| |
| For server-template users: |
| - <job> |
| params: |
| no-maint: |
| - empty |
| |
| ** Scrap server health checks only |
| |
| All health checks status are dump through `state` label values. If you want to |
| scrap server health check status but prevent all server metrics to be saved, |
| except the server_check_status, you may configure prometheus that way: |
| |
| - <job> |
| metric_relabel_configs: |
| - source_labels: ['__name__'] |
| regex: 'haproxy_(process_|frontend_|backend_|server_check_status).*' |
| action: keep |
| |
| Exported metrics |
| ------------------ |
| |
| See prometheus export for the description of each field. |
| |
| * Globals metrics |
| |
| +------------------------------------------------+ |
| | Metric name | |
| +------------------------------------------------+ |
| | haproxy_process_nbthread | |
| | haproxy_process_nbproc | |
| | haproxy_process_relative_process_id | |
| | haproxy_process_uptime_seconds | |
| | haproxy_process_pool_failures_total | |
| | haproxy_process_max_fds | |
| | haproxy_process_max_sockets | |
| | haproxy_process_max_connections | |
| | haproxy_process_hard_max_connections | |
| | haproxy_process_current_connections | |
| | haproxy_process_connections_total | |
| | haproxy_process_requests_total | |
| | haproxy_process_max_ssl_connections | |
| | haproxy_process_current_ssl_connections | |
| | haproxy_process_ssl_connections_total | |
| | haproxy_process_max_pipes | |
| | haproxy_process_pipes_used_total | |
| | haproxy_process_pipes_free_total | |
| | haproxy_process_current_connection_rate | |
| | haproxy_process_limit_connection_rate | |
| | haproxy_process_max_connection_rate | |
| | haproxy_process_current_session_rate | |
| | haproxy_process_limit_session_rate | |
| | haproxy_process_max_session_rate | |
| | haproxy_process_current_ssl_rate | |
| | haproxy_process_limit_ssl_rate | |
| | haproxy_process_max_ssl_rate | |
| | haproxy_process_current_frontend_ssl_key_rate | |
| | haproxy_process_max_frontend_ssl_key_rate | |
| | haproxy_process_frontend_ssl_reuse | |
| | haproxy_process_current_backend_ssl_key_rate | |
| | haproxy_process_max_backend_ssl_key_rate | |
| | haproxy_process_ssl_cache_lookups_total | |
| | haproxy_process_ssl_cache_misses_total | |
| | haproxy_process_http_comp_bytes_in_total | |
| | haproxy_process_http_comp_bytes_out_total | |
| | haproxy_process_limit_http_comp | |
| | haproxy_process_current_zlib_memory | |
| | haproxy_process_max_zlib_memory | |
| | haproxy_process_current_tasks | |
| | haproxy_process_current_run_queue | |
| | haproxy_process_idle_time_percent | |
| | haproxy_process_stopping | |
| | haproxy_process_jobs | |
| | haproxy_process_unstoppable_jobs | |
| | haproxy_process_listeners | |
| | haproxy_process_active_peers | |
| | haproxy_process_connected_peers | |
| | haproxy_process_dropped_logs_total | |
| | haproxy_process_busy_polling_enabled | |
| | haproxy_process_failed_resolutions | |
| | haproxy_process_bytes_out_total | |
| | haproxy_process_spliced_bytes_out_total | |
| | haproxy_process_bytes_out_rate | |
| | haproxy_process_recv_logs_total | |
| | haproxy_process_build_info | |
| | haproxy_process_max_memory_bytes | |
| | haproxy_process_pool_allocated_bytes | |
| | haproxy_process_pool_used_bytes | |
| | haproxy_process_start_time_seconds | |
| +------------------------------------------------+ |
| |
| * Frontend metrics |
| |
| +-------------------------------------------------+ |
| | Metric name | |
| +-------------------------------------------------+ |
| | haproxy_frontend_current_sessions | |
| | haproxy_frontend_max_sessions | |
| | haproxy_frontend_limit_sessions | |
| | haproxy_frontend_sessions_total | |
| | haproxy_frontend_bytes_in_total | |
| | haproxy_frontend_bytes_out_total | |
| | haproxy_frontend_requests_denied_total | |
| | haproxy_frontend_responses_denied_total | |
| | haproxy_frontend_request_errors_total | |
| | haproxy_frontend_status | |
| | haproxy_frontend_limit_session_rate | |
| | haproxy_frontend_max_session_rate | |
| | haproxy_frontend_http_responses_total | |
| | haproxy_frontend_http_requests_rate_max | |
| | haproxy_frontend_http_requests_total | |
| | haproxy_frontend_http_comp_bytes_in_total | |
| | haproxy_frontend_http_comp_bytes_out_total | |
| | haproxy_frontend_http_comp_bytes_bypassed_total | |
| | haproxy_frontend_http_comp_responses_total | |
| | haproxy_frontend_connections_rate_max | |
| | haproxy_frontend_connections_total | |
| | haproxy_frontend_intercepted_requests_total | |
| | haproxy_frontend_denied_connections_total | |
| | haproxy_frontend_denied_sessions_total | |
| | haproxy_frontend_failed_header_rewriting_total | |
| | haproxy_frontend_http_cache_lookups_total | |
| | haproxy_frontend_http_cache_hits_total | |
| | haproxy_frontend_internal_errors_total | |
| +-------------------------------------------------+ |
| |
| * Backend metrics |
| |
| +-----------------------------------------------------+ |
| | Metric name | |
| +-----------------------------------------------------+ |
| | haproxy_backend_current_queue | |
| | haproxy_backend_max_queue | |
| | haproxy_backend_current_sessions | |
| | haproxy_backend_max_sessions | |
| | haproxy_backend_limit_sessions | |
| | haproxy_backend_sessions_total | |
| | haproxy_backend_bytes_in_total | |
| | haproxy_backend_bytes_out_total | |
| | haproxy_backend_requests_denied_total | |
| | haproxy_backend_responses_denied_total | |
| | haproxy_backend_connection_errors_total | |
| | haproxy_backend_response_errors_total | |
| | haproxy_backend_retry_warnings_total | |
| | haproxy_backend_redispatch_warnings_total | |
| | haproxy_backend_status | |
| | haproxy_backend_weight | |
| | haproxy_backend_active_servers | |
| | haproxy_backend_backup_servers | |
| | haproxy_backend_check_up_down_total | |
| | haproxy_backend_check_last_change_seconds | |
| | haproxy_backend_downtime_seconds_total | |
| | haproxy_backend_loadbalanced_total | |
| | haproxy_backend_max_session_rate | |
| | haproxy_backend_http_responses_total | |
| | haproxy_backend_http_requests_total | |
| | haproxy_backend_client_aborts_total | |
| | haproxy_backend_server_aborts_total | |
| | haproxy_backend_http_comp_bytes_in_total | |
| | haproxy_backend_http_comp_bytes_out_total | |
| | haproxy_backend_http_comp_bytes_bypassed_total | |
| | haproxy_backend_http_comp_responses_total | |
| | haproxy_backend_last_session_seconds | |
| | haproxy_backend_queue_time_average_seconds | |
| | haproxy_backend_connect_time_average_seconds | |
| | haproxy_backend_response_time_average_seconds | |
| | haproxy_backend_total_time_average_seconds | |
| | haproxy_backend_failed_header_rewriting_total | |
| | haproxy_backend_connection_attempts_total | |
| | haproxy_backend_connection_reuses_total | |
| | haproxy_backend_http_cache_lookups_total | |
| | haproxy_backend_http_cache_hits_total | |
| | haproxy_backend_max_queue_time_seconds | |
| | haproxy_backend_max_connect_time_seconds | |
| | haproxy_backend_max_response_time_seconds | |
| | haproxy_backend_max_total_time_seconds | |
| | haproxy_backend_internal_errors_total | |
| | haproxy_backend_uweight | |
| +-----------------------------------------------------+ |
| |
| * Server metrics |
| |
| +----------------------------------------------------+ |
| | Metric name | |
| +----------------------------------------------------+ |
| | haproxy_server_current_queue | |
| | haproxy_server_max_queue | |
| | haproxy_server_current_sessions | |
| | haproxy_server_max_sessions | |
| | haproxy_server_limit_sessions | |
| | haproxy_server_sessions_total | |
| | haproxy_server_bytes_in_total | |
| | haproxy_server_bytes_out_total | |
| | haproxy_server_responses_denied_total | |
| | haproxy_server_connection_errors_total | |
| | haproxy_server_response_errors_total | |
| | haproxy_server_retry_warnings_total | |
| | haproxy_server_redispatch_warnings_total | |
| | haproxy_server_status | |
| | haproxy_server_weight | |
| | haproxy_server_check_failures_total | |
| | haproxy_server_check_up_down_total | |
| | haproxy_server_check_last_change_seconds | |
| | haproxy_server_downtime_seconds_total | |
| | haproxy_server_queue_limit | |
| | haproxy_server_current_throttle | |
| | haproxy_server_loadbalanced_total | |
| | haproxy_server_max_session_rate | |
| | haproxy_server_check_status | |
| | haproxy_server_check_code | |
| | haproxy_server_check_duration_seconds | |
| | haproxy_server_http_responses_total | |
| | haproxy_server_client_aborts_total | |
| | haproxy_server_server_aborts_total | |
| | haproxy_server_last_session_seconds | |
| | haproxy_server_queue_time_average_seconds | |
| | haproxy_server_connect_time_average_seconds | |
| | haproxy_server_response_time_average_seconds | |
| | haproxy_server_total_time_average_seconds | |
| | haproxy_server_failed_header_rewriting_total | |
| | haproxy_server_connection_attempts_total | |
| | haproxy_server_connection_reuses_total | |
| | haproxy_server_idle_connections_current | |
| | haproxy_server_idle_connections_limit | |
| | haproxy_server_max_queue_time_seconds | |
| | haproxy_server_max_connect_time_seconds | |
| | haproxy_server_max_response_time_seconds | |
| | haproxy_server_max_total_time_seconds | |
| | haproxy_server_internal_errors_total | |
| | haproxy_server_unsafe_idle_connections_current | |
| | haproxy_server_safe_idle_connections_current | |
| | haproxy_server_used_connections_current | |
| | haproxy_server_need_connections_current | |
| | haproxy_server_uweight | |
| +----------------------------------------------------+ |