Scope: Day-to-day operations, incident handling, replay/backfill, and ML model rollback
Pipelines: Streaming Pipeline (ETL) via Event Hubs + Synapse Streaming; Batch Pipeline (ELT) via ADF + Synapse + Snowflake
-
Check pipeline status
- Verify last 24 hours of ADF pipeline runs completed successfully.
- Verify Synapse streaming job is running and up-to-date.
- Confirm Snowflake tasks (if any) are healthy.
-
Validate SLOs
- p95 latency from ingestion to Snowflake
risk_scores< 90 seconds. - Daily batch window finished before 06:00 UTC.
- DQ pass rate ≥ 97% on critical checks, DLQ rate < 0.5%.
- p95 latency from ingestion to Snowflake
-
Spot-check dashboards
- Open key Power BI reports.
- Compare counts to yesterday and to queries in
qc_examples.sql.
If any of these fail, follow the incident playbooks below.
- No new rows in
risk_scoresfor > 5 minutes. - Synapse streaming job not running or in failed state.
- Latency alerts firing from observability stack.
- Check Azure Portal → Synapse → Monitoring for job health.
- Check Event Hubs metrics:
- Incoming messages
- Consumer lag / checkpoint age
- Query Snowflake:
SELECT MAX(scored_at) AS last_score_ts
FROM analytics.risk_scores;- If Synapse streaming job is stopped:
- Restart the job with the same configuration.
- If Event Hubs lag is high:
- Scale out streaming job (more partitions or higher parallelism).
- If schema validation fails:
- Inspect DLQ / error table in Synapse.
- Fix upstream schema or update
transactions.schema.jsonand downstream mapping with an ADR.
Streaming replay is handled by Event Hubs checkpoints:
- Stop the streaming job.
- Adjust starting position to a specific offset/time (for the incident window).
- Restart the job and monitor lag until it returns to normal.
Document the incident in the team’s incident tracker.
- ADF pipeline run failed or stuck.
- Snowflake compliance marts not refreshed.
- Batch SLO (T+1 06:00 UTC) breached.
- Open ADF → Monitor → Pipeline Runs, filter by pipeline name and date.
- Identify failing activity:
- Ingestion to ADLS
- Load to Synapse
- Load to Snowflake
- Validate raw data landed for the execution date:
-- Example Synapse raw zone check
SELECT load_date, COUNT(*) AS rows_loaded
FROM raw.transactions
WHERE load_date = 'YYYY-MM-DD'
GROUP BY load_date;- Ingestion failure: re-run only ingestion activities for the failing slice/date.
- Transform failure in Synapse: fix code/config, then re-run transform activities.
- Snowflake load failure: inspect
COPY INTOerrors; fix bad records or file paths; re-run Snowflake load step.
To replay a specific date (or range):
- Use ADF pipeline parameters for
start_dateandend_date. - Trigger a manual pipeline run with the desired window.
- Confirm:
- Raw tables in Synapse have the expected distinct counts.
- Compliance marts reflect new data and pass qc checks.
Backfills are needed when:
- Onboarding a new source system.
- Fixing a historical bug in logic.
- Bringing up a new environment (e.g., UAT → PROD).
-
Plan
- Define date range (e.g., last 18 months).
- Estimate volume and required compute (Synapse DWU, Snowflake warehouse size).
-
Isolate
- Use a separate backfill pipeline in ADF with:
- Throttled concurrency.
- Distinct tags/labels for monitoring.
- Use a separate backfill pipeline in ADF with:
-
Execute
- Run backfill in chronological order.
- Monitor loads with qc queries from
qc_examples.sql.
-
Validate
- Compare record counts and key metrics vs source system extracts.
- Ensure DQ checks pass at same or better rate than regular runs.
-
Close
- Turn off backfill pipeline.
- Write a short backfill report (dates, counts, issues) in the team’s wiki.
- Models are registered in Azure ML with:
model_namemodel_version- Metadata: training dataset hash, metrics, author, approval status.
- A Snowflake config table (e.g.
config.active_model) stores the active model_version.
-
Pre-checks
- Confirm:
- Offline metrics meet acceptance criteria.
- Fairness and bias checks were reviewed.
- Create/update ADR describing the change.
- Confirm:
-
Update config
UPDATE config.active_model
SET model_version = 'vX.Y.Z',
changed_by = 'your_name',
changed_at = CURRENT_TIMESTAMP();-
Deploy scoring pipeline
- Update Synapse / Azure ML pipeline to use
model_version = 'vX.Y.Z'. - Run a smoke test on a small batch and verify:
- Latency
- Score distribution
- Field mapping (no missing features).
- Update Synapse / Azure ML pipeline to use
-
Monitor
- For the first 24 hours:
- Watch drift dashboards.
- Confirm no unexpected spikes in risk score bands.
- For the first 24 hours:
If the new version misbehaves (high false positives, drift, or technical failure):
-
Switch active model
- Set
model_versioninconfig.active_modelback to prior version (e.g.,vA.B.C).
- Set
-
Redeploy scoring pipeline
- Redeploy / reconfigure Azure ML endpoint or Synapse job to use the prior version.
-
Optional re-score
- For the affected time window:
- Re-run scoring with the old model version.
- Overwrite or append corrected rows in
risk_scores.
- For the affected time window:
-
Document
- Log the incident and rollback details.
- Update ADRs if the rollback is permanent.
- Code & pipeline ownership: see
CODEOWNERS - Security questions: contact the security focal listed in
SECURITY.md - Data stewardship: data stewards for each domain are documented in
docs/01-context.md