Prometheus 監控 Nginx 流量 (三)


介紹

基於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

有興趣的可以看看啊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM