在微服务架构下,每个服务的运行状态、请求耗时、错误率等数据都需要被实时采集和观测,Prometheus作为主流的监控告警系统,非常适合搭配Golang开发的微服务使用。通过集成Prometheus客户端库,我们可以快速暴露服务的各类运行指标,再通过Prometheus拉取指标、Grafana展示指标,就能搭建完整的监控体系。

Prometheus核心指标类型
在使用Prometheus之前,需要先了解它支持的四种核心指标类型,不同类型的指标对应不同的监控场景:
- Counter(计数器):只增不减的指标,适合统计请求总量、错误总量这类累计数据
- Gauge(仪表盘):可增可减的指标,适合统计当前在线用户数、内存使用量这类瞬时值
- Histogram(直方图):用于统计样本分布,比如请求耗时的分位数统计
- Summary(摘要):和直方图类似,也可以统计分位数,不过是在客户端计算完成再上报
Golang服务集成Prometheus基础步骤
首先需要在Golang项目中引入Prometheus官方客户端库,执行以下命令安装依赖:
go get github.com/prometheus/client_golang/prometheus go get github.com/prometheus/client_golang/prometheus/promhttp
暴露指标接口
Prometheus通过拉取服务暴露的HTTP接口获取指标,我们需要在Golang服务中注册指标接口,示例代码如下:
package main
import (
"net/http"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
func main() {
// 注册默认的Go运行时指标,比如goroutine数量、内存分配等
// 将/metrics路径绑定到promhttp处理器,Prometheus会从这个路径拉取指标
http.Handle("/metrics", promhttp.Handler())
// 启动HTTP服务,端口为8080
http.ListenAndServe(":8080", nil)
}
运行上述代码后,访问http://127.0.0.1:8080/metrics就能看到服务暴露的所有指标,包括默认的Go运行时指标和后续自定义的指标。
自定义业务指标
除了默认的运行时指标,我们还需要采集业务相关的指标,比如接口请求次数、请求耗时等,以下是自定义Counter和Histogram指标的示例:
package main
import (
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
// 定义自定义指标
var (
// 接口请求总量计数器,按接口路径和方法标签区分
RequestTotal = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_request_total",
Help: "Total number of HTTP requests",
},
[]string{"path", "method"},
)
// 接口请求耗时直方图,按接口路径标签区分,定义耗时区间
RequestDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "HTTP request duration in seconds",
Buckets: prometheus.DefBuckets, // 默认的耗时区间:0.005, 0.01, 0.025...
},
[]string{"path"},
)
)
func init() {
// 注册自定义指标到默认注册表
prometheus.MustRegister(RequestTotal)
prometheus.MustRegister(RequestDuration)
}
// 模拟业务接口处理函数
func helloHandler(w http.ResponseWriter, r *http.Request) {
start := time.Now()
// 模拟业务处理耗时
time.Sleep(100 * time.Millisecond)
// 记录请求总量,标签为当前路径和请求方法
RequestTotal.WithLabelValues(r.URL.Path, r.Method).Inc()
// 记录请求耗时
duration := time.Since(start).Seconds()
RequestDuration.WithLabelValues(r.URL.Path).Observe(duration)
w.Write([]byte("hello world"))
}
func main() {
http.Handle("/metrics", promhttp.Handler())
http.HandleFunc("/hello", helloHandler)
http.ListenAndServe(":8080", nil)
}
Prometheus配置拉取指标
在Prometheus的配置文件prometheus.yml中添加微服务实例的拉取任务,示例配置如下:
global:
scrape_interval: 15s # 全局拉取间隔,默认15秒
scrape_configs:
- job_name: "golang_microservice" # 任务名称
static_configs:
- targets: ["127.0.0.1:8080"] # 微服务的地址和端口,多个实例可以添加到列表中
启动Prometheus后,它就会每隔15秒从127.0.0.1:8080/metrics拉取指标数据,我们可以在Prometheus的UI界面查询对应的指标,比如查询http_request_total就能看到所有接口的请求总量。
常见问题说明
- 如果微服务有多个实例,可以在
targets中添加所有实例的地址,或者使用服务发现机制自动发现实例,不需要手动修改配置 - 自定义指标时标签不要过多,过多的标签会导致Prometheus存储压力增大,一般建议标签数量不超过10个
- 指标名称要符合Prometheus的命名规范,使用下划线分隔单词,不要包含特殊字符
注意:不要在业务代码中频繁创建新的指标实例,所有指标应该在初始化阶段注册完成,避免重复注册导致错误。
GolangPrometheus微服务监控指标采集修改时间:2026-07-22 10:21:30