duck_lineage

DuckLineage erfasst automatisch die Datenherkunft (Lineage) jeder DuckDB-Abfrage und sendet OpenLineage-Ereignisse.

Maintainer: ilum-cloud, thijs-s

Installation und Laden

INSTALL duck_lineage FROM community;
LOAD duck_lineage;

Beispiel

-- Point DuckLineage at a running OpenLineage backend (e.g. Marquez at localhost:5000)
SET duck_lineage_url = 'http://localhost:5000/api/v1/lineage';
-- SET duck_lineage_namespace = 'my-data-warehouse';
-- SET duck_lineage_api_key = 'your-api-key';
-- SET duck_lineage_debug = true;
-- Run any query — lineage is captured automatically, no query changes required.
CREATE TABLE greetings (id INTEGER, message VARCHAR);
INSERT INTO greetings VALUES (1, 'Hello'), (2, 'World');
-- Derived table — column-level lineage links shouted.message -> greetings.message.
CREATE TABLE shouted AS
SELECT id, upper(message) AS message FROM greetings;
SELECT * FROM shouted;
-- START/COMPLETE events with input/output datasets, schemas, column-level lineage,
-- SQL facet, and row-count statistics are streamed to the OpenLineage backend.

Über duck_lineage

DuckLineage ist eine Open-Source-DuckDB-Erweiterung von Ilum Labs, die die Datenherkunft (Lineage) jeder Abfrage ohne SQL-Änderungen erfasst und OpenLineage-Ereignisse an jedes OpenLineage-kompatible Backend sendet (Marquez, DataHub, Atlan, OpenMetadata und ähnliche). Sie ist darauf ausgelegt, Datenherkunft, Governance und Observability out-of-the-box für eingebettete Analytik, lokale ELT-Pipelines und DuckLake-Katalog-Workloads bereitzustellen.

Die Erweiterung hängt sich in die DuckDB-Optimizer-Pipeline ein, analysiert jeden logischen Query-Plan, extrahiert Ein- und Ausgabe-Datasets zusammen mit ihren Schemas und liefert asynchron strukturierte OpenLineage-Ereignisse über HTTP — sodass die Abfrageperformance nicht durch die Latenz des Lineage-Backends beeinträchtigt wird.

Funktionen:

  • Automatische Lineage-Erfassung — läuft als DuckDB-Optimizer-Erweiterung, keine Umschreibung der Abfrage nötig
  • Vollständiger OpenLineage-Ereignislebenszyklus START / COMPLETE / FAIL für jede ausgeführte Abfrage
  • Extraktion von Ein- und Ausgabe-Datasets aus logischen Query-Plänen
  • Schema-Facets (Spaltennamen und -typen) für alle verfolgten Datasets
  • Spaltenweises Lineage-Facet auf Ausgabe-Datasets, mit Markierung direkter/indirekter Transformationen über CAST, Aliase, Joins, Aggregation, UNION/INTERSECT/EXCEPT, Fensterfunktionen, CTAS, INSERT INTO SELECT, Datei-Scans (CSV/Parquet), PIVOT und UNNEST
  • SQL-Job-Facet an jedem Ereignis (wenn der rohe SQL-String verfügbar ist)
  • Output-Statistics-Facet (Zeilenzahl) bei COMPLETE-Ereignissen
  • Lifecycle-State-Change-Facet (CREATE, DROP, ALTER, OVERWRITE, RENAME, TRUNCATE)
  • Symlinks-Facet zur Identitätsauflösung von Datasets über Katalog-/Storage-Namen
  • Dateibasierte Quellenverfolgung für read_csv, read_parquet und COPY TO
  • DuckLake-Katalogunterstützung mit automatisch aus dem Katalog-DATA_PATH aufgelöstem Namespace
  • processing_engine-, dataSource- und catalog-Facets für reichere Backend-Visualisierung
  • Asynchrone Ereigniszustellung über einen Hintergrund-Worker-Thread
  • Exponential-Backoff-Retry mit konfigurierbarer Maximalzahl an Wiederholungen
  • Begrenzte In-Memory-Ereigniswarteschlange mit Overflow-Schutz
  • API-Key-(Bearer-)Authentifizierung für OpenLineage-Backends
  • Parent-Run-Facet aus OPENLINEAGE_PARENT_*-Umgebungsvariablen, sodass DuckDB-Abfragen sauber als Child-Runs von Airflow, Dagster, Prefect oder jedem OpenLineage-fähigen Orchestrator verknüpft werden
  • Konfigurierbare Dataset-Präfix-Filterung, um Lineage für interne/System-Datasets zu unterdrücken
  • Debug-Logging-Modus, der emittierte JSON-Ereignisse auf die Konsole schreibt

Verfolgte Operationen:

  • INSERT, UPDATE, DELETE, MERGE
  • CREATE TABLE, CREATE TABLE AS, CREATE VIEW, CREATE INDEX
  • DROP, ALTER
  • COPY TO
  • SELECT (schreibgeschützte Lineage)

Konfiguration (über DuckDB-SET-Anweisungen):

  • duck_lineage_url: OpenLineage-Backend-Endpunkt (erforderlich)
  • duck_lineage_namespace: Standard-Dataset-Namespace (Standard: duckdb)
  • duck_lineage_api_key: Bearer-Token für das Backend (optional)
  • duck_lineage_debug: Debug-Logging aktivieren (Standard: false)
  • duck_lineage_max_retries: Wiederholungsversuche bei fehlgeschlagenen HTTP-Anfragen (Standard: 3)
  • duck_lineage_max_queue_size: maximale Anzahl wartender Ereignisse vor dem Verwerfen (Standard: 10000)
  • duck_lineage_timeout: HTTP-Anfrage-Timeout in Sekunden (Standard: 10)
  • duck_lineage_exclude_dataset_prefixes: kommagetrennte Dataset-Präfixe, die von der Lineage ausgeschlossen werden

Hinzugefügte Funktionen

Diese Erweiterung fügt keine Funktionen hinzu.

Überladene Funktionen

Diese Erweiterung fügt keine Funktionsüberladungen hinzu.

Hinzugefügte Typen

Diese Erweiterung fügt keine Typen hinzu.

Hinzugefügte Einstellungen

name description input_type scope aliases
duck_lineage_api_key API Key for OpenLineage backend VARCHAR GLOBAL []
duck_lineage_debug Enable debug logging for OpenLineage events BOOLEAN GLOBAL []
duck_lineage_exclude_dataset_prefixes Comma-separated prefixes of dataset names to exclude from lineage events VARCHAR GLOBAL []
duck_lineage_max_queue_size Maximum number of events to queue before dropping BIGINT GLOBAL []
duck_lineage_max_retries Maximum retry attempts for failed HTTP requests BIGINT GLOBAL []
duck_lineage_namespace Namespace for OpenLineage events VARCHAR GLOBAL []
duck_lineage_timeout HTTP request timeout in seconds BIGINT GLOBAL []
duck_lineage_url URL of the OpenLineage backend VARCHAR GLOBAL []