Prometheus 监控接入规范
目录
一、目的
二、自定义监控指标定义规范
2.1 基本命名规范
2.1.1 指标命名规范
2.1.2 标签名称
2.2 控制基数
2.2.1 避免高基数标签
2.2.2 预定义标签集
2.2.3 动态数据的处理
2.2.4 评估与监控基数
2.2.5 降低历史数据的保留
2.2.6 适当使用 Histogram 和 Summary
2.2.7 示例
2.3 指标类型
2.4 标签 (Labels)
2.5 单位 (Units)
三、自定义监控指标的实现
3.1 指标注册
3.2 指标暴露
3.3 合理模块化与封装
封装指标创建
3.4 优化打点性能
缓存和批处理
延迟操作
3.5 文档与注释
注释与文档
一、目的
本规范旨在指导研发团队在开发过程中正确定义、使用和注册自定义监控指标,确保在 Prometheus 监控系统中,所有指标具备一致性、规范性和高可观测性,为系统性能优化和问题排查提供可靠的数据支持。
二、自定义监控指标定义规范
2.1 基本命名规范
2.1.1 指标命名规范
-
前缀: 使用清晰的前缀区分不同业务领域或服务。例如:
-
http_
:与 HTTP 请求相关的指标。 -
db_
:与数据库相关的指标。 -
cache_
:与缓存系统相关的指标。
-
-
命名风格: 使用小写字母和下划线
_
分隔词。指标名称应简单易懂,并反映其所代表的内容。-
示例:
http_request_duration_seconds
,db_query_count
-
-
简洁明了: 指标名称应当简洁、描述性强,便于理解和使用。避免使用复杂、难以理解的名称。例如,
http_requests_total
明确表明它代表 HTTP 请求的总数。 -
使用标准前缀和单位: 遵循 Prometheus 社区推荐的命名惯例,以确保一致性和可读性。常见的后缀包括
_total
表示计数器,_duration_seconds
表示时间度量。确保单位明确,避免混淆。-
示例:
-
request_duration_seconds
: 表示请求的持续时间,单位为秒。 -
disk_io_bytes_total
: 表示磁盘 I/O 的总字节数。
-
-
-
避免缩写: 除非是非常常见的缩写,否则应避免使用缩写来命名指标。例如,
cpu_usage_ratio
要优于cpu_use_rt
。
2.1.2 标签名称
-
规范化名称:
-
标签应使用小写字母,并使用下划线
_
分隔单词。 -
避免大小写混用或混淆的标签命名。
-
示例:
service
,region
,method
,status_code
-
-
标签值的规范性:
-
标签值应具有实际业务意义,能够帮助区分和筛选数据。
-
标签值尽量少变动,避免使用高基数的值如用户ID、请求ID等。
-
2.2 控制基数
控制基数是自定义监控指标设计中的一个关键因素,直接影响 Prometheus 的性能和存储需求。基数(cardinality)指的是某个指标的不同标签组合生成的唯一时间序列数量。过高的基数会导致 Prometheus 需要存储和处理大量的时间序列数据,从而增加存储开销、查询延迟,甚至可能导致系统性能下降或崩溃。因此,在设计自定义监控指标时,务必注意控制基数。
2.2.1 避免高基数标签
-
标签值尽量少变动:
-
使用固定范围的标签值,比如状态码、请求方法、主机名等。
-
避免使用如用户 ID、请求 ID、设备 ID 等高基数标签值,因为这些标签可能会为每个独立请求创建一个新的时间序列。
-
-
限制动态标签:
-
尽量避免使用可能随每次请求而变化的标签,如 URL、查询参数或时间戳等。
-
如果必须使用,可以考虑通过哈希或分桶的方式来降低基数。
-
-
汇总与聚合:
-
考虑将高度动态的标签进行汇总或聚合处理,例如通过
service
、region
、instance
等更高层次的标签来替代过于细粒度的标签。
-
2.2.2 预定义标签集
-
限制标签组合:
-
预先定义好合理的标签集,避免随意添加新的标签组合。这样可以有效控制时间序列的数量。
-
示例:
-
定义好固定的请求方法和状态码标签组合,如
method="GET"
和status_code="200"
,而不是对每个不同的 URL 都创建新的标签组合。
-
-
-
固定标签值范围:
-
对于某些业务场景,可以设定固定的标签值范围。例如,对于请求的响应时间可以分为
fast
、normal
、slow
三类,而不是直接记录具体的时间值。
-
2.2.3 动态数据的处理
-
减少动态数据打点:
-
对于一些动态变化的数据,可以考虑减少其打点的频率,或者在后台通过汇总任务来定期更新指标,而不是实时更新。
-
-
批量处理:
-
对高频率产生的动态数据,可以通过批量处理的方式减少标签的变动。例如,将一分钟内的所有请求统计成一个总量,而不是单独记录每一次请求的详细信息。
-
2.2.4 评估与监控基数
-
定期评估基数:
-
定期检查 Prometheus 中指标的基数情况,识别出可能存在高基数的问题指标,并进行优化调整。
-
-
监控基数变化:
-
实时监控自定义指标的基数,及时发现和处理基数异常增长的情况,避免系统压力过大。
-
2.2.5 降低历史数据的保留
-
合理设置数据保留周期:
-
对于高基数的指标,可以考虑缩短其数据保留周期,减轻存储压力。通过配置
retention
策略,合理设置数据的保留时间。
-
-
历史数据聚合:
-
对历史数据进行聚合存储,将精细的时间序列数据汇总为更为粗粒度的时间段数据,降低历史数据的存储需求。
-
2.2.6 适当使用 Histogram 和 Summary
-
选择适合的指标类型:
-
对于需要监控的数据分布情况,优先使用
Histogram
而非Summary
,因为Histogram
提供的桶可以有效减少标签值的动态变化。
-
-
自定义桶的大小和范围:
-
在使用
Histogram
时,自定义桶的数量和范围,以避免生成过多的时间序列。确保桶的数量和范围合理,既能满足监控需求,又不会导致基数过高。
-
2.2.7 示例
-
避免高基数标签: 高基数标签会生成大量的时间序列,增加存储和检索的负担。避免使用可能产生大量唯一值的标签,例如用户ID、IP地址、请求ID等。
-
Bad: 标签
method
使用过于细化的路径,导致基数过高。status_code{method="/users/123/profile", service="user-service"}
- Good: 使用通用化的
method
标签,减少基数。status_code{method="GET", service="user-service"}
-
2.3 指标类型
Prometheus 支持以下几种主要的指标类型,每种类型有其特定的用途:
-
Counter (计数器): 用于表示某一事件发生的次数。计数器只能递增,或在重启时重置为零。
-
示例:
http_requests_total
-
httpRequestsTotal := prometheus.NewCounter(prometheus.CounterOpts{Name: "http_requests_total",Help: "Total number of HTTP requests.",
})
-
Gauge (仪表盘): 仪表用于记录可以增加或减少的数值,例如当前内存使用量、CPU 使用率等。适合用于表示系统的当前状态。
-
示例:
memory_usage_bytes
-
memoryUsage := prometheus.NewGauge(prometheus.GaugeOpts{Name: "memory_usage_bytes",Help: "Current memory usage in bytes.",
})
-
Histogram (直方图): 用于对事件发生的次数或数值进行分布统计,特别适用于测量延迟或请求大小。
-
示例:
http_request_duration_seconds_bucket
-
requestDurationHist := prometheus.NewHistogram(prometheus.HistogramOpts{Name: "http_request_duration_seconds",Help: "Duration of HTTP requests in seconds.",Buckets: prometheus.LinearBuckets(0.01, 0.05, 10), // 0.01s to 0.51s
})
-
Summary (摘要): 类似于 Histogram,但提供百分位数统计,适用于低采样率下的数据。
-
示例:
http_request_duration_seconds
-
2.4 标签 (Labels)
-
标签命名: 标签的命名应遵循与指标类似的命名规范,使用小写字母和下划线
_
。避免使用过多的标签,以减少指标的基数。-
示例:
service
,method
,status
-
-
标签值: 标签值应尽量少变化,并避免使用高基数的值(如用户 ID、请求 ID 等)。标签值应具备实际业务意义,并能够帮助区分不同维度的数据。
2.5 单位 (Units)
-
单位标识: 在指标名称中显式包含单位,使用国际单位制 (SI) 的后缀。典型单位后缀包括:
-
时间:
_seconds
-
大小:
_bytes
-
数量:
_total
-
百分比:
_ratio
或_percent
-
-
示例:
-
http_request_duration_seconds
表示 HTTP 请求的响应时间,单位为秒。 -
memory_usage_bytes
表示内存使用量,单位为字节。
-
三、自定义监控指标的实现
3.1 指标注册
在代码中自定义并注册指标时,应遵循以下步骤:
-
定义指标: 在服务启动时初始化和定义指标对象。选择适当的指标类型,并为其分配标签。
示例 (Go 语言):
var httpRequestDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{Name: "http_request_duration_seconds",Help: "HTTP request latency distributions.",Buckets: prometheus.DefBuckets,},[]string{"method", "route"}, )
-
注册指标: 将定义的指标注册到 Prometheus 默认的注册表中。
prometheus.MustRegister(httpRequestDuration)
-
记录指标: 在代码逻辑中根据需要更新指标的值。
timer := prometheus.NewTimer(httpRequestDuration.WithLabelValues("GET", "/api/v1/resource")) defer timer.ObserveDuration()
3.2 指标暴露
-
/metrics 端点:
-
确保服务中的指标通过
/metrics
端点暴露,以供 Prometheus 抓取。 -
Prometheus 客户端库通常会自动处理这一部分,只需确保服务端点正确配置。
-
3.3 合理模块化与封装
封装指标创建
将指标的创建与初始化封装在一个独立的模块中,使代码更具可维护性和重用性
package metrics
import ("github.com/prometheus/client_golang/prometheus"
)
var (HttpRequestsTotal = prometheus.NewCounter(prometheus.CounterOpts{Name: "http_requests_total",Help: "Total number of HTTP requests.",})MemoryUsage = prometheus.NewGauge(prometheus.GaugeOpts{Name: "memory_usage_bytes",Help: "Current memory usage in bytes.",})...
)
func Init() {prometheus.MustRegister(HttpRequestsTotal, MemoryUsage)
3.4 优化打点性能
缓存和批处理
根据实际情况,适当缓存数据并进行批处理,减少对指标的频繁操作。
// Example of batch processing
func ProcessDataBatch(batch []Data) {start := time.Now()for _, data := range batch {process(data)metrics.DataProcessed.Inc()}duration := time.Since(start).Seconds()metrics.BatchProcessDuration.Observe(duration)
}
延迟操作
仅在必要时更新指标,尽量减少对性能的影响。
if needToUpdateMetrics {metrics.HttpRequestsTotal.Inc()
3.5 文档与注释
注释与文档
为每个指标添加适当的注释和文档,帮助其他开发者理解指标的用途和含义
// HttpRequestsTotal counts the total number of HTTP requests received.
var HttpRequestsTotal = prometheus.NewCounter(prometheus.CounterOpts{Name: "http_requests_total",Help: "Total number of HTTP requests received.",
})
相关文章:

Prometheus 监控接入规范
目录 一、目的 二、自定义监控指标定义规范 2.1 基本命名规范 2.1.1 指标命名规范 2.1.2 标签名称 2.2 控制基数 2.2.1 避免高基数标签 2.2.2 预定义标签集 2.2.3 动态数据的处理 2.2.4 评估与监控基数 2.2.5 降低历史数据的保留 2.2.6 适当使用 Histogram 和 Summa…...

优化 SQL 查询性能:深入理解 EXPLAIN 命令
优化 SQL 查询性能:深入理解 EXPLAIN 命令 在 MySQL 数据库管理中,优化 SQL 查询性能是确保高效数据处理的关键。EXPLAIN 命令是分析和优化 SQL 查询的强大工具,它帮助我们理解查询执行计划,从而找到性能瓶颈并进行优化。本文将详细解释 EXPLAIN 命令返回的各个列的含义,…...

@Mapper报红
检查pom.xml,导入 org.mybatis.spring.boot 依赖: <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency…...

shell综合小实验1-----查看系统硬件信息
echo命令的使用 1:echo -n 不换行 echo -n “我是个大聪明” #不换行输入我是大聪明 2:echo -e 开启颜色 echo -e "\03335m我是大聪明\033[0m" #用35m这种颜色输出我是大聪明然后关闭颜色显示, 30多是字体颜色,40多是…...

【过程管理】项目需求管理规程(Word原件)
在软件开发的过程中,开发人员与用户之间往往忽视有效的信息沟通,这常常导致开发出的软件无法满足用户的实际需求,进而引发不必要的返工。返工不仅为开发人员带来技术上的困扰,增加了人力和物力的消耗,还会对软件的整体…...

C# 不使用 `async` 和 `await` 的常见场景
虽然 async 和 await 是强大的异步编程工具,但在某些情况下,不使用它们可能更合适。以下是一些不使用 async 和 await 的常见场景: 方法是完全同步的: 如果方法中的所有操作都是同步的,并且没有异步调用,则…...

adb目录笔记《adb更新、进入开发者模式,adb查询packages、adb开启应用,查询进程、强制删除进程》
1.sideload模式 在需要安卓没有root权限的时候,可以使用adb reboot sideload命令进入sideload模式,之后运行对应文件 adb reboot sideload adb sideload <root.zip> 2.packages包查询、运行、删除 在需要查看安卓中packages包的名称时…...

VS2022 C++ EasyX EGE 吃豆人升级版
我是可爱的C小盆友(不要脸了),嘻嘻,等了这么久,吃豆人终于升级啦! 更新日志: 1.修复奇奇怪怪的bug 2.把敌人AI增强了一(hen)点(duo) 3.加入了…...

计算机图形学 | 动画模拟
动画模拟 布料模拟 质点弹簧系统: 红色部分很弱地阻挡对折 Steep connection FEM:有限元方法 粒子系统 粒子系统本质上就是在定义个体和群体的关系。 动画帧率 VR游戏要不晕需要达到90fps Forward Kinematics Inverse Kinematics 只告诉末端p点,中间…...

B2.3 Arm 内存模型定义
B2.3 Arm 内存模型定义 Arm 内存模型引入了以下几种关系: 内在关系 :例如,内在数据/控制/顺序依赖关系和内在翻译之前的关系,这些是源自指令语义的硬件要求。 之后关系 :例如,之后的连贯性和 TLB 之后的关系,这些关系在特定执行中发生这种方式,但在不同的执行中可以以…...

(javaweb)SpringBootWeb案例(毕业设计)案例--部门管理
目录 1.准备工作 2.部门管理--查询功能 3.前后端联调 3.部门管理--新增功能 1.准备工作 mapper数据访问层相当于dao层 根据页面原型和需求分析出接口文档--前后端必须遵循这种规范 大部分情况下 接口文档由后端人员来编写 前后端进行交互基于restful风格接口 http的请求方式…...

PCL 采样一致性模型介绍
采样一致性可以简单高效的检测出一些具有数学表达式的目标模型。PCL中的sample consensus模块中不仅包含各种的采样一致性估计方法,也包含一些已经编写好的数学模型,下面主要介绍一下PCL中的采样一致性模型。 1. 二维圆模型 pcl::SampleConsensusModelCircle2D< PointT …...

Unity手游开放大世界解决方案
开个新坑了,分享一个手游开放大世界的解决方案,也算是我开发研究了一年多的结果吧。之前项目需要,做了一整套的手游开放大世界解决方案,这里做一个总结归纳,将所需要的技术栈和解决方案等汇总。 这篇文章只是起头一个目…...

mysql B+ 树
问题: mysql innodb引擎 B树主键自增,插入数据时是从中间分裂,还是使用页尾部元素作为父节点的值然后添加一个新页,或者说主键连续自增,mysql有没有做这样的优化? 以下是Chat GPT给出的回答:...

Sublime Text常用快捷键大全
Sublime Text 是一款功能强大且广受欢迎的文本编辑器,其丰富的快捷键支持使得开发者能够更高效地编写和编辑代码。以下是 Sublime Text 中一些常用的快捷键,帮助你更加高效地使用这款工具: 功能分类快捷键 (Windows)快捷键 (Mac)新建文件Ctr…...

中成科信票务管理系统 TicketManager.ashx接口SQL注入漏洞复现 [附POC]
文章目录 中成科信票务管理系统 TicketManager.ashx接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议中成科信票务管理系统 TicketManager.ashx接口SQL注入漏洞复现 [附POC] 0x01 前言 …...

设计模式六大原则之:依赖倒置原则
1. 依赖倒置原则简介 依赖倒置原则(Dependency Inversion Principle, DIP) 是面向对象设计的核心原则之一,由罗伯特马丁(Robert C. Martin)提出,旨在降低类间的依赖度,使之更易于维护和扩展。该原则主张高层模块不应该依赖于底层模块&#x…...

06_Linux中如何让程序重启后自动启动
Linux中如何让程序重启后自动启动 systemd单元文件1.创建服务文件!!!服务配置文件的介绍 2.需要配置服务的状态(加载和启用服务)3.验证服务程序的运行状态4.打印程序的标准输出 systemd单元文件 Systemd 是现代 Linux…...

优化业务流程的关键:深入探讨BPA流程设计
在当前竞争激烈的商业环境中,业务流程自动化(BPA)已经成为企业提升效率、减少成本和提高业务灵活性的关键工具。今天,我们将深入探讨BPA流程设计的重要性及其实施步骤,为企业提供实用的指南。 什么是BPA? …...

qt工程中调用sdl的流程
配置 Qt 工程 在你的 Qt 工程中,需要对项目文件(.pro 文件)进行配置,以包含 SDL 库的路径和链接选项。 # Qt Project File (.pro)# 设置 SDL 库的路径 INCLUDEPATH /path/to/SDL/include LIBS -L/path/to/SDL/lib -lSDL2初始化…...

ECMAScript性能优化技巧与陷阱
大家好,我是程序员小羊! 前言 ECMAScript,即JavaScript,是一种广泛应用于Web开发中的脚本语言。随着现代Web应用的复杂度日益增加,如何优化JavaScript的性能变得至关重要。性能优化不仅能提高应用的响应速度&#x…...

c++实现B树(上)
哈喽啊!好久不见,甚是想念!失踪人口要回归了,时隔一个多月小吉我终于要更新blog了🎉。在停更的一个多月中,小吉也有在好好学习提升自己,立志给大家呈现好文章。 现在让我们进入正题吧…...

【机器学习】深度强化学习–RL的基本概念、经典场景以及算法分类
引言 深度强化学习(Deep Reinforcement Learning, DRL)是机器学习的一个分支,它结合了深度学习(Deep Learning)和强化学习(Reinforcement Learning, RL)的技术 文章目录 引言一、深度强化学习–…...

【git】将本地文件上传到github
安装git 选择一个文件夹作为git仓库,cd到文件夹输入 git init文件夹出现.git文件夹,该文件夹默认为隐藏文件夹,设置为不隐藏 在cmd中输入 ssh-keygen -t rsa -C "xxxxxx.com"该邮箱为github邮箱,然后一路enter出现以…...

安卓应用开发学习:手机摇一摇功能应用尝试--摇骰子和摇红包
一、引言 前几天,我发布的日志《安卓应用开发学习:查看手机传感器信息》记录了如何查看手机传感器的信息,通过上述的方法,可以看到我的OPPO手机支持19种传感器。本篇日志就记录一下常见的加速度传感器的典型应用——“摇一摇”功…...

HTML中的<fieldset>标签元素框的使用
HTML 提供的 <fieldset> 标签用于在表单中分组相关元素。 <fieldset> 标签会在相关元素周围绘制一个框。 <legend> 标签为 fieldset 元素定义标题。 语法如下: <fieldset><legend>标题</legend><!-- 元素内容... -->…...

Linux驱动入门实验班——SR501红外模块驱动(附百问网视频链接)
目录 一、工作方式 二、接口图 三、编写思路 1.构造file_operations结构体 2.实现read函数 3.编写入口函数 4.编写中断处理函数 5.编写出口函数 6.声明出入口函数以及协议 四、源码 五、课程链接 一、工作方式 SR501人体红外感应模块有两种工作模式: …...

windows C++- Com技术简介(上)
在介绍C和winrt与COM组件技术的关系之前,有必要介绍一下com组件技术,这项技术比较古老,但是它一直作为windows的基石存在。COM 是一类独立于平台且面向对象的分布式系统,用于创建可交互的二进制软件组件。 COM 技术是 Microsoft O…...

Jenkins持续集成工具学习
一、从装修厨房看项目开发效率优化 二、持续集成工具 三、JavaEE项目部署方式对比 四、JenkinsSVN持续集成环境搭建 五、JenkinsGitHub持续集成环境搭建...

Redis:查询是否包含某个字符/字符串之三
上一篇:Redis:查询是否包含某个字符/字符串之二-CSDN博客 摘要: 遍历key,在跟进value的类型遍历value是否包含指定字符串 search_strings ,这里使用redis-py库,默认只能处理utf-8编码,如果存在…...