Gin 集成 prometheus 客户端实现注册和暴露指标

前言

当我们构建一个 Web 应用程序时,了解应用程序的性能和行为是非常重要的。Prometheus 是一个流行的开源监控系统,它提供了强大的指标收集和查询功能,可以帮助我们监控应用程序的各个方面。

在 Gin 中集成 Prometheus 可以让我们更方便地监控和收集应用程序的性能指标,从而帮助我们更好地理解应用程序的运行状态。

Prometheus 是什么?

Prometheus 是一套开源的监控和警报系统。它旨在帮助开发人员和系统管理员对大规模分布式系统进行监控,并能够及时发现和解决问题。

以下是 Prometheus 的一些主要特点和功能:

  1. 多维度数据模型:Prometheus 使用多维度数据模型来存储时间序列数据,每个时间序列都由一个唯一的标识符(称为指标名称)和一组键值对(称为标签)来表示。这种灵活的数据模型使得Prometheus能够高效地处理和查询大量的度量数据。

  2. 灵活的查询语言:Prometheus 提供了一种强大的查询语言,称为PromQL(Prometheus Query Language),用于对指标数据进行查询、聚合和分析。PromQL 支持各种常见的操作,如过滤、排序、计算等,使用户能够轻松地提取有用的信息并生成自定义的监控指标。

  3. 规则引擎和警报机制:Prometheus 内置了一个规则引擎,可以根据用户定义的规则对指标数据进行处理和计算,并生成警报。用户可以配置警报规则,当指标数据达到或超过某个阈值时,Prometheus 将触发相应的警报动作,如发送通知、执行脚本等。

  4. 可视化和报表:Prometheus 提供了一个简单易用的 Web 界面,可以用于实时监控和可视化指标数据。该界面支持图表展示、仪表盘配置和数据导出等功能,使用户能够直观地了解系统的运行情况。

  5. 服务发现和自动化:Prometheus 支持多种服务发现机制,如静态配置、目录服务、Kubernetes 集成等。它可以自动发现和监控新加入的目标,并根据配置自动调整监控策略,从而实现对动态环境的自动化监控。

  6. 可扩展性和集成性:Prometheus 具有高度可扩展的架构,可以处理数千个节点和百万级别的时间序列数据。它还提供了丰富的API和插件机制,可与其他工具和服务(如 Grafana、Alertmanager 等)进行集成,实现更全面的监控和警报功能。

总结:Prometheus 是一套功能强大、灵活可扩展的监控和警报系统,适用于各种规模和类型的分布式系统。它通过多维度数据模型、灵活的查询语言和强大的警报机制,帮助用户实时监控系统的性能和状态,并及时采取行动来解决潜在问题。

为什么集成 Prometheus?

  1. 实时监控:集成 Prometheus 可以实时监控你的 Gin 应用程序的性能指标。通过收集和记录请求次数、持续时间、错误率等指标,你可以快速了解应用程序的运行情况,并及时发现潜在的性能问题。

  2. 警报和自动化:Prometheus 还提供了警报功能,可以根据预设的阈值条件,自动触发警报通知。通过集成 Prometheus,你可以在应用程序出现异常或达到预定的性能指标时,及时获得通知,以便快速采取行动。

  3. 数据可视化:Prometheus 提供了 Grafana 等工具,可以将收集到的指标数据进行可视化展示。你可以创建仪表盘,实时地监控应用程序的性能指标,并轻松地进行趋势分析和故障排除。

集成 Prometheus 的好处

  1. 性能优化:通过 Prometheus 记录的指标数据,你可以深入了解应用程序的性能瓶颈和热点,进而进行有针对性的性能优化。你可以分析请求次数、持续时间、错误率等指标,并找出影响性能的关键路径,从而改进应用程序的效率。

  2. 容量规划:借助 Prometheus 收集的指标数据,你可以更好地了解应用程序的负载情况和资源利用率。通过对请求次数、并发连接数、内存使用量等指标的观察,你可以准确评估应用程序的容量需求,规划服务器资源,以支持应用程序的高可用性和扩展性。

  3. 故障排除:当应用程序出现异常或性能下降时,Prometheus 可以帮助你快速定位问题的根源。通过查看相关的指标数据和日志信息,你可以迅速发现故障原因,并进行及时修复,以减少长时间的服务中断和用户投诉。

Go Prometheus Client 介绍

组件:https://github.com/prometheus/client_golang

client_golang 是 Prometheus 社区提供的一个 Go 语言客户端库,用于在 Go 应用程序中集成和使用 Prometheus 监控系统。它提供了一系列功能丰富的 API,使开发人员能够方便地暴露指标数据、收集指标数据并与 Prometheus 进行交互。

以下是 client_golang 的一些主要特性和功能:

  1. 指标类型:client_golang 提供了多种常用的指标类型,包括 Counter、Gauge、Histogram、Summary 等。开发人员可以根据需求选择合适的指标类型,并使用简单的方法来收集和更新指标数据。

  2. 标签支持:client_golang 支持为指标数据添加标签,以便更灵活地对指标数据进行分类和分析。标签可以用于细分指标数据,例如按照不同的维度、服务或实例进行区分,从而更准确地了解系统的运行情况。

  3. 注册和暴露指标:client_golang 提供了 Register() 函数用于注册指标对象,并使用promhttp.Handler() 函数创建一个 HTTP 处理程序,用于暴露指标数据给Prometheus 服务器。这样,Prometheus 就可以通过 HTTP 协议获取指标数据并进行监控和分析。

  4. 指标收集和更新:client_golang 提供了一系列方法来收集和更新指标数据,例如使用 Inc() 和 Dec() 方法增加或减少计数器的值,使用 Set() 方法更新 Gauge 的值等。开发人员可以根据自己的需求选择合适的方法来操作指标数据。

  5. 兼容性和扩展性:client_golang 与 Prometheus 的数据模型和查询语言完全兼容,能够无缝地集成到 Prometheus 生态系统中。它还提供了丰富的扩展机制,例如Pushgateway、Exporter、Collector 等,使开发人员能够更灵活地管理和处理指标数据。

  6. 文档和示例:client_golang 提供了详细的文档和丰富的示例代码,帮助开发人员快速上手并理解如何使用该库。文档中包含了 API 参考、最佳实践、常见问题解答等内容,使开发人员能够更好地利用 client_golang 进行监控和警报。

总结:client_golang 是 Prometheus 社区提供的一个功能强大、易于使用的 Go 语言客户端库,用于在 Go 应用程序中集成和使用 Prometheus 监控系统。它提供了多种指标类型、标签支持、注册和暴露指标、指标收集和更新等功能,帮助开发人员方便地暴露和收集指标数据,并与 Prometheus 进行交互,实现全面的监控和警报功能。

项目中如何使用?

1. 开启指标记录

文件地址:./internal/router/router.go

go 复制代码
mux, err := core.New(logger,
 core.WithEnableCors(),
 core.WithEnableSwagger(),
 core.WithEnablePProf(),
 core.WithEnablePrometheus(metrics.RecordHandler()),
)

启用时,增加参数:core.WithEnablePrometheus(metrics.RecordHandler()) 即可。

2. 定义指标所需信息

文件地址:./internal/proposal/metrics.go

go 复制代码
// MetricsMessage 指标信息
type MetricsMessage struct {
 HOST         string  `json:"host"`          // 请求 HOST
 Path         string  `json:"path"`          // 请求 Path
 Method       string  `json:"method"`        // 请求 Method
 HTTPCode     int     `json:"http_code"`     // HTTP 状态码
 BusinessCode int     `json:"business_code"` // 业务码
 CostSeconds  float64 `json:"cost_seconds"`  // 耗时,单位:秒
 IsSuccess    bool    `json:"is_success"`    // 状态,是否成功
}

3. 指标注册

文件地址:./internal/metrics/prometheus.go

go 复制代码
// metricsRequestsTotal metrics for request total 计数器(Counter)
var metricsRequestsTotal = prometheus.NewCounterVec(
 prometheus.CounterOpts{
  Namespace: namespace,
  Subsystem: subsystem,
  Name:      "requests_total",
  Help:      "request(ms) total",
 },
 []string{"method", "path"},
)

// metricsRequestsCost metrics for requests cost 累积直方图(Histogram)
var metricsRequestsCost = prometheus.NewHistogramVec(
 prometheus.HistogramOpts{
  Namespace: namespace,
  Subsystem: subsystem,
  Name:      "requests_cost",
  Help:      "request(ms) cost milliseconds",
 },
 []string{"method", "path", "success", "http_code", "business_code", "cost_milliseconds"},
)

// 根据需要,可定制其他指标,操作如下:
// 1. 定义需要的指标
// 2. init() 中注册
// 3. RecordMetrics() 中传值

4. 指标收集

文件地址:./internal/metrics/metrics.go

go 复制代码
// RecordHandler 指标处理
func RecordHandler() func(msg *proposal.MetricsMessage) {
 return func(msg *proposal.MetricsMessage) {
  RecordMetrics(
   msg.Method,
   msg.Path,
   msg.IsSuccess,
   msg.HTTPCode,
   msg.BusinessCode,
   msg.CostSeconds,
  )
 }
}

5. 指标暴露

路由地址:http://127.0.0.1:9999/metrics

go 复制代码
if opt.enablePrometheus {
 mux.engine.GET("/metrics", gin.WrapH(promhttp.Handler())) // register prometheus
}

项目代码

相关推荐
chaodaibing2 天前
elasticsearch_exporter启动报错 failed to fetch and decode node stats
elasticsearch·prometheus
陌殇殇殇3 天前
Prometheus监控MySQL主从数据库
运维·数据库·mysql·prometheus
福大大架构师每日一题3 天前
19.1 使用k8s的sdk编写一个项目获取pod和node信息
云原生·容器·kubernetes·prometheus
福大大架构师每日一题3 天前
19.3 打镜像部署到k8s中,prometheus配置采集并在grafana看图
kubernetes·grafana·prometheus
福大大架构师每日一题4 天前
21.2 k8s中etcd的tls双向认证原理解析
容器·kubernetes·prometheus·etcd
always20224 天前
Gin框架简易搭建(3)--Grom与数据库
数据库·go·gin
我的运维人生4 天前
基于Prometheus和Grafana的现代服务器监控体系构建
服务器·运维开发·grafana·prometheus·技术共享
BUG弄潮儿5 天前
k8s 部署 prometheus
容器·kubernetes·prometheus
iQM756 天前
基于Prometheus和Grafana的现代服务器监控体系构建
服务器·grafana·prometheus
kayotin7 天前
使用Prometheus进行系统监控,包括Mysql、Redis,并使用Grafana图形化表示
redis·mysql·prometheus