consul 不直接对接 prometheus 指标采集,而是通过服务发现动态提供 gin 实例的 /metrics 地址;gin 启动时需主动注册并配置健康检查,prometheus 通过 consul_sd_configs 拉取服务,consul kv 可存储监控配置但不支持热更新。

Consul 不直接对接 Prometheus 指标采集
Consul 本身不负责暴露或传输 Prometheus 指标数据,它只做服务发现、健康检查和 KV 配置管理。Prometheus 从 Gin 应用拉取指标,靠的是 /metrics 这个 HTTP 接口;而 Consul 的作用是告诉 Prometheus:“这个 Gin 实例现在活着,在哪,端口是多少”。所以不是“Consul 对接 Prometheus 指标”,而是“Consul 帮 Prometheus 动态发现 Gin 实例的 /metrics 地址”。
Gin 启动时向 Consul 注册自身服务
你得让 Gin 进程启动后,主动调用 Consul API 把自己注册进去,否则 Prometheus 就找不到它。关键点:
- 注册时必须带上健康检查配置,比如定期 GET
/health或/metrics,失败则自动剔除 - 服务名(
service.Name)、地址(service.Address)、端口(service.Port)要填对,Prometheus 会拼出http://<address>:<port>/metrics</port> </address> - 建议在
main()中注册,且确保 GinEngine.Run()前已完成注册,避免注册成功但服务未就绪 - 示例注册字段片段(Go):
service := &api.AgentServiceRegistration{ ID: "gin-api-01", Name: "gin-api", Address: "192.168.1.100", Port: 8080, Check: &api.AgentServiceCheck{ HTTP: "http://192.168.1.100:8080/health", Interval: "10s", Timeout: "2s", }, }
Prometheus 配置 consul_sd_configs 动态拉取
Prometheus 需要明确知道去 Consul 拉哪些服务。在 prometheus.yml 里配 consul_sd_configs,而不是静态写死 targets:
-
server字段必须指向 Consul Agent 的 HTTP 地址(如http://localhost:8500),不是 Server 的 Raft 地址 -
services列表指定要监听的服务名,比如["gin-api"],匹配 Consul 中注册的Name - 默认只拉取
passing状态的服务实例;若需包含 warn 状态,加tags: ["passing"]并配合 Consul 标签过滤 - 务必确认 Consul ACL token 权限:至少需要
service:read和node:read - 配置片段示例:
scrape_configs: - job_name: 'gin-api' consul_sd_configs: - server: 'http://consul:8500' services: ['gin-api'] metrics_path: '/metrics' relabel_configs: - source_labels: [__meta_consul_service_address, __meta_consul_service_port] target_label: instance separator: ':'
Consul KV 存配置,Gin 启动时读取并初始化 Prometheus 指标
Consul 的 KV 可以存 Gin 应用的监控相关参数,比如 Histogram 的分桶边界、自定义标签值、是否启用某类指标等。Gin 启动时读一次即可,不建议运行时频繁轮询:
- 用
api.KV.Get("gin/metrics/config")获取 JSON 配置,解析进结构体 - 例如读取
enable_request_duration控制是否注册http_request_durationHistogram - 注意:KV 值变更不会自动热更新指标逻辑,需重启或设计 reload 机制(较复杂,生产环境慎用)
- 别把敏感配置(如 Prometheus Pushgateway 地址)硬编码,放 KV 更安全可管
最易被忽略的是 Consul 健康检查路径与 Gin 路由冲突:如果 /health 返回 503(比如依赖 DB 未连通),Consul 会下线该实例,但 Prometheus 就再也拉不到 /metrics —— 即使指标采集本身完全正常。健康检查应只测进程存活和基本 HTTP 可达性,而非全链路依赖。











