理解Prometheus与Python应用监控

 引言

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) |  
|                   |  
+-------------------+  

流程图说明:

    1. Prometheus 服务器 通过拉取模型从目标(exporters)中获取指标。
    2. Exporters(例如,Node Exporter)从系统中收集指标,并以 Prometheus 兼容的格式暴露这些指标。
    3. 指标(计数器、仪表、直方图、摘要)被推送到 Prometheus 服务器。

 

  • 服务器将指标存储在其时间序列数据库(TSDB)中。
  • 用户使用PromQL查询指标。
  • 查询的数据通过Grafana等工具进行可视化。

 

 结论

理解Prometheus的数据类型对于有效的系统监控至关重要:

  • 计数器跟踪累积事件。
  • 仪表监控波动值。
  • 直方图分析数据在桶中的分布。
  • 摘要提供基于分位数的洞察。

Python示例展示了实现和时间变化,而流程图概述了Prometheus从数据收集到可视化的流程。掌握这些知识后,用户可以利用Prometheus高效地监控和管理他们的系统。

更多