GCP Cloud Run Revision请求数指标Route标签为空,如何配置填充?
Cloud Run指标route标签为空的原因及解决方案
关键误解澄清
Cloud Run默认采集的请求数指标(run.googleapis.com/request_count)中的route标签,并非指向API请求的URL路径/端点,它对应的是Cloud Run的Route资源——也就是你为服务配置的流量路由规则(比如拆分流量到不同修订版本的自定义路由)。只有当你显式创建了Cloud Run Route资源时,这个标签才会填充对应路由名称;默认情况下,服务使用隐式默认路由,该标签会保持为空。
按API路径统计请求的解决方案
如果你的需求是按API端点/URL路径分组统计请求数并设置告警,可通过以下方式实现:
1. 上报自定义指标(推荐)
在NestJS应用中集成Google Cloud Monitoring客户端库,通过全局拦截器捕获每个请求的路径,上报带path标签的自定义请求数指标:
- 安装依赖:
npm install @google-cloud/monitoring - 实现NestJS全局拦截器示例代码:
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; import { MetricServiceClient } from '@google-cloud/monitoring'; @Injectable() export class RequestMetricsInterceptor implements NestInterceptor { private readonly monitoringClient = new MetricServiceClient(); private readonly projectId = process.env.GCP_PROJECT_ID; async intercept(context: ExecutionContext, next: CallHandler): Promise<Observable<any>> { const request = context.switchToHttp().getRequest(); const path = request.route?.path || request.path; const serviceName = process.env.K_SERVICE; const revisionName = process.env.K_REVISION; return next.handle().pipe( tap(async () => { await this.monitoringClient.createTimeSeries({ name: this.monitoringClient.projectPath(this.projectId), timeSeries: [ { metric: { type: 'custom.googleapis.com/api/request_count', labels: { path: path, service: serviceName, revision: revisionName, }, }, resource: { type: 'cloud_run_revision', labels: { service_name: serviceName, revision_name: revisionName, location: process.env.K_SERVICE_LOCATION, }, }, points: [ { interval: { endTime: { seconds: Date.now() / 1000 } }, value: { int64Value: '1' }, }, ], }, ], }); }), ); } }
- 在AppModule中注册该拦截器,确保每个请求触发指标上报。
2. 基于日志统计(备选)
启用Cloud Run请求日志,将日志导出到BigQuery,通过SQL查询按路径分组统计请求数,再基于结果配置告警:
- 配置Cloud Logging将Cloud Run日志导出到指定BigQuery数据集;
- 统计请求数的SQL示例:
SELECT JSON_EXTRACT_SCALAR(jsonPayload.request.path, '$') AS path, COUNT(*) AS request_count, resource.labels.service_name AS service, resource.labels.revision_name AS revision FROM `your-project-id.your-dataset-id.cloudaudit_googleapis_com_data_access` WHERE resource.type = 'cloud_run_revision' AND jsonPayload.request IS NOT NULL GROUP BY path, service, revision
- 基于该查询结果在Cloud Monitoring中创建自定义指标,再设置告警规则。
内容的提问来源于stack exchange,提问作者Jim Fielding
相关产品推荐
相关产品推荐

