基于Openresty和Prometheus、Consul、Grafana设计的,实现了针对域名和Endpoint级别的流量统计,使用Consul做服务发现、KV存储,Grafana做性能图展示。
最终展现图
POST Json 注册服务 -> Consul Service <- Prometheus -> 定时抓取 http指标接口 Nginx
POST KV 提交Endpoint -> Consul KV Service <- Nginx 定时更新需要监控的Endpoint
Grafana 读取 -> Prometheus
本项目是基于Openresty开发,所以事先安装好Openresty,这个非常简单。
安装Consul,这是基于golang开发的服务自动发现工具,详细查看官方文档。https://www.consul.io/
安装Prometheus,这是一个时序数据库和监控工具,性能和存储十分可靠,把Prometheus配置发现服务使用Consul。官方文档:https://prometheus.io/docs/operating/configuration/#
安装Grafana。https://grafana.com/
克隆 lua-nginx-prometheus 仓库到Openresty服务器上。
克隆依赖Prometheus nginx-lua-prometheus 仓库到服务器上。
克隆依赖Consul lua-resty-consul 仓库到服务器上。
把lua-nginx-prometheus仓库中的 counter.conf文件复制到Openresty目录下的nginx/conf/conf.d目录内。
lua_package_path "/Users/zl/Work/Counter/nginx-lua-prometheus/?.lua;;/Users/zl/Work/Counter/lua-resty-consul/lib/resty/?.lua;;/Users/zl/Work/Counter/lib/?.lua;;";
修改lua_package_path参数,把 lua-nginx-prometheus、nginx-lua-prometheus、lua-resty-consul三个目录位置指定,目录下一定是包含 ?.lua。
consul_host = "<Your consul host ip>"
consul_port = <Your consul port>
把consul的地址和端口替换上。
server {
listen 9145;
allow 127.0.0.1;
deny all;
access_log off;
location /metrics {
content_by_lua 'prometheus:collect()';
}
}
添加allow 允许指定ip访问 指标接口。
启动Openresty后,试试 http://
详细参考这个文档
https://prometheus.io/docs/operating/configuration/#
完成后,通过Consul 的 http API进行注册服务。
curl -X PUT -d @test.json http://:/v1/agent/service/register
{
"ID": <定义唯一的ID>,
"Name": "对应prometheus consul_sd_config",
"Tags": [
""
],
"Address": ,
"Port": 9145
}
注销服务
curl http://<ip>:<port>/v1/agent/service/deregister/<ID>
增加域名和对应的Endpoint
curl --request PUT --data @test.json http://<ip>:<port>/v1/kv/domain/<api.qq.com>/routers
数组
[
"/users/[0-9]+/followers/",
"/users/[0-9]+/",
"/users/[0-9]+/comments/",
"/news"
]
详细文档参考 https://prometheus.io/docs/visualization/grafana/
常见查询语句
sum(irate(nginx_http_request_duration_seconds_count{host="api.qq.com"}[5m])) by (status)
多台服务器合计每秒请求量,查询单个域名,group by 用状态码
sum(rate(nginx_http_request_duration_seconds_sum{host="api.qq.com",endpoint!="/ws"}[1m])) / sum(rate(nginx_http_request_duration_seconds_count{host="api.qq.com",endpoint!="/ws"}[1m]))
接口平均响应时间, 不包含 websocket接口
histogram 直方图非常有用,可以详细了解一下。
topk(5, sum(rate(nginx_http_request_duration_seconds_sum{host="api.qq.com",endpoint!="/ws"}[1h])) by (endpoint)/sum(rate(nginx_http_request_duration_seconds_count{host="api.qq.com",endpoint!="/ws"}[1h])) by (endpoint))
5个响应时间最大的,不包含 websocket接口
代码已经放到github上了
https://github.com/vovolie/lua-nginx-prometheus