昨天將可觀測性的第二隻本柱:trace
完成之後,今天開始準備來實踐最後一根柱子:metrics
。筆者在多年前協助組織建立Kong
API Management 解決方案時,其實同樣的也將 Promethus
與Grafana
也建置了起來。但也老實說,在初建立的時候筆者只有覺得一個帥字,因為可以透過儀表板將可以量測到的項目漂亮的展現出來,並且透過告警瓶頸將警告送出到公司的Teams
頻道中,突然自己覺得對於Kong
平台的掌控度提升了好幾個等級,好像很厲害。
然後?然後就沒有了。
因為例行性的維運上,筆者還是不斷協助開發同仁設定、查錯或是確認認證授權問題,鮮少打開Grafana
來觀看各式各樣的儀表板。開最多的還是Kibana
來查找Log訊息,並且回饋給維運的同仁發生了甚麼事情。
回頭想想,筆者認為在該環境中原生的架構並不複雜,而且環境中對於高併發壓力的情況並不多見。因此很少會特別需要去注意到,在各個環境中是不是有異常被量測到的行為。就跟trace
一樣,如果沒有遇到劇烈天氣之前,都不會認知到地下水道工程的重要性。
不論如何,可觀測性的三本柱還是協助維運的重要項目,就讓這篇系列文繼續介紹下去,如何將metrics
實踐在這次的題目中。
圖 13-1 metrics 架構
實踐到了第三根本柱,架構示意圖越來越複雜了,這次特別將連接到新增節點的各指向,都用紅色標註出來,讓讀者可以更清楚理解這次新增的不同角色與資料流。
http://localhost:8000/my-service
發送請求。kong.yml
的設定,將請求轉發到後端的 .NET API。http-log
Plugin,將每筆請求的紀錄發送到 Elasticsearch。opentelemetry
Plugin,將追蹤資料發送到 OpenTelemetry Collector。promethus
Plugin,將量測資料暴露在8001 port
,讓 promethus
服務透過不斷觀測的方式,將量測資料存入本體。 <=本次新增
Serilog
將結構化的日誌直接寫入 Elasticsearch。OpenTelemetry SDK
將追蹤資料發送到 OpenTelemetry Collector。OpenTelemetry SDK
將量測資料發送到 OpenTelemetry Collector。 <=本次新增
8889
port暴露給promethus
提供拉取。<=本次新增
Kong(8001 port)
以及API 送到 OTEL(8889 port)
的metric
資料,並提供給Grafana
的UI ,讓管理者可以透過dashboard 查詢與分析。<=本次新增
示範目錄請切換到 ironman2025\case_ELK_Jaeger_Promethus_Grafana\
同樣的,先從這次有異動的 Docker Compose開始,關注到示範專案下的 docker-compose.yaml
,這次新增的區塊如下:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
networks:
- kong-net
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
networks:
- kong-net
ports:
- "3000:3000"
volumes:
- ./grafana/provisioning/:/etc/grafana/provisioning/
- grafana_data:/var/lib/grafana
environment:
- GF_SMTP_ENABLED=true
- GF_SMTP_HOST=smtp.gmail.com:587
- GF_SMTP_USER=你的Gmail帳號
- GF_SMTP_PASSWORD=你的Gmail應用程式密碼
- GF_SMTP_FROM_ADDRESS=你的Gmail帳號
- GF_SMTP_FROM_NAME=Grafana
- GF_SMTP_SKIP_VERIFY=true
networks:
... 省略...
volumes:
esdata:
driver: local
prometheus_data:
driver: local
grafana_data:
driver: local
上面這段簡單節錄一些重點說明,重點著重在架構圖上的相關開放port
為主。
接下來請關注到示範資料夾中prometheus
的相關設定,路徑:case_ELK_Jaeger_Promethus_Grafana\prometheus\prometheus.yml
,並將內容節錄說明如下:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'kong'
metrics_path: /metrics
static_configs:
- targets: ['kong-dbless:8001']
- job_name: 'otel-collector-APIProvider'
metrics_path: /metrics
static_configs:
- targets: ['opentelemetry-collector:8889']
可以注意到prometheus
分別去持續執行三個工作,分別是:
prometheus
targets
: localhost:9090
。targets
: kong-dbless:8001
。kong
開放出來的 8001 port。otel-collector-APIProvider
targets
: opentelemetry-collector:8889
。OTEL Collector
所開放出來的metrics。由於 OTEL Collector
準備要協助API Provider抓取metrics
資料,提供給Prometheus
取得,因此也要調整相關的設定,請關注到 case_ELK_Jaeger_Promethus_Grafana\otel-collector-config.yaml
,筆者將詫異處標註出來:
...上方省略...
exporters:
...
prometheus:
endpoint: "0.0.0.0:8889"
service:
pipelines:
...
metrics:
...
exporters: [debug, prometheus]
...下方省略...
可以看到這次設定檔新增的內容,為了要可以承接 API Provider,因此新增了8889
port提供prometheus
使用,並在metrics
區塊新增了prometheus
輸出類型。
接下來請關注到示範資料夾中grafana
的相關設定,路徑:case_ELK_Jaeger_Promethus_Grafana\grafana\provisioning\datasources\datasource.yml
,並將內容節錄說明如下:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
這段設定是 Grafana 的資料來源(datasource)自動化設定檔,簡單說明如下:
今天一口氣地將所有新增的相關結點設定檔,都說明了一遍,明天將來說明,關於在Kong 中的plugin
的調整,以及API應該要調整的程式內容,還請期待~