tencent cloud

Prometheus 监控服务

产品简介
产品概述
产品优势
应用场景
基本概念
相关限制
功能特性
开服地域
购买指南
计费概述
按量付费(后付费)
免费试用介绍
托管采集器付费介绍
归档存储付费介绍
购买方式
欠费说明
快速入门
接入指南
抓取配置说明
自定义监控
EMR 接入
Java 应用接入
Golang 应用接入
Exporters 接入
Nacos 接入
通用组件监控
健康巡检
TKE 集群内安装组件说明
云监控
非腾讯云主机监控
通过 Remote Read 读取云托管 Prometheus 实例数据
Agent 自助接入
Pushgateway 接入
安全组开放说明
操作指南
实例
容器监控
集成中心
数据多写
预聚合
实例诊断
归档存储
告警策略
标签管理
访问控制
Grafana
API 使用指南
容器服务指标
相关资源使用及计费说明
实践教程
自建 Prometheus 迁入
云服务器场景下自定义接入
容器场景监控
TKE Serverless 集群如何放通外网
Prometheus 监控服务如何接入本地 Grafana
Prometheus 实例访问公网
配置 Prometheus 公网地址
Terraform
Terraform 概述
使用 Terraform 管理 Prometheus 实例
使用 Terraform 管理 Prometheus 实例的集成中心
使用 Terraform 采集容器监控数据
使用 Terraform 配置告警策略
常见问题
基础问题
集成容器服务相关
产品咨询
使用&技术问题
云监控问题
服务等级协议
TMP 政策
TMP 隐私协议
TMP 数据处理和安全协议

自定义监控

PDF
聚焦模式
字号
最后更新时间: 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云监控告警 的能力可以对自定义监控指标进行实时告警,详情请参见 告警介绍及使用

帮助和支持

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

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

文档反馈