Hard failures vs. silent failures
Wanneer een Power BI refresh mislukt met een fout, weet u het meteen. De API retourneert een failed status, uw alert gaat af en iemand begint met het onderzoek. Het probleem is zichtbaar, de impact is bekend en de klok begint te lopen voor de oplossing.
Silent failures werken anders. De refresh wordt voltooid. Er gaat geen alert af. Het report opent zonder fouten. Maar de onderliggende data is onjuist — onvolledig, verouderd of gebaseerd op een corrupte upstream bron. Tegen de tijd dat iemand het opmerkt, kan de schade al zijn aangericht: beslissingen zijn genomen, reports zijn verspreid, KPI's zijn gerapporteerd aan het management.
In de meeste data teams gaat veel meer aandacht naar het voorkomen en detecteren van hard failures dan van silent failures. De monitoring infrastructuur voor het detecteren van een mislukte refresh is eenvoudig: de API bevragen en een alert sturen. De infrastructuur voor het detecteren van een silent failure — een dataset die succesvol geladen is vanuit een lege brontabel — is moeilijker op te bouwen en bestaat zelden.
De ADF pipeline die niets kopieerde
Hier is een scenario dat zich regelmatig voordoet in Azure-zware data stacks: een Azure Data Factory pipeline wordt op schema uitgevoerd, voert uit zonder fouten en markeert de run als Succeeded. Power BI refresht een uur later, ook met succes. Uw ochtenddashboard ziet er normaal uit.
Wat er werkelijk is gebeurd: het bronsysteem — een REST API, SFTP server of SAP export — heeft het bestand niet op tijd aangemaakt. ADF zag een lege bron, kopieerde nul bytes naar de bestemming en rapporteerde success omdat "geen data om te kopiëren" geen fout is in het uitvoeringsmodel van ADF. De staging table bevat nu geen nieuwe rijen. Power BI heeft vervolgens de lege staging table in het model geladen.
Als het model nergens in het report een "last loaded date" toont, hebben gebruikers geen idee dat er iets mis is. Ze kijken naar data van gisteren — of vorige week — en geloven dat die actueel is. Dit is een silent failure met reële impact op de bedrijfsvoering, volledig onzichtbaar voor monitoring die alleen de refresh status controleert.
Dit is een van de meest voorkomende patronen in enterprise data pipelines. De ingebouwde monitoring van ADF zal een zero-row copy niet als een failure markeren. U hebt een extra laag nodig die de daadwerkelijke data inspecteert — bij de bestemming (row count check) of bij de model-laag (watermark monitoring).
De kosten in beslissingen, vertrouwen en tijd
De kosten van slechte data zijn moeilijk te kwantificeren, maar de categorieën zijn consistent in organisaties.
Verkeerde beslissingen: Een sales team baseert pipeline forecasts op verouderde data. De operationele afdeling wijst resources toe op basis van de cijfers van gisteren. Finance rapporteert een getal aan het management dat gebaseerd is op een gedeeltelijke load. Deze beslissingen zijn mogelijk niet direct terug te draaien.
Verloren vertrouwen: De tweede-orde effecten van een data incident zijn vaak schadelijker dan het incident zelf. Na één spraakmakend geval waarin een report onjuiste cijfers toonde, beginnen gebruikers aan alles te twijfelen. "Klopt dit wel?" wordt een terugkerende vraag in elke vergadering die data gebruikt. Onzekerheid ondermijnt de investering in het data platform.
Onderzoekstijd: Elk data kwaliteitsincident genereert onderzoekswerk. Een data engineer moet de pipeline reconstrueren, de bron controleren, het model valideren en bevestigen wat er mis is gegaan. Zelfs een onderzoek van 2 uur, herhaald over meerdere incidents per kwartaal, leidt tot aanzienlijk verlies aan engineeringcapaciteit.
Escalatiekosten: Leidinggevenden die slechte data ontvangen, escaleren. Dit brengt data engineers, data owners en soms executives samen in een reeks vergaderingen. De opportunity cost — tijd die besteed had kunnen worden aan bouwen in plaats van uitleggen — is reël.
Scenario's die data engineers herkennen
De volgende patronen duiken herhaaldelijk op in productie data stacks.
De geleidelijk groeiende null kolom: Een bronsysteem begint null te retourneren voor een veld dat eerder waarden bevatte — geen schema change, de applicatie is gewoon gestopt met het vullen van het veld. Het Power BI model refresht prima. Een berekende kolom die afhankelijk was van dat veld retourneert nu nul voor elke nieuwe rij. Reports zien er wekenlang subtiel onjuist uit voordat iemand het opmerkt.
Het tijdzone offset incident: Een data warehouse laadt timestamps in UTC. Een report gebruikt een measure die datumberekeningen uitvoert op basis van lokale tijd. Een tijdzoneconfiguratie verandert ergens in de stack en plotseling wijken alle datumgebaseerde aggregaties één af. Refreshes slagen. Data is onjuist.
De incremental refresh partition fout: Een Power BI dataset gebruikt incremental refresh met doorlopende maandelijkse partities. Een verkeerd geconfigureerd refresh policy zorgt ervoor dat het proces een historische partitie opnieuw laadt in plaats van de huidige maand. De refresh voltooit, row counts zijn vergelijkbaar met de vorige run, maar elk report toont de waarden van vorige maand waar die van deze maand zouden moeten staan. Volume monitoring vangt dit niet — alleen watermark inspectie (de maximale datum die daadwerkelijk geladen is controleren) zal dit aantonen.
Het dbt model dat stilzwijgend een fout gaf: Een dbt Cloud job wordt uitgevoerd, één model faalt met een niet-fatale fout en de job gaat door en voltooit. Het mislukte model schrijft gedeeltelijke data. Power BI refresht op die gedeeltelijke output. Alles lijkt in orde in de refresh history van Power BI Service.
Wat detectie daadwerkelijk vereist
Het detecteren van silent failures vereist monitoring op meerdere punten in de data keten, niet alleen op het niveau van de Power BI API.
Op het pipeline niveau: Row count validatie na elke copy activity. De Copy Activity van ADF geeft een rowsCopied metric terug — u kunt een conditionele stap toevoegen om de pipeline te laten falen als die waarde 0 is of onder de drempelwaarde ligt. De meeste teams configureren dit niet.
Op het staging niveau: Data contracts tussen pipeline output en model input. Als een tabel rijen moet bevatten waarbij event_date gelijk is aan vandaag, verifieer dat dan voordat de Power BI refresh wordt uitgevoerd.
Op het model niveau: Volume monitoring op geladen datasets. Als de fact table 40% minder rijen heeft dan gisteren, is de refresh succesvol voltooid maar is er iets mis.
Op het report niveau: Watermark monitoring. Toon de maximale datum in de dataset ergens zichtbaar — in het report zelf of in uw monitoring tool — zodat iemand in één oogopslag kan zien of de data actueel is.
Geen van deze checks is afzonderlijk complex. De uitdaging is het bouwen van de infrastructuur om ze allemaal betrouwbaar te laten draaien en de resultaten op één plek te tonen in plaats van verspreid over vier verschillende consoles.