Data / ML · Lineage

Data Lineage Tools — A Comparison

Data Lineage Tools — A Comparison is the work that turns raw data into decisions. The pipeline from "we have data" to "we have a model that runs in production" is the same in.

John Kihiu12 min read

Lineage tooling answers one question well when it works: if this column looks wrong, what upstream table, job, or transformation produced it? The tools differ mostly in how they discover that graph — parsing SQL statically, watching query logs at runtime, or relying on the transformation tool itself to declare it — and that choice determines how much you trust the result.

Column-level vs table-level lineage

Table-level lineage tells you that fct_orders depends on stg_orders and stg_customers. That is enough to answer "what breaks if I drop this table" but not enough to answer "which of the forty columns in this dashboard actually comes from the field the vendor just renamed." Column-level lineage traces individual fields through every transformation, which is dramatically more useful for impact analysis but much harder to compute reliably, especially across `SELECT *`, dynamic SQL, or Python transformation steps that a parser cannot follow.

How tools actually build the graph

Static SQL parsing (used by dbt's own lineage graph, SQLLineage, and most open-source options) reads the transformation code and builds a dependency graph without running anything. It is fast and free but blind to anything dynamic — a stored procedure that builds SQL strings at runtime will not resolve correctly. Query-log-based tools (OpenLineage integrations, Monte Carlo, Datadog's data tooling) watch what actually executed in the warehouse and infer lineage from real query history. That catches dynamic SQL but requires warehouse-level access and can be noisy — ad hoc analyst queries pollute the graph unless filtered out.

dbt's built-in lineage is not full lineage

The dependency graph dbt generates from ref() and source() calls is accurate but stops at the warehouse boundary. It has no visibility into what happens after a BI tool queries a table, or what fed the raw sources before dbt touched them. For end-to-end lineage — ingestion tool through BI dashboard — you need a tool that consumes OpenLineage events or integrates specifically with your ingestion and BI layers, not dbt's graph alone.

OpenLineage as the common interchange format

Most serious lineage tooling today speaks OpenLineage, an open specification for emitting lineage events (job runs, datasets read/written, schema) that any producer or consumer can integrate with. Airflow, dbt, Spark, and most modern orchestrators have OpenLineage integrations. The practical benefit: you are not locked into one vendor's proprietary graph format, and you can swap the visualization or alerting layer without re-instrumenting every pipeline.

YAML · OPENLINEAGE EVENT SHAPE
eventType: COMPLETE
job:
  namespace: analytics
  name: transform_fct_orders
inputs:
  - namespace: warehouse
    name: staging.stg_orders
outputs:
  - namespace: warehouse
    name: warehouse.fct_orders
    facets:
      schema:
        fields:
          - {name: order_id, type: BIGINT}
          - {name: amount, type: DECIMAL}

Picking a tool for your team's actual size

A five-person data team with everything in dbt gets most of the value from dbt's native lineage graph plus dbt docs generate — adding a separate lineage platform is often overhead without enough scale to justify it. Once you have multiple ingestion tools, several orchestrators, and BI tools that need to trace back to source for compliance reasons, a dedicated platform (Atlan, Select Star, Monte Carlo, OpenMetadata) earns its cost because it stitches together tools that otherwise have no shared vocabulary for lineage.

ApproachStrengthBlind spot
Static SQL parsingFast, no runtime access neededMisses dynamic SQL, `SELECT *`
Query-log basedCatches what actually ranNeeds warehouse access, noisy
dbt native graphAccurate within dbt's scopeStops at warehouse boundary
OpenLineage platformCross-tool, vendor-neutralRequires instrumentation everywhere

Wrapping up

Start with what your transformation tool already gives you for free — dbt's graph covers more than most teams realize — and only add a dedicated lineage platform once you have enough tools in the stack that no single one can see the whole picture. Column-level lineage is worth the setup cost the first time a renamed field silently breaks three dashboards and nobody can trace why.

John Kihiu
Acumatica ERP Developer · Laravel Engineer

Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.