2025-08-05
Monitor Microsoft Fabric Data Pipelines

From “why is the dashboard stale?” to “we fixed it before anyone noticed.”
The 4 pillars (system thinking, not tool sprawl)
-
Performance metrics (SLIs → SLOs → alerts)
-
Track: pipeline duration, activity duration, queue time, rows/bytes processed, success rate, retry rate, concurrency, compute utilization.
-
Design: baseline each metric per pipeline/activity; alert on deviation from normal (z-score/percentile drift), not just static limits.
-
Outcomes: early warnings for backlog formation, skewed partitions, under-sized compute.
-
-
Error logging (from red lights to root cause)
-
Capture: error codes, activity name, correlation/run IDs, input/output dataset names, row counts, schema versions, watermark timestamps.
-
Normalize logs so every alert carries the “five W’s”: what failed, where, when, which data, what to try next.
-
-
Data lineage (blast-radius awareness)
-
Maintain end-to-end lineage from source → bronze/silver/gold → semantic models → reports.
-
Use lineage to answer fast: “If table X is late/corrupt, which datasets/reports/SLA consumers are impacted?”
-
-
Automated recovery (self-healing playbooks)
-
Common automations: exponential backoff & retry, skip/quarantine bad files, schema-compat checks, partial replays via watermarks, automatic recompute of impacted gold tables, pause downstream refreshes, targeted re-runs.
-
Every error pattern should have a runbook + automation (even if the first version is semi-automated).
-
Reference architecture (Fabric-first, tool-agnostic)
-
Collect: Monitoring hub (pipeline/activity runs), dataset/model refresh history, event logs; persist structured telemetry to a central table (e.g., Lakehouse “observability” schema).
-
Enrich: Tag pipelines/datasets with
system,tier,RTO,RPO,owner,business_critical=true/false. -
Analyze: Build a “Health” semantic model with baselines (P50/P95) per pipeline/activity & hour-of-day.
-
Alert: Route to Teams/Email/ITSM with role-based routing (engineers get diagnostics; analysts get freshness/SLA impact).
-
Act: Trigger recovery flows (retry/replay/quarantine) with correlation IDs; log every action.
-
Review: Weekly ops review of top incidents, MTTD/MTTR trends, noisy alerts; retire or refine rules.
SLIs/SLOs you can copy
-
Freshness SLI:
now() - last_success_time(SLO: < 60 min for daily feeds; < 10 min for streaming). -
Success SLI:
% successful runsper 24h (SLO: ≥ 99%). -
Latency SLI:
activity_duration_p95vs baseline (SLO: within +25% of trailing 14-day median). -
Quality SLI:
% rows passing validation(nulls, ranges, referential checks) (SLO: ≥ 99.5%). -
Cost/efficiency SLI:
bytes_processed / output_bytesandretries per 100 runs.
Alert patterns that reduce noise
-
Dynamic thresholds: Alert when a metric deviates > 3σ or crosses the 95th percentile of its own history for that weekday/hour.
-
Chained alerts: If a source feed is late, suppress downstream “dataset stale” alerts and instead raise a single “root cause late” incident with lineage list.
-
Deduplication: Collapse repeats of the same error code/run within a 15–30 minute window.
-
Guardrails: Only page after N consecutive anomalies; first event posts to a low-noise ops channel.
Runbooks & automations (self-healing recipes)
-
Throttling/429s
-
Backoff: 2s → 4s → 8s … cap 60s; retry ≤ 7 times.
-
Stagger schedules; reduce parallelism; switch to pagination/bulk API where supported.
-
-
Schema drift
-
Pre-step schema probe; if unexpected column(s), route to quarantine & notify owner; auto-map safe additions; block destructive changes.
-
-
Bad records
-
Row-level validation → write failures to
quarantine.bad_rowswith file/run IDs; continue load; open ticket if error rate > threshold.
-
-
Partial replay
-
Use watermarks (
modifiedon >= last_success_ts); on failure, re-run only affected window; track idempotency with natural keys.
-
-
Downstream protection
-
If silver table is suspect, pause gold refresh & mark semantic model as “degraded” with banner; auto-resume after backfill passes checks.
-
Lineage-driven impact analysis
-
Every dataset/pipeline carries
upstream_ofanddownstream_ofreferences. -
For any incident, compute impact set: affected tables → models → reports and notify owners with expected next-good-refresh ETA.
-
Keep a “business criticality” map so executive dashboards get priority re-runs.
Dashboards that people actually use
-
Ops/Engineer view: pipeline heatmap by hour, activity p95 duration trends, retry/429 rates, top failing activities, cost/byte.
-
Analyst view: freshness tiles per domain, next refresh ETA, data quality pass rates, planned downtime.
-
Manager view: SLA attainment, incident volume & MTTR, top root causes, improvement backlog burn-down.
Tips: keep it modular; limit any page to 6–8 KPIs; link every tile to a drill page with run IDs & logs.
Tagging & ownership (the glue)
-
Required metadata:
owner,oncall_group,system,domain,tier,sla_minutes,contact,change_window. -
No tag, no deploy: block promotion if ownership or SLA tags are missing.
Data quality gates (lightweight but effective)
-
Null/empty checks on key fields.
-
Domain checks (enums, ranges, regex for IDs).
-
Referential integrity (FK existence between bronze/silver).
-
Volume drift (rows/bytes outside ±30% of trailing median).
-
Fail-open for minor drift (quarantine + warn); fail-closed for critical rules.
Cadence & hygiene
-
Daily: review red/yellow incidents, tuning backlog.
-
Weekly: top failing jobs, noisy alerts, lineage gaps.
-
Monthly: SLA/SLO review, cost anomalies, capacity right-sizing, deprecations.
-
Quarterly: disaster drill (simulate source outage & schema change), runbook audits.
Common pitfalls (and fixes)
-
Everything is “P1.” → Add tiers; reserve pages for true P1s; auto-suppress children of a known root cause.
-
Static thresholds. → Use baselines per hour/weekday & seasonality.
-
Orphan alerts. → Every alert must link to a runbook & an owner group.
-
Post-mortems only. → Track MTTD/MTTR, implement a preventative fix for each recurring issue.
-
No lineage. → You can’t do impact analysis without it—prioritize building lineage over adding one more metric.
10-step fast start (2–3 days)
-
Inventory pipelines/datasets; add owner + SLA + tier tags.
-
Define SLIs/SLOs per tier; baseline last 14–30 days.
-
Centralize telemetry in your lakehouse (observability schema).
-
Build Health model & three dashboards (Ops/Analyst/Manager).
-
Wire dynamic alerts (deviation-based) with role routing.
-
Implement two recovery runbooks (throttling, schema drift) end-to-end.
-
Add basic data quality gates (nulls, domain, volume drift).
-
Populate lineage for top 20 pipelines; test impact queries.
-
Create on-call rotation & incident template; measure MTTD/MTTR.
-
Run a failure game-day; fix the slowest part of the response.
Copy-paste incident template
-
Title: [Domain] [Pipeline] [Symptom]
-
When: Detected [UTC/local], first failed run ID(s)
-
Impact: Affected tables/models/reports; SLA at risk
-
Root cause (initial): Error code/message + recent change
-
Actions (auto/manual): Recovery steps executed, status
-
ETA to green: Next refresh estimate
-
Follow-ups: Preventative fix, owner, due date
FAQs
How do I start if I only have “success/fail” today?
Tag ownership & SLAs, centralize run metrics, and implement deviation-based alerts for duration & freshness on your top 10 pipelines.
Won’t dynamic thresholds take forever to tune?
No—baseline from 2–4 weeks of history, then iterate. You’ll cut false positives dramatically versus fixed limits.
What about streaming/real-time?
Track end-to-end latency, event lag, and consumer backlog depth. Alert on lag growth rate, not just absolute values.
How do I keep dashboards from becoming graveyards?
One dashboard per audience, owner on every tile, and a monthly hygiene pass. If a tile never drives action, remove it.
Apple Podcasts · Spotify · YouTube
Host: Mirko Peters