Prometheus 是一个功能强大且使用广泛的监控系统和时序数据库。它以 HTTP 的方式从远程机器收集数据,并支持灵活的查询语言 PromQL 来分析采集到的数据。GoFrame 框架提供了 Metric 组件,可以方便地将应用运行数据暴露给 Prometheus 采集。下面我们看看如何在 GoFrame 项目中集成 Metric。
安装 Metric 组件
shell
go get github.com/gogf/gf/contrib/metrics/prometheus/v2
配置 Prometheus 地址
在配置文件(config.yaml
)中添加:
yaml
metrics:
prometheus:
Address: ":8080"
Route: "/metrics"
其中 Address
是暴露指标的端口,Route
是 URL 路径。
初始化 Metric
go
import "github.com/gogf/gf/contrib/metrics/prometheus/v2"
func init() {
prometheus.Init()
}
添加指标收集
在需要收集指标的代码位置添加指标:
go
// 统计请求数
prometheus.Counter.Inc("app_request_total", map[string]string{
"path": r.URL.Path,
"code": r.Response.Status,
})
// 记录请求延迟
prometheus.Histogram.Observe("app_request_duration", float64(r.LeaveTime-r.EnterTime)/1000, map[string]string{
"path": r.URL.Path,
})
app_request_total
和 app_request_duration
是自定义的指标名称,可以根据实际情况修改。
运行应用,Prometheus 开始采集
启动 GoFrame 应用后,Prometheus 就可以通过配置的地址(http://localhost:8080/metrics
)采集到应用运行指标了。
可视化查询分析
在 Prometheus 的 UI 或者 Grafana 等可视化面板中,使用 PromQL 就可以方便地查询和分析采集到的指标数据了,比如:
stylus
app_request_total // 请求总数
rate(app_request_total[5m]) // 5分钟内平均请求数
app_request_duration // 请求延迟
histogram_quantile(0.95, rate(app_request_duration[5m])) // 5分钟内95%的请求延迟
使用 Metric 组件
Metric 组件提供了一些常用的指标类型,如 Counter、Gauge、Histogram、Summary 等,可以直接调用相应的方法来自定义指标。例如:
go
// Counter
prometheus.Counter.Inc("app_task_count", map[string]string{"type": "download"})
// Gauge
prometheus.Gauge.Set("app_online_users", 100)
// Histogram
prometheus.Histogram.Observe("app_task_latency", 10.5, map[string]string{"type": "upload"})
// Summary
prometheus.Summary.Observe("app_payload_size", 1024)
使用 Prometheus 客户端库
除了 Metric 组件封装的方法,你还可以直接使用 Prometheus 的 Go 客户端库来自定义指标。首先引入依赖:
go
import "github.com/prometheus/client_golang/prometheus"
然后可以使用 Prometheus 客户端库提供的方法来创建和注册指标:
go
// 创建一个 Gauge 指标
cpuUsage := prometheus.NewGauge(prometheus.GaugeOpts{
Name: "app_cpu_usage",
Help: "Current cpu usage.",
})
// 将指标注册到默认的注册表中
prometheus.MustRegister(cpuUsage)
// 更新指标的值
cpuUsage.Set(85.0)
定义结构体并实现 Prometheus 的 Collector 接口
对于一些更复杂的指标,可以定义结构体,并实现 Prometheus 的 Collector 接口。这样可以更灵活地控制指标的收集和展示。
go
import "github.com/prometheus/client_golang/prometheus"
// 定义一个结构体
type UserCollector struct {
UserTotal prometheus.Gauge
UserOnline prometheus.Gauge
}
// 实现 Describe 方法
func (c *UserCollector) Describe(ch chan<- *prometheus.Desc) {
ch <- c.UserTotal.Desc()
ch <- c.UserOnline.Desc()
}
// 实现 Collect 方法
func (c *UserCollector) Collect(ch chan<- prometheus.Metric) {
c.UserTotal.Set(getUserTotalFromDB())
c.UserOnline.Set(getUserOnlineFromRedis())
ch <- c.UserTotal
ch <- c.UserOnline
}
func init() {
// 注册自定义的 Collector
prometheus.MustRegister(&UserCollector{
UserTotal: prometheus.NewGauge(prometheus.GaugeOpts{
Name: "app_user_total",
Help: "Total number of registered users.",
}),
UserOnline: prometheus.NewGauge(prometheus.GaugeOpts{
Name: "app_user_online",
Help: "Number of online users.",
}),
})
}
总结
通过以上简单的几个步骤,我们就可以利用 GoFrame 的 Metric 组件将应用运行指标暴露给 Prometheus,实现应用性能的监控和分析。Metric 组件使用非常灵活方便,你可以收集任意你需要了解的指标,如接口调用次数、耗时、错误数、资源消耗等,以掌握应用的实时运行状态。结合 Prometheus 强大的存储、查询、报警功能,以及丰富的可视化插件,对应用进行多维度监控和优化,提高服务可用性。