使用 API

本文件說明如何使用 Cloud Monitoring API 管理服務和服務等級目標 (SLO)。

服務監控會將下列資源新增至 Monitoring API:

本文將這些新增項目統稱為 SLO API,並說明主要用途。如要瞭解 SLO API 中的結構體,請參閱「API 中的建構元件」。如需完整參考資料,請前往「Cloud Monitoring API v3」

您可以使用 SLO API 執行下列操作:

  • 建立及管理服務。

  • 根據自訂或預先定義的服務水準指標 (SLI),為任何服務建立服務等級目標 (SLO)。

有效的 ID

SLO API 中的多個方法會使用不同元素的 ID,特別是專案和服務的 ID。這些 ID 必須遵守下列規則:

  • 長度:1 至 63 個半形字元
  • 字元:只能使用小寫英文字母、數字和連字號
  • 開頭字元:小寫英文字母
  • 終端字元:小寫英文字母或數字 (但不能是連字號)

這些規則的規則運算式如下: [a-z](?:[-a-z0-9]{0,61}[a-z0-9])?

使用 curl 的範例

本節說明使用 curl 工具叫用 SLO API 時,所使用的規則和設定。如果您是透過用戶端程式庫使用這個 API,可以略過本節。

本頁範例會使用 curl 工具,將 HTTP 要求傳送至 REST 端點,以存取 SLO API。請使用下列驗證和叫用 curl 的相關資訊,設定叫用作業中使用的變數。

驗證

  1. 建立環境變數,用於存放指標範圍的範圍設定專案 ID:以下範例使用 PROJECT_ID

    PROJECT_ID=my-test-service
    
  2. 透過 Google Cloud CLI 進行驗證:

    gcloud auth login
    
  3. 為避免每次執行指令時都需要指定專案 ID,請使用 gcloud CLI 將其設為預設值:

    gcloud config set project ${PROJECT_ID}
    
  4. 建立授權權杖,並在環境變數中擷取權杖。以下範例會呼叫變數 ACCESS_TOKEN

    ACCESS_TOKEN=`gcloud auth print-access-token`
    

    您必須定期更新存取權杖。如果原本有效的指令突然回報你未經過驗證,請重新發出這項指令。

  5. 如要確認您已取得存取權杖,請回應 ACCESS_TOKEN 變數:

    echo ${ACCESS_TOKEN}
    ya29.GluiBj8o....
    

叫用 curl

每個 curl 叫用都包含一組引數,後面接著 SLO API 資源的網址。常見的引數包括 PROJECT_IDACCESS_TOKEN 環境變數指定的值。您可能還需要指定其他引數,例如指定 HTTP 要求的類型 (例如 -X DELETE)。預設要求為 GET,因此範例不會指定這項資訊。

每個 curl 叫用都有以下一般結構:

curl --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" <other_args> https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/<request>

舉例來說,如要列出專案中的所有服務,請發出下列 GET 要求:

curl  --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services

這項要求會傳回服務說明陣列,其中包含類似下列的項目,也就是服務 ID 為「my-test-service」的 GKE 工作負載服務:

{
  "services": [
    {
      "name": "projects/PROJECT_NUMBER/services/my-test-service",
      "displayName": "My Test GKE Workload Service",
      "basicService": {
        "serviceType": "GKE_WORKLOAD",
        "serviceLabels": {
          "cluster_name": "workload-test",
          "location": "us-central1-c",
          "namespace_name": "kube-system",
          "project_id": "lesser-weevil",
          "top_level_controller_name": "gke-metrics-controller",
          "top_level_controller_type": "DaemonSet"
        }
      },
      "gkeWorkload": {
        "projectId": "lesser-weevil",
        "location": "us-central1-c",
        "clusterName": "workload-test",
        "namespaceName": "kube-system",
        "topLevelControllerType": "DaemonSet",
        "topLevelControllerName": "gke-metrics-controller"
      },
      "source": "USER",
      "telemetry": {
        "resourceName": "//container.googleapis.com/projects/PROJECT_ID/zones/us-central1-c/clusters/workload-test/k8s/namespaces/kube-system/apps/daemonsets/gke-metrics-controller"
      }
    },
   ...
  ]
}

如要查看用於建立這項服務的設定,請參閱「建立服務」。請注意,這份清單中的 gkeWorkload 結構是源自用於建立服務的 basicService 結構。如要進一步瞭解服務的結構,請參閱 Service

管理服務

Service 資源是用來整理服務的根元素。特定服務的各個面向 (例如服務等級目標) 會依服務名稱分類。支援下列服務類型:

  • App Engine 服務:APP_ENGINE
  • Cloud Endpoints 服務:CLOUD_ENDPOINTS
  • 標準 Istio 服務:ISTIO_CANONICAL_SERVICE
  • 叢集 Istio 服務:CLUSTER_ISTIO
  • Cloud Run 服務:CLOUD_RUN
  • 一系列以 Google Kubernetes Engine 為基礎的服務:
    • GKE 服務:GKE_SERVICE
    • GKE 命名空間:GKE_NAMESPACE
    • GKE 工作負載:GKE_WORKLOAD
  • 自訂服務:CUSTOM

詳情請參閱「基本服務類型」或「基本 GKE 服務類型」。

您可以使用 API,在專案中的任何服務中加入服務等級目標。管理服務等級目標一文會介紹用於操控服務等級目標的指令。

服務 ID

每項服務都有一個完整的 ID,稱為「資源名稱」。這個 ID 會儲存在服務說明的 name 欄位中,例如:

"name": "projects/PROJECT_NUMBER/services/PROJECT_ID-zone-us-central1-a-cloudrun-istio-system-cluster-local-gateway",

資源名稱中嵌入的服務 ID 較短,是資源名稱中子字串 projects/PROJECT_NUMBER/services/ 後面的部分

如果您使用資源名稱 projects/PROJECT_NUMBER/services/my-test-service 建立自訂服務,服務 ID 就是 my-test-service

為了簡潔和準確,許多 curl 範例都假設服務 ID 會保留在環境變數 SERVICE_ID 中,方便您重複參照。

列出服務

如要擷取專案中所有服務的相關資訊,請叫用 services.list 方法。如要依服務 ID 擷取特定服務的相關資訊,請使用 services.get 方法:

通訊協定

如要使用 curl 列出服務相關資訊,請傳送 GET 要求至以下位置,並叫用 services.listservices.get 方法:

  • https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services 可列出所有服務
  • https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/SERVICE_ID:取得特定服務

舉例來說,下列要求會擷取由環境變數 SERVICE_ID 儲存的值所標示的服務資訊:

curl  --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}

建立 Service

如要建立服務,請指定服務類型的表示法,並將其傳送至 services.create 方法。您可以使用「基本服務類型」和「基本 GKE 服務類型」一文中所述的服務類型結構。

結構會有所不同,但呼叫 API 的程序則相同。您必須為服務指定顯示名稱,以及保存服務表示法的 basicService 欄位。

您可以視需要指定服務的服務 ID。以下範例說明如何建立 {[gke_name_short}} 工作負載服務:

通訊協定

如要使用 curl 建立服務,請將 POST 訊息傳送至 https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services 端點:

  1. 如果您想為服務提供 ID,請建立服務 ID 的變數:

    SERVICE_ID=my-test-service
    

    這個值會在網址查詢參數 service_id 中提供。

  2. 建立變數,用於儲存描述服務的要求主體:

    CREATE_SERVICE_POST_BODY=$(cat <<EOF
    {
      "displayName": "My Test GKE Workload Service",
      "basicService": {
        "serviceType": "GKE_WORKLOAD",
        "serviceLabels": {
          "cluster_name": "workload-test",
          "location": "us-central1-c",
          "namespace_name": "kube-system",
          "project_id": "PROJECT_ID",
          "top_level_controller_name": "gke-metrics-controller",
          "top_level_controller_type": "DaemonSet"
        }
      }
    }
    EOF
    )
    
  3. 將要求主體發布至端點,並將服務 ID 指定為 service_id 查詢參數的值:

    curl  --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" --header "Content-Type: application/json" -X POST -d "${CREATE_SERVICE_POST_BODY}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services?service_id=${SERVICE_ID}
    

如需其他服務相關結構的範例,請參閱基本服務類型基本 GKE 服務類型

刪除服務

如要刪除您建立的服務,請叫用 services.delete 方法,並指定服務 ID。

通訊協定

如要使用 curl 刪除服務,請將 DELETE 要求傳送至 https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/SERVICE_ID 端點:

curl  --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" -X DELETE https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}

管理服務等級目標

您可以使用 SLO API 建立、刪除及擷取 SLO。每項服務最多可設定 500 個服務等級目標。

如要管理服務的服務等級目標,您必須擁有服務 ID。服務等級目標的名稱會根據所屬服務命名。如要瞭解如何識別服務 ID,請參閱「服務 ID」。

列出服務等級目標

如要擷取與服務相關聯的所有服務等級目標資訊,請叫用 services.serviceLevelObjectives.list 方法。如要依名稱擷取特定服務水準目標的相關資訊,請使用 services.serviceLevelObjectives.get 方法:

通訊協定

如要使用 curl 列出服務相關資訊,請傳送 GET 要求至以下位置,並叫用 services.serviceLevelObjectives.listservices.serviceLevelObjectives.get 方法:

  • https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/[SERVICE_ID]/serviceLevelObjectives 可列出所有服務等級目標
  • https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/[SERVICE_ID]/serviceLevelObjectives/SLO_ID 取得特定 SLO

舉例來說,下列要求會列出與環境變數 SERVICE_ID 中儲存的服務 ID 相關聯的所有 SLO:

curl  --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}/serviceLevelObjectives

以下是從「currencyservice」服務擷取的可用性 SLO:

{
  "name": "projects/PROJECT_NUMBER/services/PROJECT_ID-zone-us-central1-c-csm-main-default-currencyservice/serviceLevelObjectives/3kavNVTtTMuzL7KcXAxqCQ",
  "displayName": "98% Availability in Calendar Week"
  "serviceLevelIndicator": {
    "basicSli": {
      "availability": {},
      "location": [
        "us-central1-c"
      ]
    }
  },
  "goal": 0.98,
  "calendarPeriod": "WEEK",
},

這個 SLO 是以可用性 SLI 為基礎,設定 98% 的目標效能目標,並評估在整個日曆週內的遵循情況。如要進一步瞭解可用性 SLI,請參閱「服務水準指標」。

如要進一步瞭解 SLO 的結構,請參閱 ServiceLevelObjective

擷取特定服務等級目標

每個服務等級目標在服務中都有專屬 ID,由 SLO name 欄位中 serviceLevelObjectives 後方的字串組成。在下列範例中:

"name": "projects/PROJECT_NUMBER/services/PROJECT_ID-zone-us-central1-c-csm-main-default-currencyservice/serviceLevelObjectives/3kavNVTtTMuzL7KcXAxqCQ",

SLO ID 是字串 3kavNVTtTMuzL7KcXAxqCQ

如要擷取這個特定 SLO 的相關資訊,請依 ID 要求 SLO。

通訊協定

如要使用 curl 取得特定 SLO,請將 GET 要求傳送至 https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/SERVICE_ID/serviceLevelObjectives/SLO_ID,以便叫用 services.serviceLevelObjectives.get 方法:

SLO_ID=dhefHDM4TwSRZEKIV4ZYEg

curl  --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}/serviceLevelObjectives/${SLO_ID}

建立服務等級目標

如要使用 SLO API 建立 SLO,您必須建立 ServiceLevelObjective 物件,並將其傳遞至 serviceLevelObjectives.create 方法。

SLO 的結構包含許多嵌入式結構,其中一個是 serviceLevelIndicator 欄位的值。

  • 針對 Cloud Service Mesh、Google Kubernetes Engine 上的 Istio 和 App Engine 服務,系統會預先定義 SLI。您可以使用 Cloud Service Mesh 主控台建立 SLO,只要指定效能目標和遵循期間即可。

  • 針對其他服務,您必須使用 SLO API 定義 SLO。如要指定服務等級目標,您也必須為 serviceLevelIndicator 欄位建立值。如要瞭解部分技巧,請參閱「建立服務水準指標」一文,如要瞭解一系列根據不同來源建立的示例,請參閱「運用指標建立 SLI」。

您也可以使用 Google Cloud 控制台建立 SLI。詳情請參閱「建立 SLO」。

服務等級目標的骨架

建立服務等級目標的基本架構如下:

{
  "displayName": string,
  "serviceLevelIndicator": {
    object (ServiceLevelIndicator)
  },
  "goal": number,

  // Union field period can be only one of the following:
  "rollingPeriod": string,
  "calendarPeriod": enum (CalendarPeriod)
  // End of list of possible types for union field period.
}

您必須指定下列項目:

  • 顯示名稱:服務水準目標的說明
  • 服務水準指標,是三種指標之一:
  • 成效目標 (百分比)
  • 達成度評估時間範圍,可分為以下兩種:
    • 滾動週期長度 (以秒為單位)
    • 日曆週期

如要進一步瞭解 SLI、效能目標和符合性期間,請參閱「服務監控的概念」。

對於 Cloud Service Mesh、Google Kubernetes Engine 上的 Istio 和 App Engine 服務,SLI 類型為基本 SLI。

針對其他服務,您必須建立以要求為基礎的 SLI 或以 Windows 為基礎的 SLI。如需瞭解相關技巧,請參閱「建立服務水準指標」。

範例

取得 SLI 後,即可建構 SLO。以下範例為使用基本服務水準指標的服務定義服務等級目標。您可能會在單一 SLI 中設定多個 SLO,例如一個是 95% 可用性,另一個是 99% 可用性。以下範例是每週日曆週 95% 可用性的 SLO:

{
  "serviceLevelIndicator": {
    "basicSli": {
      "availability": {},
      "location": [
        "us-central1-c"
      ]
    }
  },
  "goal": 0.95,
  "calendarPeriod": "WEEK",
  "displayName": "95% Availability in Calendar Week"
}

本例會指定 75% 的可用性 SLO,適用於 3 天滾動期間:

{
  "serviceLevelIndicator": {
    "basicSli": {
      "availability": {},
      "location": [
        "us-central1-c"
      ]
    }
  },
  "goal": 0.75,
  "rollingPeriod": "259200s",
  "displayName": "75% Availability in Rolling 3 Days"
}

通訊協定

如要使用 curl 建立 SLO,請將 POST 訊息傳送至 https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/SERVICE_ID/serviceLevelObjectives 端點:

  1. 建立服務 ID 的變數:

    SERVICE_ID=custom:my-test-service
    
  2. 建立變數來存放要求主體 (ServiceLevelObjective 物件的例項)。本範例使用先前所述的 SLO 之一:

    CREATE_SLO_POST_BODY=$(cat <<EOF
    {
      "serviceLevelIndicator": {
        "basicSli": {
          "availability": {},
          "location": [
            "us-central1-c"
          ]
        }
      },
      "goal": 0.75,
      "rollingPeriod": "259200s",
      "displayName": "75% Availability in Rolling 3 Days"
    }
    EOF
    )
    
  3. 將要求主體發布至端點:

    curl  --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" --header "Content-Type: application/json" -X POST -d "${CREATE_SLO_POST_BODY}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}/serviceLevelObjectives
    

    您也可以選擇將所需的 SLO ID 指定為 service_level_objective_id 查詢參數的值:

    SLO_ID=test-slo-id
    
    curl  --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" --header "Content-Type: application/json" -X POST -d "${CREATE_SLO_POST_BODY}" https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}/serviceLevelObjectives?service_level_objective_id=${SLO_ID}
    

刪除服務等級目標

如要刪除 SLO,請叫用 services.serviceLevelObjectives.delete 方法,並指定專案中的 SLO ID:

通訊協定

如要使用 curl 刪除 SLO,請將 DELETE 要求傳送至 https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/SERVICE_ID/serviceLevelObjectives/SLO_ID 端點:

curl  --http1.1 --header "Authorization: Bearer ${ACCESS_TOKEN}" -X DELETE https://monitoring.googleapis.com/v3/projects/${PROJECT_ID}/services/${SERVICE_ID}/serviceLevelObjectives/${SLO_ID}

存取服務等級目標時間序列

SLO 資料會儲存在時間序列中,因此您可以使用 timeSeries.list 方法擷取這類資料。不過,這類資料並未儲存在標準指標類型中,因此您無法使用標準機制,將指標類型篩選器指定給 timeSeries.list 方法。

相反地,您可以為 filter 參數中的 timeSeries.list 方法指定另一種篩選器 (時間序列選取器),藉此擷取 SLO 時間序列。如要瞭解如何使用這些選取器,請參閱「擷取服務等級目標資料」。

您也可以使用時序選取器,以程式設計方式設定快訊政策。詳情請參閱「資金消耗率的快訊」。