Conversation
When OTEL_EXPORTER_OTLP_ENDPOINT is set, enables full tracing pipeline with OTLP export, W3C traceparent propagation, and spans for HTTP requests, SQL file execution, DB pool acquire, and query execution. Falls back to env_logger when unset. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix tracing-log bridge initialization order (set subscriber first, then LogTracer) to avoid double-set panic - Add dedicated Dockerfile for example using release profile (avoids OOM with superoptimized LTO in Docker) - Use debian:trixie-slim runtime for glibc compatibility - Fix nginx image to nginx:otel (official image with OTel module) - Fix nginx.conf: move otel_trace directives into location block - Pin Tempo to 2.6.1 (latest has partition ring issues in single-node) - Fix otel-collector exporter alias (otlp → otlp_grpc) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
After acquiring a DB connection, set the W3C traceparent as the PostgreSQL application_name (or MySQL session variable). This makes trace IDs visible in pg_stat_activity and PostgreSQL logs, enabling direct correlation between Grafana Tempo traces and database-side monitoring. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Comprehensive documentation covering: - Step-by-step quick start for the Docker Compose example - How OpenTelemetry works (spans, collectors, backends) - Setup guides for Grafana Tempo, Jaeger, Grafana Cloud, Datadog, Honeycomb, New Relic, and Axiom with exact env vars and doc links - PostgreSQL trace correlation via application_name - Environment variable reference - Troubleshooting section Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The form submits via POST, so the title field must be referenced with the : prefix (POST parameter) rather than $ (GET parameter). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
OTel span attributes now reference the user's .sql file path and line number instead of the SQLPage Rust source code. Also improves span naming, adds JSON log formatting, custom root span builder, and Grafana dashboard provisioning for the OTel example. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- code.filepath → code.file.path, code.lineno → code.line.number - db.statement → db.query.text, db.system → db.system.name - Disable auto code location (.with_location(false)) so spans reference user SQL files, not SQLPage Rust source - Remove redundant sqlpage.file attribute (code.file.path suffices) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use well-known values from the OpenTelemetry registry instead of raw DBMS name strings. Cast line numbers to i64 for correct span recording. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The custom logfmt layer in telemetry.rs replaces it with zero extra dependencies and precise control over field selection and ordering. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds two new services (Loki, Promtail) to scrape SQLPage container logs and display them in Grafana alongside traces. The home dashboard now shows a logs panel with trace_id derived fields linking to Tempo. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… OIDC Add targeted spans to account for previously untraced time: - http.parse_request: request/form parsing before SQL execution - render: template rendering and response streaming - subprocess: sqlpage.exec() with process.command attribute - http.client: sqlpage.fetch()/fetch_with_meta() with OTel HTTP client semantic conventions (http.request.method, url.full, http.response.status_code) - sqlpage.file: sqlpage.run_sql() nested file execution - oidc.callback + http.client: OIDC token exchange Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This span covers JWT signature verification and claims validation, which runs on every authenticated request via get_token_claims(). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Records the OIDC subject claim (sub) as enduser.id after successful JWT verification, following OTel semantic conventions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Record user.id (sub), user.name (preferred_username), user.full_name (name), and user.email from OIDC claims after JWT verification. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The gap before http.parse_request was the SQL file cache lookup - now covered by the sqlpage.file.load span with code.file.path. http.parse_request now records http.request.method and content_type, which helps identify slow multipart/form-data parsing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use the custom logfmt layer for both OTel and non-OTel modes instead of falling back to env_logger. This eliminates the tracing→log bridge dumping all span fields (user agents, otel.kind, request_id, etc.) and only shows: ts, level, target, msg, method, path, status, file, client_ip, and trace_id (when valid). Adds terminal color support (bold red for errors, green for info, dim for timestamps/targets). Emits one log line per completed successful request. Errors are logged once by the error handler. Suppresses trace_id=000...0 when no real trace context exists. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Span guards from .entered() do not propagate correctly across await points. Switch to tracing::Instrument to ensure spans are properly associated with their async tasks throughout their lifetime. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When stderr is a terminal and the log message contains newlines (e.g. SQL syntax errors with source highlighting and arrows), print the metadata on the first line and the message below with its original formatting. Machine output (non-terminal) remains single-line logfmt. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the example's custom Dockerfile and use the main one with a CARGO_PROFILE=release build arg to avoid OOM from fat LTO in memory-constrained Docker environments. The build scripts now read CARGO_PROFILE from the environment, defaulting to superoptimized for backward compatibility. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add http.request.body.size to HTTP client spans (fetch, fetch_with_meta) and to the server-side http.parse_request span (from Content-Length header). Add url.query to the http.parse_request span. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
OTEL_EXPORTER_OTLP_ENDPOINTis setLoggermiddleware withTracingLoggerfor W3C traceparent extraction and HTTP request spanstracingspans at key instrumentation points:sqlpage.exec(SQL file execution),db.pool.acquire(connection pool),db.query(individual SQL statements)log::calls to tracing viatracing-log. Logs are now in logfmt format instead of the old nginx-style. They have structured data from the requests attached.Spans produced per request
tracing-actix-web)http.method,http.route,http.status_codesqlpage.execsqlpage.file(path to .sql file)db.pool.acquiredb.pool.sizedb.querydb.statement,db.systemConfiguration
Standard OTel environment variables — no custom SQLPage config needed:
Example
Includes
examples/opentelemetry/with a complete docker-compose stack:nginx (OTel module) → SQLPage → PostgreSQL → OTel Collector → Tempo → Grafana
Test plan
cargo checkcompilescargo test— all 57 existing tests passOTEL_EXPORTER_OTLP_ENDPOINT— verify env_logger behavior unchanged