Varnish Exporter
Varnish 是一款高性能的开源 HTTP 加速器,被安装在web服务器之前,从而缓存web服务器的应用程序和数据,最后相应客户的请求。针对 Varnish ,jonnenauha 开源了一个 Exporter 来监控 Varnish ,官方仓库地址是 https://github.com/jonnenauha/prometheus_varnish_exporter ,最新版本是 1.6.1 ,发布于 2021 年 12 月 9 日。
在每个 Prometheus 收集并公开所有报告的指标时,获取 varnishstat -j
的 JSON 格式输出。
具有多个后端或 Varnish 定义的标识符的指标 (例如VBE.*.happy SMA.*.c_bytes LCK.*.creat
)和其他具有类似结构的指标(例如 MAIN.fetch_*
) 组合在一个具有可区分标签的指标名称下。在构建查询时,为了让 Varnish 用户熟悉,Vanish 命名约定被尽可能地保留下来,同时尝试遵循 Prometheus 约定,比如小写和使用_
分隔符。
Varnish 在处理运行时的更改时,比如通过 vlc 重载添加新的后端,在Varnish 重新启动之前,被删除的后端会被 varnishstat
报告。高级用户可以使用 -n -N
,它们被传递给 varnishstat
。
Varnish Exporter 的开发者亲自测试了以下版本的 Varnish是可以正常工作的,比如 6.0.0,5.2.1,5.1.2,4.1.1,4.1.0,4.0.3 和 3.0.5。如果 Varnish 项目没有删除或者更改统计数据,那么在 3.x 中缺失的类别分组会被检测到并自动添加,比如 MAIN.
,使标签名称跨版本保持一致,
在这一点上,Varnish Exporter 开发者对向后的兼容性不做承诺。如果指标名称或标签被细化,构建的查询语句可能会在新版本上中断,需要重新构建查询语句。
安装和运行
Varnish Exporter 可以通过二进制来运行,通过 https://github.com/jonnenauha/prometheus_varnish_exporter/releases 页面可以下载到最新版本,包括基于各种发行版操作系统。
Varnish Exporter 缺省会通过 9131 端口来暴露指标,使用 prometheus_varnish_exporter -h
可以查看 Exporter 支持的选项。
Varnish Exporter 采集监控项是通过机器上的 varnishstat 命令来获取的,要测试主机上的 varnishstat 是否存在,并预览所有导出指标的运行情况可以执行 prometheus_varnish_exporter -test
来查看,如果正常可以看到 JSON 格式的信息输出。
运行 Varnish Exporter 和运行 Node Exporter 一样,直接执行二进制文件就可以在缺省的 9131 端口得到 Prometheus 格式的监控数据,也可以添加支持的参数来进行一定的调整。
Varnish Exporter 支持从运行在 docker 容器中的 Varnish 抓取监控指标是从1.4.1开始的。使用 docker ps
解析 Varnish 容器名称并运行以下命令。这将使用 docker exec
在指定的容器中执行 varnishstat
。
prometheus_varnish_exporter -docker-container-name <container_name>
可视化
作者提供了一个预先准备好的 Grafana Dashboard 供大家进行参考,文件地址是 https://github.com/jonnenauha/prometheus_varnish_exporter/blob/master/dashboards/jonnenauha/dashboard.json 。
Varnish 4 和 VCL UUID
从 1.2 版开始,总是设置后端和服务器标签。对于后端相关指标和 Varnish 4,服务器 tag 将被设置为后端 VCL UUID。请注意,可能同时加载了多个VCL 在这种情况下,服务器 tag 可能没有意义。
为了将所有加载的 VCL 聚合为每个后端指标,建议使用以下Prometheus记录规则:
backend:varnish_backend_bereq_bodybytes:sum = sum(varnish_backend_bereq_bodybytes) without (server)
backend:varnish_backend_bereq_hdrbytes:sum = sum(varnish_backend_bereq_hdrbytes) without (server)
backend:varnish_backend_beresp_bodybytes:sum = sum(varnish_backend_beresp_bodybytes) without (server)
backend:varnish_backend_beresp_hdrbytes:sum = sum(varnish_backend_beresp_hdrbytes) without (server)
backend:varnish_backend_conn:sum = sum(varnish_backend_conn) without (server)
backend:varnish_backend_happy:sum = sum(varnish_backend_happy) without (server)
backend:varnish_backend_pipe_hdrbytes:sum = sum(varnish_backend_pipe) without (server)
backend:varnish_backend_pipe_in:sum = sum(varnish_backend_pipe_in) without (server)
backend:varnish_backend_pipe_out:sum = sum(varnish_backend_pipe_out) without (server)
backend:varnish_backend_req:sum = sum(varnish_backend_req) without (server)