Data Quality
En QPI — Quality Performance Indicator — är en namngiven kontroll som kör SQL mot kundens datalager och returnerar en godkänt/underkänt-bedömning med ett meddelande och ett mätt värde. Två sidor täcker dem: Monitor läser, Administration skriver.
En QPI-körning kan slutföras felfritt och ändå rapportera en underkänd kontroll — det är precis vad en QPI är till för. Bedömningen kommer från sondens egen test-kolumn, aldrig från om körningen lyckades. Håll isär de två när du läser dessa sidor.
QPI Monitor
Skrivskyddad. Avgränsad till sidomenyns datumintervall, med ett Max records-reglage.

Last result per QPI
Rubriken. Varje definierad QPI, sammankopplad med den senaste körningen inom fönstret, så att en kontroll som aldrig kördes visas som en lucka i stället för att försvinna.
| Utfall | Betydelse |
|---|---|
| 🟢 Pass | Körningen slutfördes och sonden returnerade test = 1 |
| 🟠 Fail | Körningen slutfördes och sonden returnerade test = 0 — datan är fel |
| 🔴 Error | Körningen misslyckades — sondens SQL gav ett fel |
| ⚪ Not run | Ingen körning inom fönstret |
Räknare högst upp (QPIs defined, Passing, Failing, Errored, Not run) följs av ett larm per tillstånd, sedan hela tabellen: utfall, QPI, typ, beskrivning, meddelande, värde, senaste körning, fel.
Fail och Error kräver olika svar. Ett Fail är ett dataproblem — gå och titta på datan. Ett Error är en trasig kontroll — gå och rätta SQL:en på administrationssidan.

Execution
Tillståndsmätvärden, sedan tre flikar:
- Timeline (Gantt) — när varje körning startade och hur lång tid den tog. En pågående körning ritas fram till nu så att den får en synlig stapel.
- Outcome history — körningar per QPI i fönstret, färgade efter utfall. Det är här en fladdrande kontroll blir uppenbar: en QPI som växlar mellan godkänt och underkänt mellan körningar är ett annat problem än en som stadigt underkänns.
- Run detail — den råa körningstabellen med filterbyggare
Incomplete runs
Körningar som aldrig nådde Completed, lästa från en särskild statusendpoint så att listan är komplett oavsett sidans fönster eller postgräns.
Administratörer får en Admin console här med två åtgärder per fastnad körning:
| Åtgärd | Effekt |
|---|---|
| ⏹ Terminate | Stänger körningen som Completed, märkt terminated, mot dess körningsnyckel |
| 🔄 Rerun | Avslutar körningen och köar sedan en ny omedelbart |
En körning identifieras av (qpi, runDttm). Om arbetaren dör mitt i sonden blir raden kvar som Running för alltid och blockerar kontrollen. Att köra Terminate stänger den som Completed i stället för Failed — en Failed-körning räknas fortfarande som ofullständig och skulle bli kvar i listan.
Beroendegraf och schemachecklista
Grafen visar vad varje QPI väntar på, där QPI-noderna bär sitt senast kända resultat. Checklistan under listar varje definition med frekvens, intervall, tidigaste körtid, senaste och nästa körning, beroenden och beskrivning.
QPI Administration
Allt som ändrar en QPI. Alla förändrande åtgärder kräver administratör och loggas; andra roller ser sidan skrivskyddad bakom en låsnotis.

Definitions
Ett kort per QPI, grupperade efter typ i expandrar, filtrerbara på typ och på en sökning i namn/beskrivning. Varje kort visar typmärket, sitt schema (eller ett Retired-märke), beskrivning, senaste körning, nästa körning och beroenden, med tre åtgärder: ▶ Run now, ✏️ Edit och radera — var och en bekräftad på plats. Redigering öppnar ett formulär direkt under kortets rad.
Definitionsformuläret
| Fält | Noteringar |
|---|---|
| QPI name | Identifieraren. Kan inte ändras efter skapandet. |
| Type | Fri gruppering; en hel typ kan triggas som en batch |
| Sort order | Ordningen kontrollerna körs och rapporteras i |
| Description | Visas i körningsrapporten bredvid godkänt/underkänt-markören |
| Frequency | Hur ofta schemaläggaren kör den. never pensionerar den — definitionen och dess historik behålls, men schemaläggaren plockar inte längre upp den. |
| Interval | Kör var N:e frekvenscykel |
| Earliest run time | Ingen körning schemaläggs före denna tid på dygnet |
| Dependencies | Flöden kontrollen väntar på. När ett slutförs triggas dess beroende QPI:er. |
Att pensionera med never är rätt sätt att stoppa en kontroll du kan vilja ha tillbaka. Radera är för definitioner som var ett misstag.
Kontrollen
Antingen en guidad byggare eller Advanced rå SQL. Den guidade byggaren visar alltid den SQL den genererar, i en expander Generated probe SQL — konsolen skickar aldrig något du inte fått se. Att växla en guidad kontroll till Advanced ger dig SQL:en att finjustera; att växla tillbaka ersätter den.
En QPI vars SQL inte skapats av byggaren öppnas direkt i Advanced-läge.

Kontraktet för sondens SQL
Arbetaren kör SQL:en mot kundens datalager och läser den första radens tre första kolumner, i ordning:
| # | Kolumn | Betydelse |
|---|---|---|
| 1 | test | Bedömningen. 1 = godkänt, 0 = underkänt. Måste vara ett tal. |
| 2 | message | Läsbar text som visas i körningsrapporten |
| 3 | value | Det mätta talet, som text |
Namnge kolumnerna exakt så, med alias där de kommer ur uttryck, och skriv frågan så att den alltid returnerar exakt en rad — aggregera med COUNT(*) i stället för att returnera de felande raderna, annars läses bara den första och resten ignoreras tyst.
API:et avvisar ett kommando som inte slutar med exakt ett ;, eller som innehåller INSERT, UPDATE, DELETE, MERGE, DROP, TRUNCATE, ALTER, CREATE eller EXEC. En sond läser; den skriver aldrig.
Ett exempel som godkänns när inga föräldralösa kunder finns:
SELECT
CASE WHEN COUNT(*) = 0 THEN 1 ELSE 0 END AS test,
CONCAT(CAST(COUNT(*) AS VARCHAR), ' customers without a household') AS message,
CAST(COUNT(*) AS VARCHAR) AS value
FROM dwh.Customer c
LEFT JOIN dwh.Household h ON h.HouseholdKey = c.HouseholdKey
WHERE h.HouseholdKey IS NULL;
Noll föräldralösa → test = 1 → 🟢 Pass. Några föräldralösa → test = 0 → 🟠 Fail, med antalet i message och value.
Förkontroll innan sparande
Konsolen kör API:ets regler lokalt före anropet och delar upp dem:
- Blockerande — samma regler som API:et upprätthåller: antal terminatorer, förändrande nyckelord. Dessa stoppar sparandet.
- Rådgivande — heuristik som inte kan avgöras genom inspektion: frågan börjar inte med
SELECT/WITH, eller ingen kolumntest/message/valuehittades. Dessa varnar men blockerar aldrig.
Strängliteraler och kommentarer töms före nyckelordssökningen, så en sond vars meddelande lyder "please update the source" misstas inte för en UPDATE-sats.
Vad som än fallerar ligger din inmatning kvar på skärmen för att rättas — inget kastas bort.
Stuck runs
Samma möjlighet att tvångsstänga som Monitors administratörspanel, med varje ofullständig körning listad med tillstånd, starttid och fel, och en Terminate-åtgärd per körning.
Dependencies
Välj ett källflöde för att se vilka QPI:er det styr, och trigga dem alla som om flödet just hade slutförts. Det är åtgärden vid en missad slutförandesignal — flödet kördes, men dess beroende kontroller väcktes aldrig.