Gin 集成 prometheus 客户端实现注册和暴露指标
前言
一个对新手很友好的 Go 项目(带界面),开箱即用,WEB 界面一键安装,没有项目经验,完全可以拿这个练手,目前已经 5.1K+ Star。
- GitHub: github.com/xinliangnot…
- 中文文档:www.yuque.com/xinliangnot…
Prometheus 介绍
Prometheus 是一套开源的监控和警报系统。它旨在帮助开发人员和系统管理员对大规模分布式系统进行监控,并能够及时发现和解决问题。
以下是 Prometheus 的一些主要特点和功能:
- 多维度数据模型:Prometheus 使用多维度数据模型来存储时间序列数据,每个时间序列都由一个唯一的标识符(称为指标名称)和一组键值对(称为标签)来表示。这种灵活的数据模型使得Prometheus能够高效地处理和查询大量的度量数据。
- 灵活的查询语言:Prometheus 提供了一种强大的查询语言,称为PromQL(Prometheus Query Language),用于对指标数据进行查询、聚合和分析。PromQL 支持各种常见的操作,如过滤、排序、计算等,使用户能够轻松地提取有用的信息并生成自定义的监控指标。
- 规则引擎和警报机制:Prometheus 内置了一个规则引擎,可以根据用户定义的规则对指标数据进行处理和计算,并生成警报。用户可以配置警报规则,当指标数据达到或超过某个阈值时,Prometheus 将触发相应的警报动作,如发送通知、执行脚本等。
- 可视化和报表:Prometheus 提供了一个简单易用的 Web 界面,可以用于实时监控和可视化指标数据。该界面支持图表展示、仪表盘配置和数据导出等功能,使用户能够直观地了解系统的运行情况。
- 服务发现和自动化:Prometheus 支持多种服务发现机制,如静态配置、目录服务、Kubernetes 集成等。它可以自动发现和监控新加入的目标,并根据配置自动调整监控策略,从而实现对动态环境的自动化监控。
- 可扩展性和集成性:Prometheus 具有高度可扩展的架构,可以处理数千个节点和百万级别的时间序列数据。它还提供了丰富的API和插件机制,可与其他工具和服务(如 Grafana、Alertmanager 等)进行集成,实现更全面的监控和警报功能。
总结:Prometheus 是一套功能强大、灵活可扩展的监控和警报系统,适用于各种规模和类型的分布式系统。它通过多维度数据模型、灵活的查询语言和强大的警报机制,帮助用户实时监控系统的性能和状态,并及时采取行动来解决潜在问题。
Prometheus Client 介绍
client_golang 是 Prometheus 社区提供的一个 Go 语言客户端库,用于在 Go 应用程序中集成和使用 Prometheus 监控系统。它提供了一系列功能丰富的 API,使开发人员能够方便地暴露指标数据、收集指标数据并与 Prometheus 进行交互。
以下是 client_golang 的一些主要特性和功能:
- 指标类型:client_golang 提供了多种常用的指标类型,包括 Counter、Gauge、Histogram、Summary 等。开发人员可以根据需求选择合适的指标类型,并使用简单的方法来收集和更新指标数据。
- 标签支持:client_golang 支持为指标数据添加标签,以便更灵活地对指标数据进行分类和分析。标签可以用于细分指标数据,例如按照不同的维度、服务或实例进行区分,从而更准确地了解系统的运行情况。
- 注册和暴露指标:client_golang 提供了 Register() 函数用于注册指标对象,并使用promhttp.Handler() 函数创建一个 HTTP 处理程序,用于暴露指标数据给Prometheus 服务器。这样,Prometheus 就可以通过 HTTP 协议获取指标数据并进行监控和分析。
- 指标收集和更新:client_golang 提供了一系列方法来收集和更新指标数据,例如使用 Inc() 和 Dec() 方法增加或减少计数器的值,使用 Set() 方法更新 Gauge 的值等。开发人员可以根据自己的需求选择合适的方法来操作指标数据。
- 兼容性和扩展性:client_golang 与 Prometheus 的数据模型和查询语言完全兼容,能够无缝地集成到 Prometheus 生态系统中。它还提供了丰富的扩展机制,例如Pushgateway、Exporter、Collector 等,使开发人员能够更灵活地管理和处理指标数据。
- 文档和示例:client_golang 提供了详细的文档和丰富的示例代码,帮助开发人员快速上手并理解如何使用该库。文档中包含了 API 参考、最佳实践、常见问题解答等内容,使开发人员能够更好地利用 client_golang 进行监控和警报。
总结:client_golang 是 Prometheus 社区提供的一个功能强大、易于使用的 Go 语言客户端库,用于在 Go 应用程序中集成和使用 Prometheus 监控系统。它提供了多种指标类型、标签支持、注册和暴露指标、指标收集和更新等功能,帮助开发人员方便地暴露和收集指标数据,并与 Prometheus 进行交互,实现全面的监控和警报功能。
项目中如何使用?
1. 开启指标记录
文件地址:./internal/router/router.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
// 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
// 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
// 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
Prometheus 文档
项目代码
- GitHub: github.com/xinliangnot…
- 中文文档:www.yuque.com/xinliangnot…