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

相关推荐
码事漫谈1 小时前
【精华】C++成员初始化列表完全指南:为什么、何时以及如何正确使用
后端
码事漫谈1 小时前
C++ 强制类型转换:类型安全的多维工具
后端
玖日大大3 小时前
英伟达 AI 芯片:架构演进与智能时代的算力基石
人工智能·架构
RainbowSea3 小时前
github 仓库主页美化定制
后端
RainbowSea3 小时前
从 Spring Boot 2.x 到 3.5.x + JDK21:一次完整的生产环境迁移实战
java·spring boot·后端
笨手笨脚の3 小时前
Spring Core常见错误及解决方案
java·后端·spring
计算机毕设匠心工作室3 小时前
【python大数据毕设实战】全球大学排名数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
VX:Fegn08953 小时前
计算机毕业设计|基于Java人力资源管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端·课程设计
ylmzfun4 小时前
Docker全景解析:从容器化理念到日常实践
docker·eureka·架构
荔枝hu4 小时前
springboot和shiro组合引入SseEmitter的一些坑
java·spring boot·后端·sseeitter