graphs of performance analytics on a laptop screen

← INSIGHTS & PERSPECTIVES | DevOps

Prometheus 如何查看監控目標的 exporter 資訊

說明 Prometheus Targets、Service Discovery、Kubernetes kubelet exporter 權限與 ServiceMonitor 排查方式。

Prometheus 要查看 exporter 資訊,通常先從網頁介面的 Targets 頁面確認目前 scrape 的監控目標,再進入 Service Discovery 檢查服務是否被正確發現。若 exporter endpoint 需要 Kubernetes 認證,就必須帶 token 才能直接讀到 metrics。

Prometheus Target 是什麼?

Prometheus Target 是 Prometheus 定期抓取 metrics 的監控目標。Target 通常由 exporter 暴露 HTTP endpoint,Prometheus 會依設定定期呼叫 endpoint 並收集服務狀態資料。

Service Monitoring 可以監控服務可用性、吞吐量、延遲、錯誤率與請求數量。對 Kubernetes 服務來說,Target 是否出現,通常能直接反映 Service、ServiceMonitor、label selector 與 namespace selector 是否搭配正確。

Prometheus Target 可用來觀察:

  • 服務是否正常回應。
  • exporter endpoint 是否能被 Prometheus 抓取。
  • scrape 是否成功,以及失敗原因。
  • Service Discovery 是否找到預期服務。

如何瀏覽 exporter 回傳內容?

Prometheus exporter 內容可從 Targets 頁面找到 endpoint,再直接開啟 metrics URL。若 Target 沒有正確出現,應先到 Service Discovery 頁籤檢查服務發現結果。

原文截圖沒有在 `markdown-export/uploads` 找到,所以這裡保留操作邏輯:先看 Targets,確認 job、endpoint、status 與 last scrape;再看 Service Discovery,確認 label 與 namespace 是否符合設定。

常見檢查順序:

  1. 進入 Prometheus 網頁介面的 `Status > Targets`。
  2. 找到對應 job 或 ServiceMonitor 產生的 target。
  3. 點開 endpoint 或複製 metrics URL。
  4. 如果 target 不存在,改看 `Status > Service Discovery`。
  5. 比對 Service label、ServiceMonitor selector 與 namespaceSelector。

kubelet exporter 為什麼不能直接讀?

Kubernetes kubelet metrics endpoint 通常需要叢集認證。直接讀 `https://127.0.0.1:10250/metrics/cadvisor` 可能失敗,因為 kubelet 不會接受未授權請求。

在 Rancher monitoring 環境中,Prometheus 可能透過 `rancher-monitoring-kubelet` 取得 Pod 狀態。若要手動呼叫 kubelet exporter,原文做法是先取得 monitoring namespace 的 token,再用 Bearer token 呼叫 endpoint。

```bash

kubectl get secret -n cattle-monitoring-system

kubectl -n cattle-monitoring-system get secret rancher-monitoring-prometheus-token-hvlqt \

-o jsonpath={.data.token} | base64 -d

curl https://127.0.0.1:10250/metrics/cadvisor \

-k \

-H "Authorization: Bearer token_content_xxxxxxxxx"

```

ServiceMonitor 抓不到目標要查哪裡?

ServiceMonitor 抓不到監控目標時,最常見原因是 selector 對不到 Service label,或 namespaceSelector 沒有包含 Service 所在 namespace。ServiceMonitor 監控的是 Service,不是直接用 Pod label。

下面是原文提供的 ServiceMonitor 範例:

```yaml

apiVersion: monitoring.coreos.com/v1

kind: ServiceMonitor

metadata:

generation: 4

labels:

app.kubernetes.io/instance: srs-json-exporter

manager: agent

operation: Update

name: json-exporter

namespace: stu-srs

spec:

endpoints:

  • interval: 30s

params:

module:

  • default

target:

  • http://127.0.0.1:1985/api/v1/streams/

port: json-exporter

jobLabel: jobLabel

namespaceSelector:

matchNames:

  • stu-srs

selector:

matchLabels:

app.kubernetes.io/instance: srs-json-exporter

```

排查時我會先確認三件事:Service 是否有 `app.kubernetes.io/instance: srs-json-exporter` 這個 label、Service 是否真的在 `stu-srs` namespace、Service port 名稱是否叫 `json-exporter`。

常見問題

QPrometheus Targets 頁面看不到服務怎麼辦?

先到 Service Discovery 頁面確認服務是否被發現。若 Service Discovery 也沒有出現,多半是 namespaceSelector 或 selector 沒有對到。

QServiceMonitor 的 selector 是選 Pod 還是 Service?

ServiceMonitor 的 selector 是選 Service。即使 Pod label 正確,只要 Service label 不符合,Prometheus Operator 就不會產生預期 target。

Qkubelet metrics endpoint 為什麼需要 token?

kubelet endpoint 會暴露節點與容器相關 metrics,通常受 Kubernetes 認證保護。手動讀取時要使用具備權限的 Bearer token。

Q`curl -k` 是必要的嗎?

`curl -k` 是略過 TLS 憑證驗證,常用於內部測試。正式環境應盡量使用可信憑證,避免把略過憑證驗證當成長期做法。

參考資料

  • Prometheus Documentation, Jobs and instances: <https://prometheus.io/docs/concepts/jobs_instances/>
  • Prometheus Operator Documentation, ServiceMonitor: <https://prometheus-operator.dev/docs/api-reference/api/>
  • Kubernetes Documentation, kubelet authentication/authorization: <https://kubernetes.io/docs/reference/access-authn-authz/kubelet-authn-authz/>

最後更新

Thu Apr 13 2023 08:00:00 GMT+0800 (Taiwan Standard Time)

延伸閱讀

關於作者 {#author}

Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。

首次發布:2023-04-13