otlp
OpenTelemetry-Traces, -Logs und -Metriken mit SQL abfragen — oder Live-OTLP/HTTP in DuckDB, DuckLake oder Iceberg streamen
Maintainer: smithclay
Installation und Laden
INSTALL otlp FROM community;LOAD otlp;Beispiel
-- Load the extensionLOAD otlp;
-- Traces: find the slow spansSELECT trace_id, span_name, service_name, durationFROM read_otlp_traces('traces.jsonl')WHERE duration > 1e9 -- longer than one secondORDER BY duration DESCLIMIT 10;
-- Or run a live OTLP/HTTP endpoint and query what arrivesSELECT listen_url, auth_token FROM otlp_serve('otlp:localhost:4318');-- POST telemetry to http://localhost:4318/v1/logs.-- Rows commit automatically in the background; otlp_stop commits remaining rows.SELECT status FROM otlp_stop('otlp:localhost:4318');SELECT * FROM otlp_logs;
-- Metrics: latest gauge readings (works native and in the browser)SELECT timestamp, service_name, metric_name, valueFROM read_otlp_metrics_gauge('metrics.jsonl')ORDER BY timestamp DESC;
-- Logs: just the errors, read straight from S3SELECT timestamp, severity_text, body, service_nameFROM read_otlp_logs('s3://bucket/logs-*.jsonl')WHERE severity_text = 'ERROR';
-- Protobuf works too, on native buildsSELECT * FROM read_otlp_traces('traces.pb') LIMIT 10;Über otlp
OpenTelemetry, in SQL
Richten Sie diese Erweiterung auf OTLP-Daten und fragen Sie sie wie jede andere Tabelle ab. Traces,
Logs und Metriken kommen als richtige Spalten an — service_name, trace_id,
duration, value — nicht als JSON, das Sie durchsuchen müssen. Das Schema folgt dem
OpenTelemetry-ClickHouse-Exporter, daher sind die Spalten typisiert, schnell zu filtern und
stabil.
Es gibt zwei Einstiege.
Dateien lesen
Sechs Tabellenfunktionen lesen OTLP-Exporte direkt von Datenträger oder Objektspeicher:
read_otlp_traces()— Spans mit Attributen, Events, Links und einer berechneten Durationread_otlp_logs()— Datensätze mit Severity, Body und Trace-Korrelationread_otlp_metrics_gauge(),read_otlp_metrics_sum(),read_otlp_metrics_histogram(),read_otlp_metrics_exp_histogram()
JSON, JSONL und protobuf werden automatisch erkannt. Pfade können lokal, ein Glob, S3, HTTP(S), Azure oder GCS sein. Der Browser-Build (DuckDB-WASM) liest alle drei Formate — versuchen Sie die interaktive Demo.
Live-Ingest bereitstellen (native Builds)
otlp_serve() startet einen OTLP/HTTP-Endpunkt innerhalb von DuckDB. Richten Sie einen Collector oder
SDK-Exporter auf http://localhost:4318 und die Zeilen landen in Tabellen, die Sie
abfragen können:
SELECT listen_url, auth_tokenFROM otlp_serve('otlp:localhost:4318');Lassen Sie catalog leer, damit die Zeilen im Standardkatalog für schnelle lokale Arbeit landen.
Setzen Sie ihn auf ein angehängtes DuckLake-Lakehouse oder einen schreibbaren
Iceberg-REST-Katalog für dauerhaften Lakehouse-Ingest.
Ingest wird gepuffert und gruppenweise committet. Ein POST gibt 202 Accepted zurück, sobald Zeilen
geparst und gepuffert sind; sie werden beim nächsten automatischen Hintergrund-Commit dauerhaft, derzeit
wenn die älteste gepufferte Zeile etwa 5 Sekunden alt ist oder die aufgenommenen Request-Body-
Bytes etwa 64 MiB erreichen. otlp_server_list() meldet die Zähler, und
otlp_stop() committet den Rest vor dem Herunterfahren. otlp_flush() ist optional:
verwenden Sie es nur, wenn Leser die zuletzt akzeptierten Zeilen sofort dauerhaft brauchen, während
der Server weiterläuft. Stoppen Sie vor dem Schließen der Datenbank — ein einfaches Schließen
committet gepufferte Zeilen nicht.
Anwendungsfälle
- Collector- oder SDK-Exporte lesen und analysieren
- Eine kleine, dauerhaft laufende OTLP-Senke, die nach DuckDB, DuckLake oder Iceberg schreibt
- Telemetrie nach Parquet, CSV oder jedes von DuckDB geschriebene Format konvertieren
- Traces, Logs und Metriken während der lokalen Entwicklung prüfen
Gut zu wissen
- Der Live-Server ist nur nativ und nur HTTP — kein WASM, kein gRPC.
- Dateilesen ist auf 100 MB pro Datei begrenzt.
- Summary-Metriken und das einheitliche
read_otlp_metrics()sind noch nicht implementiert.
Referenzen
Hinzugefügte Funktionen
| function_name | function_type | description | comment | examples |
|---|---|---|---|---|
| otap_serve | table | NULL | NULL | |
| otlp_flush | table | NULL | NULL | |
| otlp_seal_list | table | NULL | NULL | |
| otlp_serve | table | NULL | NULL | |
| otlp_server_list | table | NULL | NULL | |
| otlp_stop | table | NULL | NULL | |
| otlp_uri_parser | scalar | NULL | NULL | |
| read_otap_logs | table | NULL | NULL | |
| read_otap_metrics_exp_histogram | table | NULL | NULL | |
| read_otap_metrics_gauge | table | NULL | NULL | |
| read_otap_metrics_histogram | table | NULL | NULL | |
| read_otap_metrics_sum | table | NULL | NULL | |
| read_otap_traces | table | NULL | NULL | |
| read_otlp_logs | table | NULL | NULL | |
| read_otlp_metrics | table | NULL | NULL | |
| read_otlp_metrics_exp_histogram | table | NULL | NULL | |
| read_otlp_metrics_gauge | table | NULL | NULL | |
| read_otlp_metrics_histogram | table | NULL | NULL | |
| read_otlp_metrics_sum | table | NULL | NULL | |
| read_otlp_metrics_summary | table | NULL | NULL | |
| read_otlp_traces | table | NULL | NULL |
Überladene Funktionen
Diese Erweiterung fügt keine Funktionsüberladungen hinzu.
Hinzugefügte Typen
Diese Erweiterung fügt keine Typen hinzu.
Hinzugefügte Einstellungen
Diese Erweiterung fügt keine Einstellungen hinzu.