从 Google Distributed Cloud (GDC) 网闸隔离配置中部署的工作负载收集指标后,您就可以开始分析这些指标。如需分析指标,您可以在信息丰富的 Grafana 信息中心内直观呈现和过滤指标,也可以使用 curl 工具直接从 Cortex 访问指标,以实现灵活的脚本编写和自动化。
本页面详细介绍了如何使用 Grafana 界面和 curl 工具查询和直观呈现 Cortex 端点的指标,以深入了解工作负载性能。
您可以通过以下两种方法之一访问指标:
- Grafana 信息中心:通过直观呈现 CPU 利用率、存储空间消耗和网络活动等关键指标,探索趋势并识别异常情况。Grafana 提供了一个人性化的界面,用于在信息中心内过滤和分析工作负载数据。
- Cortex 端点:对于更高级的用例,请在命令行中使用
curl工具直接查询项目的 Cortex 实例。Cortex 会存储项目的 Prometheus 指标,并提供一个 HTTP 端点以供程序化访问。通过此访问权限,您可以导出数据、自动执行任务和构建自定义集成。
准备工作
如需获得在 Grafana 信息中心内查询和直观呈现指标所需的权限,请让您的 IAM 组织管理员或 IAM 项目管理员为您授予预定义的 Organization Grafana Viewer 或 Project Grafana Viewer 角色之一。根据您需要的访问权限和权限级别,您可能会在组织或项目中获得 Grafana 角色。
或者,如需获得从 Cortex 端点查询指标所需的权限,请让您的 IAM 项目管理员在您的项目命名空间中为您授予 Project Cortex Prometheus Viewer 角色。
下表总结了 PA 和 AO 角色对 Role 的要求。
| 角色 | 对象 | 集群 | 角色 | 命名空间 | 群组/用户 | 配置 |
|---|---|---|---|---|---|---|
| PA | grafana | org-admin | project-grafana-viewer |
platform-obs | 群组 | 1 |
| PA | cortex | org-admin | project-cortex-prometheus-viewer |
platform-obs | 群组 | 2 |
| PA | grafana | org-admin | project-grafana-viewer |
platform-obs | 用户 | 3 |
| PA | cortex | org-admin | project-cortex-prometheus-viewer |
platform-obs | 用户 | 4 |
| AO | grafana | org-admin | project-grafana-viewer |
PROJECT_NAMESPACE | 群组 | 1 |
| AO | cortex | org-admin | project-cortex-prometheus-viewer |
PROJECT_NAMESPACE | 群组 | 2 |
| AO | grafana | org-admin | project-grafana-viewer |
PROJECT_NAMESPACE | 用户 | 3 |
| AO | cortex | org-admin | project-cortex-prometheus-viewer |
PROJECT_NAMESPACE | 用户 | 4 |
请酌情替换以下变量:
| 变量 | 说明 |
|---|---|
KUBECONFIG |
您需要特定集群的 kubeconfig,该集群包含将应用此 RoleBinding 的 NAMESPACE。 |
RULE_NAME |
此 RoleBinding 资源在命名空间中的唯一名称。例如 io-root-cortex-prometheus-viewer。 |
NAMESPACE |
将在其中创建并应用此 RoleBinding 的 Kubernetes 命名空间。请查看上表中的 Namespace 列。 |
EMAIL_ADDRESS |
被授予角色的用户的标识符。这通常是邮箱。例如 infrastructure-operator@example.com。 |
ROLE |
Role 的名称,其中包含您要授予用户的权限。在上表中查找可用角色 |
GROUP_NAME |
PA/AO 用户所属的 Group 的名称。例如 pa-group。 |
ZONE |
区域名称 |
配置 1
此配置会向用户群组授予访问 org 集群中的 PA/AO Grafana 的权限。完成此配置后,请参阅本文档的 Grafana 信息中心部分,在 Grafana 上查看指标。
Kubectl 命令
以下是通用命令格式:
kubectl --kubeconfig `KUBECONFIG` create rolebinding `RULE_NAME` -n platform-obs --group=`GROUP_NAME` --role=project-grafana-viewer示例:
kubectl --kubeconfig <path-to-kubeconfig> create rolebinding project-grafana-viewers-binding --role=project-grafana-viewer --group=my-team --namespace=platform-obsIAC 文件路径
/infrastructure/zonal/zones/`ZONE`/org-admin/rolebindings/`GROUP_NAME`/<YAML_FILE>Yaml 文件
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: RULE_NAME namespace: platform-obs subjects: - kind: Group name: GROUP_NAME apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: project-grafana-viewer apiGroup: rbac.authorization.k8s.io
配置 2
此配置会向用户群组授予权限,使其能够以编程方式访问 org 集群中的 PA/AO 指标。完成此配置后,请参阅本文档的 cortex 端点部分,以编程方式查询指标。
Kubectl 命令
以下是通用命令格式:
kubectl --kubeconfig `KUBECONFIG` create rolebinding `RULE_NAME` -n platform-obs --group=`GROUP_NAME` --role=project-cortex-prometheus-viewer示例:
kubectl --kubeconfig <path-to-kubeconfig> create rolebinding project-cortex-prometheus-viewer-binding --role=project-cortex-prometheus-viewer --group=my-team --namespace=platform-obsIAC 文件路径
/infrastructure/zonal/zones/`ZONE`/org-admin/rolebindings/`GROUP_NAME`/<YAML_FILE>Yaml 文件
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: RULE_NAME namespace: platform-obs subjects: - kind: Group name: GROUP_NAME apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: project-cortex-prometheus-viewer apiGroup: rbac.authorization.k8s.io
配置 3
此配置会向用户授予访问 org 集群中的 PA/AO Grafana 的权限。完成此配置后,请参阅本文档的 Grafana 信息中心部分,在 Grafana 上查看指标。
Kubectl 命令
以下是通用命令格式:
kubectl --kubeconfig `KUBECONFIG` create rolebinding `RULE_NAME` -n platform-obs --user=`EMAIL_ADDRESS` --role=project-grafana-viewer示例:
kubectl --kubeconfig <path-to-kubeconfig> create rolebinding project-grafana-viewers-binding --role=project-grafana-viewer --user=my-email@example.com --namespace=platform-obsIAC 文件路径
/infrastructure/zonal/zones/`ZONE`/org-admin/rolebindings/`EMAIL_ADDRESS`/<YAML_FILE>Yaml 文件
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: RULE_NAME namespace: platform-obs subjects: - kind: User name: EMAIL_ADDRESS apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: project-grafana-viewer apiGroup: rbac.authorization.k8s.io
配置 4
此配置会向用户授予权限,使其能够以编程方式访问 org 集群中的 PA/AO 指标。完成此配置后,请参阅本文档的 cortex 端点部分,以编程方式查询指标。
Kubectl 命令
以下是通用命令格式:
kubectl --kubeconfig `KUBECONFIG` create rolebinding `RULE_NAME` -n platform-obs --user=`EMAIL_ADDRESS` --role=project-cortex-prometheus-viewer示例:
kubectl --kubeconfig <path-to-kubeconfig> create rolebinding project-cortex-prometheus-viewer-binding --role=project-cortex-prometheus-viewer --user=my-email@example.com --namespace=platform-obsIAC 文件路径
/infrastructure/zonal/zones/`ZONE`/org-admin/rolebindings/`EMAIL_ADDRESS`/<YAML_FILE>Yaml 文件
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: RULE_NAME namespace: platform-obs subjects: - kind: User name: EMAIL_ADDRESS apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: project-cortex-prometheus-viewer apiGroup: rbac.authorization.k8s.io
如需详细了解这些角色,请参阅准备 IAM 权限。
获取和过滤指标
选择以下方法之一,以构建查询、直观呈现趋势并过滤项目工作负载中的指标:
Grafana 信息中心
本部分介绍如何使用 Grafana 信息中心访问指标。
确定 Grafana 端点
以下网址是项目的 Grafana 实例的端点:
https://GDC_URL/PROJECT_NAMESPACE/grafana
替换以下内容:
GDC_URL:GDC 中组织的网址。PROJECT_NAMESPACE:您的项目命名空间。例如,
org-1组织中platform-obs项目的 Grafana 端点为https://org-1/platform-obs/grafana。
在 Grafana 界面中查看指标
在 Grafana 界面中检索指标:
- 在 GDC 控制台中,选择您的项目。
- 在导航菜单中,依次选择运维 > Monitoring。
点击在 Grafana 中查看全部。
系统会打开一个新页面,其中显示您的 Grafana 端点和界面。
在界面上,点击导航菜单中的探索 探索,打开探索页面。
在探索栏的菜单中,根据您的 Universe 类型选择一个数据源来检索指标:
单可用区 Universe:选择 prometheus 以显示 Universe 的单可用区中的指标。
多可用区 Universe:Grafana 可以连接到不同的可用区并显示跨可用区数据。选择指标 ZONE_NAME,以显示 Universe 中任何可用区的指标,无论您登录的是哪个可用区。
此外,如需在单个信息中心内实现跨可用区数据可视化,并向查询添加多个可用区,请选择混合作为数据源。
输入查询,以使用 PromQL(Prometheus 查询语言)表达式搜索指标。您可以通过以下任一方式执行此步骤:
- 从指标和标签过滤条件菜单中为查询选择指标和标签。点击添加 添加,向查询添加更多标签。然后,点击运行查询。
- 直接在指标文本字段中输入查询,然后按 Shift+Enter 运行查询。
该页面会显示与您的查询匹配的指标。

图 1. 用于从 Grafana 界面查询指标的菜单选项。
在图 1 中,prometheus 选项会显示一个界面,您可以通过该界面从 Grafana 构建查询来检索指标。
如需查看可用于查询指标的标签值示例,请参阅示例查询和标签。
Cortex 端点 - 单可用区
本部分介绍如何使用 Cortex 访问指标。
确定 Cortex 端点
以下网址是项目的 Cortex 实例的端点:
https://GDC_URL/PROJECT_NAMESPACE/cortex/prometheus/
替换以下内容:
GDC_URL:GDC 中组织的网址。PROJECT_NAMESPACE:您的项目命名空间。例如,
org-1组织中platform-obs项目的 Cortex 端点为https://org-1/platform-obs/cortex/prometheus/。
对 curl 请求进行身份验证
- 下载并安装 gdcloud CLI。
设置 gdcloud
core/organization_console_url属性:gdcloud config set core/organization_console_url https://GDC_URL-
gdcloud auth login 使用您的用户名和密码进行身份验证并登录。
登录成功后,您可以通过
gdcloud auth print-identity-token命令在 curl 请求中使用授权标头。如需了解详情,请参阅 gdcloud auth。
调用 Cortex 端点
完成以下步骤,以使用 curl 工具访问 Cortex 端点:
- 对
curl请求进行身份验证。 使用
curl调用 Cortex 端点,并使用查询 HTTP API 格式扩展网址以查询指标。以下是
curl请求的示例:curl https://GDC_URL/PROJECT_NAME/cortex/prometheus/api/v1/query?query=my_metric{cluster="my-cluster"}&time=2015-07-01T20:10:51.781Z \ -H "Authorization: Bearer $(gdcloud auth print-identity-token \ --audiences=https://GDC_URL)"您会获得命令后面的输出。API 响应采用 JSON 格式。
Cortex 端点 - 多可用区
本部分介绍如何使用 Cortex 访问指标。
确定 Cortex 端点
以下网址是项目的 Cortex 实例端点,用于多可用区查询:
https://GDC_URL/PROJECT_NAMESPACE/cortex/metrics
替换以下内容:
GDC_URL:GDC 中组织的网址。- org-1、zone1 的示例:
console.org-1.zone1.google.gdch.test - 替换应用的组织和可用区。
- org-1、zone1 的示例:
PROJECT_NAMESPACE:您的项目命名空间。例如,
org-1组织中project-1项目的 Cortex 端点为https://console.org-1.zone1.google.gdch.test/project-1/cortex/metrics.。
对 curl 请求进行身份验证
- 下载并安装 gdcloud CLI。
设置 gdcloud
core/organization_console_url属性:gdcloud config set core/organization_console_url https://GDC_URL-
gdcloud auth login 使用您的用户名和密码进行身份验证并登录。
登录成功后,您可以通过
gdcloud auth print-identity-token命令在 curl 请求中使用授权标头。如需了解详情,请参阅 gdcloud auth。
调用 Cortex 端点
完成以下步骤,以使用 curl 工具访问 Cortex 端点:
- 对
curl请求进行身份验证。 - 使用
curl调用 Cortex 端点,并使用查询 HTTP API 格式扩展网址以查询指标。 除了 Prometheus 网址查询参数之外,还应添加位置参数,以提供要查询的可用区列表。 - location={string}:以
|分隔的可用区列表 - 如果未提供,系统将在所有可用区中执行查询。以下是
curl POST请求的示例:curl POST \ https://GDC_URL/PROJECT_NAME/cortex/metrics/api/v1/query_range" \ -H 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'query=pod_cpu_usage_total' \ --data-urlencode 'start=2025-07-21T16:00:00Z' \ --data-urlencode 'end=2025-07-21T16:15:00Z' \ --data-urlencode 'step=60s' \ --data-urlencode 'location=zone1|zone2' \ -H "Authorization: Bearer $(gdcloud auth print-identity-token \ --audiences=https://GDC_URL)"以下是
curl GET请求的示例:curl -X GET \ https://GDC_URL/PROJECT_NAME/cortex/metrics/api/v1/query_range?query=pod_cpu_usage_total&start=2025-07-21T16:00:00Z&end=2025-07-21T16:15:00Z&step=1s&location=zone1|zone2" \ -H "Authorization: Bearer $(gdcloud auth print-identity-token \ --audiences=https://GDC_URL)"您会看到命令后输出的结果。API 响应采用 JSON 格式。
示例查询和标签
您可以使用指标名称和标签的键值对来查询指标。PromQL 查询具有以下语法:
metric_name{label_one="value", label_two="value"}
通过标签,您可以区分指标的特征。这样,容器作者就可以让其工作负载生成指标并添加标记来过滤这些指标。
例如,您可以设置一个 api_http_requests_total 指标来统计收到的 HTTP 请求数。然后,您可以在此指标上添加 request_method 标签,该标签采用 POST、GET 或 PUT 值。因此,您需要为可能收到的每种请求类型创建三个指标流。在这种情况下,如需查找 HTTP GET 请求的数量,请运行以下查询:
api_http_requests_total{request_method="GET"}
如需详细了解指标和标签,请参阅指标和标签命名。
以下是 MonitoringTarget 自定义资源添加的一些默认标签。您可以使用以下默认标签来查询指标:
_gdch_service:服务的简称。cluster:集群的名称。container_name:Pod 中容器的名称。namespace_name:您的项目命名空间。pod_name:Pod 名称前缀。
下表介绍了 Prometheus 自动添加的标签:
| 指标标签 | 说明 |
|---|---|
job |
用于收集指标的抓取作业的内部名称。由 MonitoringTarget 自定义资源创建的作业具有采用以下格式的名称:obs-system/OBS_SHADOW_PROJECT_NAME/MONITORINGTARGET_NAME.MONITORINGTARGET_NAMESPACE/I/JI 和 J 是在内部确定的唯一数字,用于避免名称冲突。 |
instance |
已废弃服务的 $IP:$PORT。如果工作负载资源有多个副本,请使用此字段来区分它们。 |
以下代码示例展示了如何使用标签的键值对来查询不同的指标,以查看在 Kubernetes 集群中收集的 CPU 使用情况:
pod_cpu_usage_total{cluster="CLUSTER_NAME"}
使用指标重新添加标签工具添加最初未由抓取的容器公开的标签,并重命名生成的指标。您必须配置 MonitoringTarget 自定义资源,以便在它收集的指标上添加标签。在自定义资源的 metricsRelabelings 字段中指定这些标签。如需了解详情,请参阅标签指标。
以下是从 Cortex 指标端点收到的响应示例:
{
"zone1": {
"status": "success",
"data": {
"resultType": "matrix",
"result": [
{
"metric": {
"__name__": "pod_cpu_usage_total",
"_gdch_project": "project-1",
"cluster": "root-admin",
"container_name": "otel-collector",
"exported_instance": "localhost:2112",
"exported_job": "workload-0",
"ha_cluster": "root-admin-shard1",
"instance": "172.192.1.74:3113",
"job": "metrics-server-exporter.mon-system",
"namespace": "mon-system",
"namespace_name": "mon-system",
"pod": "cortex-0",
"pod_name": "metrics-server-exporter-695c9f848b-swzgq",
"zone_id": "zone1"
},
"values": [
[
1753261200,
"2.258621991"
],
[
1753261800,
"1.029301454"
]
]
}
]
}
},
"zone2": {
"status": "success",
"data": {
"resultType": "matrix",
"result": [
{
"metric": {
"__name__": "pod_cpu_usage_total",
"_gdch_project": "project-1",
"cluster": "root-admin",
"container_name": "otel-collector",
"exported_instance": "localhost:2112",
"exported_job": "workload-0",
"ha_cluster": "root-admin-shard1",
"instance": "172.196.3.208:3113",
"job": "metrics-server-exporter.mon-system",
"namespace": "mon-system",
"namespace_name": "mon-system",
"pod": "cortex-0",
"pod_name": "metrics-server-exporter-695c9f848b-kchfv",
"zone_id": "zone2"
},
"values": [
[
1753261200,
"1.814027424"
],
[
1753261800,
"2.7767060260000003"
]
]
}
]
}
}
}
查询 HTTP API
格式概览
API 响应始终采用 JSON 格式。成功的请求始终会收到 2xx 状态代码。
对于无效请求,API 处理程序将返回一个 JSON 错误对象以及以下 HTTP 状态代码之一:
- 400 Bad Request:如果缺少必要参数或提供的参数不正确。
- 503 Service Unavailable:如果查询超出时间限制或被中止,则会返回此错误。
任何成功收集的数据都将包含在响应的“data”字段中。
JSON 响应信封格式如下:
{
"status": "success" | "error",
"data": <data>,
// Only set if status is "error". The data field may still hold
// additional data.
"errorType": "<string>",
"error": "<string>",
// Only set if there were warnings while executing the request.
// There will still be data in the data field.
"warnings": ["<string>"],
// Only set if there were info-level annotations while executing the request.
"infos": ["<string>"]
}
即时查询
以下端点会在单个时间点评估即时查询:
GET /api/v1/query
POST /api/v1/query
以下网址查询参数可用于 Prometheus 表达式查询:
query=<string>:Prometheus 表达式查询字符串。time=<rfc3339 | unix_timestamp>:可选的评估时间戳,指定为 RFC 3339 字符串或 Unix 时间戳。如果省略,则使用当前服务器时间。timeout=<duration>:可选的评估超时。默认值为 query.timeout 标志的值,且受该值限制。limit=<number>:要返回的可选序列数上限。这会截断矩阵和向量的序列,但不会影响标量或字符串。值为 0 表示停用此限制。lookback_delta=<number>:一个可选参数,用于专门为此查询替换回溯期。
如果省略时间参数,系统会使用当前服务器时间。
对于可能超出网址字符数限制的较长查询,您可以使用 POST 方法提交这些参数。确保请求正文经过网址编码,并且 Content-Type 标头设置为 application/x-www-form-urlencoded。
查询结果的数据部分采用以下格式:
{
"resultType": "matrix" | "vector" | "scalar" | "string",
"result": <value>
}
<value> 是指查询结果数据,其格式因 resultType 而异。
以下示例在 2015-07-01T20:10:51.781Z 时评估表达式 up:
curl 'http://localhost:9090/api/v1/query?query=up&time=2015-07-01T20:10:51.781Z'
{
"status" : "success",
"data" : {
"resultType" : "vector",
"result" : [
{
"metric" : {
"__name__" : "up",
"job" : "prometheus",
"instance" : "localhost:9090"
},
"value": [ 1435781451.781, "1" ]
},
{
"metric" : {
"__name__" : "up",
"job" : "node",
"instance" : "localhost:9100"
},
"value" : [ 1435781451.781, "0" ]
}
]
}
}
范围查询
以下端点会评估一段时间范围内的表达式查询:
GET /api/v1/query_range
POST /api/v1/query_range
以下网址查询参数可用于 Prometheus 表达式查询:
query=<string>:Prometheus 表达式查询字符串。start=<rfc3339 | unix_timestamp>:开始时间戳(含边界值)。end=<rfc3339 | unix_timestamp>:结束时间戳(含)。step=<duration | float>:查询解析步骤宽度,采用时长格式或浮点秒数。timeout=<duration>:可选的评估超时。默认值为 query.timeout 标志的值,且受该值限制。limit=<number>:要返回的可选序列数上限。这会截断矩阵和向量的序列,但不会影响标量或字符串。值为 0 表示停用此限制。lookback_delta=<number>:一个可选参数,用于专门为此查询替换回溯期。
对于可能超出网址字符数限制的较长查询,您可以使用 POST 方法提交这些参数。确保请求正文经过网址编码,并且 Content-Type 标头设置为 application/x-www-form-urlencoded。
查询结果的数据部分采用以下格式:
{
"resultType": "matrix",
"result": <value>
}
以下示例在 30 秒范围内评估表达式 up,查询分辨率为 15 秒。
curl 'http://localhost:9090/api/v1/query_range?query=up&start=2015-07-01T20:10:30.781Z&end=2015-07-01T20:11:00.781Z&step=15s'
{
"status" : "success",
"data" : {
"resultType" : "matrix",
"result" : [
{
"metric" : {
"__name__" : "up",
"job" : "prometheus",
"instance" : "localhost:9090"
},
"values" : [
[ 1435781430.781, "1" ],
[ 1435781445.781, "1" ],
[ 1435781460.781, "1" ]
]
},
{
"metric" : {
"__name__" : "up",
"job" : "node",
"instance" : "localhost:9091"
},
"values" : [
[ 1435781430.781, "0" ],
[ 1435781445.781, "0" ],
[ 1435781460.781, "1" ]
]
}
]
}
}
指标和标签命名
指标命名准则
定义指标名称时,请考虑以下原则:
指标名称应包含一个单字应用前缀,客户端库有时将其称为“命名空间”。此前缀用于标识指标所属的网域。对于应用专属指标,通常使用应用名称作为前缀。
示例:
- prometheus_notifications_total(特定于 Prometheus 服务器)
- process_cpu_seconds_total(由许多客户端库导出)
- http_request_duration_seconds(适用于所有 HTTP 请求)
指标名称必须表示单个单位(例如,避免将秒与毫秒或秒与字节混合)。
指标名称应使用基本单位(例如秒、字节、米),而不是派生单位(例如毫秒、兆字节、千米)。
指标名称应包含复数单位后缀。对于累积计数,除了单位后缀(如果适用)之外,还应使用后缀“total”。
示例:
- http_request_duration_seconds
- node_memory_usage_bytes
- http_requests_total(用于无单位的累积计数)
- process_cpu_seconds_total(用于带单位的累积计数)
- foobar_build_info(用于提供有关正在运行的二进制文件的元数据的伪指标)
指标名称可以对其组成部分进行排序,以便在按字典顺序排序时方便分组,前提是遵循所有其他规则。相关指标通常会将共同的名称部分放在最前面,以确保它们排序在一起。
示例:
- prometheus_tsdb_head_truncations_closed_total
- prometheus_tsdb_head_truncations_established_total
- prometheus_tsdb_head_truncations_failed_total
- prometheus_tsdb_head_truncations_total
指标名称应在所有标签维度中一致地表示相同的逻辑“被测量对象”。
示例:
- 请求持续时间
- 字节的数据传输
- 瞬时资源用量(百分比)
标签命名准则
在衡量某项内容时,请使用标签来区分其特征。例如:
- 对于 API HTTP 请求总数 (
api_http_requests_total),请按操作类型进行区分,例如create、update、delete(请求类型:operation="create|update|delete")。 - 对于以秒为单位的 API 请求时长 (
api_request_duration_seconds),请按请求阶段进行区分,例如extract、transform、load(请求阶段:stage="extract|transform|load")。
避免在指标名称本身中包含标签名称,因为这会造成冗余,并且如果这些标签稍后被汇总,可能会导致混淆。