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

相关推荐
不会写DN1 分钟前
处理非 UTF-8 输入:GB18030 回退策略
后端·go
人道领域3 分钟前
GPT-5架构泄露?Kubernetes 1.31发布与Rust重构浪潮下的云原生之变
gpt·云原生·架构
Honmaple18 分钟前
Claude Code 多模型协作利器:CCG Workflow v1.7.55 更新指南
后端
Ares-Wang21 分钟前
flask 路由 add_url_rule 、@app.route app.test_request_context() 类视图
后端·python·flask
人道领域23 分钟前
【黑马点评日记02】Redis解决Tomcat集群Session共享问题
java·前端·后端·架构·tomcat·firefox
cheems952724 分钟前
[JavaEE]深度解构 Spring 核心:从控制反转 (IoC) 到依赖注入 (DI) 的架构演进
java·spring·架构·java-ee
立莹Sir25 分钟前
【架构图解+实战配置】SaaS多租户资源隔离的云原生完整方案
云原生·架构
LONGZETECH39 分钟前
破解智能网联汽车教学痛点!龙泽科技AR仿真软件,重新定义实训新范式
科技·架构·汽车·ar·职业教育·汽车仿真教学软件·汽车故障诊断
程序员cxuan40 分钟前
10 个贼爽的 workflow 工作流
后端·程序员·代码规范