Python 代码集成 Prometheus Client 输出 Metrics 到 Prometheus

在 Python 中,可以使用 Prometheus Python Client Library 来输出 Metrics,供 Prometheus 采集。

安装 Prometheus 客户端库

pip install prometheus-client

以下是一个完整的示例,展示如何设置和暴露 Metrics:

from prometheus_client import start_http_server, Summary, Counter, Gauge, Histogram
import random
import time

# 定义 Metrics
REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request')
REQUEST_COUNT = Counter('request_count', 'Total number of requests')
IN_PROGRESS = Gauge('in_progress_requests', 'Number of requests in progress')
REQUEST_LATENCY = Histogram('request_latency_seconds', 'Histogram of request latency')

# 模拟一个请求处理函数
@REQUEST_TIME.time() # 使用 Summary 记录函数运行时间
def process_request():
REQUEST_COUNT.inc() # 记录请求次数
IN_PROGRESS.inc() # 增加正在进行的请求数

latency = random.random() # 模拟随机延迟
REQUEST_LATENCY.observe(latency) # 记录延迟
time.sleep(latency)

IN_PROGRESS.dec() # 减少正在进行的请求数

if __name__ == "__main__":
# 启动 HTTP Server,用于暴露 Metrics
start_http_server(8000) # 默认端口 8000
print("Prometheus metrics available at http://localhost:8000/metrics")

# 模拟请求处理
while True:
process_request()

Metrics 类型说明(对应 Prometheus 中相关的数据类型)

  • Summary : 用于记录事件的持续时间或大小(例如请求处理时间)。
  • Counter : 计数器,记录事件的总发生次数(例如请求总数)。
  • Gauge : 测量当前值,可以增加或减少(例如当前活跃请求数)。
  • Histogram : 创建直方图,记录数据分布(例如请求延迟分布)。

向 Prometheus 暴露 Metrics

start_http_server(8000) 会启动一个 HTTP 服务器,在 /metrics 路径下暴露指标数据。Prometheus 将通过该路径采集数据。

装饰器

使用 @REQUEST_TIME.time() 装饰器自动记录函数执行时间。

标签

可以在指标中添加 标签(Labels) 来提供多维度的指标。

REQUEST_COUNT.labels(method='GET').inc()

Metrics 类型说明

在 Prometheus Python Client Library 中,常用的四种数据类型分别是 CounterGaugeSummaryHistogram

数据类型对比

数据类型 特性 常见用途
Counter 只能递增 请求总数、错误总数
Gauge 可增可减,可设置具体值 系统状态(CPU、内存)、队列长度
Summary 百分位、平均值 请求时间、数据大小
Histogram 值的分布,生成直方图 延迟分布、批处理时间分布

Counter

累加器 ,用于计数只能增加的值(不会减少)。常用于记录事件发生的总次数,如请求数量、错误数量等。支持以下方法:

from prometheus_client import Counter

REQUEST_COUNT = Counter('request_count', 'Total number of requests')

# 增加计数
REQUEST_COUNT.inc() # 增加 1
REQUEST_COUNT.inc(5) # 增加 5

# 添加标签(Labels)
REQUEST_COUNT.labels(method='GET').inc()

Gauge

可变值 ,表示某个值可以增加或减少。常用于表示当前状态,比如系统内存占用量、活跃线程数、队列长度等。

from prometheus_client import Gauge

IN_PROGRESS = Gauge('in_progress_requests', 'Number of requests in progress')

# 增加和减少
IN_PROGRESS.inc() # 增加 1
IN_PROGRESS.dec() # 减少 1
IN_PROGRESS.set(5) # 设置为具体值

Summary

用于记录事件的持续时间或值的分布 。生成 最小值最大值平均值百分位

from prometheus_client import start_http_server, Summary
import time

# 定义一个 Summary
REQUEST_TIME = Summary('request_processing_seconds', 'Time spent processing request')

# 模拟请求处理时间
@REQUEST_TIME.time() # 使用装饰器记录时间
def process_request():
time.sleep(1)

if __name__ == "__main__":
start_http_server(8000) # 启动 HTTP 服务
while True:
process_request()


Histogram

Summary 类似,但它会将值划分到 桶(buckets) 中,生成分布直方图

from prometheus_client import start_http_server, Histogram
import time
import random

# 定义一个 Histogram
REQUEST_LATENCY = Histogram('request_latency_seconds', 'Histogram of request latency')

# 模拟请求延迟
def simulate_request():
latency = random.uniform(0, 2) # 随机延迟
REQUEST_LATENCY.observe(latency) # 记录延迟

if __name__ == "__main__":
start_http_server(8000) # 启动 HTTP 服务
while True:
simulate_request()
time.sleep(1)

Django 集成 Prometheus Client Library

在 Django 项目中通过同一个地址(如 8081)暴露 Prometheus Metrics,可以通过以下方式实现共享 HTTP 服务来暴露 Metrics

  • 集中管理 Prometheus Metrics 和 HTTP 服务 。在一个单独的文件中创建指标和 HTTP Server
    metrics.py
    from prometheus_client import start_http_server, Gauge, Counter

    # 定义全局指标
    PROJECT_STATE = Gauge('proj_state', 'State of project', ['state', 'message'])
    REQUEST_COUNTER = Counter('request_counter', 'Request count', ['domain', 'item'])
    RESP_CODE = Gauge('resp_code', 'Response code', ['domain', 'item'])

    # 启动 Prometheus HTTP 服务(仅启动一次)
    def start_prometheus_server():
    start_http_server(8081)

    urls.py 中启动 Metrics 服务
    urls.py
    # urls.py
    from django.urls import path
    from .metrics import start_prometheus_server

    # 启动 Prometheus 服务
    start_prometheus_server()

    urlpatterns = [
    # 其他路径配置
    ]

    urls.py 中启动 Prometheus Metris Http Server,使用 python3 manage.py shell -c 启动程序,不会将 Metrics 写入到 Prometheus Metrics Server 中。需要通过 HTTP url 的方式调用程序才行。