go服务必须暴露符合prometheus格式的/metrics端点,使用promhttp.handler()注册且不被拦截;需手动定义业务指标并打点;prometheus配置scrape_configs须正确指向服务地址;grafana查询前应先验证prometheus targets为up及指标存在。

Go服务必须暴露 /metrics 端点,否则Grafana连数据都拿不到
Grafana本身不直接采集指标,它只负责可视化——数据得先被Prometheus拉走、存好,Grafana才能查。所以第一步不是配Grafana,而是确保你的Go服务真正在跑一个符合Prometheus文本格式的/metrics接口。
常见错误现象:curl http://localhost:8080/metrics 返回404,或返回HTML/JSON而不是纯文本指标;Grafana里选Prometheus数据源后查http_requests_total一直无数据。
- 必须用
github.com/prometheus/client_golang/prometheus/promhttp,别自己拼字符串输出——它的Handler()会自动处理内容类型、编码、多goroutine并发安全 -
http.Handle("/metrics", promhttp.Handler())要放在http.ListenAndServe()之前,且不能被其他中间件(比如JWT鉴权)拦截,否则Prometheus抓取失败 - 如果服务启用了HTTPS或反向代理(如Nginx),要确认
/metrics路径没被重写或过滤,尤其注意X-Forwarded-Proto头是否影响健康检查
注册指标不能只靠默认收集器,业务指标得手动定义和打点
只挂promhttp.Handler(),你只能看到Go运行时指标(比如go_goroutines、go_memstats_alloc_bytes),但HTTP请求数、延迟、错误率这些关键业务指标,得你自己定义、注册、并在代码路径中调用。
常见错误现象:Grafana面板里rate(http_requests_total[5m])始终为0;直方图http_request_duration_seconds_bucket没有数据;标签(如method、status)全是空值。
- 计数器
Counter适合累计量,比如http_requests_total,但要用rate()函数算QPS,不能直接看原始值 - 直方图
Histogram比Summary更推荐——Prometheus服务端能算分位数,比如histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) - 务必用
WithLabelValues()传入动态标签,别用With()手动拼map,否则容易因标签键名不一致导致series爆炸 - 中间件里打点要包裹
defer,比如记录耗时:start := time.Now(); defer func(){ duration.Observe(time.Since(start).Seconds()) }()
Prometheus配置里的scrape_configs写错,Grafana就成“无米之炊”
Grafana连的是Prometheus,不是你的Go服务。如果Prometheus根本没把指标抓下来,Grafana再漂亮也是空转。所以prometheus.yml里job配置是承上启下的关键一环。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
常见错误现象:Prometheus Web界面的Status > Targets里显示DOWN,报错context deadline exceeded或connection refused;Graph页搜不到任何自定义指标。
-
static_configs里的targets填的是Go服务地址,不是localhost——容器内、K8s Pod IP、宿主机网络环境都要对应,本地开发常用host.docker.internal:8080 -
scrape_interval别设太短(比如1s),Go服务的/metrics是全量dump,高频抓取可能拖慢服务;生产建议15s–30s - 加
metrics_path: "/metrics"显式声明,避免某些反向代理默认改路径;如有基础认证,需配basic_auth字段 - 启动Prometheus后,先去
http://localhost:9090/targets确认target状态为UP,再进Graph搜指标名验证数据存在,这步跳过=后面全白忙
Grafana里查PromQL别硬背,先从http_requests_total和go_goroutines起步
刚配好数据源,别急着导入模板或写复杂查询。先验证链路通不通,再逐步叠加维度和聚合逻辑。很多问题其实卡在最基础的PromQL语法或时间范围上。
常见错误现象:面板图表空白;显示“no data”;数值明显异常(比如延迟显示几万秒);切换时间范围后数据消失。
-
http_requests_total本身是Counter,直接画图意义不大,要用rate(http_requests_total[5m])算每秒请求数;想看总量增长趋势,用increase(http_requests_total[1h]) -
go_goroutines是Gauge,可直接画折线图,但要注意:goroutine数突增可能是泄漏,缓慢上涨也可能是正常业务增长,得结合go_gc_duration_seconds一起看 - 直方图分位数查询必须带
rate(),比如histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])),漏掉rate会导致结果失真 - Grafana面板右上角时间范围选太小(比如Last 5 minutes),而Prometheus抓取间隔是30s,可能只有一两个点——调大到Last 1 hour更稳妥
最容易被忽略的其实是网络连通性链路:Go服务 → Prometheus(scrape)→ Grafana(query)。三者不在同一网络平面时,DNS、防火墙、协议版本(HTTP/1.1 vs HTTP/2)、甚至Go服务的http.Server.ReadTimeout设置,都可能让指标在某一层静默丢失。验证时别跳步骤,从curl /metrics开始,一层层往上摸。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










