tencent cloud

腾讯云可观测平台

动态与公告
产品动态
产品简介
产品概述
产品优势
基本功能
基本概念
应用场景
使用限制
购买指南
云产品监控
应用性能监控
终端性能监控
前端性能监控
云拨测
Prometheus 监控服务
Grafana 服务
事件总线
云压测
快速入门
监控概览
实例分组
云产品监控
应用性能监控
云拨测
云压测
Prometheus 监控服务
Grafana 服务
创建 Dashboard
事件总线
告警服务
云产品监控
云产品监控指标
控制台操作指南
云服务器监控组件
云产品监控对接 Grafana
故障处理
实践教程
应用性能监控
应用性能监控简介
接入指南
控制台操作指南
实践教程
参考信息
常见问题
终端性能监控
终端性能监控概述
控制台操作指南
接入指南
实践教程
前端性能监控
前端性能监控简介
控制台操作指南
接入指南
常见问题
云拨测
产品简介
控制台操作指南
常见问题
云压测
云压测概述
控制台操作指南
实践教程
JavaScript API 列表
常见问题
Prometheus 监控
Prometheus 监控简介
接入指南
控制台操作指南
实践教程
Terraform
常见问题
Grafana 服务
产品简介
控制台操作指南
Grafana 平台常用功能指引
常见问题
Dashboard
什么是 Dashboard
控制台操作指南
告警管理
控制台操作指南
故障处理
常见问题
事件总线
事件总线简介
控制台操作指南
实践教程
常见问题
报表管理
常见问题
腾讯云可观测平台常见问题
告警服务相关
一般性问题
监控图表相关
云服务器监控组件相关
动态阈值告警相关
云监控对接 Grafana 相关
文档阅读指南
相关协议
应用性能监控服务等级协议
APM 隐私协议
APM 数据处理和安全协议
前端性能监控服务等级协议
终端性能监控服务等级协议
云拨测服务等级协议
Prometheus 监控服务服务等级协议
Grafana 服务服务等级协议
云压测服务等级协议
云压测使用限制
Cloud Monitor Service Level Agreement
词汇表

自定义监控

PDF
聚焦模式
字号
最后更新时间: 2024-08-07 22:00:10

操作场景

您可以通过 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云监控告警 的能力可以对自定义监控指标进行实时告警,详情请参见 告警介绍及使用

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈