我正在尝试向我的 Sanic 应用程序添加指标。 Prometheus 提供作为 ASGI 应用程序运行的 Python 客户端 - https://prometheus.github.io/client_python/exporting/http/asgi/ .
问题是如何同时运行 2 个 ASGI 应用程序。| ||我发现 Starlette 可以提供帮助:
安装并工作, 但 Sunic 返回一个异常:
from prometheus_client import make_asgi_app
from starlette.applications import Starlette
from starlette.routing import Mount
from sanic import Sanic
from sanic.response import text
sanic_app = Sanic("MyHelloWorldApp")
@sanic_app.get("/")
async def hello_world(request):
return text("Hello, world.")
metrics_app = make_asgi_app()
routes = [
Mount("/", app=sanic_app),
Mount("/metrics", app=metrics_app)
]
app = Starlette(routes=routes)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=8000, log_level="info")
metrics_app
有人知道将 Prometheus 客户端与 ASGI Sanic 一起使用的更直接的方法吗?
sanic.exceptions.SanicException: Loop can only be retrieved after the app has started running. Not supported with `create_server` function
Does anybody know a more straightforward way to use Prometheus Client with ASGI Sanic?
遇到的错误是因为 Sanic 没有以 ASGI 应用的方式运行。虽然 Sanic 可以使用 uvicorn 运行,但这会在其上创建一个 ASGI 层,而 Sanic 本身并不了解它。
要解决这个问题,需要直接在 Sanic 中公开 Prometheus 指标端点,而不是尝试将其作为单独的 ASGI 应用程序运行。
以下是如何操作:
import asyncio
from prometheus_client import Counter, generate_latest
from sanic import Sanic
from sanic.response import raw, text
app = Sanic("MyHelloWorldApp")
# 创建一个简单的计数器指标
REQUEST_COUNT = Counter(
'request_count',
'Total number of requests served',
['method', 'endpoint']
)
@app.route("/")
async def hello_world(request):
REQUEST_COUNT.labels(request.method, request.path).inc()
return text("Hello, world.")
@app.route("/metrics")
async def metrics(request):
# 使用 asyncio.to_thread 将同步函数转换为异步函数
# generate_latest 是同步函数,需要在单独的线程中执行
content = await asyncio.to_thread(generate_latest)
return raw(content, content_type="text/plain; version=0.0.4; charset=utf-8")
if __name__ == "__main__":
app.run(host="127.0.0.1", port=8000)
这段代码执行以下操作:
-
定义指标:
创建一个
REQUEST_COUNT
计数器,用于跟踪每个端点的请求数量及其 HTTP 方法。 -
增加指标:
在
hello_world
处理程序中,使用REQUEST_COUNT.labels().inc()
增加相应标签的计数器。 -
公开指标端点:
创建一个新的
/metrics
路由,该路由使用generate_latest
函数以 Prometheus 格式返回指标。 - 运行 Sanic 应用: 与以前一样启动 Sanic 应用。
现在,应该能够访问
http://127.0.0.1:8000/metrics
并查看 Prometheus 格式的指标。
请记住,这只是一个简单的示例,可以根据自己的需要定义更复杂的指标和标签。
标签:python,prometheus,metrics,asgi,sanic From: 78837870