Practical Data Lineage & Observability
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 → ConsumptionMore concretely:
Anti-pattern:
Only capturing lineage at the transformation layer (e.g., dbt only).
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
✔ EventsCapturing 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_iddbt produces a lineage graph:
raw.orders → stg_orders → fct_revenueSpark / ETL Lineage
Use:
- OpenLineage
- Spark listener hooks
from openlineage.client import OpenLineageClientD. 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.amountTools:
- 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: 4hAlert 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_pipelinePattern 4: Column-Level Distribution Drift
Use:
- KS test
- PSI (Population Stability Index)
psi > 0.25 → high driftLineage-Driven Impact Analysis (The Real Power)
When something breaks:
“Who is impacted?”
With lineage:
Column change →
Affected models →
Affected dashboards →
Affected teamsThis 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 neededThis 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.










