基於 prometheus 的微服務指標監控

Kevin Wan發表於2020-11-02

服務上線後我們往往需要對服務進行監控,以便能及早發現問題並做針對性的優化,監控又可分為多種形式,比如日誌監控,呼叫鏈監控,指標監控等等。而通過指標監控能清晰的觀察出服務指標的變化趨勢,瞭解服務的執行狀態,對於保證服務穩定起著非常重要的作用

prometheus是一個開源的系統監控和告警工具,支援強大的查詢語言 PromQL 允許使用者實時選擇和匯聚時間序列資料,時間序列資料是服務端通過 HTTP 協議主動拉取獲得,也可以通過中間閘道器來推送時間序列資料,可以通過靜態配置檔案或服務發現來獲取監控目標

Prometheus 的架構

Prometheus 的整體架構以及生態系統元件如下圖所示:

prometheus

Prometheus Server 直接從監控目標中或者間接通過推送閘道器來拉取監控指標,它在本地儲存所有抓取到樣本資料,並對此資料執行一系列規則,以彙總和記錄現有資料的新時間序列或生成告警。可以通過 Grafana 或者其他工具來實現監控資料的視覺化

go-zero 基於 prometheus 的服務指標監控

go-zero 框架中整合了基於 prometheus 的服務指標監控,下面我們通過 go-zero 官方的示例shorturl來演示是如何對服務指標進行收集監控的:

  • 第一步需要先安裝 Prometheus,安裝步驟請參考官方文件
  • go-zero 預設不開啟 prometheus 監控,開啟方式很簡單,只需要在 shorturl-api.yaml 檔案中增加配置如下,其中 Host 為 Prometheus Server 地址為必填配置,Port 埠不填預設 9091,Path 為用來拉取指標的路徑預設為/metrics
Prometheus:
  Host: 127.0.0.1
  Port: 9091
  Path: /metrics
  • 編輯 prometheus 的配置檔案 prometheus.yml,新增如下配置,並建立 targets.json

    - job_name: 'file_ds'
    file_sd_configs:
    - files:
      - targets.json
    
  • 編輯 targets.json 檔案,其中 targets 為 shorturl 配置的目標地址,並新增了幾個預設的標籤

    [
    {
        "targets": ["127.0.0.1:9091"],
        "labels": {
            "job": "shorturl-api",
            "app": "shorturl-api",
            "env": "test",
            "instance": "127.0.0.1:8888"
        }
    }
    ]
    
  • 啟動 prometheus 服務,預設偵聽在 9090 埠

    prometheus --config.file=prometheus.yml
    
  • 在瀏覽器輸入http://127.0.0.1:9090/Status,然後點選 -> Targets 即可看到狀態為 Up 的 Job,並且 Lables 欄可以看到我們配置的預設的標籤

job狀態為up

通過以上幾個步驟我們完成了 prometheus 對 shorturl 服務的指標監控收集的配置工作,為了演示簡單我們進行了手動的配置,在實際的生產環境中一般採用定時更新配置檔案或者服務發現的方式來配置監控目標,篇幅有限這裡不展開講解,感興趣的同學請自行檢視相關文件

go-zero 監控的指標型別

go-zero 中目前在 http 的中介軟體和 rpc 的攔截器中新增了對請求指標的監控。

主要從請求耗時和請求錯誤兩個維度,請求耗時採用了 Histogram 指標型別定義了多個 Buckets 方便進行分位統計,請求錯誤採用了 Counter 型別,並在 http metric 中新增了 path 標籤 rpc metric 中新增了 method 標籤以便進行細分監控。

接下來演示如何檢視監控指標:

首先在命令列多次執行如下命令

curl -i "http://localhost:8888/shorten?url=http://www.xiaoheiban.cn"

開啟 Prometheus 切換到 Graph 介面,在輸入框中輸入{path="/shorten"}指令,即可檢視監控指標,如下圖

查詢皮膚

我們通過 PromQL 語法查詢過濾 path 為/shorten 的指標,結果中顯示了指標名以及指標數值,其中 http_server_requests_code_total 指標中 code 值為 http 的狀態碼,200 表明請求成功,http_server_requests_duration_ms_bucket 中對不同 bucket 結果分別進行了統計,還可以看到所有的指標中都新增了我們配置的預設指標

Console 介面主要展示了查詢的指標結果,Graph 介面為我們提供了簡單的圖形化的展示介面,在實際的生產環境中我們一般使用 Grafana 做圖形化的展示

grafana 視覺化介面

grafana是一款視覺化工具,功能強大,支援多種資料來源 Prometheus、Elasticsearch、Graphite 等,安裝比較簡單請參考官方文件,grafana 預設埠 3000,安裝好後再瀏覽器輸入http://localhost:3000/admin,預設賬號和密碼都為

下面演示如何基於以上指標進行視覺化介面的繪製:

  • 點選左側邊欄 Configuration->Data Source->Add data source 進行資料來源新增,其中 HTTP 的 URL 為資料來源的地址

datasource

  • 點選左側邊欄新增 dashboard,然後新增 Variables 方便針對不同的標籤進行過濾篩選比如新增 app 變數用來過濾不同的服務

variables

  • 進入 dashboard 點選右上角 Add panel 新增皮膚,以 path 維度統計介面的 qps

qps

  • 最終的效果如下所示,可以通過服務名稱過濾不同的服務,皮膚展示了 path 為/shorten 的 qps 變化趨勢

qps_panel

總結

以上演示了 go-zero 中基於 prometheus+grafana 服務指標監控的簡單流程,生產環境中可以根據實際的場景做不同維度的監控分析。現在 go-zero 的監控指標主要還是針對 http 和 rpc,這對於服務的整體監控顯然還是不足的,比如容器資源的監控,依賴的 mysql、redis 等資源的監控,以及自定義的指標監控等等,go-zero 在這方面後續還會持續優化。希望這篇文章能夠給您帶來幫助

專案地址

https://github.com/tal-tech/go-zero

微信交流群

微信交流群

更多原創文章乾貨分享,請關注公眾號
  • 基於 prometheus 的微服務指標監控
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章