昨天簡單介紹過 Prometheus 了,那麼今天我們就自己架一個來玩看看吧。嘗試任何一個新工具的第一個步驟,就是找看看他有沒有官方 image 可以用 (x)。目前 prometheus 在 docker hub 以及 quay 上面皆有 image repository,分別是 prom/prometheus
以及 prometheus/prometheus
,在使用上需要注意名稱的不同,但兩邊版本應該是一致的。
既然確定有 image 了,那麼下一步就是要來寫 docker compose 的 config 啦,參考官方文件,生出來的 config 如下:
version: "3.8"
services:
prometheus:
image: prom/prometheus:v2.30.0
volumes:
- ./prometheus/config:/etc/prometheus
- ./prometheus/data:/prometheus
ports:
- 9090:9090
networks:
default:
name: normal-oj_default
external: true
這邊我的做法是把希望把監控相關的服務都存放在同一個 repository 下面,所以我讓 Prometheus 的 volume 都放在 prometheus/
這個資料夾底下,另外雖然官方文件沒有提到 DB 路徑,不過根據官方的 Dockerfile,它會存在 container 的 /prometheus
底下。
網路設定的部分,因為有需要直接跟服務連線,所以要跟其他 container 掛在同一個 bridge network 底下,也就是這邊的 normal-oj_default
。
在開始服務之前還需要先建立 Prometheus 用的 config,從專案的根目錄來看會是下面這樣的結構,prometheus.yml
先留空就行,稍後會再設定,然而需要注意的是,prometheus/data/
的 owner 需要改成 nobody:nogroup
(命令是 sudo chown -R nobody:nogroup prometheus/data
),這樣 Prometheus 才有權限寫入,不然的話,使用 docker 的 managed volume 而不要選擇 bind mount 也是個選項,關於兩者的差異可以參考 docker 的官方文件。
prometheus/
├── config
│ └── prometheus.yml
└── data
處理好設定之後,執行 docker-compose up -d
應該就可以把 Prometheus 的 server 跑起來了,連上 http://localhost:9090
應該可以看到如下畫面。
然而現在一定是沒有數據的嘛,因為我們還沒有叫 Prometheus 去爬取任何資料,因此下個步驟是需要設定 prometheus.yml
,關於詳細的設定,可以參閱官方文件,後面我只會主要介紹用到的幾個參數而已,但 Prometheus 本身有非常豐富的選項。
要讓 Prometheus 去爬取 metrics,主要需要設定的就是 scrape_configs,因為 Prometheus 本身就有自帶 metrics 了,所以我們就先從它下手吧。寫出來的 config 長得會像這樣:
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ["localhost:9090"]
簡單講解一下這幾個設定的意義,scrape_configs
底下會是由 scrape_config
組成的陣列,每個 scrape_config
裡面需要設定一個唯一的 job_name
,這會用來自動幫爬取到的指標們上標籤,基本上可以把它當作一個獨特的 id 來用,可以參考官方文件的說明。
在 job_name
隔壁,static_configs
是一個由 static_config
物件組成的陣列,它們代表的是一些實際爬取的目標(使用 targets
陣列設定),並且會共享一些共用的標籤(使用 labels
)。
寫好之後,下 docker compose restart
重開服務,等個一陣子再打開網頁輸入 prometheus 應該可以看到如下圖所示的結果,我們已經成功的把一些 metrics 記錄下來了。
如果有設定多個 job 爬取同樣的 metrics 的話,可以看到查詢出來的結果會有 job 分類。
今天本來想順便把 exporter 跟 Alertmanager 的設定,不過開學之後果然時間就變得比較少了呢,看來得挪到明天再來寫這些部份了,希望不會被分成太多篇。