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

相关推荐
HelloWorld00116 分钟前
告警不是心疼 token,是根因没找对:把 400 条告警压成 1 条根因的归因管道实战
架构
鶴哥只手遮天18 分钟前
《rustc 内幕》第 1 章 全景:rustc 编译流水线与 crate 版图
后端·rust·开源
starzy199039 分钟前
深入理解Scala隐式值:编译期自动装配
开发语言·后端·scala
时间的拾荒人2 小时前
Redis 哨兵(Sentinel)详解:原理、选举机制与实战部署
redis·面试·架构·sentinel
装不满的克莱因瓶2 小时前
设计模式之策略模式核心概念和应用场景
java·后端·设计模式·架构·系统架构·策略模式
特立独行的猫A9 小时前
用仓颉语言 cj-tauri 框架,五分钟给娃做了个鸿蒙形近字游戏
java·后端·python
码事漫谈12 小时前
我花了一周时间,看AI公司怎么"管"AI,结果越看越后背发凉
后端
真上帝的左手12 小时前
30. 技术专题-‌应用框架组件-分布式架构
分布式·架构·系统架构·分布式架构
爱学习的程序媛14 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
GISer_Jing14 小时前
Agent核心内容
后端·ai·langchain