Après auer lançat MeteoTrail —eth nòste produit de previsions a nivèu de punt de contròtle entà eveniments esportius a l'aire liure— era màger part dera nòsta atencion se n'anè entara precision deth modèl: vent, precipitacion e temperatura en un punt concrèt d'ua montanha, a ua ora concreta. Çò que non vau compréner deth tot dinc a Val d'Aran by UTMB ei quant pes organizatiu pòt acabar cargant un logiciau un còp es directors de corsa l'an dauant entà préner decisions d'anar o non anar. Aquera experiéncia cambièc com pensi sus quinsevolha causa que bastim que tòque decisions de seguretat, quitament de manèra indirècta.
Enes mesi que vengueren, un problèma mès petit e aparentament sense relacion tornaue apareisher ua e auta viatge. Es alertes meteorologiques oficiaus deth govèrn —deth tipe "avís irange per vent entà aguesta region a compdar de deman a les 06:00"— son publiques e vertadèraments utiles, mès arrés non auie bastit arren entà qu'es consomíssem de manèra programatica. Cada produit ath quau importaue auie d'anar a cercar-les per compde sòn. Aguest article parle deth petit servici intèrn que bastírem entà qu'açò deishèsse de passar.
1. Dades publiques, mau pensadas entà se consomir
Euròpa ja resolvec, mès o mens, eth problèma deth descobriment entàs alertes meteorologiques. Meteoalarm amassa es alertes oficiaus de totes es agéncias meteorologicas nacionaus deth continent e les republique coma un flux Atom, un per país. Açò ei vertadèraments util: non as de saber a quina des trenta e escai agéncias consultar. Mès eth pròpri flux ei un resumit: titol, un còdi de region aproximatiu, un color de severitat, un ligam entà fòra.
Eth contengut reau d'ua alèrta —quin fenomèn, quini lindars, quina finestra temporau, en quina zòna precisa— viu en un payload CAP (Common Alerting Protocol), publicat pera agéncia de cada país en sòn pròpri dialècte der estandard. Entà Espanha, açò ei AEMET. "Estandard", en mon des alertes, encara deishe fòrça marge entà particularitats pròprias de cada agéncia en còdis de zòna, vocabularis de severitat e estructura XML.
Consomir açò corrèctament vò díder dues peticions, dus formats, e reconciliar toti dus en quauquarren sus eth quau un produit pòsque ramificar logica. Ei plan de hè'c ua sola viatge. Non ei plan de demanar a cada equip intèrn que ac hèsque per compde sòn.
2. Qué bastim exactament
Bastírem eth Spain Meteo Alerts Aggregator: un petit servici FastAPI damb un solet trabalh —obtier, filtrar, normalizar e cachejar—. Non ensaje de curbir tota Espanha. Fonccione sus ua lista fixa de regions rellevantas entàs nòsti produits de torisme a l'aire liure e de montanha: Lhèida, Aran (Val d'Aran), e diuèrses zònes costanères de Mallorca —sud, tramontana, interior, levant e nòrd-nòrd-èst—.
Eth pipeline per peticion ei simple:
- Obtier eth flux Atom de Meteoalarm Espanha.
- Filtrar es entradas dinc as regions dera lista.
- Entà cada alèrta que coincidisque, obtier eth payload CAP d'AEMET damb eth detalh reau.
- Normalizar tot —era forma deth flux de Meteoalarm e era forma deth CAP d'AEMET— en un unic esquèma JSON estable.
- Amassar eth resultat per region, e dempús per severitat (roja, irange, gruèga, desconeishuda).
- Trèir dera responsa quinsevolha region que ara madeish non age cap alèrta activa, entà qu'aqueth que la consomisque non age de filtrar bronit uet per compde sòn.
Ua forma illustrativa e simplificada de çò que torne GET /alerts:
{
"generated_at": "2024-10-18T07:15:00Z",
"regions": {
"aran": {
"red": [],
"orange": [
{
"id": "aemet-es-es610-20241018-0001",
"phenomenon": "wind",
"onset": "2024-10-19T06:00:00Z",
"expires": "2024-10-19T18:00:00Z",
"headline": "Orange wind warning"
}
],
"yellow": [],
"unknown": []
},
"mallorca-tramontana": {
"red": [],
"orange": [],
"yellow": [
{ "id": "aemet-es-illesbalears-20241018-0007", "phenomenon": "rain" }
],
"unknown": []
}
},
"errors": []
}
Arren d'exotic. Eth valor non ei en cap pas concrèt, ei en auer hèt era reconciliacion ua sola viatge, en un solet lòc, en lòc de sies viatges repartidas en sies produits.
3. Falhar barrat, e falhar parciaument
Dues decisions de disseny aciu venguèren dirèctament de leçons que non volia auer de tornar a aprénguer.
Prumèra: era autentificacion. /alerts, /areas e /areas/{country} exigissen totes ua capçalèra X-API-Key. /health e / demoren obèrtes, pr'amor qu'es monitors d'uptime an besonh d'un lòc a on trucar sense credenciaus. Çò que m'importe ei qué se passe quan eth servici non a cap clau d'API configurada —un desplegament mau configurat, un secret que manque, çò que sigue—. Regète tota peticion protegida damb 401. Non cad en accès obèrt. Un servici sense claus configuradas ei un servici que s'a oblidat de configurar claus, non un servici que pretend d'èster public.
Dusau, e mès sotil: GET /alerts distinguís dus mòdes de falhada fòrça diferents. Se er obtencion deth flux de Meteoalarm falhe complètament, o eth servici non pòt bastir un resumit deth quau se fisarie, torne 503 —"non è arren fisable a te díder, non actues sus aguesta responsa"—. Mès se eth flux vad plan e era màger part des regions se resòlven corrèctament mentre que, digam, ua consulta ath CAP d'AEMET hè timeout, torne 200 damb es regions que sí se resolvèren e un array errors non uet que descriu qué non se resolvec —"açò ei çò que sabi, e açò ei çò que non, tu decidisses qué hèr damb eth uet"—. Es produits que consomeishen açò pòden reagir de manèra fòrça diferenta ad aguesti dus cas.
4. Perqué açò non ei MeteoTrail
Aguest servici jamès n'aurà ua pagina d'entrada. Non i a interfàcia, non i a inscripcion publica, non i a tèxte de marketing: sonque un backend FastAPI intèrn ath quau un punhat des nòsti pròpris produits truque damb ua clau. Justament per açò eth disseny de falhada barrada e falhada parciau importe mès aciu de çò que poirie importar en quauquarren de cara ath public.
Quan un produit public se trinque, un usatgèr ve un error e recarregue. Quan se trinque ua pèça d'infrastructura intèrna dera quau auti servicis depenen en silenci —o piri, se degrade en silenci e torne quauquarren que semble corrècte mès non ac ei— cada produit bastit dessús hereta aguesta falhada sense ac saber. Aquerò ei un listèu fòrça mens indulgent que "a bona cara era pagina de previsions?". Ei tanben, cresi, eth listèu corrècte entà quinsevolha causa que sigue en silenci dejós de decisions que tòquen era seguretat de quauquarrés, quitament a ua distància.
Non bastírem açò pr'amor que siguesse dificil o interessant. Ac bastírem pr'amor que, après Val d'Aran by UTMB, preferisqui passar ua tarde dissenhant per endauant entath cas de falhada abans que saber-ac mès tard, per un produit que ne depen, que non l'auíem hèt.