[Pytheus]用于同步/异步Python应用程序的简单多处理指标
#教程 #python #fastapi #rust

pytheus

现代的Python库,用于收集用于您的应用程序的Prometheus指标,可在同步和异步程序中运行。

文档: https://pythe.us

GitHub logo Llandy3d / pytheus

与新的Prometheus客户进行python的实验

Pytheus

与Metrics一起玩

ci pypi versions license downloads


文档https://pythe.us


Pytheus是一个现代的Python库,用于收集构建的prometheus指标。

一些功能是:

  • 多个多进程支持
    • redis后端
    • Rust Powered后端ð§ª
    • 带上自己的
  • 支持默认标签值
  • 部分标签值(以增量方式构建)
  • 可自定义的注册表支持
  • 注册表前缀支持

哲学

简而言之就是让您按照所需的方式工作。

非常灵活,允许用户自定义他们可能想做的任何事情而不必求助于黑客,最重要的是,为单个和多过程方案提供相同的API,该开关应为很容易加载不同的后端而无需更改代码中的任何内容。

  • 您看到的是您得到的。
  • singleprocessmultiprocess之间没有差异,唯一的更改是

用法

与:
安装

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