Skip to main content
The OpenTelemetry message decoder converts OpenTelemetry JSON payloads into Pinot rows during realtime ingestion. It supports OpenTelemetry logs, metrics, and traces through a single decoder class selected by the otel.data.type decoder property.
The decoder expects OpenTelemetry JSON payloads shaped like OTLP JSON export messages. It does not run an OTLP collector endpoint by itself; use a stream such as Kafka or another supported realtime source to deliver the JSON payloads to Pinot.

When to Use

Use the OpenTelemetry decoder when:
  • Logs, metrics, or traces are already exported as JSON messages into a stream.
  • You want Pinot tables to support observability analytics without writing a custom transform pipeline.
  • You need OpenTelemetry attributes available as either JSON blobs or promoted Pinot columns.
Use the Prometheus decoder or Prometheus remote-write decoder for Prometheus-specific payloads.

Decoder Property

Set the decoder class and choose one data type:
Supported otel.data.type values: The value is case-insensitive in practice because it is normalized before matching.

Log Ingestion

OpenTelemetry log payloads are decoded from resourceLogs[].scopeLogs[].logRecords[]. Recommended schema:
Realtime table stream config:
Log output fields: Example query:

Metrics Ingestion

OpenTelemetry metric payloads are decoded from resourceMetrics[].scopeMetrics[].metrics[]. Recommended schema:
Stream config:
Metric output fields: Example query:

Trace Ingestion

OpenTelemetry trace payloads are decoded from resourceSpans[].scopeSpans[].spans[]. Recommended schema:
Stream config:
Trace output fields: Example latency query:

Attribute Modeling

For logs and traces, attribute handling follows two patterns:
  • Keep the full attributes object in attributes, resourceAttributes, or context JSON columns for flexible exploration.
  • Promote frequently filtered attributes to top-level Pinot columns by adding matching column names to the schema.
Example promoted fields:
Add JSON indexes when you frequently filter inside JSON attribute columns. Add inverted indexes to promoted low-cardinality attributes.

Troubleshooting