介紹
基於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
優點
- 基本實現自動化集中配置,各種接口使用非常簡單
- 通過Prometheus提供了非常豐富的查詢維度,例如(域名、Endpoint、狀態碼、協議類型、method),當然還可以非常簡單地添加更多。
- Grafana圖表功能強大,非常直觀地查看各個服務的狀態和發現異常。
安裝和使用說明
本項目是基於Openresty開發,所以事先安裝好Openresty,這個非常簡單。
安裝Consul,這是基於golang開發的服務自動發現工具,詳細查看官方文檔。https://www.consul.io/
安裝Prometheus,這是一個時序數據庫和監控工具,性能和存儲十分可靠,把Prometheus配置發現服務使用Consul。官方文檔:https://prometheus.io/docs/operating/configuration/#<consul_sd_config>
安裝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目錄內。
編輯 counter.conf 文件
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://<ip>:9145/metrics
配置 Prometheus 服務發現功能
詳細參考這個文檔
https://prometheus.io/docs/operating/configuration/#<consul_sd_config>
完成后,通過Consul 的 http API進行注冊服務。
curl -X PUT -d @test.json http://<ip>:<port>/v1/agent/service/register
{
"ID": <定義唯一的ID>,
"Name": "對應prometheus consul_sd_config",
"Tags": [
""
],
"Address": <Openresty地址>,
"Port": 9145
}
注銷服務
curl http://<ip>:<port>/v1/agent/service/deregister/<ID>
配置 Consul KV存儲
增加域名和對應的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"
]
配置Grafana 到 Prometheus上讀取數據
詳細文檔參考 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
有興趣的可以看看啊。