ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

go-zero + Prometheus + Grafana:30分钟搭好微服务监控链路,看清接口卡在哪一层

go-zero + Prometheus + Grafana:30分钟搭好微服务监控链路,看清接口卡在哪一层 go-zero Prometheus Grafana:30分钟搭好微服务监控链路,看清接口卡在哪一层【免费下载链接】go-zeroA cloud-native Go microservices framework with cli tool for productivity.项目地址: https://gitcode.com/GitHub_Trending/go/go-zero用户说接口慢,你是从哪一层开始查的?请求可能卡在网关、某一次 RPC 调用或某个下游依赖上,没有数据支撑时,排查基本靠人肉提问。这篇文章的方案是:用 go-zero 内置的 Prometheus 指标出口,配合 Grafana 大盘,把每个接口的耗时和错误率变成一眼可见的曲线——不用引第三方库,也不用写埋点代码,30 分钟能跑通。先看默认能测到什么好消息是,go-zero 的大部分监控能力默认就是开着的:REST 服务的MiddlewaresConf.Prometheus默认值为 true(见 rest/ 下的配置定义)zrpc 的服务端与客户端各自有 Prometheus 拦截器,也默认启用,分别在 zrpc/internal/serverinterceptors/ 和 zrpc/internal/clientinterceptors/服务启动时,core/service/serviceconf.go 里的SetUp会调用prometheus.StartAgent(sc.Prometheus)也就是说,你要做的只剩一件事:在配置里填上监听地址。端口和路径在 core/prometheus/config.go 里已有默认值——9101 和 /metrics。Prometheus: Host: 0.0.0.0 # 关键只在这一行,不填地址端口就不会起来原因在 core/prometheus/agent.go:StartAgent发现 Host 为空会直接返回。所以指标没出口,通常不是被关掉了,而是没配地址。go-zero Prometheus 出口怎么配,能拿到哪些指标服务起来后,指标端点就是http://服务IP:9101/metrics,其中最有用的两类:rpc_server_requests_duration_ms:每个 RPC 接口的耗时直方图,内置 1ms 到 5000ms 的桶,可以直接算 P95/P99rpc_server_requests_code_total:按接口 gRPC 错误码打点的计数器,哪个方法在报 500 一查便知这两个指标由UnaryPrometheusInterceptor维护,每次调用结束记一次,标签就是方法全名。你新增接口时完全不用碰它们。REST 侧同样有对应的请求量、耗时指标,由默认中间件输出。⚠️ 怎么验证监控真的生效了这一步最容易跳过,也最容易埋坑,建议按顺序做四件事:看启动日志,应出现Starting prometheus agent at 0.0.0.0:9101。没有这行,先回头查 Host 是否漏配执行curl http://localhost:9101/metrics,输出里应包含rpc_server_requests_duration_ms_bucket手动发起一次真实 RPC 调用,再次 curl 对比,对应 method 的桶计数应增长在 Prometheus 的 Targets 页面确认实例变绿,Query 里能查到指标如果第 2 步 404,多半是 Path 配错;如果是连接被拒,检查防火墙——9101 是独立于业务端口的,容器网络里经常被单独拦掉。Grafana 大盘怎么导入,第一屏看什么先给 prometheus.yml 加一个 job:scrape_configs: - job_name: go-zero static_configs: - targets: [10.0.1.10:9101, 10.0.1.11:9101] scrape_interval: 5s然后在 Grafana 的 Dashboard Import 里导入模板或新建,数据源选 Prometheus。新建大盘时,我建议第一屏只放三张面板:P95 耗时:用 histogram_quantile 对 duration_ms 的 bucket 序列做分位计算错误率:统计 code 非 0 的速率占总请求的比例QPS:code_total 的总速率排查问题时先看这三条曲线,一分钟就能锁定是哪个接口异常,再去放大对应 method 的明细。告警阈值怎么定才不吵告警配得比业务还敏感,比没有告警更伤。我的建议是分两阶段走:第一周只保留一条服务不可达告警(Prometheus 的 up 指标为 0),这是唯一真正的 P0,先证明监控链路本身可信有了 1~2 周历史数据后再加两条:错误率 5 分钟窗口超过 1%,P95 延迟超过 500ms。阈值定在历史峰值加一点容忍度,别凭空拍高频接口的 method 标签基数高,告警规则里的查询时间窗口别拉太长,避免规则本身把 Prometheus 拖慢踩坑与收束再提醒两处容易踩的:新版 go-zero 中 ServiceConf 的 Prometheus 字段已标注 Deprecated,官方倾向用 DevServer(默认 6060 端口,顺带提供 /metrics、/healthz 和 pprof)。如果你的工程启用了 DevServer,指标端口是 6060 而不是 9101,别猜,看日志默认 1~5000ms 的桶不一定贴你的业务。接口都是毫秒级的话,可以用 core/metric/ 里的直方图能力自己调桶;接口普遍秒级的,则要往大扩展上界后续方向一句话带过:pyroscope 持续性能剖析(internal/profiling/)和 OpenTelemetry 全链路追踪都值得接,但不急,一次一步。现在就可以动手:挑你最头疼的那个服务,把Host: 0.0.0.0加进配置,重启,然后跑一遍上面的四步验证。等 /metrics 吐出第一串指标,下次接口慢再来找你时,你手里就有数据了。【免费下载链接】go-zeroA cloud-native Go microservices framework with cli tool for productivity.项目地址: https://gitcode.com/GitHub_Trending/go/go-zero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进