DevOps課程-Prometheus 15

監控自己的應用程式(PART I),透過Prometheus Client Library蒐集暴露Metrics資料

ZONGRU Li
9 min readOct 31, 2022

前面到目前為止,已經完成了以下項目的監控設置:

  1. K8S Component
  2. K8S Nodes,也就是機台的資源使用
  3. 開箱即用(out-of-box)監控Prometheus Stack本身(Alertmanage,Prometheus Operator…etc)
  4. 第三方應用程式 — 如Redis

現在還缺少監控的是自己的應用程式專案的監控

接下來例子是一個Nodejs專案進行監控

但是有幾項需要解決的問題:

  • 自己的應用程式沒有exporter來蒐集Metrics資料
  • 當然我們還得要自己定義Metrics資料

這時候就會想找找是不是有客製化的解決方案!?

→找該應用程式對應的"Prometheus Client Library"

Prometheus Client Library:

  • 有對應各種不同的程式語言
  • 用以抽象化的介面,暴露Metrics資訊
  • 而這些Metrics資訊是以時間序列化(Time Series)格式的方式暴露給Prometheus去讀取
  • 也就是Library實作成Prometheus metric type:
  • 1.Counter
  • 2.Gauge
  • 3.Histogram
  • 4.Summary
  • 再重複一次,各種不同程式語言有各自對應的PrometheusLibrary
  • 這些Library用以暴露應用程式的Metrics資訊

後面就是簡單用一個Nodejs程式專案來當範例,其步驟如下:

  1. 使用NodejsPromethus client library暴露其Metrics資訊到/metrics
  2. 佈署該Nodejs應用程式
  3. 設置Prometheus來搜集新的Target(也就是設置serviceMonitor元件)
  4. 將獲得的Metrics資料在Grafana Dashboard上以視覺化呈現

架構大致如下:

並且整個架構都是佈署在K8S Cluster裡面,這邊用的是EKS

1.Expose Metrics — Nodejs Client Library:

依據課程準備寫的,所使用的程式專案是以下:

我有fork一份到自己的GitLab

如果本機有裝node的話

#執行以下node指令即可在本機看到網頁:
cd {到有package.json目錄}
npm install
node ./app/server.js

隨便起了一台ubuntu來用:

裝好nodejs & npm

然後防火牆有開的話,就可以看到:

接下來這邊決定要做的Metrics有兩個:

  1. 被請求的數量
  2. 每個請求所花費的時間

以一位DevOps工程師角度或是K8S Admin角度來說

我們通常需要監控應用程式,所以要要求開發者在應用程式中暴露Metrix資訊

而開發者就要找到PrometheusClinet Library進行相關設置

以下就假設已通知開發者要做相關程式內的設置

所以我們可以簡單分析一下程式內容:

其來源可以google找"prometheus client nodejs npm":

LINK

往下拉會看到相關使用解說(不過nodejs我不熟...):

然後程式內容可以看到 →server.js:

以上僅僅只是宣告了我們要得兩個Metrics資訊

實際上的統計則要靠後面的程式碼:

以開發者角度而言,其職責在於:

  1. 定義Metric
  2. 在程式邏輯內追蹤該值

而最後這些Metrics資訊要暴露在其位置的/metrics這個URI上:

所以這時候可以連到以下位置看到相關資訊

如上圖內容很多,因為還有預設的metrics資訊,上面code也有暴露出來

往下也能找到我們額外定義的兩個Metrics內容:

這時候進去原本的3000 PORT首頁:

然後回去metrics頁面刷新:

以上對程式以及引用的Prometheus Client Library

來暴露metrics資訊的方式就有大概了解

再來就是要把這個程式想辦法佈署到K8S上面

並且實際串接Prometheus來做監控,設置Alert Rule,甚至視覺化到Grafana

打包成Docker image,並且推到Repo上:

fork來的程式專案內,還有包含道Dockerfile:

所以接著就來打包

#執行以下指令進行image封裝(記得改帳號):
docker build -t nanajanashia/demo-app:nodeapp .

簡單確認:

docker images

再來要推上Repo前要登入才能推

#登入(填帳號密碼):
docker login
#推(記得改帳號部分):
docker push nanajanashia/demo-app:nodeapp

然後到dockerhub上看到:

這邊如果有做CICD PIPELINE設置的話

一般當Code進行commitGit Repo後,就會觸發打包成image儲存了

佈署應用程式到K8S Clsuter內:

這邊可以看到該程式專案也有寫好的Deployment yaml內容:

Service yaml部分:

當前完整兩個K8S元件yaml內容如下:

#取得docker server位置,等等後面建立拉image的secret要用:
docker info
#如上這時候有一行是Registry的位置的URL#簡單建立取用image的帳密SECRET:
kubectl create secret docker-registry my-registry-key --docker-server={上面Registry的URL值} --docker-username=nanajanashia --docker-password={這邊填密碼}
#上面指令實際組出來就是:
kubectl create secret docker-registry my-registry-key --docker-server=https://index.docker.io/v1/ --docker-username=nanajanashia --docker-password={密碼}
借用docker官方的docker info指令畫面
#接著就是佈署上述兩個K8S元件:
kubectl apply -f k8s-config.yaml
#這時候可以確認(這邊就沒有再佈署google的微服務專案了,比較乾淨):
kubectl get pod
#確認service:
kubectl get svc
看到nodeapp

(這邊目前重建的Cluster省去前面googleonline-shop那一堆微服務程式)

#快速本機確認:
kubectl port-forward svc/nodeapp 3000:3000
失敗,忘了要調image位置

上面Deployment設定檔裡面的image是講師的

我這邊調整成我自己dockerhub那份後重新apply

#快速調整成自己dockerhub的image:
kubectl apply -f k8s-config.yaml

再重跑port-forward:

這時候就可以點開web打開來看:

127.0.0.1:3000

成功!

也可以看看metrics資訊:

localhost:3000/metrics

後面再來就是設置讓Prometheus開始抓取這個Target

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet