tencent cloud

文档反馈

自定义监控

最后更新时间:2024-01-29 15:55:14

    操作场景

    您可以通过 Prometheus 监控服务自定上报指标监控数据,对应用或者服务内部的一些状态进行监控,如请求处理数,下单数等,也可以对一些核心逻辑的处理耗时进行监控,如请求外部服务的耗时情况等。
    本文以 Go 这个语言为例,介绍如何通过 Prometheus 监控服务进行业务自定义指标上报,可视化及告警。

    支持开发语言

    Prometheus 开源社区官方 SDK:
    其它第3方开发语言 SDK:
    Lua for Nginx
    Lua for Tarantool

    数据模型

    Prometheus 具有多维分析的能力,数据模型有如下几部分组成。
    Metric Name(标指名称) + Labels(标签) + Timestamp(时间戳) + Value/Sample(监控值/样品)
    Metric Name(标指名称):监控对象的含义(例如,http_request_total - 表示当前系统接收到的HTTP请求总量)。
    标签(label):表示当前样本的特征维度,是一个K/V结构,通过这些维度 Prometheus 可以对样本数据进行过滤,聚合等。
    时间戳(timestamp):一个精确到毫秒的时间戳。
    样本值(value):一个float64的浮点型数据表示当前样本的值。
    Metric Name(指标名称)/Labels(标签) 只能由ASCII字符、数字、下划线以及冒号组成并必须符合正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*。

    如何监控埋点

    Prometheus 根据监控的不同场景提供了 Counter/Gauge/Historgram/Summary 四种指标类型,每种指标类型说明可参考下文。更多说明请参考 Prometheus 官网 METRIC TYPES
    Prometheus 社区提供了多种开发语言的 SDK,每种语言的使用方法基本上类似,主要是开发语言语法上的区别,下面主要以 Go 作为例子如何上报自定义监控指标数据。

    Counter

    计数类型,数据是单调递增的指标,服务重启之后会重置。可以用 Counter 来监控请求数/异常数/用户登录数/订单数等。
    如何通过 Counter 来监控订单数:
    package order
    
    import (
    "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 order
    
    import (
    "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 order
    
    import (
    "net/http"
    "time"
    
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promauto"
    "github.com/prometheus/client_golang/prometheus/promhttp"
    )
    
    // 定义需要监控 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 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 main
    
    import (
    "net/http"
    
    "github.com/prometheus/client_golang/prometheus/promhttp"
    )
    
    func main() {
    // 业务代码
    
    // 把 Prometheus 指标暴露在 HTTP 服务上
    http.Handle("/metrics", promhttp.Handler())
    
    // 业务代码
    }
    

    采集数据

    完成相关业务自定义监控埋点之后,应用发布,即可通过 Prometheus 来抓取监控指标数据。详情请参见Golang 接入。

    查看监控数据和告警

    打开 Prometheus 监控服务自带的 Grafana,通过 Explore 来查看监控指标数据,如下图,也可以 自定义 Grafana 监控大盘
    
    
    通过 Prometheus云监控告警 的能力可以对自定义监控指标进行实时告警,详情请参见 告警介绍及使用
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持