当前位置: 首页 > news >正文

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、查询参数或时间戳等。

    • 如果必须使用,可以考虑通过哈希或分桶的方式来降低基数。

  • 汇总与聚合:

    • 考虑将高度动态的标签进行汇总或聚合处理,例如通过 serviceregioninstance 等更高层次的标签来替代过于细粒度的标签。

2.2.2 预定义标签集
  • 限制标签组合:

    • 预先定义好合理的标签集,避免随意添加新的标签组合。这样可以有效控制时间序列的数量。

    • 示例:

      • 定义好固定的请求方法和状态码标签组合,如 method="GET"status_code="200",而不是对每个不同的 URL 都创建新的标签组合。

  • 固定标签值范围:

    • 对于某些业务场景,可以设定固定的标签值范围。例如,对于请求的响应时间可以分为 fastnormalslow 三类,而不是直接记录具体的时间值。

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 指标注册

在代码中自定义并注册指标时,应遵循以下步骤:

  1. 定义指标: 在服务启动时初始化和定义指标对象。选择适当的指标类型,并为其分配标签。

    示例 (Go 语言):
    ​
    var httpRequestDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{Name: "http_request_duration_seconds",Help: "HTTP request latency distributions.",Buckets: prometheus.DefBuckets,},[]string{"method", "route"},
    )​
    ​​​
  2. 注册指标: 将定义的指标注册到 Prometheus 默认的注册表中。
     

    prometheus.MustRegister(httpRequestDuration)
  3. 记录指标: 在代码逻辑中根据需要更新指标的值。

    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&#xff0c;导入 org.mybatis.spring.boot 依赖&#xff1a; <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency…...

shell综合小实验1-----查看系统硬件信息

echo命令的使用 1&#xff1a;echo -n 不换行 echo -n “我是个大聪明” #不换行输入我是大聪明 2&#xff1a;echo -e 开启颜色 echo -e "\03335m我是大聪明\033[0m" #用35m这种颜色输出我是大聪明然后关闭颜色显示&#xff0c; 30多是字体颜色&#xff0c;40多是…...

【过程管理】项目需求管理规程(Word原件)

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

C# 不使用 `async` 和 `await` 的常见场景

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

adb目录笔记《adb更新、进入开发者模式,adb查询packages、adb开启应用,查询进程、强制删除进程》

1.sideload模式 在需要安卓没有root权限的时候&#xff0c;可以使用adb reboot sideload命令进入sideload模式&#xff0c;之后运行对应文件 adb reboot sideload adb sideload <root.zip> 2.packages包查询、运行、删除 在需要查看安卓中packages包的名称时&#xf…...

VS2022 C++ EasyX EGE 吃豆人升级版

我是可爱的C小盆友&#xff08;不要脸了&#xff09;&#xff0c;嘻嘻&#xff0c;等了这么久&#xff0c;吃豆人终于升级啦&#xff01; 更新日志&#xff1a; 1.修复奇奇怪怪的bug 2.把敌人AI增强了一&#xff08;hen&#xff09;点&#xff08;duo&#xff09; 3.加入了…...

计算机图形学 | 动画模拟

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

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手游开放大世界解决方案

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

mysql B+ 树

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

Sublime Text常用快捷键大全

Sublime Text 是一款功能强大且广受欢迎的文本编辑器&#xff0c;其丰富的快捷键支持使得开发者能够更高效地编写和编辑代码。以下是 Sublime Text 中一些常用的快捷键&#xff0c;帮助你更加高效地使用这款工具&#xff1a; 功能分类快捷键 (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) 是面向对象设计的核心原则之一&#xff0c;由罗伯特马丁(Robert C. Martin)提出&#xff0c;旨在降低类间的依赖度&#xff0c;使之更易于维护和扩展。该原则主张高层模块不应该依赖于底层模块&#x…...

06_Linux中如何让程序重启后自动启动

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

优化业务流程的关键:深入探讨BPA流程设计

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

qt工程中调用sdl的流程

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

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...