Telegraf 可以直接从运行的系统中获取各种指标,以及从第三方 API 中提取指标,然后将指标保存至prometheus,通过grafana观测系统运行情况,调研了四种telegraf监控nginx的方案。
方案1,使用脚本
Telegraf部署目录/opt/app/telegraf/scripts,只需将脚本放在这里,telegraf 60s调用一次脚本。
ELB当前已经有monitor监控,后续新增指标不用修改monitor,只需修改telegraf目录下的脚本即可。
telegraf配置如下
[[inputs.exec]]
commands = [
"/opt/app/telegraf/scripts/collect_*"
]
data_format = "influx"
脚本输出参考格式
[root@js10-az1-region-gateway-11e8e0e20 tmp]# ./collect_l7xgw_detail_stat.py
l7xgw,tag=lb-kaye0jh20g@listener-eew1g7wvw5@10.28.6.66 conn=867899
l7xgw,tag=lb-kaye0jh20g@listener-eew1g7wvw5@10.28.6.66 ms=235129598
l7xgw,tag=lb-h4kl25niba@listener-9rj7xastto@192.168.0.15 conn=111
l7xgw,tag=lb-h4kl25niba@listener-9rj7xastto@192.168.0.15 ms=153
这样prometheus的指标为l7xgw_conn,tag可以多个,可以表示不同的listener或者不同的upstream
计算请求耗时语句为increase(l7xgw_ms)/increase(l7xgw_conn),展示结果为
方案2,使用nginx内存数据
telegraf监控nginx,github上新版本已经支持nginx的不同模块作为输入
插件nginx使用的是nginx_http_stub_status_module,字段较少
插件nginx_vts模块,l7xgw编译了该模块,monitor计算qps数据就是从该模块采集。
主要数据为链接数据
以及不同维度(filter,server,upstream,shared)的业务数据
测试验证:测试环境可以通过telegraf的配置
[[inputs.nginx_vts]]
urls = ["XXX/stats"]
[[outputs.http]]
url = "XXX/prometheus/api/v1/write"
data_format="prometheusremotewrite"
上传到Prometheus,查看对应的指标,总共390个数据较全。
使用测试环境grafana,并且1qps压测,每个请求耗时1s,grafana展示如图。
方案3,使用nginx日志
telegraf支持inputs.tail的方式,日志按照grok的语法进行分割。grok可以理解成写好的正则表达式,参考资料blog.csdn.net/qq_36025814/article/details/108820679。
测试验证:最新日志格式如下图,telegraf的配置为
[[inputs.tail]]
files = ["/usr/local/LB7XGW/logs/access_log"]
from_beginning = false
grok_patterns = ["%{NGINX_ACCESS_LOG}"]
name_override = "nginx_access_log"
grok_custom_pattern_files = []
grok_custom_patterns = '''
NGINX_ACCESS_LOG \"%{TIMESTAMP_ISO8601:timestamp}\" \"(-|%{IP:proxy_addr})\" \"(-|%{NUMBER:proxy_port})\" \"(-|%{IP:proxy_server_addr})\" \"(-|%{NUMBER:proxy_server_port})\" \"(-|%{NUMBER:vni})\" \"%{NUMBER:pid}\" \"%{IP:remote_addr}\" \"%{DATA:server_name}\" \"%{DATA:http_host}\" \"%{WORD:request_method}\" \"%{URIPATHPARAM:request}\" \"%{DATA:server_protocol}\" \"%{NUMBER:request_length}\" \"%{NUMBER:bytes_sent}\" \"%{WORD:protocol_type}\" \"%{NUMBER:status}\" \"%{NUMBER:upstream_status}\" \"%{DATA:http_referer}\" \"%{DATA:http_user_agent}\" \"%{DATA:http_x_forwarded_for}\" \"%{DATA:upstream_addr}\" \"%{NUMBER:request_time}\" \"%{NUMBER:upstream_connect_time}\" \"%{NUMBER:upstream_header_time}\" \"%{NUMBER:upstream_response_time}\" \"%{NUMBER:tcpinfo_rtt}\" \"%{NUMBER:connection}\" \"%{NUMBER:connection_requests}\" \"%{DATA:ssl_protocol}\" \"%{DATA:ssl_cipher}\" \"%{DATA:ssl_session_reused}\" '''
data_format = "grok"
经过测试发现这样可以输出到文件中,但是格式是influxdb,和Prometheus不兼容。
使用grok_exporter可以进行格式的转换,转成Prometheus的metric。
grok_exporter可以实时的监控nginx access日志(类似于tail -f),然后根据grok匹配,转成自定义的Prometheus metric格式
grok配置如下,可以配置多个type,label的条件可以根据需要配置
- type: counter
name: nginx_request_time
labels:
timestamp: '{{.timestamp}}'
request_time: '{{.request_time}}'
Prometheus监控显示如图
grok_exporter目前只支持作为server,由Prometheus拉取。
方案4,部署influxdb。
这个需要部署influxdb集群。
测试验证:
[[outputs.influxdb_v2]]
urls = ["XXX"]
token = "XXX"
organization = "test"
bucket = "test"
显示结果