使用 API

Service Monitoring 可将以下资源添加到 Monitoring API 中:

本页面介绍了新 API 资源的主要用途。 如需了解此处所用结构的一般概览,请参阅 API 中的构造。全面的参考资料将显示在 Cloud Monitoring API v3 下。

本文档将这些新增内容统称为 Service Monitoring API。

何时使用 API

Service Monitoring API 可用于管理服务和服务等级目标 (SLO)。本页面重点介绍自定义服务和服务等级指标 (SLI)。系统会自动检测 App Engine、Istio on Google Kubernetes Engine 和 Cloud Endpoints 上运行的服务,并为其预定义 SLI:

  • 要为 Anthos Service Mesh 服务定义 SLO,您可以使用 Anthos Service Mesh 控制台或 Service Monitoring API。如需详细了解如何使用 Anthos 服务网格信息中心创建 SLO,请参阅 Anthos 服务网格文档:创建 SLO

  • 对于其他服务和自定义服务,您必须使用 Service Monitoring API 定义 SLO。目前没有提供 Google Cloud Console 支持。

本页面中的示例主要侧重于自定义服务和 SLI。

有效标识符

Service Monitoring API 中的一些方法针对不同元素使用不同的标识符,尤其是项目和服务的标识符。这些 ID 遵循以下规则:

  • 长度:1-63 个字符
  • 字符:只能使用小写字母、数字和连字符
  • 首字母:小写字母
  • 尾字母:小写字母或数字,但不能是连字符

这些规则的正则表达式如下所示:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?

使用 curl 的示例

本部分介绍了使用 curl 工具调用 Service Monitoring API 时所使用的惯例和设置。如果您是通过客户端库使用此 API,则可以跳过此部分。

本页中的示例通过使用 curl 工具将 HTTP 请求发送到 RESTM 端点来访问 Service Monitoring API。使用以下关于身份验证和调用 curl 的信息设置调用中使用的变量。

身份验证

  1. 创建一个环境变量来保存 Cloud Monitoring 工作区的 ID。这些示例使用 PROJECT_ID

    PROJECT_ID=my-test-service
    
  2. 向 Cloud SDK 验证身份:

    gcloud auth login
    
  3. 为避免必须使用每个命令指定项目 ID,请使用 Cloud SDK 将其设置为默认值:

    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 调用都包含一组参数,其后面是 Service Monitoring 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

此请求会返回一组服务说明,其中包含如下所示的条目,示例是名为“currencyservice”的 Istio 服务:

{
  "services": [
    {
      "name": "projects/[PROJECT_NUMBER]/services/[PROJECT_ID]-zone-us-central1-c-csm-main-default-currencyservice",
      "displayName": "[PROJECT_ID]/us-central1-c/csm-main/default/currencyservice",
      "clusterIstio": {
        "location": "us-central1-c",
        "clusterName": "csm-main",
        "serviceNamespace": "default",
        "serviceName": "currencyservice"
      },
      "telemetry": {
        "resourceName": "//container.googleapis.com/projects/[PROJECT_ID]/zones/us-central1-c/clusters/csm-main/k8s/namespaces/default/services/currencyservice"
      }
    },
   ...
  ]
}

如需详细了解服务的结构,请参阅 Service

管理服务

Service 资源充当组织服务的根元素。某个特定服务的各方面(例如其 SLO)都按照服务名称整理。

系统会自动为您在 App Engine、Istio on Google Kubernetes Engine 和 Cloud Endpoints 上创建服务。您可以使用 Anthos 服务网格控制台或 Service Monitoring API 执行操作,例如将 SLO 添加到这些服务中。

您手动创建的服务称为自定义服务。 只能使用 Service Monitoring API 来创建、删除、检索和更新自定义服务。

确定或创建服务后,您可以向该服务添加 SLO。 管理 SLO涵盖操纵 SLO 的命令。

服务 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}

创建服务

如果您没有使用自动创建服务的环境(即 App Engine、Istio on Google Kubernetes Engine 和 Cloud Endpoints),则可以使用 services.create 方法创建服务。

如果您手动创建服务,则必须使用 Service Monitoring API 手动将 SLO 和其他服务监控工件添加到服务结构中。如需了解这些结构的概述,请参阅 API 中的构造

要创建服务,您必须指定服务的显示名以及名为 custom 的字段(对象为空)。您可以选择指定您希望服务具有的服务 ID。

协议

要使用 curl 创建服务,请向 https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services 端点发送一条 POST 消息:

  1. 如果要提供服务 ID,请为服务 ID 创建变量:

    SERVICE_ID=my-test-service
    

    网址查询参数 service_id 中会提供此值。

  2. 创建变量以保存描述服务的请求正文:

    CREATE_SERVICE_POST_BODY=$(cat <<EOF
    {
        "displayName": "My Test Service",
        "custom": {}
    }
    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}
    

删除服务

要删除自定义服务,请调用 services.delete 方法并指定服务 ID。

协议

要使用 curl 删除服务,请向 https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/[SERVICE_ID] 端点发送 DELETE 请求:

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

管理 SLO

SLO 与服务关联。您可以使用适用于 App Engine 的 Anthos 服务网格控制台、Istio on Google Kubernetes Engine、Cloud Endpoints 或使用 Service Monitoring API 创建 SLO。您必须使用 Service Monitoring API 为自定义服务创建 SLO。

您还可以使用 Service Monitoring API 检索与服务关联的 SLO,以及从服务中删除 SLO。每个服务最多可以有 500 个 SLO。

要管理服务的 SLO,您必须拥有服务 ID。 SLO 根据其所属的服务进行命名。 服务 ID介绍如何识别服务 ID。

列出 SLO

要检索与服务关联的所有 SLO 的相关信息,请调用 services.serviceLevelObjectives.list 方法。要按名称检索特定 SLO 的相关信息,请使用 services.serviceLevelObjectives.get 方法:

协议

要使用 curl 列出有关服务的信息,请通过将 GET 请求发送给以下对象,来调用 services.serviceLevelObjectives.listservices.serviceLevelObjectives.get 方法:

  • 要列出所有 SLO,请发送至 https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/[SERVICE_ID]/serviceLevelObjectives
  • 要获取特定 SLO,请发送至 https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/[SERVICE_ID]/serviceLevelObjectives/[SLO_ID]

例如,以下请求列出了与存储在环境变量 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

检索特定 SLO

每个 SLO 在服务中都有一个唯一标识符,由 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,请通过向 https://monitoring.googleapis.com/v3/projects/[PROJECT_ID]/services/[SERVICE_ID]/serviceLevelObjectives/[SLO_ID] 发送 GET 请求来调用 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

要使用 Service Monitoring API 创建 SLO,您必须创建一个 ServiceLevelObjective 对象并将其传递给 serviceLevelObjectives.create 方法。

SLO 的结构具有许多嵌入式结构,其中便有一个关于 serviceLevelIndicator 字段的值的结构。

  • 对于 App Engine、Istio on Google Kubernetes Engine 和 Cloud Endpoints 服务,SLI 已预定义。 您可以使用 Anthos 服务网格控制台创建 SLO;您只需指定型能目标和合规期即可。

    您还可以使用 Service Monitoring API 来定义 SLO。

  • 对于自定义服务,您必须使用 Service Monitoring API 来定义 SLO。 要指定 SLO,您还必须为 serviceLevelIndicator 字段创建一个值。如需了解一些技术问题,请参阅创建服务等级指标

SLO 的框架

构建 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.
}

您必须指定以下各项:

  • 显示名:SLO 的说明
  • 服务等级指标,可以是以下三种类型之一:
  • 性能目标(百分比)
  • 合规性期限,有以下两种类型:
    • 一定长度的滚动周期(以秒为单位)
    • 日历周期

如需详细了解 SLI、效果目标和合规性周期的详情,请参阅服务监控中的概念

对于 App Engine、Istio on Google Kubernetes Engine 和 Cloud Endpoints 服务,SLI 类型是基本的 SLI。

对于自定义服务,您必须创建基于请求的 SLI 或基于 Windows 的 SLI。如需了解一些技术问题,请参阅创建服务等级指标

示例

获得 SLI 后,您便可以构建 SLO。以下示例为使用基本 SLI 的服务定义了 SLO。单个 SLI 上可能有多个 SLO,例如,一个 SLO 的可用性为 95%,另一个 SLO 的可用性为 99%。以下示例是在日历周内可用性为 95% 的 SLO:

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

此示例指定了在 3 天滚动周期内可用性为 75%的 SLO:

{
  "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

要删除 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 时间序列

SLO 数据按时间序列存储,因此您可以使用 timeSeries.list 方法检索这些数据。但是,此类数据并非以标准指标类型存储,因此您无法使用为 timeSeries.list 方法指定指标类型过滤条件的标准机制。

相反,您可以通过在 filter 参数中向 timeSeries.list 方法指定其他类型的过滤条件(时间序列选择器)来检索 SLO 时间序列。如需了解使用这些选择器的信息,请参阅检索 SLO 数据

您还可以使用时间序列选择器以编程方式设置提醒政策。如需了解详情,请参阅消耗率提醒