使用 Prometheus 的 Metric 组件监控 GoFrame 应用

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

相关推荐
bugtraq202141 分钟前
Fyne ( go跨平台GUI )中文文档-入门(一)
开发语言·后端·golang
绒绒毛毛雨1 小时前
特定transfomer架构的模型的压缩量化处理
架构
Mutig_s1 小时前
如何理解MVCC
java·后端·mysql·面试
晴子呀1 小时前
Spring底层架构源码解析(三)
架构
无理 Java1 小时前
【技术解析】消息中间件MQ:从原理到RabbitMQ实战(深入浅出)
java·分布式·后端·rabbitmq·多线程·mq·消息中间件
iQM751 小时前
Spring Boot 2.x基础教程:实现文件上传
java·开发语言·spring boot·后端
pumpkin845141 小时前
Spring Boot 从 2.7.x 升级到 3.3注意事项
java·spring boot·后端
2402_857583491 小时前
蜗牛兼职网:Spring Boot框架应用
java·spring boot·后端
全栈学姐2 小时前
springbootKPL比赛网上售票系统
java·vue.js·spring boot·后端
Ylucius2 小时前
苍穹外卖学习日志 -----20天项目从零到完结-----含软件下载,环境配置,框架学习,代码编写,报错处理,测试联调,每日总结,心路历程等等......
java·spring boot·后端·学习·intellij-idea·mybatis·idea