首页 › 论坛 › 置顶 › 理解Prometheus与Python应用监控
-
作者帖子
-
2025-05-30 10:07 #24065Q QPY课程团队管理员
引言
Prometheus 是一个开源的系统监控和告警工具包,最初在 SoundCloud 开发。Prometheus 的核心组件是其数据模型,该模型定义了用于表示监控指标的不同数据类型。理解这些数据类型对于有效使用 Prometheus 收集、存储和查询监控数据至关重要。本文将深入探讨 Prometheus 数据类型,提供 Python 代码示例以演示其用法,分析它们在一分钟和五分钟内的变化,解释其背后的变化原理,最后使用英文 bash 方框图呈现 Prometheus 流程图。
Prometheus 数据类型
1 .计数器
在 Prometheus 中,计数器 是一个累积指标,表示一个只增不减的单一数值。它通常用于计数事件,例如服务的请求数量、完成的任务或发生的错误。
Python 代码示例
from prometheus_client import Counter # 创建一个计数器指标
request_counter = Counter('http_requests_total', 'HTTP请求总数') # 模拟一些HTTP请求 for _ in range(10): request_counter.inc() print(request_counter._value.get())
解释:
- 从
prometheus_client
库中导入Counter
类。 - 创建一个名为
http_requests_total
的计数器,并附上帮助字符串。 - 通过递增计数器来模拟 10 次 HTTP 请求。
- 打印当前的计数器值。
数据随时间变化
- 一分钟:
假设一个网络服务器每分钟接收 10 个请求。如果初始计数器值为 50,那么在一分钟后将增加到 60。 - 五分钟:
在每分钟 10 个请求的恒定速率下,计数器将在五分钟内增加 50,从初始值 50 增加到 100。
变化原理:
每当跟踪事件发生时,计数器增加 1。Prometheus 会存储随时间累积的总和,值不会自然减少,这使得它非常适合跟踪长期事件趋势。
2. 计量器
Gauge 是一个表示单一数值的指标,该数值可以任意增减。它用于测量温度、内存使用情况或并发连接等值。
Python 代码示例
from prometheus_client import Gauge # 创建一个 gauge 指标 memory_usage_gauge = Gauge('memory_usage_bytes', '内存使用情况(字节)') # 模拟内存使用情况变化 memory_usage_gauge.set(1024) memory_usage_gauge.inc(512) memory_usage_gauge.dec(256)
print(memory_usage_gauge._value.get())
解释:
- 导入
Gauge
类并创建一个名为memory_usage_bytes
的仪表。 - 将初始值设置为 1024 字节,增量为 512,减量为 256。
- 打印最终的仪表值(1280 字节)。
数据随时间变化
- 一分钟:
内存使用情况可能会快速波动。例如,如果初始值为1024字节,进程消耗了额外的300字节,仪表值上升至1324字节。如果进程释放了100字节,则下降至1224字节。 - 五分钟:
值可能会经历多次变化(例如,在五分钟内,值变化为1024 → 1324 → 1200 → 1500 → 1400 → 1600字节)。
变化原理:
仪表可以被显式设置、递增或递减。Prometheus在每个采样间隔记录当前值,反映被监控实体的实时状态。
3. 直方图
直方图对观察结果(例如,请求持续时间或响应大小)进行采样,并将其计入可配置的桶中,同时提供所有值的总和。
Python代码示例
from prometheus_client import Histogram import random # 创建一个具有指定桶的直方图度量 request_duration_histogram = Histogram(
'http_request_duration_seconds', 'HTTP请求持续时间(秒)', buckets=(0.1, 0.2, 0.3, 0.4, 0.5) ) # 模拟20个请求持续时间 for _ in range(20): duration = random.uniform(0, 0.6) request_duration_histogram.observe(duration) # 打印结果
print(f"总和: {request_duration_histogram._sum.get()}") print(f"计数: {request_duration_histogram._count.get()}") for bucket, count in request_duration_histogram._buckets.items():
print(f"桶 {bucket}: {count.get()}")
解释:
- 定义一个包含0.1到0.5秒的直方图桶。
- 模拟20个请求持续时间,并使用
observe()
记录它们。 - 打印总和、计数和桶分布。
数据随时间变化
- 一分钟:
新的观察(例如,一分钟内25个请求)增加了计数和总和,桶计数根据实际持续时间进行更新。 - 五分钟:
累积的观察导致更大的计数和总和,如果发生更多长时间请求,桶分布会发生变化。
变化原则:
每个观察值被分配到一个桶中,并更新总和。直方图随着时间的推移构建数据分布,使得能够分析值范围和大小。
4 .摘要
摘要对观察值进行采样并计算分位数(例如,中位数、90百分位数)以总结数据分布,不同于使用固定桶的直方图。
Python 代码示例
from prometheus_client import Summary # 创建一个带有端点标签的摘要 response_size_summary = Summary( 'http_response_size_bytes',
'HTTP响应大小(字节)', labelnames=['endpoint'] ) # 记录不同端点的观察结果 response_size_summary.labels(endpoint='/api/v1/users').observe(1024) response_size_summary.labels(endpoint='/api/v1/posts').observe(2048) # 打印结果
print(f"总和: {response_size_summary._sum.get()}") print(f"计数: {response_size_summary._count.get()}") for quantile, sum_val in response_size_summary._quantile_sum.items():
print(f"分位数 {quantile}: {sum_val.get()}")
解释:
- 创建一个带有
endpoint
标签的摘要,以区分 API 路由。 - 记录两个端点的响应大小,并打印总和、计数和分位数数据。
数据随时间变化
- 一分钟:
新请求会更新计数、总和和分位数。例如,较大的响应可能会增加第90百分位值。 - 五分钟:
累积数据提高了分位数的准确性,计数和总和不断增长,分布反映了长期趋势。
变化原则:
观察结果更新运行总和、计数和分位数计算(使用移动窗口等算法)。分位数动态调整,以反映最新的数据分布。
Prometheus 流程图(英文 Bash 方框图)
+-------------------+ | Prometheus Server | +-------------------+ | | | 数据收集 | | (拉取模型) | | | | 目标 |<---+ | (出口程序) | | | | | +-------------------+ | | +-------------------+ | | 出口程序 | | | (例如,节点 | | | 出口程序) | | +-------------------+ | | | 指标 | | | (计数器、仪表、 | | | 直方图、 | | | 摘要) | | +-------------------+ | | | 将指标推送到 |<---+ | Prometheus | +-------------------+
| | | 数据存储 | | (TSDB - 时间序列数据库) | | | +-------------------+ | | | 查询 | | (PromQL) | | | +-------------------+ | | | 可视化 | | (例如,Grafana) | | | +-------------------+
流程图说明:
-
- Prometheus 服务器 通过拉取模型从目标(exporters)中获取指标。
- Exporters(例如,Node Exporter)从系统中收集指标,并以 Prometheus 兼容的格式暴露这些指标。
- 指标(计数器、仪表、直方图、摘要)被推送到 Prometheus 服务器。
- 服务器将指标存储在其时间序列数据库(TSDB)中。
- 用户使用PromQL查询指标。
- 查询的数据通过Grafana等工具进行可视化。
结论
理解Prometheus的数据类型对于有效的系统监控至关重要:
- 计数器跟踪累积事件。
- 仪表监控波动值。
- 直方图分析数据在桶中的分布。
- 摘要提供基于分位数的洞察。
Python示例展示了实现和时间变化,而流程图概述了Prometheus从数据收集到可视化的流程。掌握这些知识后,用户可以利用Prometheus高效地监控和管理他们的系统。
- 从
-
作者帖子
- 哎呀,回复话题必需登录。