Zo nu en dan heb je dat wel eens… je bent een stukje software aan het maken en tijdens het ‘debuggen’ gaat iets niet zoals je het had verwacht. Je denkt natuurlijk eerst dat je zelf een fout hebt gemaakt, maar wat als je er na een tijdje achter komt dat er een probleem is bij Microsoft. Dat had ik kort geleden dus ook toen ik bij een hobbyproject tegen een probleem aanliep in Microsoft Azure Data Factory. Er bleken meerdere processen/activities te draaien die ik niet kon zien, maar die wel werden doorbelast. Na een paar dagen stond de maandelijkse forecast van mijn Azure Data Factory project op meer dan 4.000 euro. Oeps….even met Microsoft bellen dan maar.
Het project
Ik was voor een vriend wat data aan het verzamelen vanuit een webportal, die deze data beschikbaar stelde via een REST API. Het betrof gebruiks-, verkoop- en marketingdata van een goed bezochte webshop. Die wilden we hebben om wat analyses te kunnen doen in Power BI. Het waren meerdere API’s met responses die ‘paginated’ waren. Dat wil zeggen dat ze per keer een response geven van maximaal 1.000 entries, die je meerdere keren moet aanroepen met een opvolgend ‘page’-nummer. Als je in totaal 300.000 entries hebt, moet je die API dus 300 keer aanroepen. Zodra alle data in een Azure SQL database stond, konden we deze importeren in Power BI en hier mooie analyses op maken. Door mijn ervaring met Azure Data Factory dacht ik dit in een avondje wel voor elkaar te hebben. Dat liep dus even anders.
Azure Data Factory opstelling
In mijn BI Chemistry omgeving in Azure heb ik een aparte Data Factory aangemaakt voor dit project. Ik had bedacht om daarin met twee in elkaar geneste ‘loops’ te gaan werken. Eerste een ‘For Each Loop’ om vier verschillende API’s te kunnen aanroepen met steeds dezelfde logica, met daarbinnen in een ‘Until loop’. Om per API de ‘pages’ met 1.000 entries te kunnen ophalen, tot ik alle pages heb gehad. De eerstgenoemde ‘loop’ is dus niet meer dan dit:
Waarbinnen ik in de ForEach loop een andere Data Factory pipeline aanroep met de API-naam als parameter. De pipeline met die parameter ziet er als volgt uit:
Eerst haal ik voor de betreffende API het aantal ‘entries’ en ‘pages’ op, die in een variabele worden gezet en dáármee ga ik een ‘Until Loop’ in. Deze ‘loop’ start bij 1 en stopt (als het goed is) bij de laatste page van de betreffende API. Binnen deze ‘Until Loop’ maakt hij wederom een verbinding met de API en verwerkt de response naar tabellen in een SQL database. Maar als je dus een foutje maakt in de instellingen van deze activiteit, waardoor hij het maximaal aantal pages nooit bereikt, dan blijft de activity dus ‘loopen’…
Ik was blij met de uitgewerkte oplossing en ik had meerdere keren een ‘debug’ run gedaan en vervolgens de pipline runs weer ‘gecancelled’. Het zag er allemaal veelbelovend uit… totdat ik de dag erna allemaal berichten kreeg dat mijn ‘spending limit’ was bereikt. Dat kon nooit! Ik had maar een paar runs gedaan en ik had voor 100 euro per maand beschikbaar. Heel gek! Ik moest weten wat het was, maar ik kon niets meer met mijn resources en moest eerst de limiet van mijn subscription halen. Dat heb ik gedaan en dát heeft gezorgd voor een paar dagen toenemende ellende in mijn Azure Cost Management overzicht. De €-teller bleef maar doorlopen (helaas niet zoals in het casino ten bate, maar deze keer dus ten laste van mij). Ik kon geen processen ontdekken in mijn Data Factory die hiervoor verantwoordelijk konden zijn. Paniek!
“Ik moest iemand van Microsoft spreken, en snel!”
Betalen voor Azure resources die niet draaien?
Ik had dus een Data Factory met een oplossing waar ik blij mee was, waar ik wat meer dan één avondje op had zitten zweten en die ik niet maar zo wilde weg gooien. Maar in mijn Azure Cost Management zag ik uur na uur de teller verder oplopen…meer dan €140 per dag ging erdoor…aan niets! Ik moest iemand van Microsoft spreken, en snel!
Microsoft Azure Support team
Ze hebben geen 0900-nummer waar je even heen belt, 10 minuten in de wacht staat en iemand je gaat helpen. Wel kun je een Support Request indienen binnen je subscription, dus dat deed ik zo snel mogelijk. Ik gaf aan dat ik op ‘enigszins onverklaarbare wijze’ mijn billing uit de hand zag lopen en dat er geen resources actief waren. Het hele verhaal hierboven paste niet het veld ‘Problem description’ maar ik moest toch wat.
Een uur of twee later werd ik gebeld door een vriendelijke Indiase dame van Microsoft support. Ik legde mijn hele verhaal uit aan Adeola en ze kwam tot de conclusie dat zij me niet verder kon helpen; ik moest zijn bij een support engineer van het Data Factory team. Adeola verwees me door naar Claudia-Maria, wederom een aardige dame maar dan nu uit Roemenië. Ze belde me de volgende dag en na wat koetjes en kalfjes (genoeg te bespreken, want Europa was net in de ban van lockdowns vanwege het Corona-virus) kwamen we ter zake. Ik kreeg mijn probleem redelijk snel uitgelegd en zij was in staat om in de back-end te zien dat ik wat moois had gemaakt in Azure Data Factory. Ook zag ze dat er vier ‘activities’ op status ‘running’ stonden.
De helpende hand van Microsoft
Deze processen liepen al enkele dagen, ik dacht meteen; dát zijn ze. Ik was erg blij dat mijn probleem zo snel (h)erkend werd, maar ze kon ze niet stoppen. Helaas (of misschien wel ‘gelukkig’) zijn ze vanuit Microsoft Support niet in staat om zelf zaken in de subscription van de klant te regelen. Via Microsoft Teams deelde ik mijn scherm en ze gaf aan dat ik in staat moest zijn om via PowerShell (via de Cloud Shell in de Azure Portal) aan de hand van wat ID’s de activities te stoppen. Dat had ik vaker gedaan dacht ik, maar wat we ook deden; we kregen de activities niet gestopt. Wat blijkt: je kunt met PowerShell alleen pipelines stoppen, niet de onderliggende activities.
De pipeline wás al gestopt, dat had ik tijdens het debuggen al gedaan. Maar de onderliggende activiteit (de ‘Until Loop’) was nog steeds aan het draaien, keer na keer na keer, tot de foutief ingestelde maximale ‘page’ werd bereikt. Die kwam dus niet. Claudia-Marie en ik zaten nu dus samen met de gebakken peren. Wat we ook probeerden, de €-teller in Cost Management bleef oplopen. Als het zo door zou gaan zou ik aan het eind van de maand een rekening van meer dan € 4.000,- krijgen. Dat gaat de creditcard maatschappij niet leuk vinden…en mijn vrouw ook niet. Ik vertrouwde erop dat ik het geld wel terug zou krijgen; als iemand van Microsoft het niet voor elkaar krijgt om de processen te stoppen, dan zou dat niet terecht zijn vond ik.
Derde lijns support
Toen ook Claudia-Marie het met mij niet voor elkaar kreeg om de processen te stoppen, moest ze dit voorleggen bij het ‘production team’ van Azure Data Factory. Ik dacht, oef, dat is de derdelijns support al…maar het voelde niet ‘van het kastje naar de muur’, meer naar een ander ‘kastje’, ééntje met meer lades ofzo. Anyway, niet veel later kreeg ik een mailtje dat de processen door de technisch engineers waren gestopt en dat ze met me wilde spreken over het vervolg. We hadden dezelfde dag nog een Teams-gesprek en bespraken dat het onderliggende probleem tweeledig is.
Ten eerste heeft een Until-loop niet voor niets een time-out (die standaard op 7 dagen staat). Dat wil dus zeggen dat de processen na 7 dagen alsnog automatisch waren gestopt met een time-out. Ik besefte al snel; het was beter geweest om die op 8 uur te zetten:
Ten tweede heb je als je aan het ‘debuggen’ bent in Azure Data Factory, twee mogelijkheden om te stoppen: ‘Cancel’ en ‘Cancel Recursive’. Nooit nagedacht over de consequenties klik altijd maar ‘even snel’ op ‘Cancel’. Even iets langer nadenken dus over de geboden opties.
Ten derde zou je altijd in staat moeten zijn om een proces of activiteit die nog loopt, ook al heb je die geannuleerd, te kunnen zien en te kunnen annuleren. Daar heb ik dus geen invloed op en ik was blij te horen dat ze dit bij Microsoft op hun backlog zetten om te verbeteren. Natuurlijk ook omdat ze een klein beetje toegaven dat het niet helemáál mijn eigen schuld was.
Geld terug…of niet?
Gelukkig heb ik niet hoeven dreigen om mijn geld terug te krijgen. Sterker nog; ik kreeg mijn hele € 100,- van de vorige maand terug op mijn Azure tegoed. Claudia-Marie gaf wel aan dat het nog een hele klus was om dit uitgelegd te krijgen aan het ‘Billing team’. Ja, vertel mij wat, ik heb er ook meer dan 1.500 woorden voor nodig gehad. Gelukkig was dit alles opgelost nét voordat de transacties werden geïnd, waardoor ik niet bij mijn vrouw op het matje heb hoeven komen.