Appearance
Lineage and impact
Keel keeps column-level lineage from source columns to the consumers of a metric, and answers "what breaks if this changes?".
text
source columns ─► views ─► entities ─► dimensions / measures ─► metrics ─► releases ─► consumers
(serving endpoints, MCP, exports)Where edges come from
| Scope | Built from |
|---|---|
model:{id} | The model document on main and every release: column → dimension (Derives), column → measure (Aggregates), filter columns (Filters), join keys (Joins), members → release (Consumes). SQL-defined entities are parsed through their query. |
views:{sourceId} | View definitions from the latest scan, parsed by Keel's SQL column-lineage extractor. |
openlineage:{namespace}/{job} | OpenLineage run events posted to POST /api/v1/lineage/openlineage (inputs, outputs and the column-lineage facet). |
dbt:{project} | A dbt manifest.json posted to POST …/lineage/dbt: model dependencies as dataset-level edges mapped onto scanned tables. |
Lineage is rebuilt after every release and scan, and on demand (POST …/lineage:rebuild). Consumers from the serving query log (last 90 days) and DQ status are added when you read it.
What the SQL extractor understands
CREATE VIEW headers, aliases, every JOIN form with ON/USING, parenthesized joins, APPLY/LATERAL, subqueries, non-recursive CTEs, set operations, SELECT * (expanded from the snapshot), casts, date parts and window functions. It reports — and never guesses — recursive CTEs, table functions and VALUES, SELECT * over unknown tables, ambiguous unqualified columns, PIVOT, dynamic SQL and JSON paths. Backtick-quoted and Snowflake-specific view text is not parsed yet.
Using it
- Lineage (
/lineage/:assetRef): five lanes (source columns → entities → measures → metrics → consumers); select a node to trace up- and downstream (the rest dims); direction, depth (default 4) and a column-level toggle; DQ status overlaid as dots, with failing upstream rules shown as the root cause. - Impact (
GET …/lineage/impact?asset=): everything downstream — model objects, releases, exports and serving consumers with last-used dates. - Change requests and drift use the same knowledge to classify breaking changes.
Asset references
Assets are addressed by name, so links survive releases: table:{source}/{schema}/{table}, column:{source}/{schema}/{table}/{column}, entity:{model}/{entity}, metric:{model}/{metric}, domain:{name}.