logbrew-django
Django integration for capturing LogBrew request spans and exceptions with the public Python SDK.
Install
python3 -m pip install logbrew-sdk logbrew-django
logbrew-django requires Python 3.10 or newer and supports Django>=4.2.30,<6.
The package is typed, ships py.typed, depends on the core logbrew-sdk, and keeps Django as a normal framework dependency instead of owning the user's project layout.
Example
# settings.py
MIDDLEWARE = [
"logbrew_django.LogBrewDjangoMiddleware",
*MIDDLEWARE,
]
# app startup code
import logging
from logbrew_django import configure_logbrew, get_active_logbrew_trace
from logbrew_sdk import LogBrewClient, LogBrewLoggingHandler, RecordingTransport
client = LogBrewClient.create(
api_key="LOGBREW_API_KEY",
sdk_name="logbrew-django",
sdk_version="0.1.0",
)
transport = RecordingTransport.always_accept()
logger = logging.getLogger("checkout-api")
logger.addHandler(LogBrewLoggingHandler(client, metadata={"service": "checkout-api"}))
configure_logbrew(
client=client,
transport=transport,
span_id_factory=lambda: "b7ad6b7169203331",
)
LogBrewDjangoMiddleware records successful requests as span events, records unhandled view exceptions as issue plus error-span events, and flushes through the configured transport after each response. Exception issues include first-class exception type, django.middleware mechanism, unhandled state, and up to 32 sanitized newest-first traceback frames. The frame projection contains basename and bounded code identity only; it omits raw traceback text, source code, local variables, and absolute paths. Automatic capture never reads or sends exception messages: the issue uses the fixed summary Unhandled exception, and every exception-chain node is marked redacted. If no transport is provided, events stay queued on the core client so the project can flush them itself.
When an incoming request has a valid W3C traceparent header, request capture continues that trace by using the incoming traceId and parent span id while creating a fresh child span id. The same request-local trace is available from get_active_logbrew_trace() while your view runs, and LogBrewLoggingHandler automatically adds traceId, spanId, parentSpanId, and sampled metadata to standard-library logs emitted inside that context:
def checkout_view(request):
trace = get_active_logbrew_trace()
logger.info("checkout request", extra={"traceId": trace.trace_id if trace else None})
...
Missing or malformed traceparent headers start a fresh W3C-shaped local trace so bad client headers do not break the project.
Request spans use the Django resolver route template, such as GET /orders/<int:order_id>/, for low-noise grouping. Span metadata includes routeTemplate; concrete dynamic paths are not emitted when a route template is available. The trace helper never exposes the raw header, request headers, body, cookies, query strings, or response body.
Outbound HTTP child spans
Django views can wrap a caller-owned HTTP request seam with requests_request_with_logbrew_span(...) to create an outbound child span under the active Django request trace and inject a normalized W3C traceparent header:
from django.http import JsonResponse
from logbrew_sdk import requests_request_with_logbrew_span
def checkout_view(request, order_id):
response = requests_request_with_logbrew_span(
"POST",
"https://payments.example.com/payments/authorize",
client=client,
event_id="evt_django_outbound_payment",
request=fake_payment_request,
route_template="/payments/authorize",
metadata={"dependency": "payments", "operation": "authorize"},
)
return JsonResponse({"ok": response.status_code == 202, "orderId": order_id})
Run python -m logbrew_django.examples outbound-http to see the same local flow from an installed package. The example shows the outgoing traceparent span id matching the emitted outbound span id, and the outbound span's parent is the active Django request span. LogBrew does not globally patch requests, create sessions, capture request or response bodies, serialize headers, store full URLs, or keep query strings.
Database, cache, and queue child spans
Django views can also wrap app-owned dependency work with the core Python helpers. The active Django request trace becomes the parent for each dependency span:
from django.http import JsonResponse
from logbrew_sdk import (
cache_operation_with_logbrew_span,
database_operation_with_logbrew_span,
queue_operation_with_logbrew_span,
)
def checkout_view(request, order_id):
inventory = database_operation_with_logbrew_span(
"SELECT inventory",
client=client,
event_id="evt_django_dependency_database",
operation=select_inventory,
system="sqlite",
db_name="checkout",
statement_template="SELECT inventory WHERE sku = ?",
row_count=1,
)
cached_count = cache_operation_with_logbrew_span(
"GET inventory",
client=client,
event_id="evt_django_dependency_cache",
operation=read_inventory_cache,
system="memory-cache",
cache_name="inventory-cache",
cache_hit=True,
)
queue_operation_with_logbrew_span(
"PUBLISH checkout.completed",
client=client,
event_id="evt_django_dependency_queue",
operation=publish_checkout_event,
system="memory-queue",
operation_kind="publish",
queue_name="checkout-events",
task_name="checkout.completed",
message_count=1,
)
return JsonResponse({"ok": inventory is not None and cached_count >= 0, "orderId": order_id})
Run python -m logbrew_django.examples dependency-spans to see a local request span parenting SQLite, cache, and queue child spans from an installed package. LogBrew does not patch database drivers, cache clients, queue frameworks, or broker metadata globally, and the helpers avoid SQL values, cache keys/values, queue bodies, headers, baggage, and tracestate.
Request duration metrics are opt-in. Set capture_request_metrics=True to emit an explicit http.server.duration histogram for completed requests. Each generated metric carries the stable description Duration of one completed server request. so its purpose remains clear in investigations:
configure_logbrew(
client=client,
transport=transport,
capture_request_metrics=True,
)
The metric includes primitive, low-cardinality metadata: framework, method, routeTemplate, statusCode, and statusCodeClass. Query strings and URL hashes are omitted. Set capture_successful_requests=False with capture_request_metrics=True when you only want duration metrics and not successful request spans. Avoid user IDs, request payloads, headers, or free-form text in custom metric metadata.
By default, transport failures do not break the Django response path. Set raise_flush_errors=True only when your project wants delivery failures to surface as request errors.
Use a clearly fake placeholder like LOGBREW_API_KEY in examples.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file logbrew_django-0.1.6.tar.gz.
File metadata
- Download URL: logbrew_django-0.1.6.tar.gz
- Upload date:
- Size: 11.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
10c69ec67bc888d3714b470f010f280a77bdb4913324a33909635fb2caca6166
|
|
| MD5 |
9b5cf6c4a5d01d4d12bc58296ba9bd11
|
|
| BLAKE2b-256 |
2fdbcbf94b9b8abd347aec9e7d3bf3b5b9670cc503c04b5df8558f7457cadf39
|
Provenance
The following attestation bundles were made for logbrew_django-0.1.6.tar.gz:
Publisher:
publish-packages.yml on LogBrewCo/sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
logbrew_django-0.1.6.tar.gz -
Subject digest:
10c69ec67bc888d3714b470f010f280a77bdb4913324a33909635fb2caca6166 - Sigstore transparency entry: 2617080753
- Sigstore integration time:
-
Permalink:
LogBrewCo/sdk@3300be284d9243fc99e972e4adc5ac6d7f537b29 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/LogBrewCo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
self-hosted -
Publication workflow:
publish-packages.yml@3300be284d9243fc99e972e4adc5ac6d7f537b29 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file logbrew_django-0.1.6-py3-none-any.whl.
File metadata
- Download URL: logbrew_django-0.1.6-py3-none-any.whl
- Upload date:
- Size: 15.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6a060e881b2a87d338e433794821dd0a120fb3ea857661b72fd61cd01c5a533
|
|
| MD5 |
37b49aadfd293eb6ad63ec67e38e1033
|
|
| BLAKE2b-256 |
08cc2c471fd5d5e363df4089518cf182d6196906a8c31275d0dbcb8f6eeeccfe
|
Provenance
The following attestation bundles were made for logbrew_django-0.1.6-py3-none-any.whl:
Publisher:
publish-packages.yml on LogBrewCo/sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
logbrew_django-0.1.6-py3-none-any.whl -
Subject digest:
f6a060e881b2a87d338e433794821dd0a120fb3ea857661b72fd61cd01c5a533 - Sigstore transparency entry: 2617080800
- Sigstore integration time:
-
Permalink:
LogBrewCo/sdk@3300be284d9243fc99e972e4adc5ac6d7f537b29 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/LogBrewCo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
self-hosted -
Publication workflow:
publish-packages.yml@3300be284d9243fc99e972e4adc5ac6d7f537b29 -
Trigger Event:
workflow_dispatch
-
Statement type: