pytheus
现代的Python库,用于收集用于您的应用程序的Prometheus指标,可在同步和异步程序中运行。
文档: https://pythe.us
Pytheus
与Metrics一起玩
Pytheus是一个现代的Python库,用于收集构建的prometheus指标。
一些功能是:
- 多个多进程支持
- redis后端
- Rust Powered后端ð§ª
- 带上自己的
- redis后端
- 支持默认标签值
- 部分标签值(以增量方式构建)
- 可自定义的注册表支持
- 注册表前缀支持
哲学
简而言之就是让您按照所需的方式工作。
非常灵活,允许用户自定义他们可能想做的任何事情而不必求助于黑客,最重要的是,为单个和多过程方案提供相同的API,该开关应为很容易加载不同的后端而无需更改代码中的任何内容。
- 您看到的是您得到的。
-
singleprocess
&multiprocess
之间没有差异,唯一的更改是
用法
与:
安装
pip install pytheus
创建一个计数器并将其递增:
from pytheus.metrics import Counter
cache_hit_total = Counter(name='cache_hit_total', description='desc')
cache_hit_total.inc()
最终生成指标:
from pytheus.exposition import generate_metrics
metrics = generate_metrics()
烧瓶应用程序的完整示例
import time
from flask import Flask, Response
from pytheus.metrics import Histogram
from pytheus.exposition import generate_metrics, PROMETHEUS_CONTENT_TYPE
app = Flask(__name__)
http_request_duration_seconds = Histogram(
'http_request_duration_seconds', 'documenting the metric..'
)
@app.route('/metrics')
def metrics():
data = generate_metrics()
return Response(data, headers={'Content-Type': PROMETHEUS_CONTENT_TYPE})
# track time with the context manager
@app.route('/')
def home():
with http_request_duration_seconds.time():
return 'hello world!'
# alternatively you can also track time with the decorator shortcut
@app.route('/slow')
@http_request_duration_seconds
def slow():
time.sleep(3)
return 'hello world! from slow!'
app.run(host='0.0.0.0', port=8080)
生锈的多进程ð
对于Python中的多过程,您需要同步所有枪支工人之间的指标,例如,此后端实现使您的应用程序非常容易支持该指标,并且它也与Asyncio Python应用程序兼容,因为该处理将在处理中并行完成在引擎盖下!
安装:
pip install pytheus-backend-rs
加载后端:
from pytheus.backends import load_backend
from pytheus_backend_rs import RedisBackend
load_backend(
backend_class=RedisBackend,
backend_config={"host": "127.0.0.1", "port": 6379},
)
就是这样!现在,无论您使用多少个指标的工人,它们之间都会同步:)
FastAPI自动指标集合
库为FastAPI应用程序提供了中间件,该应用程序将自动收集有关HTTP请求处理时间和数据大小的指标,并且可能会根据method
(GET/POST/..)进行检查检查,status_code
(200,400,.. )&route
(/home)。
加载中间件
from fastapi import FastAPI
from pytheus.middleware import PytheusMiddlewareASGI
app = FastAPI()
app.add_middleware(PytheusMiddlewareASGI)
创建Prometheus收集指标的终点
from fastapi.responses import PlainTextResponse
from pytheus.exposition import generate_metrics
@app.get('/metrics', response_class=PlainTextResponse)
def pytheus_metrics():
return generate_metrics()
如果您访问端点,您将看到类似的指标:
# HELP http_request_duration_seconds duration of the http request
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_bucket{method="GET",route="/metrics",status_code="200",le="0.005"} 1.0
http_request_duration_seconds_bucket{method="GET",route="/metrics",status_code="200",le="0.01"} 1.0
http_request_duration_seconds_bucket{method="GET",route="/metrics",status_code="200",le="0.025"} 1.0
http_request_duration_seconds_bucket{method="GET",route="/metrics",status_code="200",le="0.05"} 1.0
http_request_duration_seconds_bucket{method="GET",route="/metrics",status_code="200",le="0.1"} 1.0
http_request_duration_seconds_bucket{method="GET",route="/metrics",status_code="200",le="0.25"} 1.0
http_request_duration_seconds_bucket{method="GET",route="/metrics",status_code="200",le="0.5"} 1.0
http_request_duration_seconds_bucket{method="GET",route="/metrics",status_code="200",le="1"} 1.0
http_request_duration_seconds_bucket{method="GET",route="/metrics",status_code="200",le="2.5"} 1.0
http_request_duration_seconds_bucket{method="GET",route="/metrics",status_code="200",le="5"} 1.0
http_request_duration_seconds_bucket{method="GET",route="/metrics",status_code="200",le="10"} 1.0
http_request_duration_seconds_bucket{method="GET",route="/metrics",status_code="200",le="+Inf"} 1.0
http_request_duration_seconds_sum{method="GET",route="/metrics",status_code="200"} 0.0014027919969521463
http_request_duration_seconds_count{method="GET",route="/metrics",status_code="200"} 1.0
# HELP http_request_size_bytes http request size
# TYPE http_request_size_bytes histogram
# HELP http_response_size_bytes http response size
# TYPE http_response_size_bytes histogram
http_response_size_bytes_bucket{method="GET",route="/metrics",status_code="200",le="10.0"} 0.0
http_response_size_bytes_bucket{method="GET",route="/metrics",status_code="200",le="100.0"} 0.0
http_response_size_bytes_bucket{method="GET",route="/metrics",status_code="200",le="1000.0"} 1.0
http_response_size_bytes_bucket{method="GET",route="/metrics",status_code="200",le="10000.0"} 1.0
http_response_size_bytes_bucket{method="GET",route="/metrics",status_code="200",le="100000.0"} 1.0
http_response_size_bytes_bucket{method="GET",route="/metrics",status_code="200",le="1000000.0"} 1.0
http_response_size_bytes_bucket{method="GET",route="/metrics",status_code="200",le="10000000.0"} 1.0
http_response_size_bytes_bucket{method="GET",route="/metrics",status_code="200",le="100000000.0"} 1.0
http_response_size_bytes_bucket{method="GET",route="/metrics",status_code="200",le="+Inf"} 1.0
http_response_size_bytes_sum{method="GET",route="/metrics",status_code="200"} 296.0
http_response_size_bytes_count{method="GET",route="/metrics",status_code="200"} 1.0