登录
首页 >  Golang >  Go教程

Golang监控与Prometheus集成教程

时间:2025-10-19 12:55:29 389浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Golang自定义指标监控与Prometheus集成》,涉及到,有需要的可以收藏一下

答案是使用Prometheus Go客户端库定义并注册自定义指标,通过HTTP中间件记录请求数据,暴露/metrics端点供Prometheus抓取。具体步骤为:1. 引入prometheus/client_golang依赖,定义计数器http_requests_total和直方图request_duration_seconds;2. 在init函数中注册指标;3. 编写中间件更新指标,利用包装的ResponseWriter捕获状态码;4. 使用promhttp.Handler()暴露/metrics路径;5. 配置prometheus.yml的scrape_configs添加目标地址,即可在UI查询指标。

Golang如何使用Prometheus抓取自定义指标

在Go应用中集成Prometheus来抓取自定义指标,核心是使用官方客户端库 prometheus/client_golang。你需要定义指标、注册到处理器,并暴露一个HTTP端点供Prometheus抓取。

1. 引入依赖并初始化指标

先安装Prometheus Go客户端:

go get github.com/prometheus/client_golang/prometheusgo get 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", "endpoint", "status"}, )
requestDuration = prometheus.NewHistogramVec(
    prometheus.HistogramOpts{
        Name:    "http_request_duration_seconds",
        Help:    "HTTP request latency in seconds.",
        Buckets: []float64{0.1, 0.3, 0.5, 1.0, 2.0},
    },
    []string{"endpoint"},
)

)

在程序启动时注册这些指标:

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

2. 在代码中更新指标

在处理请求的地方记录数据。例如,在HTTP中间件中:

func metricsMiddleware(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { start := time.Now()
    // 包装 ResponseWriter 来捕获状态码
    rw := &responseWriter{ResponseWriter: w, statusCode: 200}
    next.ServeHTTP(rw, r)

    duration := time.Since(start).Seconds()
    endpoint := r.URL.Path

    httpRequestsTotal.WithLabelValues(r.Method, endpoint, fmt.Sprintf("%d", rw.statusCode)).Inc()
    requestDuration.WithLabelValues(endpoint).Observe(duration)
}

}

确保实现自定义的 responseWriter 来获取状态码:

type responseWriter struct { http.ResponseWriter statusCode int }

func (rw *responseWriter) WriteHeader(code int) { rw.statusCode = code rw.ResponseWriter.WriteHeader(code) }

3. 暴露/metrics端点

使用 promhttp 处理器暴露指标:

func main() { http.Handle("/metrics", promhttp.Handler())
// 示例接口
http.HandleFunc("/api/users", metricsMiddleware(func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "user list")
}))

log.Println("Server starting on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))

}

Prometheus就可以通过 http://your-service:8080/metrics 抓取数据了。

4. 配置Prometheus抓取

prometheus.yml 中添加你的目标:

scrape_configs: - job_name: 'go-service' static_configs: - targets: ['localhost:8080']

重启Prometheus后,就能在Prometheus UI中查询如 http_requests_totalhttp_request_duration_seconds 等指标。

基本上就这些。只要定义好指标、正确记录、暴露端点,Prometheus就能自动抓取你的Go服务中的自定义监控数据。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>