一、操作场景
这篇以 Go 这个语言为例,介绍如何通过 Prometheus 监控服务进行业务自定义指标上报,可视化及告警。
二、版本与环境说明
这篇中的 Go 示例基于 Go Modules 环境编写,推荐使用 github.com/prometheus/client_golang 的当前稳定版本。该 SDK 仅正式支持 Go 最近两个大版本,具体最低 Go 版本要求请以所使用 SDK 版本对应的发布说明为准。
三、支持开发语言
Prometheus 开源社区 SDK:
·Go
·Java or Scala
·Python
·Ruby
其它第3方开发语言 SDK:
·Bash
·C
·C++
·Common Lisp
·Dart
·Elixir
·Erlang
·Haskell
·Lua for Nginx
·Lua for Tarantool
·.NET / C#
·Node.js
·Perl
·PHP
·R
·Rust
更多信息请参见此处
四、数据模型
Prometheus 具有多维分析的能力,数据模型由如下几部分组成。
Metric Name(指标名称) + Label(标签) + Timestamp(时间戳) + Sample Value(样本值)
·Metric Name(指标名称):监控对象的含义(例如,http_request_total 表示当前系统接收到的 HTTP 请求总量)。
·Label(标签):表示当前样本的特征维度,是一个 K/V 结构,通过这些维度 Prometheus 可以对样本数据进行过滤、聚合等。
·Timestamp(时间戳):一个精确到毫秒的时间戳。
·Sample Value(样本值):一个 float64 浮点型数据,表示当前样本的值。
·Metric Name(指标名称)和 Label(标签)只能由 ASCII 字符、数字、下划线以及冒号组成,并必须符合正则表达式 [a-zA-Z_:][a-zA-Z0-9_:]*。
其他参考文档详见 更多 Data Model 说明、Metric/Label 命名实践教程。
五、如何监控埋点
Prometheus 根据监控的不同场景提供了 Counter/Gauge/Histogram/Summary 四种指标类型,每种指标类型说明可参见下文。更多说明请参见 Prometheus 页面 METRIC TYPES。
Prometheus 社区提供了多种开发语言的 SDK,每种语言的使用方法基本上类似,主要是开发语言语法上的区别,下面主要以 Go 作为示例介绍如何上报自定义监控指标数据。
六、Counter
计数类型,数据是单调递增的指标,服务重启之后会重置。可以用 Counter 来监控请求数/异常数/用户登录数/订单数等。
如何通过 Counter 来监控订单数:
package orderimport ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto")// 定义需要监控 Counter 类型对象var ( opsProcessed = promauto.NewCounterVec(prometheus.CounterOpts{ Name: "order_service_processed_orders_total", Help: "The total number of processed orders", }, []string{"status"}) // 处理状态)// 订单处理func makeOrder() { opsProcessed.WithLabelValues("success").Inc() // 成功状态 // opsProcessed.WithLabelValues("fail").Inc() // 失败状态 // 下单的业务逻辑}
例如,通过 rate() 函数获取订单的增长率:
rate(order_service_processed_orders_total[5m])
七、Gauge
当前值,监控打点的时候可对其做加减。可以用 Gauge 来监控当前内存使用率 /CPU 使用率/当前线程数/队列个数等。
如何通过 Gauge 来监控订单队列大小:
package orderimport ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto")// 定义需要监控 Gauge 类型对象var ( queueSize = promauto.NewGaugeVec(prometheus.GaugeOpts{ Name: "order_service_order_queue_size", Help: "The size of order queue", }, []string{"type"}))type OrderQueue struct { queue chan string}func newOrderQueue() *OrderQueue { return &OrderQueue{ queue: make(chan string,100), }}// 产生订单消息 func (q *OrderQueue)produceOrder() { // 产生订单消息 // 队列个数加1 queueSize.WithLabelValues("make_order").Inc() // 下单队列 // queueSize.WithLabelValues("cancel_order").Inc() // 取消订单队列}// 消费订单消息 func (q *OrderQueue)consumeOrder() { // 消费订单消息 // 队列个数减1 queueSize.WithLabelValues("make_order").Dec()}
通过 Gauge 指标,直接查看订单每种类型队列的当前大小:
order_service_order_queue_size
八、Histogram
直方图,Prometheus 会根据配置的 Bucket 来计算样本的分布情况,后期可以再加工,一般多用于耗时的监控,通过 Histogram 可以计算出 P99/P95/P50等耗时,同时也可以监控处理的个数,如果用上 Histogram 就不需要再用 Counter 统计个数。可以用 Histogram 来监控接口响应时间/数据库访问耗时等。
Histogram 和 Summary 的使用方式类似,可以直接参考 Summary 的使用方式。
九、Summary
摘要,和 Histogram 有一点类似,也是计算样本的分布情况,区别是 Summary 会在客户端计算出分布情况(P99/P95/Sum/Count),因此也会更占客户端资源,后期不可再聚合计算处理,同样可以用 Summary 来监控接口响应时间/数据库访问耗时等。
如何通过 Summary 来监控订单处理耗时:
package orderimport ( "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto")// 定义需要监控 Summary 类型对象var ( opsProcessCost = promauto.NewSummaryVec(prometheus.SummaryOpts{ Name: "order_service_process_order_duration", Help: "The order process duration", }, []string{"status"}))func makeOrder() { start := time.Now().UnixNano() // 下单逻辑处理结束,记录处理耗时 defer func() { opsProcessCost.WithLabelValues("success").Observe((float64)(time.Now().UnixNano() – start)) }() // 下单的业务逻辑 time.Sleep(time.Second) // 模拟处理耗时}
通过 Summary 指标,直接查看下单处理平均耗时:
order_service_processed_order_duration_sum / order_service_processed_order_duration_count
十、暴露 Prometheus 指标
通过 promhttp.Handler() 把监控埋点数据暴露到 HTTP 服务上。
package mainimport ( "net/http" "github.com/prometheus/client_golang/prometheus/promhttp")func main() { // 业务代码 // 把 Prometheus 指标暴露在 HTTP 服务上 http.Handle("/metrics", promhttp.Handler()) // 业务代码}
十一、采集数据
完成相关业务自定义监控埋点之后,应用发布,即可通过 Prometheus 来抓取监控指标数据。详情请参见 Golang 接入。
十二、查看监控数据和告警
·如需在 Grafana 中查看监控指标数据,请先确保当前 Prometheus 实例已绑定 Grafana 实例。若尚未绑定,可在 Prometheus 实例列表页通过更多 > 绑定 Grafana 完成绑定,或先在 Grafana 服务 中创建实例后再绑定。绑定完成后,在 Prometheus 实例列表页单击 Grafana 访问地址 列的 Grafana 图标(单击后将在新窗口打开 Grafana),进入 Grafana 后通过 Explore 查看监控指标数据,如下。
·通过 Prometheus 和 腾讯云可观测平台告警管理 的能力可以对自定义监控指标进行实时告警,详情请参见 告警介绍及使用。