HTTPX
The logfire.instrument_httpx() method can be used to instrument HTTPX with Logfire.
Install logfire with the httpx extra:
pip install 'logfire[httpx]'
uv add 'logfire[httpx]'
Let’s see a minimal example below. You can run it with python 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())
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.
The logfire.instrument_httpx() method accepts various parameters to configure the instrumentation.
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'})
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')
Instead of capturing both request and response headers, you can create a request hook to capture only the request headers:
import httpx
from opentelemetry.trace import Span
import logfire
from logfire.integrations.httpx import RequestInfo
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')
Similarly, you can create a response hook to capture only the response headers:
import httpx
from opentelemetry.trace import Span
import logfire
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.
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!')