Prometheus 介紹與基礎入門 (下)

Prometheus 介紹與基礎入門 (下)

Prometheus 介紹與基礎入門 (下)

Job 與 Instance

Prometheus 中會將任意獨立資料來源(Target)稱為 Instance。而包含多個相同 Instance 的集合稱為 Job。如以下範例:

- job: api-server - instance 1: 1.2.3.4:5670 - instance 2: 1.2.3.4:5671 - instance 3: 5.6.7.8:5670 - instance 4: 5.6.7.8:5671
  • Instance: 被抓取目標 URL 的<host>:<port>部分。
  • Job: 一個同類型的 Instances 集合。(主要確保可靠性與擴展性)

PromQL

PromQL (Prometheus Query Language)是 Prometheus 的資料查詢 DSL 語言,該語言提供許多內建函式,在資料視覺化與 Rule alert 中都會使用到,更多 PromQL 語法可以參考官方 Querying 頁面。

Prometheus 簡單部署與使用

Prometheus 官方提供了已建構完成的二進制執行檔可以下載,只需要至 Download 頁面下載即可。首先下載符合作業系統的檔案,這邊以 Linux 為例:

$ wget https://github.com/prometheus/prometheus/releases/download/v2.3.0/prometheus-2.3.0.linux-amd64.tar.gz $ tar xvfz prometheus-*.tar.gz $ tree prometheus-2.3.0.linux-amd64 ├── console_libraries # Web console templates │   ├── menu.lib │   └── prom.lib ├── consoles # Web console templates │   ├── index.html.example │   ├── node-cpu.html │   ├── node-disk.html │   ├── node.html │   ├── node-overview.html │   ├── prometheus.html │   └── prometheus-overview.html ├── LICENSE ├── NOTICE ├── prometheus # Prometheus 執行檔 ├── prometheus.yml # Prometheus 設定檔 └── promtool # 2.x+ 版本用來將一些 rules 格式轉成 YAML 用。

解壓縮完成後,編輯prometheus.yml檔案來調整設定:

global: scrape_interval: 15s # 設定預設 scrape 的拉取間隔時間 external_labels: # 外通溝通時標示在 time series 或 Alert 的 Labels。 monitor: 'codelab-monitor' scrape_configs: # 設定 scrape jobs - job_name: 'prometheus' scrape_interval: 5s # 若設定間隔時間,將會覆蓋 global 的預設時間。 static_configs: - targets: ['localhost:9090']

完成後,直接執行 prometheus 檔案來啟動伺服器:

$ ./prometheus --config.file=prometheus.yml --storage.tsdb.path /tmp/data ... level=info ts=2018-06-19T08:46:37.42756438Z caller=main.go:500 msg="Server is ready to receive web requests."

–storage.tsdb.path 預設會直接存放在./data底下。

啟動後就可以瀏覽 :9090 來查看 Web-based console。

另外也可以進入 :9090/metrics 查看 Export metrics 資訊,並且可以在 console 來查詢指定 Metrics,並以圖表呈現。

Prometheus 提供了 Functional Expression Language 進行查詢與聚合時間序列資料,比如用sum(http_requests_total{method=”GET”} offset 5m)來查看指定時間的資訊總和。

Prometheus 提供拉取第三方或者自己開發的 Exporter metrics 作為監測資料,這邊可以透過簡單的 Go Client 範例來簡單部署 Exporter:

$ git clone https://github.com/prometheus/client_golang.git $ cd client_golang/examples/random $ go get -d $ go build

完成後,開啟三個 Terminals 分別啟動以下 Exporter:

# terminal 1 $ ./random -listen-address=:8081 # terminal 2 $ ./random -listen-address=:8082 # terminal 3 $ ./random -listen-address=:8083

啟動後可以在:8081等 Ports 中查看 Metrics 資訊。

確定沒問題後,修改prometheus.yml來新增 target,並重新啟動 Prometheus Server:

global: scrape_interval: 15s # 設定預設 scrape 的拉取間隔時間 external_labels: # 外通溝通時標示在 time series 或 Alert 的 Labels。 monitor: 'codelab-monitor' scrape_configs: # 設定 scrape jobs - job_name: 'prometheus' scrape_interval: 5s # 若設定間隔時間,將會覆蓋 global 的預設時間。 static_configs: - targets: ['localhost:9090'] - job_name: 'example-random' scrape_interval: 5s static_configs: - targets: ['localhost:8080', 'localhost:8081'] labels: group: 'production' - targets: ['localhost:8082'] labels: group: 'canary'

啟動完成後,就可以 Web-console 的 Execute 執行以下來查詢:

avg(rate(rpc_durations_seconds_count[5m])) by (job, service)

另外 Prometheus 也提供自定義 Group rules 來將指定的 Expression query 當作一個 Metric,這邊建立一個檔案prometheus.rules.yml,並新增以下內容:

groups: - name: example rules: - record: job_service:rpc_durations_seconds_count:avg_rate5m expr: avg(rate(rpc_durations_seconds_count[5m])) by (job, service)

接著修改prometheus.yml加入以下內容,並重新啟動 Prometheus Server:

global: ... scrape_configs: ... rule_files: - 'prometheus.rules.yml'

global 與 scrape_configs 不做任何修改,只需加入rule_files即可,另外注意檔案路徑位置。

正常啟動後,就可以看到新的 Metric 被加入。

Refers

文: 白凱仁 迎棧科技資深工程師