Skip to content

HTTPX

The logfire.instrument_httpx() method can be used to instrument HTTPX with Logfire.

Installation

Install logfire with the httpx extra:

pip install 'logfire[httpx]' 
uv add 'logfire[httpx]' 

Usage

Let's see a minimal example below. You can run it with python main.py:

main.py
import asyncio import httpx import logfire logfire.configure() logfire.instrument_httpx() url = "https://httpbin.org/get" with httpx.Client() as client: client.get(url) async def main(): async with httpx.AsyncClient() as client: await client.get(url) asyncio.run(main()) 
main.py
import asyncio import httpx import logfire logfire.configure() url = 'https://httpbin.org/get' with httpx.Client() as client: logfire.instrument_httpx(client) client.get(url) async def main(): async with httpx.AsyncClient() as client: logfire.instrument_httpx(client) await client.get(url) asyncio.run(main()) 

logfire.instrument_httpx() uses the OpenTelemetry HTTPX Instrumentation package, which you can find more information about here.

Configuration

The logfire.instrument_httpx() method accepts various parameters to configure the instrumentation.

Capture Everything

You can capture all information (headers and bodies) by setting the capture_all parameter to True.

import httpx import logfire logfire.configure() logfire.instrument_httpx(capture_all=True) client = httpx.Client() client.post("https://httpbin.org/post", json={"key": "value"}) 

Capture HTTP Headers

By default, Logfire doesn't capture HTTP headers. You can enable it by setting the capture_headers parameter to True.

import httpx import logfire logfire.configure() logfire.instrument_httpx(capture_headers=True) client = httpx.Client() client.get("https://httpbin.org/get") 

Capture Only Request Headers

Instead of capturing both request and response headers, you can create a request hook to capture only the request headers:

import httpx import logfire from logfire.integrations.httpx import RequestInfo from opentelemetry.trace import Span def capture_request_headers(span: Span, request: RequestInfo): headers = request.headers span.set_attributes( { f'http.request.header.{header_name}': headers.get_list(header_name) for header_name in headers.keys() } ) logfire.configure() logfire.instrument_httpx(request_hook=capture_request_headers) client = httpx.Client() client.get("https://httpbin.org/get") 

Capture Only Response Headers

Similarly, you can create a response hook to capture only the response headers:

import httpx import logfire from opentelemetry.trace import Span from logfire.integrations.httpx import RequestInfo, ResponseInfo def capture_response_headers(span: Span, request: RequestInfo, response: ResponseInfo): headers = response.headers span.set_attributes( {f'http.response.header.{header_name}': headers.get_list(header_name) for header_name in headers.keys()} ) logfire.configure() logfire.instrument_httpx(response_hook=capture_response_headers) client = httpx.Client() client.get('https://httpbin.org/get') 

You can also use the hooks to filter headers or modify them before capturing them.

Capture HTTP Bodies

By default, Logfire doesn't capture HTTP bodies.

To capture bodies, you can set the capture_request_body and capture_response_body parameters to True.

import httpx import logfire logfire.configure() logfire.instrument_httpx( capture_request_body=True, capture_response_body=True, ) client = httpx.Client() client.post("https://httpbin.org/post", data="Hello, World!")