Kratos 默认不启用 metrics 采集。需手动初始化 Prometheus registry、调用 srv.Handle("/metrics", promhttp.Handler()) 暴露端点,并用 metrics.DefaultMeter 显式创建和上报指标,否则 /metrics 返回空或 404。

kratos 默认 metrics 采集是否自动启用?
不自动启用。Kratos 的 metrics 接口只是定义了一套标准抽象(metrics.Meter),本身不启动 HTTP 端点、不暴露 /metrics 路径、也不默认注册任何指标。你得手动接入 Prometheus 客户端并挂载 handler。
怎么注册 Prometheus handler 到 Kratos HTTP Server?
核心是两步:初始化 Prometheus registry,再用 promhttp.Handler() 挂到路由上。Kratos 的 http.Server 支持直接添加 http.Handler,无需改写中间件链。
- 确保已引入
github.com/prometheus/client_golang/prometheus/promhttp - 在构建
http.Server时,调用server.Handle("/metrics", promhttp.Handler()) - 如果用了 Kratos 的
http.NewServer+http.WithMiddleware,不要把/metrics路由丢进中间件链——它不需要鉴权、限流或 tracing,绕过中间件更安全
示例片段:
srv := http.NewServer(
http.Address(":8000"),
)
srv.Handle("/metrics", promhttp.Handler()) // 直接注册,不走 middleware
如何让业务指标被 Prometheus 自动采集?
Kratos 不会帮你埋点。你需要用 metrics.DefaultMeter(或自己注入的 metrics.Meter)显式创建指标,并在关键路径上报。Prometheus 客户端只负责暴露已注册的指标,不自动扫描代码。
- 计数器用
meters.NewCounter,比如http_requests_total{method="GET",code="200"} - 直方图用
meters.NewHistogram,推荐用于请求耗时,注意 bucket 设置要匹配实际 P95/P99 分布 - 所有指标必须通过
meter.Record或对应方法(如counter.Add)触发上报,否则不会出现在/metrics输出里 - 避免在 hot path 上反复调用
meters.NewXXX—— 应该在 init 或 service setup 阶段一次性创建并复用
为什么 /metrics 返回空或 404?
最常见三个原因:
-
srv.Handle("/metrics", ...)没调用,或者路径写成了/actuator/metrics这类 Spring 风格路径 - Prometheus client 的 registry 没被正确传入 handler,比如误用了
prometheus.NewRegistry()却没把它塞给promhttp.HandlerFor - HTTP Server 启动失败或端口被占,但日志没报错——建议 curl 本地
localhost:8000/metrics确认服务真在跑
另外注意:Kratos 的 tracing 和 logging 中间件默认不打点 metrics,这部分得自己补全,比如在 middleware 里调用 counter.Add(1) 统计请求量。


















