logbrew-flask
Flask integration for capturing LogBrew request spans and exceptions with the public Python SDK.
python3 -m pip install logbrew-sdk logbrew-flask
logbrew-flask requires Python 3.10 or newer.
The package is typed, ships py.typed, depends on the core logbrew-sdk, and keeps Flask as a normal framework dependency instead of monkeypatching Flask globally.
Use a project-scoped server ingest key in LOGBREW_SERVER_API_KEY. The
framework initializer also reads LOGBREW_SERVICE_NAME,
LOGBREW_ENVIRONMENT, and LOGBREW_RELEASE when they are present.
from flask import Flask
from logbrew_flask import init_logbrew
app = Flask(__name__)
logbrew = init_logbrew(app)
client = logbrew.client
@app.get("/health")
def health() -> dict[str, bool]:
return {"ok": True}
Confirm The Hosted Trace
A local 200 response or a RecordingTransport receipt confirms that the Flask
integration created telemetry. It does not confirm that LogBrew accepted,
stored, and indexed the event. Use the public CLI for end-to-end confirmation.
First confirm that the CLI has account access. If it reports that it is not
authenticated, a human must complete logbrew login before the account read:
logbrew status --json
logbrew projects --json
Use a project-scoped server ingest key in the Flask process; never use the CLI account session for ingestion. The CLI can create an owner-only key file without printing the one-time key:
install -d -m 700 "$HOME/.logbrew"
logbrew projects keys create <project_id> \
--kind server \
--label "Flask server" \
--ingest-key-file "$HOME/.logbrew/flask-app.ingest" \
--json
export LOGBREW_SERVER_API_KEY="$(tr -d '\r\n' < "$HOME/.logbrew/flask-app.ingest")"
export LOGBREW_SERVICE_NAME="flask-app"
export LOGBREW_ENVIRONMENT="production"
export LOGBREW_RELEASE="flask-app@1.0.0"
Run one real request, then read the same project and deployment scope. Explain one returned trace to confirm that the hosted investigation can use the captured evidence:
logbrew read traces \
--project <project_id> \
--service flask-app \
--environment production \
--release flask-app@1.0.0 \
--since 1h \
--json
logbrew explain trace <trace_id> --json
The complete first-event flow, including new-project creation, correlated logs, exceptions, metrics, shutdown hooks, and recovery, is in the Flask setup guide.
The initializer owns an HTTP transport and sends on a background worker, so a
telemetry request does not block the Flask response. The first accepted event
wakes delivery immediately. Call logbrew.client.shutdown() from the normal
graceful worker-shutdown hook to flush any retained tail. Repeated
init_logbrew(app) calls return the same app extension and do not install
duplicate hooks.
Use add_logbrew_middleware() when the application already owns a
LogBrewClient. Pass a transport for response-path flushing, or give the
client an owned transport and set flush_on_response=False for automatic
background delivery.
What It Captures
The middleware records one request span for each captured response. It can also record request duration metrics and exception issues.
Request spans use the Flask route template, such as GET /orders/<int:order_id>, for low-noise grouping. Span metadata includes routeTemplate. Concrete request paths are not emitted, and unmatched routes use the fixed <unmatched> label. Valid inbound W3C traceparent headers are continued with a fresh child span id.
Handlers can call get_active_logbrew_trace() or use LogBrewLoggingHandler; logs emitted during the request share the active request trace and span.
from logbrew_flask import get_active_logbrew_trace
@app.get("/orders/<int:order_id>")
def order_detail(order_id: int) -> dict[str, str | None]:
trace = get_active_logbrew_trace()
return {"traceId": trace.trace_id if trace else None}
Set capture_request_metrics=True to emit an explicit http.server.duration histogram for each request. Each generated metric carries the stable description Duration of one completed server request. so its purpose remains clear in investigations. Apps can pass span_id_factory when deterministic child span ids are useful for controlled diagnostics; production apps usually let LogBrew generate span ids.
Outbound HTTP Child Spans
When a handler calls another service, use the core Python HTTP helpers inside the Flask request. They automatically reuse the active Flask request trace, create a child span, and inject one W3C traceparent header whose span id matches the emitted outbound span.
from logbrew_sdk import requests_request_with_logbrew_span
@app.post("/checkout/<order_id>")
def checkout(order_id: str) -> dict[str, bool]:
response = requests_request_with_logbrew_span(
"POST",
"https://payments.example.com/payments/authorize",
client=client,
event_id="evt_checkout_payment",
route_template="/payments/authorize",
)
return {"accepted": response.status_code == 202}
The helper does not patch requests globally. It records method, low-cardinality route template, status code, trace id, span id, and parent span id. It does not capture full URLs, query strings, request bodies, response bodies, arbitrary headers, cookies, baggage, or tracestate.
Database, Cache, And Queue Child Spans
Use the core dependency helpers inside a Flask handler to connect database, cache, and queue work to the active request trace.
from logbrew_sdk import (
cache_operation_with_logbrew_span,
database_operation_with_logbrew_span,
queue_operation_with_logbrew_span,
)
@app.post("/checkout/<order_id>")
def checkout(order_id: str) -> dict[str, bool]:
inventory = database_operation_with_logbrew_span(
"SELECT inventory",
client=client,
operation=lambda: database.execute("SELECT quantity FROM inventory WHERE sku = ?", ("sku_123",)).fetchone(),
system="sqlite",
statement_template="SELECT inventory WHERE sku = ?",
)
cached_inventory = cache_operation_with_logbrew_span(
"GET inventory",
client=client,
operation=lambda: cache["sku_123"],
system="memory-cache",
cache_name="inventory-cache",
cache_hit=True,
)
published = queue_operation_with_logbrew_span(
"PUBLISH checkout.completed",
client=client,
operation=lambda: queue.append("checkout.completed") or len(queue),
system="memory-queue",
operation_kind="publish",
queue_name="checkout-events",
task_name="checkout.completed",
)
return {"ok": inventory is not None and cached_inventory > 0 and published == 1}
Run python -m logbrew_flask.examples dependency-spans to see a request span with database, cache, and queue child spans under the same trace. These helpers record operation names, systems, status, trace ids, span ids, parent span ids, and primitive metadata. They do not capture SQL bind values, result payloads, queue message payloads, cache values, arbitrary headers, baggage, or tracestate.
Privacy Defaults
LogBrew does not capture concrete request paths, request bodies, response bodies, cookies, arbitrary headers, query strings, raw traceparent values, baggage, or tracestate. Exception issues include first-class exception type, flask.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.
Delivery Failures
By default, transport failures do not break the Flask response path. Set raise_flush_errors=True only when your app wants delivery failures to surface as request errors in controlled diagnostics.
Tradeoff
Sentry, Datadog, and OpenTelemetry provide broader automatic Flask, outbound HTTP, and dependency instrumentation, including global patching and deeper view/template/client hooks. LogBrew starts with explicit app-owned Flask and dependency helpers because that keeps setup reversible, simple to reason about, and safer for privacy-sensitive services.
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_flask-0.1.5.tar.gz.
File metadata
- Download URL: logbrew_flask-0.1.5.tar.gz
- Upload date:
- Size: 13.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 |
9866d9295c358ef858aa8c98180b569835f1e7063259e5ff12ceb0d26c832da0
|
|
| MD5 |
b8d3b52e2129f212709df421d98d2ccf
|
|
| BLAKE2b-256 |
d6aad744ee5a2e80f2f7840f68c819739ccbdedc01b797f499ede62c09f0c59d
|
Provenance
The following attestation bundles were made for logbrew_flask-0.1.5.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_flask-0.1.5.tar.gz -
Subject digest:
9866d9295c358ef858aa8c98180b569835f1e7063259e5ff12ceb0d26c832da0 - Sigstore transparency entry: 2617080032
- 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_flask-0.1.5-py3-none-any.whl.
File metadata
- Download URL: logbrew_flask-0.1.5-py3-none-any.whl
- Upload date:
- Size: 15.2 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 |
5e868b488b486a03fe3a744aea7404fde8e526e128b27adc4951ccdbef626552
|
|
| MD5 |
ee0e70ed51dc3433a6e86b4d08421950
|
|
| BLAKE2b-256 |
f1459d233399c896877f80e94ef9ae8c9bac2041c06e701efc5d13ccd6b40c14
|
Provenance
The following attestation bundles were made for logbrew_flask-0.1.5-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_flask-0.1.5-py3-none-any.whl -
Subject digest:
5e868b488b486a03fe3a744aea7404fde8e526e128b27adc4951ccdbef626552 - Sigstore transparency entry: 2617080079
- 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: