0

0

如何使用Golang实现指标监控_监控指标采集方法

P粉602998670

P粉602998670

发布时间:2026-01-12 17:07:13

|

368人浏览过

|

来源于php中文网

原创

最直接方式是用prometheus/client_golang注册指标并挂载promhttp.Handler()到/metrics;必须调用MustRegister(),指标为全局单例,禁用弃用的prometheus.Handler()。

如何使用golang实现指标监控_监控指标采集方法

prometheus.ClientGolang 暴露指标端点最直接

Go 服务暴露监控指标,首选官方维护的 prometheus/client_golang。它不负责采集,只提供注册、收集和 HTTP 暴露能力。你要做的,是初始化一个 promhttp.Handler() 并挂到 HTTP 路由上。

  • 必须调用 prometheus.MustRegister() 注册你定义的指标(如 prometheus.NewCounterVec),否则指标不会出现在 /metrics
  • 不要在每次请求里新建 CounterGauge —— 它们是全局单例,重复注册会 panic
  • HTTP handler 必须用 promhttp.Handler(),不能用 http.DefaultServeMux 直接返回 prometheus.Handler()(后者已弃用)
package main

import (
    "net/http"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

var (
    httpRequestsTotal = prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total number of HTTP requests.",
        },
        []string{"method", "status"},
    )
)

func init() {
    prometheus.MustRegister(httpRequestsTotal)
}

func handler(w http.ResponseWriter, r *http.Request) {
    httpRequestsTotal.WithLabelValues(r.Method, "200").Inc()
    w.WriteHeader(200)
}

func main() {
    http.HandleFunc("/", handler)
    http.Handle("/metrics", promhttp.Handler()) // 注意这里
    http.ListenAndServe(":8080", nil)
}

自定义指标类型选错会导致查询失败或语义错误

Counter、Gauge、Histogram、Summary 不是随便换着用的。Prometheus 查询函数(如 rate()increase())只对 Counter 有意义;用 Gauge 记请求数量,rate() 会返回 0 或负值。

  • Counter:只增不减,适合累计量(如请求总数、错误总数)
  • Gauge:可增可减,适合瞬时值(如当前 goroutine 数、内存使用 MB)
  • Histogram:分桶统计,适合延迟(latency)、响应大小等分布类指标;生成 _sum_count_bucket 多个时间序列
  • Summary:客户端计算分位数(如 p95),但无法聚合,多实例场景下基本不用

常见误用:HistogramBuckets 设太宽(如 []float64{0.1, 0.2, 5})导致大部分请求挤在最后一个桶,p99 失真;应按实际延迟分布设,比如 []float64{0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10}(单位秒)

指标命名和 label 设计影响 Prometheus 查询效率

指标名要带语义前缀(如 myapp_http_request_duration_seconds),避免用 metric1 这类名称;label 不是越多越好,高基数(cardinality)label(如 user_idrequest_id)会让 series 数量爆炸,拖慢 Prometheus 查询和存储。

ClipDrop Relight
ClipDrop Relight

ClipDrop推出的AI图片图像打光工具

下载

立即学习go语言免费学习笔记(深入)”;

  • 必须用 label 区分维度:比如 methodstatuspath 是合理 label;ipuser_agent 通常不该加(除非明确需要)
  • 避免在 label 值里拼接字符串(如 path="/api/v1/users/"+id),这等于为每个 ID 创建新 series
  • 高频更新的指标(如每秒上千次 Inc())别加太多 label,写入压力会陡增

本地调试时 curl localhost:8080/metrics 看不到指标?先查三件事

暴露端点后 curl 返回空或 404,不是代码写错了就是没跑起来。

  • 确认 http.ListenAndServe() 没 panic,且端口没被占用(lsof -i :8080
  • 确认指标已 MustRegister(),未注册的指标不会出现在 /metrics 输出中
  • 确认没有在 handler 里调用了 os.Exit() 或 panic 后没 recover,导致进程提前退出

另外,promhttp.Handler() 默认只响应 GETOPTIONS,用 POST curl 会 405;调试就老实用 curl -v http://localhost:8080/metrics

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

178

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

192

2025.06.17

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

9

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.6万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号