跳转至

FastAPI接口

LogfireFastAPI 的自定义和第三方工具与 logfire.instrument_fastapi() 方法。

安装

使用 fastapi extra 安装 logfire

pip install 'logfire[fastapi]'
rye add logfire -E fastapi
poetry add 'logfire[fastapi]'

用法

我们下面有一个最小的例子。请安装 Uvicorn 来运行它:

pip install uvicorn

您可以使用 python main.py 运行它:

main.py
import logfire
from fastapi import FastAPI

app = FastAPI()

logfire.configure()
logfire.instrument_fastapi(app)


@app.get("/hello")
async def hello(name: str):
    return {"message": f"hello {name}"}


if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app)

然后访问 http://localhost:8000/hello?name=world 并检查日志。

OpenTelemetry FastAPI 插桩

第三方 OpenTelemetry FastAPI Instrumentation 包为每个请求添加了跨度,其中包含有关 HTTP 请求的详细属性,例如完整 URL 和用户代理。通过开始和结束时间,您可以查看处理每个请求所需的时间。

[logfire.instrument_fastapi()][logfire.默认情况下,Logfire.instrument_fastapi] 应用此检测。您可以通过传递 use_opentelemetry_instrumentation=False 来禁用它。

logfire.instrument_fastapi() 还接受任意附加关键字参数,并将它们传递给 OpenTelemetry FastAPIInstrumentor.instrument_app() 方法。有关更多详细信息,请参阅其文档。

Logfire插桩:记录端点参数和验证错误

logfire.instrument_fastapi() 将为每个请求发出一个称为 FastAPI 参数的跨度,该跨度显示 FastAPI 解析和验证请求中的端点函数参数并解决任何依赖项所需的时间。默认情况下,跨度还将包含以下属性:

  • values:将端点函数的参数名称映射到已解析和已验证的值的字典。

  • errors:任何无效输入的验证错误列表。

您可以通过将 request_attributes_mapper 函数传递给 instrument_fastapi 来自定义此函数。此函数将与 RequestWebSocket 对象以及默认属性字典一起调用。它应该返回一个新的属性字典,或者返回 None 将跨度级别设置为“debug”,以便默认情况下它是隐藏的。例如:

import logfire

app = ...


def request_attributes_mapper(request, attributes):
    if attributes["errors"]:
        # Only log validation errors, not valid arguments
        return {
            "errors": attributes["errors"],
            "my_custom_attribute": ...,
        }
    else:
        # Don't log anything for valid requests
        return None


logfire.configure()
logfire.instrument_fastapi(app, request_attributes_mapper=request_attributes_mapper)

注意

request_attributes_mapper 函数不得更改错误的内容,但它可以安全地用新值替换它们。

从检测中排除 URL

为避免跟踪某些 URL,您可以指定一串逗号分隔的正则表达式,该正则表达式将与完整的请求 URL 匹配。这可以传递给:

  • instrument_fastapiexcluded_urls,例如:logfire.instrument_fastapi(app, excluded_urls='/health')

  • 环境变量OTEL_PYTHON_FASTAPI_EXCLUDED_URLS

  • 环境变量 OTEL_PYTHON_EXCLUDED_URLS(这也适用于其他检测)。

捕获请求和响应标头


本文总阅读量