使用 Prometheus API 或 UI 查詢

部署 Google Cloud Managed Service for Prometheus 後,您可以查詢傳送至代管服務的資料,並在圖表和資訊主頁中顯示結果。

本文將說明指標範圍,這會決定您可以查詢的資料,以及下列 Prometheus 方式,用於擷取及使用所收集的資料:

  • Prometheus HTTP API
  • Prometheus UI

Managed Service for Prometheus 的所有查詢介面都已設定為使用 Cloud Monitoring API 從 Monarch 擷取資料。您可以查詢 Monarch,而非查詢本機 Prometheus 伺服器的資料,以便大規模進行全域監控。

事前準備

如果您尚未部署代管服務,請設定代管收集自行部署的收集。如果您只想使用 PromQL 查詢 Cloud Monitoring 指標,可以略過這項操作。

設定環境

為避免重複輸入專案 ID 或叢集名稱,請執行下列設定:

  • 請按照下列方式設定指令列工具:

    • 設定 gcloud CLI 以參照Google Cloud 專案的 ID:

      gcloud config set project PROJECT_ID
      
    • 設定 kubectl CLI 以使用叢集:

      kubectl config set-cluster CLUSTER_NAME
      

    如要進一步瞭解這些工具,請參閱下列資源:

設定命名空間

為範例應用程式中建立的資源建立 NAMESPACE_NAME Kubernetes 命名空間:

kubectl create ns NAMESPACE_NAME

驗證服務帳戶憑證

如果 Kubernetes 叢集已啟用 Workload Identity Federation for GKE,您可以略過本節。

在 GKE 上執行時,Managed Service for Prometheus 會根據 Compute Engine 預設服務帳戶,自動從環境中擷取憑證。預設服務帳戶具備必要權限 monitoring.metricWritermonitoring.viewer。如果您未為 GKE 使用 Workload Identity Federation,且先前已從預設節點服務帳戶移除其中任一角色,則必須重新加入缺少的權限,才能繼續操作。

設定 Workload Identity Federation for GKE 的服務帳戶

如果 Kubernetes 叢集未啟用 Workload Identity Federation for GKE,您可以略過本節。

Managed Service for Prometheus 會使用 Cloud Monitoring API 擷取指標資料。如果叢集使用 GKE 適用的工作負載身分聯盟,您必須將 Monitoring API 的權限授予 Kubernetes 服務帳戶。本節說明下列事項:

建立及繫結服務帳戶

這個步驟會出現在 Managed Service for Prometheus 說明文件的多個位置。如果您已在先前的任務中執行此步驟,則不必重複執行。請跳到「授權服務帳戶」一節。

下列指令序列會建立 gmp-test-sa 服務帳戶,並將其繫結至 NAMESPACE_NAME 命名空間中的預設 Kubernetes 服務帳戶:

gcloud config set project PROJECT_ID \
&&
gcloud iam service-accounts create gmp-test-sa \
&&
gcloud iam service-accounts add-iam-policy-binding \
  --role roles/iam.workloadIdentityUser \
  --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE_NAME/default]" \
  gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com \
&&
kubectl annotate serviceaccount \
  --namespace NAMESPACE_NAME \
  default \
  iam.gke.io/gcp-service-account=gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com

如果您使用的是其他 GKE 命名空間或服務帳戶,請視情況調整指令。

授權給服務帳戶

相關權限的群組會收集到角色中,您可以將角色授予主體,在本例中為 Google Cloud服務帳戶。如要進一步瞭解監控角色,請參閱「存取權控管」。

下列指令會授予 Google Cloud 服務帳戶 gmp-test-sa 所需的 Monitoring API 角色,以便讀取指標資料。

如果您已在先前的任務中授予 Google Cloud 服務帳戶特定角色,則不必再次執行。

如要授權服務帳戶讀取多專案指標範圍,請按照下列操作說明操作,然後參閱「變更要查詢的專案」。

gcloud projects add-iam-policy-binding PROJECT_ID \
  --member=serviceAccount:gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com \
  --role=roles/monitoring.viewer

對 GKE 適用的工作負載身分聯盟設定進行偵錯

如果您無法順利使用 Workload Identity Federation for GKE,請參閱相關文件,瞭解如何驗證 Workload Identity Federation for GKE 設定,以及Workload Identity Federation for GKE 疑難排解指南

由於輸入錯誤和部分複製貼上作業是設定 GKE 工作負載身分識別聯邦的常見錯誤來源,因此我們強烈建議您使用這些操作說明中程式碼範例中內嵌的可編輯變數和可點選的複製貼上圖示。

在實際工作環境中使用 Workload Identity Federation for GKE

本文所述範例會將 Google Cloud 服務帳戶繫結至預設 Kubernetes 服務帳戶,並授予 Google Cloud服務帳戶使用 Monitoring API 所需的所有權限。

在正式環境中,您可能會想採用更精細的方法,為每個元件建立服務帳戶,並為每個服務帳戶授予最基本的權限。如要進一步瞭解如何設定服務帳戶以管理工作負載身分,請參閱「使用 GKE 適用的工作負載身分聯盟」。

查詢和指標範圍

無論您使用哪種方法查詢資料,Cloud Monitoring 建構的指標範圍都會決定您可以查詢的資料。舉例來說,如果您使用 Grafana 查詢 Managed Service for Prometheus 資料,則必須將每個指標範圍設為獨立的資料來源。

監控指標範圍是僅限讀取時間的建構元件,可讓您查詢屬於多個 Google Cloud 專案的指標資料。每個指標範圍都由指定的 Google Cloud 專案代管,稱為範圍專案

根據預設,專案會是其指標範圍的限定範圍專案,而指標範圍包含該專案的指標和設定。限定範圍專案的指標範圍中,可能包含多個受監控專案,而限定範圍專案可查看指標範圍中所有受監控專案的指標和設定。監控專案也可以屬於多個指標範圍。

當您在限定範圍專案中查詢指標時,如果該限定範圍專案代管多專案指標範圍,您就能從多項專案擷取資料。如果指標範圍包含所有專案,查詢和規則會在全球範圍內評估。

如要進一步瞭解專案範圍和指標範圍,請參閱「指標範圍」。如要瞭解如何設定多專案指標範圍,請參閱「查看多項專案的指標」。

Cloud Monitoring 中的 Managed Service for Prometheus 資料

如要確認 Prometheus 資料是否已匯出,最簡單的方法就是使用支援 PromQL 的 Google Cloud 主控台中的 Cloud Monitoring Metrics Explorer 頁面。如需操作說明,請參閱「在 Cloud Monitoring 中使用 PromQL 進行查詢」。

獨立 Prometheus 前端 UI

您可以使用獨立的 Prometheus 前端 UI 存取及視覺化已攝入的資料。這個 UI 會根據與專案相關聯的指標範圍,針對Google Cloud 專案中的所有資料執行 PromQL 查詢。

前端 UI 也會做為驗證 Proxy,用於存取已攝入的資料。這項功能可用於不支援服務帳戶 OAuth2 的用戶端工具,包括 Grafana 或使用 prometheus-adapter 程式庫的水平 Pod 自動調整大小

強烈建議您使用資料來源同步器,設定 Grafana 以視覺化呈現 Managed Service for Prometheus 的資料。我們在此提供使用獨立 Prometheus 前端 UI 設定 Grafana 的操作說明,供先前以這種方式設定 Grafana 的使用者參考。

部署前端 UI

如要部署 Managed Service for Prometheus 的獨立式 Prometheus 前端 UI,請執行下列指令:

  1. 部署 frontend 服務,並將其設為查詢所選指標範圍的範圍專案

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.15.3/examples/frontend.yaml |
    sed 's/\$PROJECT_ID/PROJECT_ID/' |
    kubectl apply -n NAMESPACE_NAME -f -
    
  2. frontend 服務轉送至本機電腦。以下範例將服務轉送至通訊埠 9090:

    kubectl -n NAMESPACE_NAME port-forward svc/frontend 9090
    

    這個指令不會傳回,並在執行期間回報對網址的存取情形。

如果您想繼續使用由 kube-prometheus 安裝的 Grafana 部署作業,請改為在 monitoring 命名空間中部署獨立的 Prometheus 前端 UI。

您可以在瀏覽器中透過網址 http://localhost:9090 存取獨立的 Prometheus 前端 UI。如果您在這個步驟中使用 Cloud Shell,可以使用「Web Preview」按鈕取得存取權。

下圖顯示獨立 Prometheus 前端 UI 中的表格,其中顯示 up 指標:

在 Prometheus 介面中查看指標。

您也可以使用 Identity-Aware Proxy ���服務,在 frontend 服務上設定適當的驗證和授權。如要進一步瞭解如何公開服務,請參閱「使用服務公開應用程式」。

變更要查詢的專案,以便進行多專案監控

frontend 部署作業會使用已設定的 Google Cloud 專案做為範圍專案。如果這項專案是多專案指標範圍的限定範圍專案,則可讀取指標範圍內所有專案的指標。

您可以使用 --query.project-id 標記,指定具有多專案指標範圍的專案。

通常,您會使用專屬專案做為限定範圍專案,而這個專案與 frontend 部署作業執行的專案不同。如要讓部署作業讀取其他目標專案,您必須執行下列操作:

  • 告訴 frontend 部署哪個專案是目標專案。
  • 授予服務帳戶讀取目標專案的權限。如果您一直使用 Compute Engine default 服務帳戶,可以執行下列任一操作:

如要授予存取不同 Google Cloud 專案所需的權限,請執行下列操作:

  1. 授予服務帳戶權限,讓服務帳戶可讀取要查詢的目標專案:

    gcloud projects add-iam-policy-binding SCOPING_PROJECT_ID \
      --member=serviceAccount:gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/monitoring.viewer
    
  2. 開啟先前建立的 frontend 部署作業進行編輯:

    kubectl -n NAMESPACE_NAME edit deploy frontend
    
  3. 使用 --query.project-id 標記指定目標專案:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: NAMESPACE_NAME
      name: frontend
    spec:
      template
        containers:
        - name: frontend
          args:
          - --query.project-id=SCOPING_PROJECT_ID
    ...
    

    儲存檔案並關閉編輯器。套用變更後,前端 Pod 會重新啟動並查詢新的範圍專案。

驗證前端 UI

frontend 部署作業支援基本存取驗證,可在 0.5.0 以上版本中提供經過驗證的存取權。如要啟用驗證機制,請將 AUTH_USERNAMEAUTH_PASSWORD 環境變數新增至部署作業:

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: NAMESPACE_NAME
  name: frontend
spec:
  template
    containers:
    - name: frontend
      env:
      - name: AUTH_USERNAME
        value: USERNAME
      - name: AUTH_PASSWORD
        value: PASSWORD
...

明確提供憑證

如果您是在 Google Kubernetes Engine 叢集中執行 frontend 容器,可以略過本節。如果您在 GKE 上遇到驗證問題,請參閱「驗證服務帳戶憑證」一文。

在 GKE 上執行時,前端會根據節點的服務帳戶或 Workload Identity Federation for GKE 設定,自動從環境中擷取憑證。在非 GKE Kubernetes 叢集中,您必須使用標記或 GOOGLE_APPLICATION_CREDENTIALS 環境變數,明確向前端提供憑證。

  1. 將內容設定為目標專案:

    gcloud config set project PROJECT_ID
    
  2. 建立服務帳戶:

    gcloud iam service-accounts create gmp-test-sa
    

    這個步驟會建立服務帳戶,您可能已在 Workload Identity Federation for GKE 操作說明中建立此帳戶。

  3. 將必要權限授予服務帳戶:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com \
      --role=roles/monitoring.viewer
    

  4. 建立並下載服務帳戶金鑰:

    gcloud iam service-accounts keys create gmp-test-sa-key.json \
      --iam-account=gmp-test-sa@PROJECT_ID.iam.gserviceaccount.com
    
  5. 將金鑰檔案新增為非 GKE 叢集的密鑰:

    kubectl -n NAMESPACE_NAME create secret generic gmp-test-sa \
      --from-file=key.json=gmp-test-sa-key.json
    

  6. 開啟前端部署資源進行編輯:

    kubectl -n NAMESPACE_NAME edit deploy frontend
    
    1. 將粗體文字新增至資源:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        namespace: NAMESPACE_NAME
        name: frontend
      spec:
        template
          containers:
          - name: frontend
            args:
            - --query.credentials-file=/gmp/key.json
      ...
            volumeMounts:
            - name: gmp-sa
              mountPath: /gmp
              readOnly: true
      ...
          volumes:
          - name: gmp-sa
            secret:
              secretName: gmp-test-sa
      ...
      

    2. 儲存檔案並關閉編輯器。套用變更後,系統會重新建立 Pod,並開始使用指定的服務帳戶對指標後端進行驗證。

    或者,您可以使用 GOOGLE_APPLICATION_CREDENTIALS 環境變數設定金鑰檔案路徑,而非使用本範例中設定的旗標。

    透過前端 Proxy 使用 Grafana

    Managed Service for Prometheus 會使用 Grafana 內建的 Prometheus 資料來源,因此您可以繼續使用任何社群建立或個人建立的 Grafana 資訊主頁,無須進行任何變更。您也可以將 Grafana 資訊主頁匯入 Cloud Monitoring

    驗證 Google Cloud API

    Google Cloud API 都需要使用 OAuth2 進行驗證;不過,Grafana 不支援 Prometheus 資料來源所使用的服務帳戶的 OAuth2 驗證機制。如要搭配使用 Grafana 和 Managed Service for Prometheus,您可以使用獨立 Prometheus 前端 UI做為驗證 Proxy。

    您必須將 Grafana 指向獨立的前端 UI Proxy,才能在全球範圍內查詢資料。如果您未按照這些步驟操作,Grafana 只會針對本機 Prometheus 伺服器中的資料執行查詢。

    如果您尚未將 Prometheus UI frontend 服務部署為 Proxy,請執行下列指令來部署:

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.15.3/examples/frontend.yaml |
    sed 's/\$PROJECT_ID/PROJECT_ID/' |
    kubectl apply -n NAMESPACE_NAME -f -
    

    如果是 Anthos 叢集等非 GKE Kubernetes 叢集,請參閱「明確提供憑證」一文,為 frontend 服務提供查詢指標所需的權限。

    如要瞭解如何設定 frontend 服務用於跨多個專案查詢的指標範圍,請參閱「變更要查詢的專案」一文。

    如果您已部署 Grafana,例如透過 kube-prometheus 程式庫安裝,或是使用 Helm 圖表安裝,您可以繼續使用 Managed Service for Prometheus 的 Grafana。如果是,請參閱「設定資料來源」一文,瞭解後續步驟。否則,您必須先部署 Grafana。

    部署 Grafana

    如果叢集中沒有正在執行的 Grafana 部署作業,您可以建立暫時測試部署作業來進行實驗。

    如要建立暫時性的 Grafana 部署作業,請將 Managed Service for Prometheus grafana.yaml 資訊清單套用至叢集,然後將 grafana 服務透過通訊埠轉送至本機。以下範例會將服務轉送至通訊埠 3000。

    1. 套用 grafana.yaml 資訊清單:

      kubectl -n NAMESPACE_NAME apply -f  https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/beb779d32f4dd531a3faad9f2916617b8d9baefd/examples/grafana.yaml
      
    2. grafana 服務轉送至本機電腦。以下範例會將服務轉送至通訊埠 3000:

      kubectl -n NAMESPACE_NAME port-forward svc/grafana 3000
      

      這個指令不會傳回,並在執行期間回報對網址的存取情形。

      您可以在瀏覽器中透過網址 http://localhost:3000 存取 Grafana,並使用使用者名稱:密碼 admin:admin

    設定資料來源

    如要使用 Prometheus UI 做為驗證 Proxy,在 Grafana 中查詢 Managed Service for Prometheus,您必須在 Grafana 中新增資料來源。如要為代管服務新增資料來源,請按照下列步驟操作:

    1. 前往 Grafana 部署作業,例如瀏覽網址 http://localhost:3000 即可前往 Grafana 歡迎頁面。

    2. 從 Grafana 主選單中選取「Configuration」,然後選取「Data Sources」

      在 Grafana 中新增資料來源。

    3. 選取「新增資料來源」,然後選取 Prometheus 做為時間序列資料庫。

      新增 Prometheus 資料來源。

    4. 在「HTTP」窗格的「網址」欄位中,輸入 Managed Service for Prometheus frontend 服務的網址。如果您將 Prometheus 前端 UI 設定為在通訊埠 9090 上執行,則這個欄位的服務網址為 http://frontend.NAMESPACE_NAME.svc:9090

      在「HTTP」窗格的「逾時」欄位中,將值設為 120

      如果您使用基本驗證設定前端 UI 代理程式,請在「Auth」窗格中啟用「Basic auth」切換鈕,然後填入使用者名稱和密碼。

      在「查詢逾時」欄位中,將值設為 2m

      在「HTTP Method」欄位中,選取 GET

      在「Prometheus type」欄位中,選取 Prometheus

      在「Prometheus 版本」欄位中,選取 2.40.x 以上版本。

      如果您有多個 Prometheus 資料來源,可以為這個來源命名為「Managed Prometheus Service」。其他欄位則保留預設值。

      設定 Managed Service for Prometheus 資料來源。

    5. 按一下「儲存並測試」,然後查看「資料來源運作正常」訊息。

      測試 Managed Service for Prometheus 資料來源。

    使用新的資料來源

    您現在可以使用新的資料來源建立 Grafana 資訊主頁。您也可以將現有資訊主頁重新導向至新的資料來源。以下螢幕截圖顯示 Grafana 圖表,其中顯示 up 指標:

    Grafana 圖表,顯示 Managed Service for Prometheus 的 Up 指標。

    將 Managed Service for Prometheus 連結至 Thanos

    您可以使用開放原始碼的 thanos-promql-connector,將 Managed Service for Prometheus 與自行部署的 Thanos 堆疊進行聯結。 Google Cloud不支援這項整合。

    Prometheus HTTP API

    Managed Service for Prometheus 支援上游 Prometheus HTTP API,網址前置字串為 https://monitoring.googleapis.com/v1/projects/PROJECT_ID/location/global/prometheus/api/v1/。如要瞭解支援的端點,請參閱「API 相容性」。

    任何可與標準 Prometheus 伺服器互動的工具,都可以存取這個 API。這是 API 端點,不會提供 UI。 Google Cloud API 會使用 OAuth2 驗證,而 Cloud Monitoring API 的一部分,PROJECT_ID 的值是指標範圍的範圍專案,因此您可以從指標範圍中的任何專案擷取資料。如要進一步瞭解範圍,請參閱「指標範圍」。

    如要使用這個端點,請提供 PromQL 運算式。舉例來說,下列即時查詢會擷取所有指標名稱為 up 的時間序列:

    curl https://monitoring.googleapis.com/v1/projects/PROJECT_ID/location/global/prometheus/api/v1/query \
      -d "query=up" \
      -H "Authorization: Bearer $(gcloud auth print-access-token)"
    

    如果要求成功,查詢會傳回以下格式的結果,方便閱讀:

    {
      "status":"success",
      "data":{
        "resultType":"vector",
        "result":[{
          "metric": {
            "__name__":"up",
            "cluster":"gmp-test",
            "instance":"prom-example-84c6f547f5-g4ljn:web",
            "job":"prometheus",
            "location":"us-central1-a",
            "project_id":"a-gcp-project"
          },
          "value": [1634873239.971,"1"]
        }]
      }
    }
    

    如要瞭解如何使用 PromQL 查詢 Google Cloud 系統指標,請參閱「Cloud Monitoring 指標的 PromQL」。

    API 相容性

    Managed Service for Prometheus 支援以下 Prometheus HTTP API 端點,其網址前置字串為 https://monitoring.googleapis.com/v1/projects/PROJECT_ID/location/global/prometheus/api/v1/

    如需完整說明文件,請參閱 Cloud Monitoring API 參考文件。Cloud Monitoring 語言專屬用戶端程式庫中不支援 Prometheus HTTP 端點。

    如要瞭解 PromQL 相容性,請參閱「PromQL 支援」。

    • 系統全面支援下列端點:

      • /api/v1/query
      • /api/v1/query_range
      • /api/v1/metadata
      • /api/v1/labels
      • /api/v1/query_exemplars
    • 只有在使用 __name__ 標籤做為 <label_name> 值,或使用系列選取器完全比對 __name__ 標籤時,/api/v1/label/<label_name>/values 端點才會運作。舉例來說,系統完全支援下列呼叫:

      • /api/v1/label/__name__/values
      • /api/v1/label/__name__/values?match[]={__name__=~".*metricname.*"}
      • /api/v1/label/labelname/values?match[]={__name__="metricname"}

      這項限制會導致 Grafana 中的 label_values($label) 變數查詢失敗。您可以改用 label_values($metric, $label)。建議使用這類查詢,因為這可避免擷取與指定資訊主頁無關的指標標籤值。

    • /api/v1/series 端點支援 GET 要求,但不支援 POST 要求。使用資料來源同步器前端 Proxy 時,系統會為您管理這項限制。您也可以在 Grafana 中設定 Prometheus 資料來源,只發出 GET 要求。match[] 參數不支援 __name__ 標籤上的規則運算式比對。