• 作者:老汪软件技巧
  • 发表时间:2024-09-25 00:03
  • 浏览量:

Prometheus 是一个功能强大且使用广泛的监控系统和时序数据库。它以 HTTP 的方式从远程机器收集数据,并支持灵活的查询语言 PromQL 来分析采集到的数据。GoFrame 框架提供了 Metric 组件,可以方便地将应用运行数据暴露给 Prometheus 采集。下面我们看看如何在 GoFrame 项目中集成 Metric。

安装 Metric 组件

go get github.com/gogf/gf/contrib/metrics/prometheus/v2

配置 Prometheus 地址

在配置文件(config.yaml)中添加:

metrics:
  prometheus:
    Address: ":8080"
    Route: "/metrics"

其中Address是暴露指标的端口,Route是 URL 路径。

初始化 Metric

import "github.com/gogf/gf/contrib/metrics/prometheus/v2"
func init() {
    prometheus.Init()
}

添加指标收集

在需要收集指标的代码位置添加指标:

// 统计请求数
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 就可以通过配置的地址(:8080/metrics)采集到应用运行指标了。

应用组件管理__应用软件组件

可视化查询分析

在 Prometheus 的 UI 或者 Grafana 等可视化面板中,使用 PromQL 就可以方便地查询和分析采集到的指标数据了,比如:

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 等,可以直接调用相应的方法来自定义指标。例如:

// 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 客户端库来自定义指标。首先引入依赖:

import "github.com/prometheus/client_golang/prometheus"

然后可以使用 Prometheus 客户端库提供的方法来创建和注册指标:

// 创建一个 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 接口。这样可以更灵活地控制指标的收集和展示。

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 强大的存储、查询、报警功能,以及丰富的可视化插件,对应用进行多维度监控和优化,提高服务可用性。