Configure OpenTelemetry tracing for self-hosted Lightdash
Export distributed traces from your Lightdash instance to any OpenTelemetry-compatible backend
🛠This page is for engineering teams self-hosting their own Lightdash instance. For instance health metrics, see Prometheus metrics.Lightdash can export distributed traces using the OpenTelemetry SDK, so you can follow a request or scheduled job across the API server, scheduler, and warehouse queries in any OpenTelemetry-compatible backend (for example Grafana Tempo, Jaeger, Honeycomb, or Datadog).Tracing runs in one of two exclusive modes:
Sentry mode (default): spans are created and exported through Sentry, controlled by the Sentry environment variables.
OpenTelemetry mode: spans are created by the OpenTelemetry SDK and exported according to the standard OTEL_* environment variables. Sentry still captures errors, but receives no spans.
By default, Lightdash traces through Sentry. To switch to OpenTelemetry mode, set the following environment variable on every Lightdash container (API server and scheduler):
Switches tracing to OpenTelemetry mode: spans are created by the OpenTelemetry SDK and Sentry receives errors only. When false, tracing runs through Sentry. (default=false)
LIGHTDASH_OTEL_TRACES_SAMPLE_RATE
Trace sampling ratio from 0.0 to 1.0. Falls back to SENTRY_TRACES_SAMPLE_RATE (deprecated) when unset. (default=1)
LIGHTDASH_OTEL_ALWAYS_SAMPLE_AI_TRACES
Set to false to stop always-sampling AI agent traces, so they follow the global sampling ratio instead. (default=true)
LIGHTDASH_OTEL_DB_TRACES_ENABLED
Adds spans for application database (Postgres) queries to traces, including the SQL statement. Requires OpenTelemetry mode. (default=false)
LIGHTDASH_OTEL_DB_TRACES_MAX_QUERY_LENGTH
Maximum length of the SQL statement recorded on database spans; longer statements are truncated. Must be a non-negative integer. (default=1022)
OTEL_SDK_DISABLED
Standard OpenTelemetry kill switch. When true, OpenTelemetry mode is off even if LIGHTDASH_OTEL_TRACES_ENABLED=true.
OTEL_TRACES_EXPORTER
Comma-separated exporters: otlp, console, zipkin, or none. Unsupported values are ignored with a startup warning; none overrides any other value. (default=otlp)
OTEL_EXPORTER_OTLP_PROTOCOL
OTLP protocol: grpc, http/json, or http/protobuf. OTEL_EXPORTER_OTLP_TRACES_PROTOCOL takes precedence. Unsupported values fall back to the default. (default=http/protobuf)
OTEL_EXPORTER_OTLP_ENDPOINT
Base URL of your OTLP collector. Handled by the OpenTelemetry Node SDK, along with OTEL_EXPORTER_OTLP_TRACES_ENDPOINT and OTEL_EXPORTER_OTLP_HEADERS.
OTEL_SERVICE_NAME
Service name attached to exported spans. (default=lightdash)
OTEL_LOG_LEVEL
Enables OpenTelemetry SDK and exporter diagnostics at the given level (e.g. DEBUG). Lightdash redacts credentials, tokens, and span payloads from diagnostic output.
OTEL_TRACES_SAMPLER and OTEL_TRACES_SAMPLER_ARG are overridden by Lightdash. Control sampling with LIGHTDASH_OTEL_TRACES_SAMPLE_RATE instead.
Lightdash defers exporter and protocol selection to the OpenTelemetry Node SDK’s standard environment variable handling:
OTEL_TRACES_EXPORTER supports otlp (default), console, zipkin, and none. You can combine exporters with a comma-separated list. If the list contains none, no traces are exported regardless of the other values.
With the otlp exporter, OTEL_EXPORTER_OTLP_PROTOCOL (or the traces-specific OTEL_EXPORTER_OTLP_TRACES_PROTOCOL) selects grpc, http/json, or http/protobuf (default).
Unsupported exporter or protocol values are ignored with a warning in the Lightdash logs at startup.
For example, to export traces over gRPC with an authentication header:
LIGHTDASH_OTEL_TRACES_SAMPLE_RATE sets the head-sampling ratio for trace roots, from 0.0 (nothing) to 1.0 (everything, the default). Child spans follow their root’s decision, so a sampled request captures the whole waterfall.Two behaviours to be aware of:
AI agent traces are always sampled regardless of the ratio, so a broken agent run always has a trace to debug. Set LIGHTDASH_OTEL_ALWAYS_SAMPLE_AI_TRACES=false to make them follow the global ratio instead.
OTEL_TRACES_SAMPLER and OTEL_TRACES_SAMPLER_ARG are overridden by Lightdash’s own sampler and have no effect.
Requests to health checks (/api/v1/health, livez), status polling endpoints, favicon.ico, and robots.txt are never traced.
Every API response carries an x-trace-id header with the trace ID of the request that produced it, so you can go from a request in your proxy or application logs to its trace in your backend. The same ID appears in the Lightdash logs for that request.The header is only set when the request was sampled. Requests dropped by LIGHTDASH_OTEL_TRACES_SAMPLE_RATE have no exported trace and no header.In OpenTelemetry mode the backend does not continue the sentry-trace and traceparent headers sent by the Lightdash web app, because the browser span is only exported to Sentry and would leave the trace without a root. A traceparent header set by your own ingress or middleware is continued as normal.
Set LIGHTDASH_OTEL_DB_TRACES_ENABLED=true to add a span for each application database (Postgres) query, so you can see where a request spends time inside Lightdash’s own database:
Database spans only appear inside an existing trace, so they follow the sampling decision of their parent request or job.
Each span records the SQL statement, truncated to LIGHTDASH_OTEL_DB_TRACES_MAX_QUERY_LENGTH characters (default 1022). Invalid values fall back to the default with a warning.
This traces queries to Lightdash’s application database only, not queries sent to your data warehouse.
At startup, Lightdash logs a line confirming the tracing configuration, including the active exporters, OTLP protocol, and sampling ratio. This confirms configuration only; exporter connectivity is not validated at startup.If traces aren’t arriving in your backend, set OTEL_LOG_LEVEL=DEBUG to enable OpenTelemetry SDK and exporter diagnostics in the Lightdash logs. Diagnostic output is redacted before logging: URL credentials and query strings are stripped, values containing tokens or API keys are omitted, and span payloads are not printed.
This page covers traces only. For instance health metrics (CPU, memory, event loop, query durations), see Prometheus metrics, which can also feed an OpenTelemetry backend through the collector’s Prometheus receiver.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Lightdash","colors":{"primary":"#8072ff","light":"#8072ff","dark":"#8072ff"},"logo":{"light":"https://mintcdn.com/lightdash/NAoHiyWrKI0dLTGZ/logo/light.svg?fit=max\u0026auto=format\u0026n=NAoHiyWrKI0dLTGZ\u0026q=85\u0026s=4b91c8292b732e3daca7558549cf018c","dark":"https://mintcdn.com/lightdash/NAoHiyWrKI0dLTGZ/logo/dark.svg?fit=max\u0026auto=format\u0026n=NAoHiyWrKI0dLTGZ\u0026q=85\u0026s=c15813eedf4ff7a28709d8c163765fd1","href":"https://lightdash.com/"},"favicon":"https://mintcdn.com/lightdash/fPTXVBgl8dEzSm3L/favicon.png?fit=max\u0026auto=format\u0026n=fPTXVBgl8dEzSm3L\u0026q=85\u0026s=ab889bc3b46d3db2eb20c3ff381c098a","api":{"playground":{"display":"simple"}},"appearance":{"default":"light"},"background":{"decoration":"gradient"},"navbar":{"links":[{"href":"https://www.lightdash.com/#","label":"Book a demo"},{"href":"https://app.lightdash.cloud/login","label":"Login"}],"primary":{"type":"button","label":"Start for free","href":"https://www.lightdash.com/start?utm_source=docs\u0026utm_medium=internal_cta\u0026utm_campaign=get_started"}},"footer":{"socials":{"github":"https://github.com/lightdash/lightdash","slack":"https://join.slack.com/t/lightdash-community/shared_invite/zt-3pbwqmq5e-vhTc7HHcS787w618ngoPHA","linkedin":"https://www.linkedin.com/company/lightdash","x":"https://x.com/lightdash_devs"},"links":[{"header":"Lightdash","items":[{"label":"About us","href":"https://www.lightdash.com/about"},{"label":"Community","href":"https://join.slack.com/t/lightdash-community/shared_invite/zt-3pbwqmq5e-vhTc7HHcS787w618ngoPHA"},{"label":"Blog","href":"https://www.lightdash.com/blog"}]}]},"seo":{"indexing":"all"},"fonts":{"heading":{"family":"Space Grotesk","weight":600,"source":"https://fonts.gstatic.com/s/spacegrotesk/v16/V8mDoQDjQSkFtoMM3T6r8E7mPbF4Cw.woff2","format":"woff2"}},"icons":{"library":"tabler"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"lightdash","hasAudioNarration":false,"actualSubdomain":"lightdash","customDomains":["docs.lightdash.com"],"gitSource":{"type":"github","owner":"lightdash","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae908f763212a81d6b52c7c","collectionId":"03bbeddf-18df-4876-8b0b-e7fecd05e222","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae908f763212a81d6b52c7c"},"feedback":{"issues":true,"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae9161a28f6e7046f0b03b8","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"API","count":879},{"language":"default","tag":"Reference","count":875},{"language":"default","tag":"Docs","count":206},{"language":"default","tag":"API Reference","count":194},{"language":"default","tag":"Projects","count":140},{"language":"default","tag":"v2","count":127},{"language":"default","tag":"Organizations","count":76},{"language":"default","tag":"Integrations","count":40},{"language":"default","tag":"Explore","count":34},{"language":"default","tag":"Self-host","count":31}],"searchSettings":{"maxResults":10}},"assistantConfig":{"enableAskAiButton":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"support@lightdash.com","showHelpButton":false}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"styles.css","content":"#navigation-items>ul.sidebar-group{margin-top:12px}.feature-badges{display:flex;flex-wrap:wrap;align-items:center;gap:.375rem;margin:1rem 0;font-size:.8125rem}#content>.callout:first-child,.feature-badges:first-child{margin-top:0}.feature-badge-link{display:inline-flex;align-items:center;vertical-align:middle;border:0;border-radius:9999px;text-decoration:none!important;background-image:none!important}.feature-badge-link:hover [data-badge]{background-color:color-mix(in srgb,var(--color-text) 20%,transparent);box-shadow:0 0 0 1px var(--color-text)}.feature-badge-link:active [data-badge]{background-color:color-mix(in srgb,var(--color-text) 35%,transparent);box-shadow:inset 0 0 0 2px var(--color-text);transform:translateY(1px)}.feature-badge-link:focus-visible{outline:2px solid currentColor;outline-offset:3px}.sticky-first-col{overflow-x:auto;position:relative;max-width:100%}.sticky-first-col table{width:max-content;min-width:100%;border-collapse:separate;border-spacing:0}.sticky-first-col table td:first-child,.sticky-first-col table th:first-child{position:sticky;left:0;z-index:1;min-width:260px;max-width:320px;white-space:normal;background-color:#fff;box-shadow:inset -1px 0 0 0 rgba(0,0,0,.08)}.sticky-first-col table thead th:first-child{z-index:2}html.dark .sticky-first-col table td:first-child,html.dark .sticky-first-col table th:first-child{background-color:#0b0b0f;box-shadow:inset -1px 0 0 0 rgba(255,255,255,.1)}svg.matrix-no{background-color:#d9d5f0}html.dark svg.matrix-no{background-color:#2e2947}.copy-prompt{margin:1.5rem 0}.copy-prompt-btn{display:inline-flex;align-items:center;gap:.75rem;padding:.75rem 1.375rem;border:0;border-radius:9999px;background-color:#8072ff;color:#fff;font-size:.875rem;font-weight:500;line-height:1.25rem;cursor:pointer;box-shadow:0 1px 2px rgba(0,0,0,.08);transition:background-color 150ms ease}.copy-prompt-btn:hover{background-color:#6c5df2}.copy-prompt-btn:focus-visible{outline:2px solid #8072ff;outline-offset:2px}.copy-prompt-label{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.copy-prompt-icons{display:inline-flex;align-items:center;gap:.3125rem}.copy-prompt-icons svg{width:1.25rem;height:1.25rem;flex:none;transition:transform 300ms ease-out}.copy-prompt-icons svg:nth-child(1){transform:rotate(-6deg)}.copy-prompt-icons svg:nth-child(4){transform:rotate(6deg)}.copy-prompt-btn:hover .copy-prompt-icons svg:nth-child(1){transform:translateX(-4px) rotate(-12deg)}.copy-prompt-btn:hover .copy-prompt-icons svg:nth-child(2){transform:translate(-1px,-1px) rotate(6deg) scale(1.1)}.copy-prompt-btn:hover .copy-prompt-icons svg:nth-child(3){transform:translate(1px,2px) rotate(-6deg) scale(1.1)}.copy-prompt-btn:hover .copy-prompt-icons svg:nth-child(4){transform:translateX(4px) rotate(12deg)}.copy-prompt-preview{margin:.625rem 0 0 .25rem;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.8125rem;color:#9ca3af;opacity:0;transform:translateY(4px);transition:opacity 200ms ease,transform 200ms ease}html.dark .copy-prompt-preview{color:#6b7280}.copy-prompt-preview.is-copied{color:#5747cf}html.dark .copy-prompt-preview.is-copied{color:#cfc9ff}.copy-prompt-preview.is-copied,.copy-prompt:has(.copy-prompt-btn:focus-visible) .copy-prompt-preview,.copy-prompt:hover .copy-prompt-preview{opacity:1;transform:none}.copy-prompt-sr-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media (prefers-reduced-motion:reduce){.copy-prompt-icons svg,.copy-prompt-preview{transition:none}.copy-prompt-preview{transform:none}}.setup-path{--setup-path-line:#e2e2e8;--setup-path-surface:#f5f5f7;--setup-path-ground:#ffffff;--setup-path-ink:#16151d;--setup-path-muted:#5d5c69;--setup-path-faint:#8b8a97;--setup-path-accent:#8072ff;display:grid;gap:1rem;justify-items:start;margin:1.5rem 0;color:var(--setup-path-ink);font-size:1rem;line-height:1.55}html.dark .setup-path{--setup-path-line:#2d2d38;--setup-path-surface:#1b1b22;--setup-path-ground:#0f0f14;--setup-path-ink:#efeff3;--setup-path-muted:#a5a5b2;--setup-path-faint:#777784}.setup-path p{margin:0}.setup-path ol{list-style:none;margin:0;padding:0}.setup-path svg{display:block;flex:none}.setup-path button{font-family:inherit;color:inherit;cursor:pointer}.setup-path-trunk{display:grid;width:100%}.setup-path-trunk>li{position:relative;display:grid;grid-template-columns:2.375rem minmax(0,1fr);gap:1rem;padding:0 0 1.5rem;margin:0}.setup-path-trunk>li::before{content:\"\";position:absolute;left:calc(1.1875rem - 1px);top:2.375rem;bottom:0;width:2px;background:var(--setup-path-line)}.setup-path-trunk>li.is-done::before{background:var(--setup-path-accent)}.setup-path-trunk>li.is-last{padding-bottom:0}.setup-path-trunk>li.is-last::before{display:none}.setup-path-tile{position:relative;z-index:1;display:grid;place-items:center;width:2.375rem;height:2.375rem;flex:none;border-radius:.625rem;background:var(--setup-path-surface);transition:transform 180ms ease}.setup-path-tile.is-dark{background:#16151d}.setup-path-trunk>li.is-current>.setup-path-tile{background:var(--setup-path-ink);color:var(--setup-path-ground)}.setup-path-trunk>li.is-pending>.setup-path-tile{background:0 0;border:2px dashed var(--setup-path-line);color:var(--setup-path-faint)}.setup-path-node{display:grid;gap:.75rem;min-width:0}.setup-path-answer,.setup-path-question{display:flex;align-items:center;min-height:2.375rem}.setup-path-question{font-size:1.125rem;font-weight:600;line-height:1.3}.setup-path-answer{justify-content:space-between;gap:1rem}.setup-path-answer p{display:grid;min-width:0;line-height:1.3}.setup-path-answer p span{font-size:.8125rem;color:var(--setup-path-muted)}.setup-path-answer p strong{font-weight:600}.setup-path-change{flex:none;padding:.25rem .625rem;border:1px solid transparent;border-radius:.5rem;background:0 0;font-size:.875rem;font-weight:500;color:var(--setup-path-muted)!important}.setup-path-change:hover{border-color:var(--setup-path-line);color:var(--setup-path-ink)!important}.setup-path-leaves{display:flex;flex-wrap:wrap;gap:.375rem;margin-top:-.25rem}.setup-path-leaves a{display:inline-flex;align-items:center;gap:.375rem;padding:.1875rem .625rem;border-radius:.5rem;background:var(--setup-path-surface);font-size:.8125rem;color:inherit;text-decoration:none}.setup-path-leaves a:hover{text-decoration:underline}.setup-path-chevron,.setup-path-leaves svg{color:var(--setup-path-faint)}.setup-path-note,.setup-path-pending{font-size:.8125rem;color:var(--setup-path-muted)}.setup-path-note a,.setup-path-step-body a{color:var(--setup-path-ink);font-weight:600;text-decoration:underline;text-underline-offset:3px}.setup-path-pending{display:flex;align-items:center;min-height:2.375rem;font-size:.9375rem;line-height:1.4}.setup-path-options{display:grid;grid-template-columns:repeat(var(--setup-path-columns),minmax(0,1fr));gap:.625rem}.setup-path-option{display:flex;align-items:center;gap:.75rem;min-width:0;padding:.75rem .875rem;border:1px solid var(--setup-path-line);border-radius:.75rem;background:var(--setup-path-ground);text-align:left;transition:border-color 150ms ease,background 150ms ease}.setup-path-option:hover{border-color:var(--setup-path-faint)}.setup-path-option:hover .setup-path-tile{transform:scale(1.06)}.setup-path-change:focus-visible,.setup-path-ghost:focus-visible,.setup-path-option:focus-visible,.setup-path-phase li>button:focus-visible{outline:2px solid var(--setup-path-accent);outline-offset:2px}.setup-path-option[aria-checked=true]{border-color:var(--setup-path-ink);background:var(--setup-path-surface)}.setup-path-option[aria-checked=true] .setup-path-tile:not(.is-dark){background:var(--setup-path-ground)}.setup-path-option-text{display:grid;flex:1;gap:1px;min-width:0}.setup-path-option-title{display:flex;flex-wrap:wrap;align-items:center;gap:.1875rem .5rem;font-size:.9375rem;font-weight:600;line-height:1.3}.setup-path-option-hint{font-size:.8125rem;line-height:1.4;color:var(--setup-path-muted)}.setup-path-tag{padding:1px .4375rem;border:1px solid var(--setup-path-line);border-radius:99px;font-size:.6875rem;font-weight:600;color:var(--setup-path-muted);white-space:nowrap}.setup-path-radio{display:grid;place-items:center;width:1.125rem;height:1.125rem;flex:none;border:1.5px solid var(--setup-path-line);border-radius:50%;color:transparent;transition:background 150ms ease,border-color 150ms ease}.setup-path-option[aria-checked=true] .setup-path-radio{border-color:var(--setup-path-ink);background:var(--setup-path-ink);color:var(--setup-path-ground)}.setup-path-options.is-compact .setup-path-option{padding:.5625rem .75rem}.setup-path-options.is-compact .setup-path-radio{display:none}.setup-path-options.is-compact .setup-path-option-title{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.setup-path-ghost,.setup-path-phase li>button{align-items:center;border-radius:.5rem;background:0 0}.setup-path-ghost{display:inline-flex;gap:.375rem;padding:.375rem .75rem;border:1px solid var(--setup-path-line);font-size:.875rem;font-weight:500}.setup-path-ghost:hover{border-color:var(--setup-path-ink)}.setup-path-result{display:grid;gap:1rem;min-width:0}.setup-path-result-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.5rem 1rem;min-height:2.375rem}.setup-path-result-title{font-size:1.125rem;font-weight:600}.setup-path-result-title span{margin-left:.5rem;font-size:.875rem;font-weight:500;color:var(--setup-path-muted)}.setup-path-phases{display:grid;border-top:1px solid var(--setup-path-line)}.setup-path-phase{display:grid;grid-template-columns:8rem minmax(0,1fr);gap:0 1rem;padding:.75rem 0;border-bottom:1px solid var(--setup-path-line)}.setup-path-phase-name{display:flex;align-items:center;align-self:start;gap:.5rem;padding:.4375rem 0;font-size:.9375rem;font-weight:600}.setup-path-phase-name svg{color:var(--setup-path-muted)}.setup-path-phase li{margin:0;padding:0}.setup-path-phase li>button{display:flex;gap:.75rem;width:100%;min-width:0;padding:.4375rem .5rem;border:0;text-align:left}.setup-path-phase li>button:hover{background:var(--setup-path-surface)}.setup-path-step-number{width:1.25rem;flex:none;font-size:.8125rem;font-weight:600;font-variant-numeric:tabular-nums;color:var(--setup-path-faint)}.setup-path-step-title{flex:1;min-width:0;font-size:.9375rem;font-weight:500}.setup-path-chevron{transition:transform 150ms ease}.setup-path-phase li.is-open .setup-path-chevron{transform:rotate(90deg)}.setup-path-step-body{display:grid;gap:.375rem;justify-items:start;padding:0 .5rem .625rem 2.5rem;font-size:.875rem;color:var(--setup-path-muted)}.setup-path-step-body a{display:inline-flex;align-items:center;gap:.3125rem}.setup-path-step-body>span{font-size:.8125rem;color:var(--setup-path-faint)}@media (max-width:640px){.setup-path-options,.setup-path-phase{grid-template-columns:1fr}.setup-path-options.is-compact{grid-template-columns:repeat(2,minmax(0,1fr))}.setup-path-phase{gap:.25rem}}@media (prefers-reduced-motion:reduce){.setup-path-chevron,.setup-path-option,.setup-path-radio,.setup-path-tile{transition:none}}"},{"filePath":"sidebar-filter.css","content":".nav-filter{--filter-ink:rgb(var(--gray-700));--filter-muted:rgb(var(--gray-500));--filter-breadcrumb:rgb(var(--gray-600) / 0.8);--filter-border:rgb(var(--gray-200));--filter-surface:rgb(var(--background-light));--filter-hover:rgb(var(--gray-600) / 0.05);color:var(--filter-ink);margin-bottom:1rem;font-size:.875rem;line-height:1.5}html.dark .nav-filter{--filter-ink:rgb(var(--gray-300));--filter-muted:rgb(var(--gray-400));--filter-breadcrumb:rgb(var(--gray-400) / 0.8);--filter-border:rgb(var(--gray-800));--filter-surface:rgb(var(--background-dark));--filter-hover:rgb(var(--gray-200) / 0.05)}.nav-filter-field{display:flex;align-items:center;gap:.5rem;min-height:2.25rem;padding:0 .625rem;border:1px solid var(--filter-border);border-radius:.75rem;background:var(--filter-surface);transition:border-color 150ms ease,box-shadow 150ms ease}.nav-filter-field:focus-within{border-color:rgb(var(--primary));box-shadow:0 0 0 3px rgb(var(--primary)/.12)}.nav-filter svg{width:1rem;height:1rem;flex:none;color:var(--filter-muted)}.nav-filter input{width:100%;min-width:0;padding:.5rem 0;font:inherit;color:inherit;background:0 0;border:0;outline:0}.nav-filter input::placeholder{color:var(--filter-muted)}.nav-filter button{display:grid;place-items:center;width:1.75rem;height:1.75rem;flex:none;border-radius:.5rem;cursor:pointer}.nav-filter button:hover,.nav-filter-results a:hover{background:var(--filter-hover)}.nav-filter button:focus-visible,.nav-filter-results a:focus-visible{outline:2px solid rgb(var(--primary));outline-offset:2px}.nav-filter-status{padding:.625rem .75rem 0;color:var(--filter-muted);font-size:.75rem}.nav-filter-status:empty{display:none}.nav-filter-results{margin-top:.5rem}.nav-filter-results ul{list-style:none;padding:0;margin:0}.nav-filter-results a{display:grid;gap:.125rem;padding:.5rem .75rem;border-radius:.75rem;color:inherit;text-decoration:none}.nav-filter-results small{color:var(--filter-breadcrumb);font-size:.75rem}.nav-filter-results small svg{display:inline;width:.625rem;height:.625rem;margin:0 .125rem;vertical-align:-.0625rem;color:inherit}.nav-filter-results a[aria-current=page]{background:rgb(var(--primary)/.1);color:rgb(var(--primary))}.nav-filter-empty{padding:.75rem;color:var(--filter-muted)}#navigation-items[hidden],.nav-filter [hidden]{display:none}#mobile-nav #navigation-items[data-nav-filter-active]>:not(.nav-filter):not([data-nav-filter-controls]){display:none}@media (max-width:1023px){.nav-filter input{font-size:1rem}.nav-filter-field{min-height:2.75rem}}@media (prefers-reduced-motion:reduce){.nav-filter-field{transition:none}}"}],"page":{"pagePath":"self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash","slug":"/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash","pageMetadata":{"title":"Configure OpenTelemetry tracing for self-hosted Lightdash","sidebarTitle":"OpenTelemetry tracing","description":"Export distributed traces from your Lightdash instance to any OpenTelemetry-compatible backend","boost":0.001,"doc-type":"reference","href":"/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Export distributed traces from your Lightdash instance to any OpenTelemetry-compatible backend\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note,Table}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`🛠This page is for engineering teams self-hosting their own Lightdash instance. For instance health metrics, see `,_jsx(_components.a,{href:`/self-host/customize-deployment/configure-prometheus-metrics-for-self-hosted-lightdash`,children:`Prometheus metrics`}),`.`]}),`\n`,_jsx(_components.p,{children:`Lightdash can export distributed traces using the OpenTelemetry SDK, so you can follow a request or scheduled job across the API server, scheduler, and warehouse queries in any OpenTelemetry-compatible backend (for example Grafana Tempo, Jaeger, Honeycomb, or Datadog).`}),`\n`,_jsx(_components.p,{children:`Tracing runs in one of two exclusive modes:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Sentry mode (default)`}),`: spans are created and exported through Sentry, controlled by the `,_jsx(_components.a,{href:`/self-host/customize-deployment/environment-variables#sentry`,children:`Sentry environment variables`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`OpenTelemetry mode`}),`: spans are created by the OpenTelemetry SDK and exported according to the standard `,_jsx(_components.code,{children:`OTEL_*`}),` environment variables. Sentry still captures errors, but receives no spans.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`enabling-opentelemetry-tracing`,children:`Enabling OpenTelemetry tracing`}),`\n`,_jsx(_components.p,{children:`By default, Lightdash traces through Sentry. To switch to OpenTelemetry mode, set the following environment variable on every Lightdash container (API server and scheduler):`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`LIGHTDASH_OTEL_TRACES_ENABLED`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`true`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Then point the OTLP exporter at your collector:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`OTEL_EXPORTER_OTLP_ENDPOINT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`http://otel-collector:4318`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`configuration-options`,children:`Configuration options`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Variable`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.code,{children:`LIGHTDASH_OTEL_TRACES_ENABLED`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Switches tracing to OpenTelemetry mode: spans are created by the OpenTelemetry SDK and Sentry receives errors only. When `,_jsx(_components.code,{children:`false`}),`, tracing runs through Sentry. (default=false)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.code,{children:`LIGHTDASH_OTEL_TRACES_SAMPLE_RATE`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Trace sampling ratio from 0.0 to 1.0. Falls back to `,_jsx(_components.code,{children:`SENTRY_TRACES_SAMPLE_RATE`}),` (deprecated) when unset. (default=1)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.code,{children:`LIGHTDASH_OTEL_ALWAYS_SAMPLE_AI_TRACES`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Set to `,_jsx(_components.code,{children:`false`}),` to stop always-sampling AI agent traces, so they follow the global sampling ratio instead. (default=true)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.code,{children:`LIGHTDASH_OTEL_DB_TRACES_ENABLED`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Adds spans for application database (Postgres) queries to traces, including the SQL statement. Requires OpenTelemetry mode. (default=false)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.code,{children:`LIGHTDASH_OTEL_DB_TRACES_MAX_QUERY_LENGTH`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Maximum length of the SQL statement recorded on database spans; longer statements are truncated. Must be a non-negative integer. (default=1022)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.code,{children:`OTEL_SDK_DISABLED`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Standard OpenTelemetry kill switch. When `,_jsx(_components.code,{children:`true`}),`, OpenTelemetry mode is off even if `,_jsx(_components.code,{children:`LIGHTDASH_OTEL_TRACES_ENABLED=true`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.code,{children:`OTEL_TRACES_EXPORTER`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Comma-separated exporters: `,_jsx(_components.code,{children:`otlp`}),`, `,_jsx(_components.code,{children:`console`}),`, `,_jsx(_components.code,{children:`zipkin`}),`, or `,_jsx(_components.code,{children:`none`}),`. Unsupported values are ignored with a startup warning; `,_jsx(_components.code,{children:`none`}),` overrides any other value. (default=otlp)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.code,{children:`OTEL_EXPORTER_OTLP_PROTOCOL`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`OTLP protocol: `,_jsx(_components.code,{children:`grpc`}),`, `,_jsx(_components.code,{children:`http/json`}),`, or `,_jsx(_components.code,{children:`http/protobuf`}),`. `,_jsx(_components.code,{children:`OTEL_EXPORTER_OTLP_TRACES_PROTOCOL`}),` takes precedence. Unsupported values fall back to the default. (default=http/protobuf)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.code,{children:`OTEL_EXPORTER_OTLP_ENDPOINT`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Base URL of your OTLP collector. Handled by the OpenTelemetry Node SDK, along with `,_jsx(_components.code,{children:`OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`}),` and `,_jsx(_components.code,{children:`OTEL_EXPORTER_OTLP_HEADERS`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.code,{children:`OTEL_SERVICE_NAME`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Service name attached to exported spans. (default=lightdash)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.code,{children:`OTEL_LOG_LEVEL`})}),_jsxs(_components.td,{style:{textAlign:`left`},children:[`Enables OpenTelemetry SDK and exporter diagnostics at the given level (e.g. `,_jsx(_components.code,{children:`DEBUG`}),`). Lightdash redacts credentials, tokens, and span payloads from diagnostic output.`]})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`OTEL_TRACES_SAMPLER`}),` and `,_jsx(_components.code,{children:`OTEL_TRACES_SAMPLER_ARG`}),` are overridden by Lightdash. Control sampling with `,_jsx(_components.code,{children:`LIGHTDASH_OTEL_TRACES_SAMPLE_RATE`}),` instead.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`choosing-an-exporter`,children:`Choosing an exporter`}),`\n`,_jsx(_components.p,{children:`Lightdash defers exporter and protocol selection to the OpenTelemetry Node SDK’s standard environment variable handling:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`OTEL_TRACES_EXPORTER`}),` supports `,_jsx(_components.code,{children:`otlp`}),` (default), `,_jsx(_components.code,{children:`console`}),`, `,_jsx(_components.code,{children:`zipkin`}),`, and `,_jsx(_components.code,{children:`none`}),`. You can combine exporters with a comma-separated list. If the list contains `,_jsx(_components.code,{children:`none`}),`, no traces are exported regardless of the other values.`]}),`\n`,_jsxs(_components.li,{children:[`With the `,_jsx(_components.code,{children:`otlp`}),` exporter, `,_jsx(_components.code,{children:`OTEL_EXPORTER_OTLP_PROTOCOL`}),` (or the traces-specific `,_jsx(_components.code,{children:`OTEL_EXPORTER_OTLP_TRACES_PROTOCOL`}),`) selects `,_jsx(_components.code,{children:`grpc`}),`, `,_jsx(_components.code,{children:`http/json`}),`, or `,_jsx(_components.code,{children:`http/protobuf`}),` (default).`]}),`\n`,_jsx(_components.li,{children:`Unsupported exporter or protocol values are ignored with a warning in the Lightdash logs at startup.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`For example, to export traces over gRPC with an authentication header:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`LIGHTDASH_OTEL_TRACES_ENABLED`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`OTEL_TRACES_EXPORTER`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`otlp`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`OTEL_EXPORTER_OTLP_PROTOCOL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`grpc`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`OTEL_EXPORTER_OTLP_ENDPOINT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`https://otlp.example.com:4317`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`OTEL_EXPORTER_OTLP_HEADERS`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"authorization=Bearer \u003ctoken>\"`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`sampling`,children:`Sampling`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`LIGHTDASH_OTEL_TRACES_SAMPLE_RATE`}),` sets the head-sampling ratio for trace roots, from `,_jsx(_components.code,{children:`0.0`}),` (nothing) to `,_jsx(_components.code,{children:`1.0`}),` (everything, the default). Child spans follow their root’s decision, so a sampled request captures the whole waterfall.`]}),`\n`,_jsx(_components.p,{children:`Two behaviours to be aware of:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`AI agent traces are always sampled`}),` regardless of the ratio, so a broken agent run always has a trace to debug. Set `,_jsx(_components.code,{children:`LIGHTDASH_OTEL_ALWAYS_SAMPLE_AI_TRACES=false`}),` to make them follow the global ratio instead.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`OTEL_TRACES_SAMPLER`}),` and `,_jsx(_components.code,{children:`OTEL_TRACES_SAMPLER_ARG`}),` are overridden`]}),` by Lightdash’s own sampler and have no effect.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Requests to health checks (`,_jsx(_components.code,{children:`/api/v1/health`}),`, `,_jsx(_components.code,{children:`livez`}),`), status polling endpoints, `,_jsx(_components.code,{children:`favicon.ico`}),`, and `,_jsx(_components.code,{children:`robots.txt`}),` are never traced.`]}),`\n`,_jsx(Heading,{level:`2`,id:`finding-a-request’s-trace`,children:`Finding a request’s trace`}),`\n`,_jsxs(_components.p,{children:[`Every API response carries an `,_jsx(_components.code,{children:`x-trace-id`}),` header with the trace ID of the request that produced it, so you can go from a request in your proxy or application logs to its trace in your backend. The same ID appears in the Lightdash logs for that request.`]}),`\n`,_jsxs(_components.p,{children:[`The header is only set when the request was sampled. Requests dropped by `,_jsx(_components.code,{children:`LIGHTDASH_OTEL_TRACES_SAMPLE_RATE`}),` have no exported trace and no header.`]}),`\n`,_jsxs(_components.p,{children:[`In OpenTelemetry mode the backend does not continue the `,_jsx(_components.code,{children:`sentry-trace`}),` and `,_jsx(_components.code,{children:`traceparent`}),` headers sent by the Lightdash web app, because the browser span is only exported to Sentry and would leave the trace without a root. A `,_jsx(_components.code,{children:`traceparent`}),` header set by your own ingress or middleware is continued as normal.`]}),`\n`,_jsx(Heading,{level:`2`,id:`database-query-tracing`,children:`Database query tracing`}),`\n`,_jsxs(_components.p,{children:[`Set `,_jsx(_components.code,{children:`LIGHTDASH_OTEL_DB_TRACES_ENABLED=true`}),` to add a span for each application database (Postgres) query, so you can see where a request spends time inside Lightdash’s own database:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`LIGHTDASH_OTEL_TRACES_ENABLED`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`LIGHTDASH_OTEL_DB_TRACES_ENABLED`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`true`})]}),`\n`]})})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Database spans only appear inside an existing trace, so they follow the sampling decision of their parent request or job.`}),`\n`,_jsxs(_components.li,{children:[`Each span records the SQL statement, truncated to `,_jsx(_components.code,{children:`LIGHTDASH_OTEL_DB_TRACES_MAX_QUERY_LENGTH`}),` characters (default `,_jsx(_components.code,{children:`1022`}),`). Invalid values fall back to the default with a warning.`]}),`\n`,_jsx(_components.li,{children:`This traces queries to Lightdash’s application database only, not queries sent to your data warehouse.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsx(_components.p,{children:`At startup, Lightdash logs a line confirming the tracing configuration, including the active exporters, OTLP protocol, and sampling ratio. This confirms configuration only; exporter connectivity is not validated at startup.`}),`\n`,_jsxs(_components.p,{children:[`If traces aren’t arriving in your backend, set `,_jsx(_components.code,{children:`OTEL_LOG_LEVEL=DEBUG`}),` to enable OpenTelemetry SDK and exporter diagnostics in the Lightdash logs. Diagnostic output is redacted before logging: URL credentials and query strings are stripped, values containing tokens or API keys are omitted, and span payloads are not printed.`]}),`\n`,_jsx(Heading,{level:`2`,id:`metrics`,children:`Metrics`}),`\n`,_jsxs(_components.p,{children:[`This page covers traces only. For instance health metrics (CPU, memory, event loop, query durations), see `,_jsx(_components.a,{href:`/self-host/customize-deployment/configure-prometheus-metrics-for-self-hosted-lightdash`,children:`Prometheus metrics`}),`, which can also feed an OpenTelemetry backend through the collector’s Prometheus receiver.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Configure OpenTelemetry tracing for self-hosted Lightdash","sidebarTitle":"OpenTelemetry tracing","description":"Export distributed traces from your Lightdash instance to any OpenTelemetry-compatible backend","boost":0.001,"doc-type":"reference","href":"/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Enabling OpenTelemetry tracing","slug":"enabling-opentelemetry-tracing","depth":2,"children":[]},{"title":"Configuration options","slug":"configuration-options","depth":2,"children":[]},{"title":"Choosing an exporter","slug":"choosing-an-exporter","depth":2,"children":[]},{"title":"Sampling","slug":"sampling","depth":2,"children":[]},{"title":"Finding a request’s trace","slug":"finding-a-request’s-trace","depth":2,"children":[]},{"title":"Database query tracing","slug":"database-query-tracing","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Metrics","slug":"metrics","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/lightdash/d0a9cf4e6619eae5/analytics.js","/_mintlify/custom/lightdash/09fccb112e45cce5/sidebar-filter.js","/_mintlify/custom/lightdash/3c8789d81bb7bbd0/sidebar-navigation.js"],"subdomain":"lightdash","siteName":"Lightdash","title":"Configure OpenTelemetry tracing for self-hosted Lightdash - Lightdash","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-29T20:54:12.571Z","originalFileLocation":"self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Export distributed traces from your Lightdash instance to any OpenTelemetry-compatible backend\">\u003cmeta data-mint-head name=\"application-name\" content=\"Lightdash\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/lightdash/x1yO_UZNDKcOd4RY/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/lightdash/x1yO_UZNDKcOd4RY/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/lightdash/x1yO_UZNDKcOd4RY/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/lightdash/x1yO_UZNDKcOd4RY/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/lightdash/x1yO_UZNDKcOd4RY/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/lightdash/x1yO_UZNDKcOd4RY/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/lightdash/x1yO_UZNDKcOd4RY/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/lightdash/x1yO_UZNDKcOd4RY/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/lightdash/x1yO_UZNDKcOd4RY/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Configure OpenTelemetry tracing for self-hosted Lightdash - Lightdash\">\u003cmeta data-mint-head property=\"og:description\" content=\"Export distributed traces from your Lightdash instance to any OpenTelemetry-compatible backend\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Lightdash\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.lightdash.com/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://lightdash.mintlify.app/_mintlify/api/og/v2?division=Infrastructure\u0026amp;title=Configure+OpenTelemetry+tracing+for+self-hosted+Lightdash\u0026amp;description=Export+distributed+traces+from+your+Lightdash+instance+to+any+OpenTelemetry-compatible+backend\u0026amp;theme=ec550573033c2195fadd36ad\u0026amp;signature=4db0fafa0a22b80dbfb99ef5d9aa5049c1c4abd224df978e9466fe4cafcbb3f7\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Configure OpenTelemetry tracing for self-hosted Lightdash - Lightdash\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Export distributed traces from your Lightdash instance to any OpenTelemetry-compatible backend\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://lightdash.mintlify.app/_mintlify/api/og/v2?division=Infrastructure\u0026amp;title=Configure+OpenTelemetry+tracing+for+self-hosted+Lightdash\u0026amp;description=Export+distributed+traces+from+your+Lightdash+instance+to+any+OpenTelemetry-compatible+backend\u0026amp;theme=ec550573033c2195fadd36ad\u0026amp;signature=4db0fafa0a22b80dbfb99ef5d9aa5049c1c4abd224df978e9466fe4cafcbb3f7\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/lightdash/x1yO_UZNDKcOd4RY/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Lightdash\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#8072ff\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.lightdash.com/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.lightdash.com/#organization\",\"name\":\"Lightdash\",\"url\":\"https://docs.lightdash.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/lightdash/NAoHiyWrKI0dLTGZ/logo/light.svg?fit=max\u0026auto=format\u0026n=NAoHiyWrKI0dLTGZ\u0026q=85\u0026s=4b91c8292b732e3daca7558549cf018c\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.lightdash.com#website\",\"name\":\"Lightdash\",\"url\":\"https://docs.lightdash.com\",\"publisher\":{\"@id\":\"https://docs.lightdash.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.lightdash.com/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash#webpage\",\"url\":\"https://docs.lightdash.com/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash\",\"name\":\"Configure OpenTelemetry tracing for self-hosted Lightdash\",\"description\":\"Export distributed traces from your Lightdash instance to any OpenTelemetry-compatible backend\",\"dateModified\":\"2026-10-29T20:54:12.571Z\",\"isPartOf\":{\"@id\":\"https://docs.lightdash.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.lightdash.com/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.lightdash.com/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Self-host\",\"item\":\"https://docs.lightdash.com/self-host\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Infrastructure\",\"item\":\"https://docs.lightdash.com/self-host/customize-deployment/configure-lightdash-to-use-an-external-database\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Configure OpenTelemetry tracing for self-hosted Lightdash\",\"item\":\"https://docs.lightdash.com/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.lightdash.com/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash#article\",\"headline\":\"Configure OpenTelemetry tracing for self-hosted Lightdash\",\"name\":\"Configure OpenTelemetry tracing for self-hosted Lightdash\",\"description\":\"Export distributed traces from your Lightdash instance to any OpenTelemetry-compatible backend\",\"url\":\"https://docs.lightdash.com/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash\",\"mainEntityOfPage\":{\"@id\":\"https://docs.lightdash.com/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash#webpage\"},\"dateModified\":\"2026-10-29T20:54:12.571Z\",\"publisher\":{\"@id\":\"https://docs.lightdash.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.lightdash.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Lightdash\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Lightdash","nav":{"global":null,"tabs":[{"tab":"Docs","pages":[{"title":"Welcome to Lightdash","mode":"wide","href":"/introduction"},{"group":"Get started","icon":"rocket","root":{"title":"Getting started","href":"/get-started"},"directory":"card","pages":[{"title":"Quickstart","href":"/get-started/quickstart"},{"title":"Agentic onboarding with Aurora","sidebarTitle":"Agentic onboarding","tag":"Beta","href":"/get-started/agentic-onboarding"},{"title":"Explore your data","href":"/get-started/explore-your-data"},{"title":"Build your semantic layer","href":"/get-started/build-your-semantic-layer"},{"title":"Migrating from another BI tool","sidebarTitle":"Migrate from another BI tool","href":"/get-started/migrate-from-another-bi-tool"},{"title":"The Lightdash Way","href":"/get-started/lightdash-way"}]},{"group":"Explore","icon":"telescope","root":{"title":"Explore your data","href":"/explore"},"directory":"card","pages":[{"group":"Build charts","pages":[{"title":"Configure your charts","href":"/explore/configure-charts"},{"title":"Custom tooltips","href":"/explore/configure-custom-tooltip"},{"title":"Using custom fields","sidebarTitle":"Custom fields","href":"/explore/create-custom-fields"},{"title":"Formatting your fields","sidebarTitle":"Formatting fields","href":"/explore/formatting-your-fields"},{"title":"Period-over-period comparisons","sidebarTitle":"Period-over-period","href":"/explore/period-over-period"},{"title":"SQL runner","sidebarTitle":"SQL runner","href":"/explore/sql-runner"},{"title":"Merge queries","sidebarTitle":"Merge queries","href":"/explore/merge-queries"},{"title":"External sources","sidebarTitle":"External sources","tag":"Experimental","href":"/explore/external-sources"}]},{"group":"Table calculations","root":{"title":"Table calculations","href":"/explore/table-calculations"},"directory":"card","pages":[{"title":"Formula table calculations","sidebarTitle":"Formula","href":"/explore/table-calculations/formulas"},{"title":"Row functions","href":"/explore/table-calculations/functions/row-functions"},{"title":"Pivot functions","href":"/explore/table-calculations/functions/pivot-functions"},{"title":"Aggregate functions","href":"/explore/table-calculations/functions/aggregate-functions"},{"title":"SQL templates","href":"/explore/table-calculations/sql-templates"}]},{"group":"Dashboards","root":{"title":"Dashboards","href":"/explore/dashboards"},"pages":[{"title":"Interacting with dashboards","href":"/explore/dashboards/interact"},{"title":"Dashboard filters","href":"/explore/dashboards/filter"},{"title":"Date zoom","href":"/explore/dashboards/date-zoom"}]},{"title":"Documents","href":"/explore/documents"},{"group":"Explore view","root":{"title":"The Explore view","href":"/explore/explore-view"},"pages":[{"title":"Filtering in the Explore view","href":"/explore/explore-view/filter"}]},{"title":"Filters reference","href":"/explore/filters-reference"},{"group":"Metrics catalog","root":{"title":"Metrics catalog","href":"/explore/metrics-catalog"},"directory":"card","pages":[{"title":"Catalog","href":"/explore/metrics-catalog/curate-the-catalog"},{"title":"Saved Trees","href":"/explore/metrics-catalog/build-saved-trees"},{"title":"Drivers","href":"/explore/metrics-catalog/drivers"}]},{"title":"Search","href":"/explore/search"},{"title":"Learn","tag":"Beta","href":"/explore/learn"},{"group":"Organize and share","pages":[{"title":"Spaces","href":"/explore/spaces"},{"title":"Default user spaces","href":"/explore/default-user-spaces"},{"title":"Review requests","sidebarTitle":"Review requests","href":"/explore/review-requests"},{"title":"Homepage","href":"/explore/homepage"},{"title":"How to promote content","sidebarTitle":"Promoting content","href":"/explore/promote-content"},{"title":"Verified charts and dashboards","sidebarTitle":"Verified content","href":"/explore/verified-content"},{"title":"Version history","sidebarTitle":"Version history","href":"/explore/version-history"},{"title":"Sharing charts","href":"/explore/share-charts"},{"title":"Scheduled deliveries","href":"/explore/create-scheduled-deliveries"},{"title":"Alerts","href":"/explore/create-alerts"}]}]},{"group":"Visualizations","icon":"chart-histogram","root":{"title":"Visualizations","href":"/visualizations"},"directory":"card","pages":[{"group":"Built-in charts","pages":[{"title":"Bar chart","icon":"chart-bar","href":"/visualizations/bar-chart"},{"title":"Line chart","icon":"chart-line","href":"/visualizations/line-chart"},{"title":"Area chart","icon":"chart-area","href":"/visualizations/area-chart"},{"title":"Mixed chart","icon":"chart-area-line","href":"/visualizations/mixed-chart"},{"title":"Scatter chart","icon":"chart-scatter","href":"/visualizations/scatter-chart"},{"title":"Pie chart","icon":"chart-pie","href":"/visualizations/pie-chart"},{"title":"Funnel chart","icon":"chart-funnel","href":"/visualizations/funnel-chart"},{"title":"Treemap chart","icon":"chart-treemap","href":"/visualizations/treemap-chart"},{"title":"Sankey chart","icon":"chart-sankey","tag":"Beta","href":"/visualizations/sankey"},{"title":"Table","icon":"table","href":"/visualizations/table"},{"title":"Big value","icon":"number-123","href":"/visualizations/big-value"},{"title":"Gauge","icon":"gauge","href":"/visualizations/gauge"},{"title":"Map","icon":"world","href":"/visualizations/map"}]},{"group":"Custom charts","root":{"title":"Custom charts","sidebarTitle":"Custom charts","href":"/visualizations/custom-charts"},"pages":[{"title":"Create reusable chart types with Chart Studio","sidebarTitle":"Chart Studio","href":"/visualizations/chart-studio"},{"title":"Install chart types from the chart library","sidebarTitle":"Chart library","href":"/visualizations/chart-library"}]}]},{"group":"Semantic layer","icon":"stack-2","root":{"title":"Lightdash semantic layer","href":"/semantic-layer"},"directory":"card","pages":[{"title":"Tables reference","sidebarTitle":"Tables","href":"/semantic-layer/tables"},{"title":"Dimensions reference","sidebarTitle":"Dimensions","href":"/semantic-layer/dimensions"},{"title":"Metrics reference","sidebarTitle":"Metrics","href":"/semantic-layer/metrics"},{"title":"Joins reference","sidebarTitle":"Joins","href":"/semantic-layer/joins"},{"title":"Nested and repeated columns","href":"/semantic-layer/nested-and-repeated-columns"},{"title":"Explores","sidebarTitle":"Explores","href":"/semantic-layer/explores"},{"title":"How to use parameters","sidebarTitle":"Parameters","href":"/semantic-layer/parameters"},{"title":"SQL variables","href":"/semantic-layer/sql-variables"},{"title":"Virtual views","href":"/semantic-layer/virtual-views"},{"title":"Lightdash YAML","sidebarTitle":"Lightdash YAML","href":"/semantic-layer/yaml"},{"title":"Caching","href":"/semantic-layer/caching"},{"group":"Pre-aggregates","root":{"title":"Pre-aggregates","href":"/semantic-layer/pre-aggregates"},"directory":"card","pages":[{"title":"External pre-aggregates","sidebarTitle":"External","href":"/semantic-layer/pre-aggregates/external"},{"title":"Monitoring and debugging pre-aggregates","sidebarTitle":"Monitoring and debugging","href":"/semantic-layer/pre-aggregates/monitoring"},{"title":"Auditing pre-aggregates from the CLI","sidebarTitle":"CLI audit","href":"/semantic-layer/pre-aggregates/audit-with-cli"}]},{"title":"lightdash.config.yml reference","sidebarTitle":"lightdash.config.yml","href":"/semantic-layer/lightdash-config-yml"},{"title":"Writing useful descriptions in your semantic layer","sidebarTitle":"Writing descriptions","href":"/semantic-layer/writing-descriptions"},{"title":"dbt modeling strategies for Lightdash","sidebarTitle":"Modeling strategies","href":"/semantic-layer/modeling-strategies"}]},{"group":"Workflow","icon":"git-branch","root":{"title":"Workflow","href":"/workflow"},"directory":"card","pages":[{"group":"CLI","root":{"title":"Lightdash CLI","sidebarTitle":"CLI","href":"/workflow/cli"},"directory":"card","pages":[{"title":"How to install the Lightdash CLI","sidebarTitle":"Install the CLI","href":"/workflow/cli/install"},{"title":"Authenticate the CLI","sidebarTitle":"Authenticate","href":"/workflow/cli/authenticate"},{"title":"Generate semantic layer YAML","sidebarTitle":"Generate YAML","href":"/workflow/cli/generate"},{"title":"Deploy changes to production","sidebarTitle":"Deploy changes","href":"/workflow/cli/deploy"},{"title":"Validate content","sidebarTitle":"Validate","href":"/workflow/cli/validate"},{"title":"Lint your code","sidebarTitle":"Lint","href":"/workflow/cli/lint"},{"title":"Compilation","sidebarTitle":"Compilation","href":"/workflow/cli/compile"},{"title":"Lightdash CLI reference","sidebarTitle":"Lightdash CLI","href":"/workflow/cli/reference"}]},{"title":"Preview projects","href":"/workflow/preview-projects"},{"title":"Pull requests","href":"/workflow/pull-requests"},{"title":"Automate with CI/CD","href":"/workflow/set-up-ci-cd"},{"title":"Validating your content","href":"/workflow/validating-your-content"},{"title":"Content as code","href":"/workflow/content-as-code"},{"title":"Migrate dashboards between projects","sidebarTitle":"Migrate dashboards","href":"/workflow/migrate-dashboards-between-projects"},{"title":"Editing dashboards with agents","href":"/workflow/edit-dashboards-with-agents"},{"title":"Agent skills","href":"/workflow/install-agent-skills"},{"title":"Set up VS Code for Lightdash","sidebarTitle":"Set up VS Code","href":"/workflow/set-up-vs-code"},{"title":"Renaming models, metrics, and dimensions","sidebarTitle":"Rename models and fields","href":"/workflow/rename-models-and-fields"},{"title":"Keyboard shortcuts","href":"/workflow/keyboard-shortcuts"}]},{"group":"Agents","icon":"robot","root":{"title":"AI agents","href":"/agents"},"directory":"card","pages":[{"group":"Set up agents","pages":[{"title":"Set up AI agents","sidebarTitle":"Set up agents","href":"/agents/set-up-agents"},{"title":"Agent visibility","sidebarTitle":"Visibility","href":"/agents/visibility"},{"title":"Data access control","href":"/agents/data-access"},{"title":"Agent identity","sidebarTitle":"Agent identity","tag":"Beta","href":"/agents/agent-identity"},{"title":"Agent permissions","sidebarTitle":"Agent permissions","tag":"Beta","href":"/agents/agent-permissions"},{"title":"Agent access to restricted data","sidebarTitle":"Restricted data","href":"/agents/agent-access-to-restricted-data"},{"title":"Thread retention","href":"/agents/thread-retention"},{"title":"Creating and editing content","sidebarTitle":"Content editing","tag":"Beta","href":"/agents/enable-content-tools"},{"title":"AI Router","sidebarTitle":"AI Router","href":"/agents/enable-ai-router"},{"title":"Lightdash MCP server","href":"/agents/lightdash-mcp"},{"title":"Connect external MCP servers","sidebarTitle":"External MCP servers","href":"/agents/connect-external-mcp-servers"},{"title":"AI agents as code","sidebarTitle":"Agents as code","href":"/agents/agents-as-code"},{"title":"AI writeback","href":"/agents/ai-writeback"},{"title":"AI coding agent","tag":"Beta","href":"/agents/ai-coding-agent"}]},{"group":"Work with agents","pages":[{"title":"Using AI agents","href":"/agents/use-ai-agents"},{"title":"Lightdash Desktop","sidebarTitle":"Desktop","tag":"Experimental","href":"/agents/lightdash-desktop"},{"title":"Deep research","sidebarTitle":"Deep research","href":"/agents/deep-research"},{"title":"Autopilot","sidebarTitle":"Autopilot","tag":"Beta","href":"/agents/autopilot"}]},{"group":"Improve answers","pages":[{"title":"Effective analytics with agents","sidebarTitle":"Effective analytics","href":"/agents/effective-analytics-with-agents"},{"title":"Custom agent skills","href":"/agents/custom-agent-skills"},{"title":"Agent context","sidebarTitle":"Agent context","href":"/agents/agent-context"},{"title":"Verified Answers","href":"/agents/verified-answers"},{"title":"Create evaluation suites","href":"/agents/create-evaluation-suites"},{"title":"AI agent issues","sidebarTitle":"Issues","tag":"Beta","href":"/agents/issues"},{"title":"Send issues to Linear and Jira","sidebarTitle":"Linear and Jira","tag":"Beta","href":"/agents/issues-linear-jira"}]}]},{"group":"Data apps","icon":"cube-spark","root":{"title":"Data apps","tag":"Beta","href":"/data-apps"},"tag":"Beta","directory":"card","pages":[{"title":"Customize themes","sidebarTitle":"Themes","href":"/data-apps/customize-themes"},{"title":"External connections","sidebarTitle":"External connections","href":"/data-apps/external-connections"},{"title":"Download data apps as code","sidebarTitle":"Download as code","href":"/data-apps/download-data-apps-as-code"},{"title":"Scheduled deliveries and syncs","sidebarTitle":"Deliveries and syncs","href":"/data-apps/deliveries-and-syncs"},{"title":"Build maps and globes in a data app","sidebarTitle":"Build maps and globes","href":"/data-apps/build-maps-and-globes"},{"title":"AI analysis","sidebarTitle":"AI analysis","tag":"Experimental","href":"/data-apps/ai-analysis"},{"title":"Saved app state","sidebarTitle":"Saved app state","tag":"Experimental","href":"/data-apps/saved-app-state"}]},{"group":"Embed","icon":"image-in-picture","root":{"title":"Embedding","href":"/embed"},"directory":"card","pages":[{"title":"Set up embedding","sidebarTitle":"Set up embedding","href":"/embed/set-up-embedding"},{"title":"How to Embed Dashboards","sidebarTitle":"Dashboards","href":"/embed/embed-dashboards"},{"title":"How to Embed Charts","sidebarTitle":"Charts","href":"/embed/embed-charts"},{"title":"How to embed AI agents","sidebarTitle":"AI agents","href":"/embed/embed-ai-agents"},{"title":"How to embed the metrics catalog","sidebarTitle":"Metrics catalog","href":"/embed/embed-metrics-catalog"},{"title":"How to embed data apps","sidebarTitle":"Data apps","href":"/embed/embed-data-apps"},{"title":"Embedding reference","href":"/embed/reference"},{"title":"Embedding with iframe","sidebarTitle":"iframe","href":"/embed/iframe"},{"title":"Embedding with React SDK","sidebarTitle":"React SDK","href":"/embed/react-sdk"},{"title":"How to translate embedded dashboards","sidebarTitle":"Translating dashboards","href":"/embed/translate-embedded-dashboards"}]},{"group":"Integrations","icon":"plug","root":{"title":"Integrations","href":"/integrations"},"directory":"card","pages":[{"title":"Connect your warehouse and project","sidebarTitle":"Connect your project","href":"/integrations/connect-project"},{"title":"Connect through an SSH tunnel","href":"/integrations/connect-through-ssh-tunnel"},{"title":"Connect Athena with web identity","sidebarTitle":"Athena web identity","tag":"Beta","href":"/integrations/connect-athena-with-web-identity"},{"group":"dbt","root":{"title":"dbt","href":"/integrations/dbt"},"directory":"card","pages":[{"title":"Syncing dbt projects","sidebarTitle":"Syncing dbt projects","href":"/integrations/dbt/projects"},{"title":"dbt write-back","href":"/integrations/dbt/write-back"},{"title":"dbt MetricFlow metrics","sidebarTitle":"dbt MetricFlow","href":"/integrations/dbt/metricflow"},{"title":"Upgrading dbt","href":"/integrations/dbt/upgrading"}]},{"title":"Slack integration","sidebarTitle":"Slack","href":"/integrations/slack"},{"group":"Google Sheets","root":{"title":"Google Sheets","href":"/integrations/google-sheets"},"directory":"card","pages":[{"title":"Lightdash for Google Sheets","sidebarTitle":"Google Sheets add-on","href":"/integrations/google-sheets/add-on"}]},{"title":"Metrics SQL API","tag":"Beta","href":"/integrations/metrics-sql-api"},{"title":"Snowflake Cortex","href":"/integrations/snowflake-cortex"},{"title":"Apache Ossie","tag":"Experimental","href":"/integrations/apache-ossie"}]},{"group":"Workspace admin","icon":"shield-cog","root":{"title":"Workspace admin","href":"/workspace-admin"},"directory":"card","pages":[{"group":"Access and permissions","pages":[{"title":"Invite your team","sidebarTitle":"Invite your team","href":"/workspace-admin/invite-new-users"},{"title":"Roles and permissions","href":"/workspace-admin/roles"},{"title":"Direct access","href":"/workspace-admin/direct-access"},{"title":"Custom Roles","href":"/workspace-admin/custom-roles"},{"title":"Groups","href":"/workspace-admin/manage-groups"},{"title":"User attributes","href":"/workspace-admin/user-attributes"},{"title":"Service accounts","href":"/workspace-admin/service-accounts"}]},{"group":"SSO","root":{"title":"SSO providers","href":"/workspace-admin/sso"},"directory":"card","pages":[{"title":"SSO setup","href":"/workspace-admin/sso/setup"},{"title":"Verified domains","href":"/workspace-admin/sso/verified-domains"},{"title":"SCIM Integration","href":"/workspace-admin/sso/scim"}]},{"group":"Organization settings","pages":[{"title":"Managing your organization","href":"/workspace-admin/manage-your-organization"},{"title":"Creating multiple projects","href":"/workspace-admin/manage-projects"},{"title":"Customizing the appearance of your project","sidebarTitle":"Color palettes","href":"/workspace-admin/appearance"},{"title":"Custom email domain","href":"/workspace-admin/set-up-custom-email-domain"},{"title":"Organization credentials","href":"/workspace-admin/organization-credentials"},{"title":"Multiple warehouse connections","sidebarTitle":"Warehouse connections","tag":"Experimental","href":"/workspace-admin/multiple-warehouse-connections"},{"title":"Set up timezones","sidebarTitle":"Timezones","href":"/workspace-admin/set-project-timezone"}]},{"group":"Monitoring and limits","pages":[{"title":"Usage analytics","href":"/workspace-admin/usage-analytics"},{"title":"Usage analytics project","tag":"Beta","href":"/workspace-admin/usage-analytics-project"},{"title":"Project compilation history","href":"/workspace-admin/project-compilation-history"},{"title":"Export limits","href":"/workspace-admin/export-limits"},{"title":"Instance health","href":"/workspace-admin/instance-health"}]}]},{"group":"Personal settings","icon":"user-cog","root":{"title":"Personal settings","href":"/personal-settings"},"directory":"card","pages":[{"title":"Personal access tokens","sidebarTitle":"Access tokens","href":"/personal-settings/create-personal-tokens"},{"title":"Personal warehouse connections","sidebarTitle":"Warehouse connections","href":"/personal-settings/personal-warehouse-connections"},{"title":"Timezones","href":"/personal-settings/timezone"}]},{"group":"Self-host","icon":"server-bolt","root":{"title":"Self-hosting","href":"/self-host"},"directory":"card","pages":[{"title":"Lightdash Cloud vs. Self-Hosted","href":"/self-host/lightdash-cloud-vs-self-hosted"},{"title":"Enterprise on-prem setup","sidebarTitle":"On-prem setup","href":"/self-host/enterprise-on-prem"},{"title":"Production deployment checklist","href":"/self-host/production-deployment-checklist"},{"title":"Data flows and telemetry in self-hosted Lightdash","sidebarTitle":"Data flows and telemetry","href":"/self-host/data-flows-and-telemetry"},{"title":"Environment variables","mode":"wide","href":"/self-host/customize-deployment/environment-variables"},{"group":"Install","pages":[{"title":"Self-Host Lightdash","href":"/self-host/self-host-lightdash"},{"title":"Self-host Lightdash using docker compose","sidebarTitle":"Docker compose","href":"/self-host/self-host-lightdash-docker-compose"}]},{"group":"Upgrading","pages":[{"title":"Upgrade your instance","href":"/self-host/upgrading"},{"title":"Upgrade notes","href":"/self-host/upgrade-notes"}]},{"group":"Connect services","pages":[{"title":"Configure a Github integration for self-hosted Lightdash","sidebarTitle":"Github Integration","href":"/self-host/customize-deployment/configure-github-for-lightdash"},{"title":"Configure a Slack integration for self-hosted Lightdash","sidebarTitle":"Slack Integration","href":"/self-host/customize-deployment/configure-a-slack-app-for-lightdash"},{"title":"Configure a Google Sheets integration for self-hosted Lightdash","sidebarTitle":"Google sheets","href":"/self-host/customize-deployment/configure-google-sheets-integration"}]},{"group":"Infrastructure","pages":[{"title":"Configure Lightdash to use an external database","sidebarTitle":"Use External Database","href":"/self-host/customize-deployment/configure-lightdash-to-use-an-external-database"},{"title":"Configure Lightdash to use external storage","sidebarTitle":"External storage","href":"/self-host/customize-deployment/configure-lightdash-to-use-external-object-storage"},{"title":"Run a dedicated scheduler worker","sidebarTitle":"Scheduler worker","href":"/self-host/customize-deployment/scheduler"},{"title":"Add headless browser on self-hosting","sidebarTitle":"Headless browser","href":"/self-host/customize-deployment/enable-headless-browser-for-lightdash"},{"title":"Sandboxes","sidebarTitle":"Sandboxes","href":"/self-host/customize-deployment/sandboxes"},{"title":"Secure Lightdash with HTTPS","sidebarTitle":"Secure with HTTPS","href":"/self-host/customize-deployment/secure-lightdash-with-https"},{"title":"Configure Prometheus metrics for self-hosted Lightdash","sidebarTitle":"Prometheus metrics","description":"Expose Prometheus metrics for instance health, plus custom counters driven by application events","href":"/self-host/customize-deployment/configure-prometheus-metrics-for-self-hosted-lightdash"},{"title":"Configure OpenTelemetry tracing for self-hosted Lightdash","sidebarTitle":"OpenTelemetry tracing","href":"/self-host/customize-deployment/configure-opentelemetry-tracing-for-self-hosted-lightdash"}]},{"group":"Access and licensing","pages":[{"title":"Configure Lightdash to use passwords or SSO for authentication","sidebarTitle":"SSO and auth","description":"Enable password login and SSO with Okta, Google, Azure AD, OneLogin, or any OIDC provider","href":"/self-host/customize-deployment/use-sso-login-for-self-hosted-lightdash"},{"title":"Organization roadmap","href":"/self-host/customize-deployment/organization-roadmap"}]},{"group":"Enterprise features","root":{"title":"Enterprise features","href":"/self-host/enterprise-features"},"pages":[{"title":"AI agents","href":"/self-host/enterprise-features/ai-agents"},{"title":"Data apps","href":"/self-host/enterprise-features/data-apps"},{"title":"Chart library","href":"/self-host/enterprise-features/chart-library"},{"title":"AI writeback","href":"/self-host/enterprise-features/ai-writeback"},{"title":"MCP","href":"/self-host/enterprise-features/mcp"},{"title":"Pre-aggregates","href":"/self-host/enterprise-features/pre-aggregates"},{"title":"Usage analytics","tag":"Beta","href":"/self-host/enterprise-features/usage-analytics"}]},{"group":"NATS workers","root":{"title":"NATS workers","href":"/self-host/nats-workers"},"directory":"card","pages":[{"title":"Warehouse workers","sidebarTitle":"Warehouse workers","href":"/self-host/nats-workers/warehouse-workers"},{"title":"Pre-aggregate workers","sidebarTitle":"Pre-aggregate workers","href":"/self-host/nats-workers/pre-aggregate-workers"}]}]},{"group":"Support","icon":"lifebuoy","root":{"title":"Support","href":"/support"},"directory":"card","pages":[{"title":"Generating a HAR file","href":"/support/generate-har-file"},{"title":"AI thread debug dump","href":"/support/ai-thread-debug-dump"},{"title":"Feature badges reference","href":"/support/feature-badges"},{"title":"Support access","href":"/support/support-access"}]}]},{"tab":"API","pages":[{"title":"API","href":"/api-reference/v1/introduction"}]}]},"basePath":"","title":"Configure OpenTelemetry tracing for self-hosted Lightdash - Lightdash","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":[],"chunks":[]}