Skip to content
Blog

Engineering

Designing Observable Data Pipelines

A practical checklist for making ingestion, transformation, and reporting pipelines easier to operate.

June 12, 2026 / 2 min read
Data EngineeringObservabilityPipelines
Phan Hoang Nguyen ยท Backend Engineer

A data pipeline can be green on every dashboard and still be lying to you. The orchestration job succeeded, the Lambda didn't error โ€” and the report is a day stale, missing a partition, and full of duplicate rows. Observability for pipelines isn't "did the job run"; it's "can I trust the data it produced." ๐Ÿ“Š

Track freshness as a product signal

Freshness is the signal users feel first, because they make decisions on the data. Every dataset should expose three things: when it was last updated, which source produced it, and whether any expected partition is late. Treat a late partition like a failed request โ€” it's a user-facing incident, even when the job "succeeded."

mermaid
flowchart LR
    S[Sources] --> I[Ingest]
    I --> T[Transform]
    T --> R[(Reporting tables)]
    R --> D[Dashboards]
    I -.freshness / lineage.-> M[Signals]
    T -.quality checks.-> M
    R -.row counts.-> M
    M --> A[Actionable alert]

Separate data quality from job success

A job can finish cleanly and still emit incomplete or wrong data. Run data-quality checks beside orchestration health, not instead of it:

CheckCatches
Schema driftA source silently added or renamed a column
Row-count deltaA partial load or a runaway duplicate
Null-sensitive fieldsA broken join or missing upstream field
Duplicate keysNon-idempotent re-runs

Green orchestration plus a red quality check should still page someone.

Preserve source identity

Observable pipelines keep enough source identity to trace a bad report back to its input after transformation. Carry source object keys, event IDs, extraction timestamps, and batch IDs through each layer. When an analyst flags a wrong number, you want to answer "which input produced this?" in minutes, not spend an afternoon reverse-engineering it.

Make alerts actionable

An alert that just says "pipeline failed" makes someone go digging. A useful one names the owner, the dataset, the failure class, and the next action:

json
{
  "dataset": "gold.daily_active_users",
  "owner": "data-platform",
  "failure_class": "freshness",
  "detail": "partition dt=2026-07-24 is 6h late",
  "next_action": "check AppFlow source export schedule"
}

Now the on-call engineer knows whether this is freshness, quality, permissions, source availability, or compute โ€” before opening a single log.

Keep reading