Chapter 29 — Data governance: measurement
Lesson map
Lesson 29 published. Map, example, EX085.
flowchart TD
N0["Learning outcomes"]
N1["29.1 The service level"]
N2["Lab — Feed arrivals against a 06:00 service level ov"]
N3["29.2 Results"]
N4["29.3 Finding the cause"]
N5["29.4 Reporting service"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5
N5 --> EX["Worked example"]
EX --> Q["Exercise EX085"]
Logical drawing
flowchart LR
N0["Learning outcomes"]
N1["29.1 The service level"]
N2["Lab — Feed arrivals against a 06:00 service level ov"]
N3["29.2 Results"]
N4["29.3 Finding the cause"]
N5["29.4 Reporting service"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> Q["EX085"]
[Learning outcomes]
|
v
[29.1 The service level]
|
v
[Lab — Feed arrivals against a 06:00 service level ov]
|
v
[29.2 Results]
|
v
[29.3 Finding the cause]
|
v
[29.4 Reporting service]
|
v
[Worked example] --> [Exercise EX085]
Learning outcomes
You will (1) measure timeliness against a service level; (2) find patterns in breaches; (3) report service performance.
29.1 The service level
The daily supplied-volume feed must reach the warehouse by 06:00 so the morning leakage view is ready for network engineers. Kofi measures arrival times over ninety synthetic days. He records the time each feed lands and compares it with the deadline. He explains that a service level is only useful if it is measured continuously and reported to both the supplier and the consumer, so each side knows whether the agreement is being kept. The supplier here is network operations. It runs the export job each morning.
Lab — Feed arrivals against a 06:00 service level over 90 synthetic days
"""Measure daily feed timeliness against a 06:00 service level over 90 synthetic days (stdlib only)."""
import random
random.seed(19)
arr = [random.gauss(5.2, 0.6) + (1.5 if 40 <= d < 47 else 0) for d in range(90)] # hours after midnight
late = [d for d, a in enumerate(arr) if a > 6.0]
print(f"days {len(arr)}; feed after 06:00 on {len(late)} days ({100*len(late)/len(arr):.1f}%)")
print(f"late days in the week 40-46: {sum(1 for d in late if 40 <= d < 47)} of 7")
Run with python3 lab_sla.py. Verified output:
days 90; feed after 06:00 on 11 days (12.2%)
late days in the week 40-46: 7 of 7
29.2 Results
The lab shows the feed arrived after 06:00 on 11 of 90 days, or 12.2 percent. The service level target is 95 percent on time, which allows about four or five late days; Tidewater achieved 87.8 percent. All seven days in the week from day 40 to day 46 were late. The other four late days were scattered. Kofi notes that a single summary figure hides this pattern, which points to a specific event rather than general slowness. Kofi plots the daily arrival times so that the cluster is visible at a glance to every reader.
29.3 Finding the cause
Kofi investigates the late week with network operations. During that week, a control system upgrade added a backup job that ran before the export, delaying the feed by about an hour and a half every day. Nobody connected the upgrade to the late feed because the warehouse team was not told about the change. He recommends that changes affecting the export schedule notify the data owner, and that the upgrade's backup job be moved. The backup job is rescheduled to after the export.
29.4 Reporting service
Kofi designs a monthly service report showing on-time percentage, a daily arrival chart with the deadline marked, clusters of breaches and causes found. The report goes to the network operations owner and the data consumers. Prof. Varga notes that showing the daily chart rather than only the percentage lets readers see patterns themselves, and that service reports should explain breaches rather than merely count them, since counting alone gives no basis for improvement. The first report is discussed at the monthly operations meeting.
Worked example
Kofi measures 11 late days of 90 (12.2 percent), with all seven late in week 40 to 46, traces them to an upgrade's backup job and designs a monthly service report with a daily chart.
Synthetic case. Arrivals are synthetic; outputs come from lab_sla.py.
Errors and limits
Averages hide clusters; plot daily values.
Exercises
- EX085 — Late share. On what share of days was the feed late? Rubric: 3 = 12.2% (11 of 90);; 2 = partly correct;; 1 = partial;; 0 = none.
- EX086 — Cluster cause. What caused the late week? Rubric: 3 = an upgrade's backup job running before the export;; 2 = partly correct;; 1 = vague;; 0 = none.
- EX087 — Scattered days. How many late days fell outside that week? Rubric: 3 = four;; 2 = partly correct;; 1 = wrong;; 0 = none.
Continue studying — lesson 29 (chapter 29 of 50)
← Chapter 28 · Course chapter index · Chapter 30 →
Continue to the next authored lesson.