使用 Prometheus API 或界面进行查询

部署 Google Cloud Managed Service for Prometheus 后,您可以查询发送到代管式服务的数据,并将结果显示在图表和信息中心中。

本文档介绍了确定可以查询的数据的指标范围,以及检索和使用收集的数据的以下 Prometheus 方法:

  • Prometheus HTTP API
  • Prometheus 界面

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,则可以跳过此部分。

在 GKE 上运行时,Managed Service for Prometheus 会自动根据 Compute Engine 默认服务账号从环境中检索凭据。默认情况下,默认服务账号具有必要的权限 monitoring.metricWritermonitoring.viewer。如果您未使用 Workload Identity,并且之前从默认节点服务账号中移除了任一角色,则必须重新添加这些缺少的权限,然后才能继续。

如果您不在 GKE 上运行,请参阅明确提供凭据

为 Workload Identity 配置服务账号

如果您的 Kubernetes 集群未启用 Workload Identity,则可以跳过此部分。

Managed Service for Prometheus 使用 Cloud Monitoring API 捕获指标数据。如果您的集群使用的是 Workload Identity,则必须向您的 Kubernetes 服务账号授予 Monitoring API 权限。本节介绍以下内容:

创建和绑定服务账号

此步骤显示在 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 服务账号)。如需详细了解 Monitoring 角色,请参阅访问权限控制

以下命令会向 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

调试 Workload Identity 配置

如果您在使 Workload Identity 正常工作时遇到问题,请参阅验证 Workload Identity 设置的文档和 Workload Identity 故障排除指南

由于拼写错误和部分复制粘贴是配置 Workload Identity 时最常见的错误来源,因此我们强烈建议使用这些说明中代码示例中嵌入的可编辑变量和可点击复制粘贴图标。

生产环境中的 Workload Identity

本文档中描述的示例将 Google Cloud 服务账号绑定到默认 Kubernetes 服务账号,并授予 Google Cloud 服务账号使用 Monitoring API 所需的所有权限。

在生产环境中,您可能需要使用更精细的方法,其中每个组件对应一个服务账号,并且每个服务账号都具有最小的权限。如需详细了解如何为工作负载身份管理配置服务账号,请参阅使用 Workload Identity

查询和指标范围

您可以查询的数据取决于 Cloud Monitoring 构造指标范围,无论您用于查询数据的方法如何。例如,如果您使用 Grafana 查询 Managed Service for Prometheus 数据,则必须将每个指标范围配置为单独的数据源。

Monitoring 指标范围是一种只读结构,可让您查询属于多个 Google Cloud 项目的指标数据。每个指标范围都由指定的 Google Cloud 项目托管,称为范围项目。

默认情况下,项目是其自身指标范围的范围限定项目,而指标范围包含该项目的指标和配置。限定范围的项目可以在其指标范围内包含多个受监控的项目,并且指标范围内所有受监控项目的指标和配置对限定范围的项目可见。一个受监控的项目还可以属于多个指标范围。

查询范围项目中的指标时,如果该项目托管多项目指标范围,则可以从多个项目中检索数据。如果指标范围包含所有项目,则查询和规则将进行全局评估。

如需详细了解如何限定项目和指标范围,请参阅指标范围。如需了解如何配置多项目指标范围,请参阅查看多个项目的指标

Cloud Monitoring 中的 Managed Service for Prometheus 数据

如需验证 Prometheus 数据被导出,最简单的方法是使用 Google Cloud 控制台中的 Cloud Monitoring Metrics Explorer 页面,它支持 PromQL。如需查看相关说明,请参阅在 Cloud Monitoring 中使用 PromQL 进行查询

独立的 Prometheus 前端界面

您可以使用独立 Prometheus 前端界面来访问和直观呈现注入的数据。此界面针对 Google Cloud 项目中的所有数据运行 PromQL 查询,具体取决于与项目关联的指标范围。

前端界面还可充当访问注入数据的身份验证代理。此功能可用于不支持 OAuth2 的客户端工具,包括 Grafana 或使用 prometheus-adapter 库的 Pod 横向自动扩缩

我们强烈建议您配置 Grafana,以使用数据源同步器直观呈现来自 Managed Service for Prometheus 的数据。此处提供了使用独立 Prometheus 前端界面配置 Grafana 的说明,以便为之前使用此方法配置了 Grafana 的用户提供参考。

部署前端界面

如需为 Managed Service for Prometheus 部署独立的 Prometheus 前端界面,请运行以下命令:

  1. 部署 frontend 服务并将其配置为查询您选择的指标范围的范围限定项目

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.8.2/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 前端界面。

您可以通过浏览器访问独立的 Prometheus 前端界面,网址为 http://localhost:9090。如果您使用 Cloud Shell 执行此步骤,则可以使用网页预览按钮进行访问。

以下屏幕截图显示了独立 Prometheus 前端界面中的表,该表展示了 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 会重启并查询新的范围项目。

对前端界面进行身份验证

在版本 0.5.0 及更高版本中,frontend 部署支持基本访问身份验证,通过身份验证后可获得访问权限。如需启用身份验证,请将 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 设置自动从环境中检索凭据。 在非 GKE Kubernetes 集群中,必须使用标志或 GOOGLE_APPLICATION_CREDENTIALS 环境变量将凭据明确提供给前端。

  1. 将上下文设置为目标项目:

    gcloud config set project PROJECT_ID
    
  2. 创建服务账号:

    gcloud iam service-accounts create gmp-test-sa
    

    此步骤会创建您可能已在 Workload Identity 说明中创建的服务账号。

  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. 将密钥文件作为 Secret 添加到非 GKE 集群:

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

  6. 打开前端 Deployment 资源以进行修改:

    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 环境变量来设置密钥文件路径,而不是使用本示例中设置的标志。

    通过前端代理使用 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 前端界面作为身份验证代理。

    您必须将 Grafana 指向独立前端界面代理,以便在全球范围内查询数据。如果您未执行这些步骤,Grafana 仅会对本地 Prometheus 服务器中的数据执行查询。

    如果您尚未将 Prometheus 界面 frontend 服务部署为代理,请运行以下命令进行部署:

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

    对于非 GKE Kubernetes 集群(例如 Anthos 集群),另请参阅明确提供凭据,以向 frontend 服务授予查询指标所需的权限。

    如需了解如何配置 frontend 服务使用的指标范围以跨多个项目进行查询,请参阅更改查询的项目

    如果您已有 Grafana 部署,例如由 kube-prometheus 库安装或使用 Helm 图表安装的部署,则可以继续在 Managed Service for Prometheus 中使用。如果是,请参阅配置数据源以获取后续步骤。否则,您必须先部署 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 使用用户名:密码 admin:admin 访问 Grafana。

    配置数据源

    如需使用 Prometheus 界面作为身份验证代理,在 Grafana 中查询 Managed Service for Prometheus,您必须将新数据源添加到 Grafana。如需为托管式服务添加数据源,请执行以下操作:

    1. 转到 Grafana 部署(例如,通过浏览到网址 http://localhost:3000 来访问 Grafana 欢迎页面)。

    2. 从 Grafana 主菜单中选择配置,然后选择数据源

      在 Grafana 中添加数据源。

    3. 选择添加数据源,然后选择 Prometheus 作为时序数据库。

      添加 Prometheus 数据源。

    4. HTTP 窗格的网址字段中,输入 Managed Service for Prometheus frontend 服务的网址。如果您已将 Prometheus 前端界面配置为在端口 9090 上运行,则此字段的服务网址为 http://frontend.NAMESPACE_NAME.svc:9090

      HTTP 窗格的超时字段中,将值设置为 120

      如果您为前端界面代理配置了基本身份验证,请在身份验证窗格中启用基本身份验证开关,然后填写用户名和密码。

      查询超时字段中,将值设置为 2m

      HTTP 方法字段中,选择 GET

      Prometheus 类型字段中,选择 Prometheus

      Prometheus 版本字段中,选择 2.40.x 或更高版本。

      如果您有多个 Prometheus 数据源,则可以为其指定一个名称,例如“Managed Prometheus Service”。其他字段可以保留默认值。

      配置 Managed Service for Prometheus 数据源。

    5. 点击保存并测试,然后查找消息“数据源正常运行”。

      测试 Managed Service for Prometheus 数据源。

    使用新数据源

    您现在可以使用新数据源创建 Grafana 信息中心。您还可以将现有信息中心重定向到新数据源。以下屏幕截图中的 Grafana 图表显示了 up 指标:

    Managed Service for Prometheus up 指标的 Grafana 图表。

    将 Managed Service for Prometheus 连接到 Thanos

    您可以使用开源 thanos-promql-connector 将 Managed Service for Prometheus 联合到自行部署的 Thanos 堆栈。Google Cloud 不为此集成提供支持。

    Prometheus HTTP API

    Managed Service for Prometheus 支持带有 https://monitoring.googleapis.com/v1/projects/PROJECT_ID/location/global/prometheus/api/v1/ 前缀的网址的上游 Prometheus HTTP API。如需了解支持的端点,请参阅 API 兼容性

    此 API 可供任何可与标准 Prometheus 服务器交互的工具访问。这只是一个 API 端点;它不提供界面。作为 Google Cloud API,该 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 系统指标,请参阅 PromQL for Cloud Monitoring 指标

    API 兼容性

    Managed Service for Prometheus 支持以下 Prometheus HTTP API 端点(网址前缀为 https://monitoring.googleapis.com/v1/projects/PROJECT_ID/location/global/prometheus/api/v1/)。

    如需查看完整文档,请参阅 Cloud Monitoring API 参考文档

    如需了解 PromQL 兼容性,请参阅 PromQL 支持

    • 以下端点完全受支持:

      • /api/v1/query
      • /api/v1/query_range
      • /api/v1/metadata
      • /api/v1/labels
      • /api/v1/query_exemplars
    • /api/v1/label/<label_name>/values 端点只有在 __name__ 标签是通过将其用作 <label_name> 值或使用序列选择器对其进行完全匹配时才有效。例如,以下调用完全受支持:

      • /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 请求。当您使用数据源同步器前端代理时,此限制由系统为您代管。您也可以在 Grafana 中将 Prometheus 数据源配置为仅发出 GET 请求。