如何配置GCP上的Prometheus自动抓取新增Compute Engine实例指标
完全可以靠Prometheus原生的GCE服务发现能力实现自动识别新实例的需求,不需要K8s环境,也不用每次新实例上线就改配置、重载服务。
实现逻辑
Prometheus 自带的GCE服务发现模块(gce_sd_config)会按固定周期(默认1分钟)调用GCE API拉取当前项目下的实例元数据,你可以提前定义好目标筛选规则,符合规则的实例会被自动纳入抓取列表。新增实例只要匹配预设规则,就会被自动识别,不需要手动维护静态实例清单。
前置准备
- 找到运行Prometheus的Compute Engine实例绑定的服务账号,为其添加
Compute Instance Viewer权限,保证服务账号可以正常查询项目下的实例列表。直接复用实例内置的服务账号鉴权即可,不需要额外生成离线密钥文件,减少密钥泄露风险。 - 提前给同类被监控实例定义统一的识别标识,比如统一打自定义标签、固定实例命名前缀,方便Prometheus精准筛选目标,避免误抓其他业务的实例。
核心配置参考
下面是适配Nginx监控场景的配置示例,替换项目ID、zone、筛选规则、端口即可使用:
scrape_configs: - job_name: 'auto-discovered-nginx' # GCE服务发现核心配置 gce_sd_configs: - project: '你的GCP项目ID' # 如果实例分布在多个可用区,可以重复添加多个zone配置 zone: 'asia-northeast1-a' port: 9100 # 对应你部署的nginx-exporter/node_exporter端口 # 筛选规则:只抓打了monitoring_target=nginx标签、处于运行状态的实例 filter: 'labels.monitoring_target = nginx AND status = RUNNING' # 重写抓取地址,用实例内网IP通信 relabel_configs: - source_labels: [__meta_gce_instance_network_interface_0_network_ip] target_label: __address__ replacement: '$1:9100' # 把实例元数据附加到指标上,方便后续查询 - source_labels: [__meta_gce_instance_name] target_label: gce_instance_name - source_labels: [__meta_gce_instance_zone] target_label: gce_zone
日常使用流程
后续新增Nginx实例时,只要满足两个条件就会被自动采集:
- 新建实例时打上约定的
monitoring_target=nginx自定义标签(或者匹配你设置的实例名前缀规则) - 实例上正常运行监控指标暴露服务,对应端口可被Prometheus通过内网访问
Prometheus在1分钟的发现周期结束后就会自动把新实例加入抓取列表,全程不需要调整任何配置。
常见注意事项
- 筛选规则尽量精确,不要漏加运行状态判断,避免把已停机、其他业务的实例纳入抓取范围,产生无效请求。
- 因为默认用实例内网IP做抓取地址,要保证Prometheus和所有被监控实例网络互通,同一VPC下默认满足这个要求,跨VPC需要提前配置对等连接。
- 如果不想用标签做识别规则,也可以把filter改写成实例名前缀匹配的形式,比如
name = nginx-*,只要新实例名以nginx-开头且处于运行状态,就会被自动发现。
内容的提问来源于stack exchange,提问作者rschirin
相关产品推荐
相关产品推荐

