从Prometheus官方网站可以看到,官方网站已经有支持对HAProxy软件的exporter,我们从官方网站下载下来进行使用,也可以通过下载HAProxy的项目地址,通过编译进行部署。
github项目地址
https://github.com/prometheus/haproxy_exporter
二进制可执行程序地址
https://prometheus.io/download/
原理解析
通过查看源码,haproxy_exporter是对uri地址获取到的csv内容进行解析,所以需要配置HAProxy,以便暴露HAProxy的状态信息。
func (e *Exporter) scrape(ch chan<- prometheus.Metric) (up float64) {
e.totalScrapes.Inc()
body, err := e.fetch()
if err != nil {
level.Error(e.logger).Log("msg", "Can't scrape HAProxy", "err", err)
return 0
}
defer body.Close()
reader := csv.NewReader(body)
reader.TrailingComma = true
reader.Comment = '#'
loop:
for {
row, err := reader.Read()
switch err {
case nil:
case io.EOF:
break loop
default:
if _, ok := err.(*csv.ParseError); ok {
level.Error(e.logger).Log("msg", "Can't read CSV", "err", err)
e.csvParseFailures.Inc()
continue loop
}
level.Error(e.logger).Log("msg", "Unexpected error while reading CSV", "err", err)
return 0
}
e.parseRow(row, ch)
}
return 1
}
HAProxy配置:
打开haproxy.cfg配置文件,添加如下配置项
listen stats
bind :9099
stats uri /haproxy
stats enable
该配置项将HAProxy的状态信息进行曝露,绑定在端口9099,并且路由地址为/haproxy。
通过访问该地址,我们可以看到相应的HAProxy状态信息。
HAProxy_exporter配置
haproxy_exporter.exe --haproxy.scrape-uri="http://192.168.55.80:9099/haproxy;csv"
配置命令行参数–haproxy.scrape-uri 为指向HAProxy的状态信息的地址即可。
监控效果
访问exporter曝露的/metrics,可以访问到HAProxy的状态信息。
haproxy_backend_bytes_in_total{
backend="app"} 2020
haproxy_backend_bytes_in_total{
backend="static"} 0
haproxy_backend_bytes_in_total{
backend="stats"} 11258
# HELP haproxy_backend_bytes_out_total Current total of outgoing bytes.
# TYPE haproxy_backend_bytes_out_total gauge
haproxy_backend_bytes_out_total{
backend="app"} 12400
haproxy_backend_bytes_out_total{
backend="static"} 0
haproxy_backend_bytes_out_total{
backend="stats"} 237858
# HELP haproxy_backend_compressor_bytes_bypassed_total Number of bytes that bypassed the HTTP compressor
# TYPE haproxy_backend_compressor_bytes_bypassed_total gauge
haproxy_backend_compressor_bytes_bypassed_total{
backend="app"} 0
haproxy_backend_compressor_bytes_bypassed_total{
backend="static"} 0
haproxy_backend_compressor_bytes_bypassed_total{
backend="stats"} 0
# HELP haproxy_backend_compressor_bytes_in_total Number of HTTP response bytes fed to the compressor
# TYPE haproxy_backend_compressor_bytes_in_total gauge
haproxy_backend_compressor_bytes_in_total{
backend="app"} 0
haproxy_backend_compressor_bytes_in_total{
backend="static"} 0
haproxy_backend_compressor_bytes_in_total{
backend="stats"} 0
# HELP haproxy_backend_compressor_bytes_out_total Number of HTTP response bytes emitted by the compressor
# TYPE haproxy_backend_compressor_bytes_out_total gauge
haproxy_backend_compressor_bytes_out_total{
backend="app"} 0
haproxy_backend_compressor_bytes_out_total{
backend="static"} 0
haproxy_backend_compressor_bytes_out_total{
backend="stats"} 0
# HELP haproxy_backend_connection_errors_total Total of connection errors.
# TYPE haproxy_backend_connection_errors_total gauge
haproxy_backend_connection_errors_total{
backend="app"} 0
haproxy_backend_connection_errors_total{
backend="static"} 0
haproxy_backend_connection_errors_total{
backend="stats"} 16
# HELP haproxy_backend_current_queue Current number of queued requests not assigned to any server.
# TYPE haproxy_backend_current_queue gauge
haproxy_backend_current_queue{
backend="app"} 0
haproxy_backend_current_queue{
backend="static"} 0
haproxy_backend_current_queue{
backend="stats"} 0
# HELP haproxy_backend_current_server Current number of active servers
# TYPE haproxy_backend_current_server gauge
haproxy_backend_current_server{
backend="app"} 2
haproxy_backend_current_server{
backend="static"} 0
haproxy_backend_current_server{
backend="stats"} 0
# HELP haproxy_backend_current_session_rate Current number of sessions per second over last elapsed second.
# TYPE haproxy_backend_current_session_rate gauge
haproxy_backend_current_session_rate{
backend="app"} 0
haproxy_backend_current_session_rate{
backend="static"} 0
haproxy_backend_current_session_rate{
backend="stats"} 0
# HELP haproxy_backend_current_sessions Current number of active sessions.
# TYPE haproxy_backend_current_sessions gauge
haproxy_backend_current_sessions{
backend="app"} 0
haproxy_backend_current_sessions{
backend="static"} 0
haproxy_backend_current_sessions{
backend="stats"} 0
# HELP haproxy_backend_http_connect_time_average_seconds Avg. HTTP connect time for last 1024 successful connections.
# TYPE haproxy_backend_http_connect_time_average_seconds gauge
haproxy_backend_http_connect_time_average_seconds{
backend="app"} 0.001
haproxy_backend_http_connect_time_average_seconds{
backend="static"} 0
haproxy_backend_http_connect_time_average_seconds{
backend="stats"} 0
# HELP haproxy_backend_http_queue_time_average_seconds Avg. HTTP queue time for last 1024 successful connections.
# TYPE haproxy_backend_http_queue_time_average_seconds gauge
haproxy_backend_http_queue_time_average_seconds{
backend="app"} 0
haproxy_backend_http_queue_time_average_seconds{
backend="static"} 0
haproxy_backend_http_queue_time_average_seconds{
backend="stats"} 0
# HELP haproxy_backend_http_response_time_average_seconds Avg. HTTP response time for last 1024 successful connections.
# TYPE haproxy_backend_http_response_time_average_seconds gauge
haproxy_backend_http_response_time_average_seconds{
backend="app"} 0.001
haproxy_backend_http_response_time_average_seconds{
backend="static"} 0
haproxy_backend_http_response_time_average_seconds{
backend="stats"} 0
# HELP haproxy_backend_http_responses_compressed_total Number of HTTP responses that were compressed
# TYPE haproxy_backend_http_responses_compressed_total gauge
haproxy_backend_http_responses_compressed_total{
backend=