Sitemap

Practical Data Lineage & Observability

4 min readJan 23, 2026

--

From Ingestion to BI — Tools, Patterns, and Engineering Workflows That Scale

“If you can’t explain where your data came from, how it changed, and who depends on it — you don’t have a data platform. You have a liability.”

Why Data Lineage & Observability Matter (Practically)

In modern data platforms, failures rarely come from broken pipelines — they come from invisible dependencies.

Common real-world problems:

  • A dashboard breaks after a “harmless” upstream change
  • Regulatory teams ask where a number came from — and no one knows
  • Data quality silently degrades for weeks
  • Schema changes ripple unpredictably across BI, ML, and APIs

Lineage answers what depends on what
Observability answers is it behaving correctly

You need both — tightly integrated.

What “End-to-End Lineage” Actually Means

True lineage spans five layers:

Source → Ingestion → Storage → Transformation → Consumption

More concretely:

Anti-pattern:
Only capturing lineage at the transformation layer (e.g., dbt only).

Press enter or click to view image in full size

Lineage Types You Must Capture

1️⃣ Technical Lineage (System-Level)

  • Tables, columns, files
  • Jobs, DAGs, streams

2️⃣ Operational Lineage (Runtime)

  • Job executions
  • Run times, failures
  • Late or missing data

3️⃣ Business Lineage

  • Metrics
  • KPIs
  • Business definitions

Production systems need all three.

Reference Architecture: Lineage + Observability

        ┌───────────┐
│ Sources │
└─────┬─────┘
│
┌──────▼──────┐
│ Ingestion │ (Kafka, Airbyte)
└──────┬──────┘
│
┌────────▼────────┐
│ Raw / Bronze │
└────────┬────────┘
│
┌────────▼────────┐
│ Transform Layer │ (dbt / Spark)
└────────┬────────┘
│
┌────────▼────────┐
│ Curated / Gold │
└────────┬────────┘
│
┌────────▼────────┐
│ BI / ML / APIs │
└─────────────────┘
All layers emit:
✔ Metadata
✔ Metrics
✔ Events

Capturing Lineage at Each Stage

A. Ingestion Lineage

Pattern: Event-Based Metadata Capture

Every ingestion job emits metadata:

{
"dataset": "orders_raw",
"source": "mysql.orders",
"ingestion_time": "2026-01-20T10:00Z",
"schema_version": "v3",
"record_count": 102345
}

Tools:

  • Kafka headers
  • Airbyte/Fivetran metadata APIs
  • Custom OpenLineage emitters

B. Storage-Level Lineage

Track:

  • File → table mapping
  • Partition evolution
  • Schema drift

Key principle:
Lineage must be immutable and append-only.

C. Transformation Lineage (dbt / Spark)

dbt Native Lineage

dbt automatically generates:

  • Model dependencies
  • Column-level lineage
select
order_id,
sum(amount) as revenue
from {{ ref('orders') }}
group by order_id

dbt produces a lineage graph:

raw.orders → stg_orders → fct_revenue

Spark / ETL Lineage

Use:

  • OpenLineage
  • Spark listener hooks
from openlineage.client import OpenLineageClient

D. BI & Metric Lineage (The Hard Part)

This is where most platforms fail.

Get Uchit’s stories in your inbox

Join Medium for free to get updates from this writer.

You must track:

  • Metric → SQL → Tables → Columns
  • Dashboard → Metric → Source

Example:

Revenue KPI
→ SUM(fct_revenue.amount)
→ fct_revenue.amount
→ stg_orders.amount
→ raw.orders.amount

Tools:

  • Alation
  • Atlan
  • Monte Carlo (partial)
  • Custom semantic layers (dbt metrics, LookML)

Data Observability: What to Measure

Core Observability Dimensions

Engineering Patterns for Observability

Pattern 1: Freshness SLAs

dataset: fct_revenue
freshness:
warn_after: 2h
error_after: 4h

Alert only when:

  • Business impact is real
  • Downstream consumers are affected

Pattern 2: Volume Anomaly Detection

if abs(today_count - avg_7d) > threshold:
alert()

Prefer adaptive thresholds, not static ones.

Pattern 3: Schema Drift Detection

  • Detect new columns
  • Detect type changes
  • Block or quarantine data
ALTER TABLE detection
IF schema_change THEN fail_pipeline

Pattern 4: Column-Level Distribution Drift

Use:

  • KS test
  • PSI (Population Stability Index)
psi > 0.25 → high drift

Lineage-Driven Impact Analysis (The Real Power)

When something breaks:

“Who is impacted?”

With lineage:

Column change →
Affected models →
Affected dashboards →
Affected teams

This enables:

  • Targeted alerts
  • Faster MTTR
  • Confident change management

Integrating Lineage + Observability

Unified Workflow

Data Issue Detected
→ Identify dataset
→ Traverse lineage graph
→ Notify impacted owners
→ Block downstream consumption if needed

This is how you move from reactive to proactive data ops.

Tooling Landscape (Opinionated)

Reality: Most enterprises end up with a hybrid approach.

Operating Model & Ownership

Who Owns What?

Metrics That Matter (Leadership View)

  • % datasets with full lineage
  • Mean Time To Detect (MTTD)
  • Mean Time To Resolve (MTTR)
  • Data incidents per month
  • % dashboards with certified metrics

Real-World Case Example

Scenario:
Bank with 5,000+ tables, frequent schema changes.

Approach

  • OpenLineage + dbt lineage
  • Alation for business metadata
  • Freshness & volume SLAs
  • Impact-based alerting

Results (6 months)

  • Incidents ↓ 60%
  • MTTR ↓ 45%
  • Audit response time ↓ weeks → minutes
  • Higher trust in analytics

Key Takeaways

✔ Lineage without observability is blind
✔ Observability without lineage is noisy
✔ Column-level lineage unlocks real impact analysis
✔ Treat metadata as a first-class product

Finally

Data platforms don’t fail because of missing data.
They fail because no one knows what the data means, where it came from, or who it breaks.

Build lineage. Instrument observability.
Then — and only then — you can scale data with confidence.

--

--

Uchit
Uchit

Written by Uchit

Uchit is an IT industry veteran, a hands-on Enterprise Architect & AI transformation Leader.