OpenTelemetry (OTLP) Data Streams
OpenTelemetry is an open-source observability framework that captures three types of signals from your web apps, APIs, and services:
- Logs — application events and errors (e.g., failed requests, warnings, debug messages).
- Metrics — performance measurements over time (e.g., request latency, CPU usage, error rates).
- Traces — end-to-end request flows across services (e.g., an API call that touches multiple microservices).
Choosing the OpenTelemetry (OTLP) source type when creating a data stream turns Keboola into a drop-in OTLP/HTTP endpoint. Any official OpenTelemetry SDK or collector can export directly to Keboola, and the incoming telemetry data lands in Storage — queryable alongside your business data.
Why Send Telemetry to Keboola?
Section titled “Why Send Telemetry to Keboola?”Your web apps, APIs, and services already generate telemetry data. Typically, this data lives in a dedicated monitoring tool (e.g., Datadog, New Relic, Grafana) while your business data lives in Keboola. When you need to understand how application performance affects business outcomes, you have to export data, build custom pipelines, or switch between tools.
With OTLP source support in Data Streams, your telemetry and business data live side by side in Keboola Storage. This lets you:
- Correlate application errors with revenue impact — join error logs with transaction records to see how outages affect orders.
- Connect API latency to conversion rates — analyze whether slow response times cause drop-offs in user workflows.
- Track deployment activity alongside business KPIs — measure whether a new release improved or degraded key metrics.
- Monitor LLM agent or pipeline performance — trace AI agent activity and cost alongside product usage data.
Getting Started
Section titled “Getting Started”Step 1: Create an OTLP Data Stream
Section titled “Step 1: Create an OTLP Data Stream”- Navigate to Storage > Data Streams and click Create Data Stream.
- Select OpenTelemetry (OTLP) as the source type.
- Name the data stream (e.g., “production-telemetry”). The destination table names are filled automatically.
- Click Create. Three destination tables (logs, metrics, traces) are created for you.
Step 2: Configure Your Application
Section titled “Step 2: Configure Your Application”The source detail page displays the OTLP endpoint URL along with a copy button and a ready-to-paste environment variable snippet.
To connect any OpenTelemetry SDK or collector, set two environment variables:
export OTEL_EXPORTER_OTLP_ENDPOINT="<your-stream-endpoint>"export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"Replace <your-stream-endpoint> with the endpoint URL shown on the source detail page. Once these variables are set, any official OpenTelemetry SDK will automatically pick them up and begin exporting telemetry data to your Keboola project.
Step 3: Verify Data Ingestion
Section titled “Step 3: Verify Data Ingestion”Records are typically available in Storage within approximately 15 seconds of ingestion. Check the Table statistics on the source detail page to confirm data is flowing.
Destination Tables
Section titled “Destination Tables”When you create an OTLP data stream, three destination tables are automatically created and pre-mapped:
| Table | Content |
|---|---|
| logs | Log records emitted by your applications (events, errors, warnings). |
| metrics | Metric data points (counters, gauges, histograms, etc.). |
| traces | Distributed trace spans with timing and context. |
Column Mapping
Section titled “Column Mapping”Each table’s column mapping is pre-configured so the fields you query most often — such as service, severity, trace_id, host_name, k8s_pod_name, and deployment_environment — are stored as top-level columns rather than buried inside a JSON blob.
Key details:
- Each signal’s column mappings are independently editable per sink.
- An opt-in option is available if you also want to keep the raw OTLP payload.
- Column names follow a flattened dot-notation derived from the OTLP protobuf schema, making SQL queries straightforward.
SDK and Collector Setup
Section titled “SDK and Collector Setup”The OTLP/HTTP endpoint is compatible with any OpenTelemetry SDK or collector. Below are quick-start snippets for popular languages and the OpenTelemetry Collector.
Python
Section titled “Python”Install the OpenTelemetry SDK and OTLP exporter:
pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp-proto-httpThen set the environment variables before running your application:
export OTEL_EXPORTER_OTLP_ENDPOINT="<your-stream-endpoint>"export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"export OTEL_SERVICE_NAME="my-python-service"python my_app.pyNode.js
Section titled “Node.js”Install the OpenTelemetry SDK and OTLP exporter:
npm install @opentelemetry/sdk-node @opentelemetry/exporter-trace-otlp-proto @opentelemetry/exporter-metrics-otlp-protoSet the environment variables:
export OTEL_EXPORTER_OTLP_ENDPOINT="<your-stream-endpoint>"export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"export OTEL_SERVICE_NAME="my-node-service"node --require @opentelemetry/sdk-node/register my_app.jsgo get go.opentelemetry.io/otel \ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp \ go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttpexport OTEL_EXPORTER_OTLP_ENDPOINT="<your-stream-endpoint>"export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"export OTEL_SERVICE_NAME="my-go-service"OpenTelemetry Collector
Section titled “OpenTelemetry Collector”If you already run an OpenTelemetry Collector, add Keboola as an OTLP/HTTP exporter in your collector configuration:
exporters: otlphttp/keboola: endpoint: "<your-stream-endpoint>" compression: gzip
service: pipelines: traces: exporters: [otlphttp/keboola] metrics: exporters: [otlphttp/keboola] logs: exporters: [otlphttp/keboola]This approach lets you fan out telemetry to both your existing monitoring backend and Keboola simultaneously.
Use Cases
Section titled “Use Cases”Joining Error Logs with Business Data
Section titled “Joining Error Logs with Business Data”Once your telemetry data is in Keboola Storage, you can query it alongside any other table. For example, to find how API errors affected revenue:
SELECT DATE(logs."timestamp") AS date, COUNT(DISTINCT transactions."order_id") AS lost_orders, SUM(transactions."amount") AS lost_revenueFROM logsJOIN transactions ON logs."trace_id" = transactions."trace_id"WHERE logs."severity" = 'ERROR'GROUP BY dateMonitoring Deployment Impact
Section titled “Monitoring Deployment Impact”Track how deployments affect error rates by correlating deployment timestamps with trace data:
SELECT traces."deployment_environment", traces."service", DATE_TRUNC('hour', traces."timestamp") AS hour, COUNT(*) AS total_spans, COUNT(CASE WHEN traces."status_code" = 'ERROR' THEN 1 END) AS error_spans, ROUND(100.0 * COUNT(CASE WHEN traces."status_code" = 'ERROR' THEN 1 END) / COUNT(*), 2) AS error_rateFROM tracesWHERE traces."timestamp" >= DATEADD('day', -7, CURRENT_TIMESTAMP())GROUP BY 1, 2, 3ORDER BY hour DESCLLM Observability
Section titled “LLM Observability”If your application uses LLM APIs, instrument them with OpenTelemetry to track token usage, latency, and costs alongside product metrics:
SELECT traces."service", traces."ai_model" AS model, COUNT(*) AS total_calls, AVG(traces."duration_ms") AS avg_latency_ms, SUM(traces."ai_total_tokens") AS total_tokensFROM tracesWHERE traces."ai_model" IS NOT NULL AND traces."timestamp" >= DATEADD('day', -30, CURRENT_TIMESTAMP())GROUP BY 1, 2ORDER BY total_tokens DESCOTLP Source Detail Page
Section titled “OTLP Source Detail Page”The OTLP source detail page provides:
- Endpoint URL with a one-click copy button.
- Environment variable snippet ready to paste into your application or deployment configuration.
- Table statistics for each of the three destination tables (logs, metrics, traces), showing waiting vs. imported data.
- Import conditions — the same configurable thresholds (time interval, data size, record count) as HTTP data streams. Learn more