Beschrijving
In de interactie met de FHR REST API kunnen zich, naast de fouten die zich voordoen aan de serverzijde, er zich ook fouten voordoen bij de verwerking van de resources door de cliënt van de FHIR REST API. Het is van belang deze fouten te melden, omdat anders de infrastructuur ervan uit kan gaan dat het clientsysteem de informatie correct verwerkt heeft, of correct kan verwerken. De foutafhandeling door de client bestaat uit het aanmaken van een AuditEvent, hiermee maakt de applicatie duidelijk aan de andere applicaties en de beheerder van het domein dat er iets niet goed is gegaan. Het type AuditEvent maakt duidelijk wat er exact aan de hand is. Een applicatie kan een FHIR resource om verschillende redenen niet verwerken. Dit onderscheid is belangrijk, omdat sommige fouten verwacht kunnen zijn en geen aandacht van een beheerder vereisen, terwijl andere type fouten onverwacht zijn en aandacht vereisen.
Overwegingen
Grijze gebieden in het FHIR profiel
Bij het vaststellen van het FHIR profiel is er een ultieme inspanning gedaan deze enkel en eenduidig te houden. Echter, bij een klein aantal velden is er een onmogelijkheid voorgekomen; in een bepaalde situatie bleek een veld totaal niet van toepassing, terwijl het in een andere situatie juist verplicht bleek. De leveranciers hebben hierover gestemd en besloten dat de koppeltaal infrastructuur er vanuit moet gaan dat het veld in deze situatie niet verplicht is, en applicaties, ook degene die het veld vereisen, hiermee om moeten gaan.
...
In de Koppeltaal specificatie moet om bovengenoemde het scenarios als realistisch beschouwd worden. De implicatie hiervan is dat de specificatie vastgesteld wat het verwachte gedrag van de applicaties in dergelijk scenario.
Onverwerkbare informatie
Naast het grijze gebied in het FHIR profiel doet zich nog een ander probleem voor. Het FHIR profiel legt vast welke velden kunnen worden verwacht, en wat de inhoud van de velden is. Dit voorkomt niet dat in de verwerking van de velden zich er een probleem voordoet. Het kan zo zijn dat een veld illegale inhoud kent, bijvoorbeeld een illegaal e-mail adres, postcode of telefoonnummer. De validatieregels van de applicatie kunnen nu eenmaal strenger zijn dan Koppeltaal en het FHIR profiel deze stelt. Verder zijn er mogelijk restricties op het datamodel die van toepassing kunnen zijn. Kortom, er zijn legio aan redenen dat een applicatie een resource niet goed kan verwerken.
Verwacht vs. onverwacht, herstelbaar vs onherstelbaar (repareerbaar)
In de foutafhandeling is een onderscheid te maken tussen een aantal belangrijke facetten. Een van die facetten is of een fout in de kern verwacht of onverwacht is. Een verwachte fout doet zich voor als men redelijkerwijs kan voorspellen dat een fout zich voordoet. Als bekend is dat een applicatie een veld verplicht heeft, maar het domein het niet verplicht stelt, kan men een fout van de applicatie die het verplicht stelt verwachten. Indien er zich een interne systeemfout voordoet bij de verwerking van een resource door de applicatie, kan men deze fout niet verwachten. Dit onderscheid is belangrijk, omdat onverwachte systeemfouten aandacht vereisen van systeembeheer, en verachte fouten niet.
Een ander facet van foutafhandeling is of de fout herstelbaar is of niet. Een verwerkingsfout die voortkomt uit tijdelijke problemen in de infrastructuur kunnen hersteld worden door de resource op een ander moment opnieuw proberen te verwerken. Een fout die voortkomt uit een validatiefout of ontbrekend veld kan niet hersteld worden door het opnieuw aanbieden van dezelfde resource. Daarnaast kan kan de resource herstelbaar zijn door bewerking, bijvoorbeeld door het ontbrekende veld toe te voegen of een veld te corrigeren.
Informeren
Het doel van de foutafhandeling aan de kant van de cliënt van de FHIR resource service is informeren. De cliënt moet in staat zijn de andere applicaties in het domein ervan op de hoogte te stellen dat de applicatie de resource niet goed verwerkt heeft. Wat de applicatie hiermee doet bepaald koppeltaal niet. Mogelijk kan een EPD inzichtelijk maken dat een resource door een van de applicaties in het domein niet goed verwerkt is.
Toepassing, restricties en eisen
Het AuditEvent
Voor terugkoppeling van een foutstatus moet de applicatie een AuditEvent object aanmaken. Voor de correcte verwerking maken we gebruik van het `geen nieuws is goed nieuws` principe. Dit omdat de FHIR resource service reeds AuditEvents vastlegt, ook van de interacties met de cliënt. Indien er een situatie zich voordoet waarbij de verwerking niet juist verloopt moet de applicatie een audit event aanmaken.
Type fouten
In koppeltaal gaan we ervan uit dat er drie type fouten zich kunnen voordoen aan de zijde van de client. Deze zijn:
...
Tijdelijke fout | Gegevensverwerkingsfout | Terminale fout | |
onverwacht/verwacht | onverwacht | verwacht | onverwacht |
herstelbaar | ja | nee | nee |
Wanneer een AuditEvent aan te maken
Het doel van het AuditEvent is de rest van het domein te laten weten dat de applicatie niet in staat is het FHIR object te verwerken op een dergelijke manier dat in het domein verwacht wordt. Dit houdt in dat een applicatie FHIR objecten kan negeren zolang duidelijk is dat de applicatie er niets mee doet. In de toekomst wordt overwogen op basis van FHIR profielen per domein of applicatie aan te geven welke entiteiten en velden binnen de entiteiten verplicht of verwacht zijn. Vooralsnog volstaat met een AuditEvent aan te geven dat de verwerking niet gelukt is. Het AuditEvent is een manier om als applicatie aan de andere applicaties in het domein aan te geven dat de verwerking niet goed gegaan is.
Scenario's
De applicatie mist een veld dat optioneel is. Dit is een verwachte fout die voorkomt uit de discrepantie van wat de applicatie verwacht en in het domein verplicht is. Dit is een gegevensverwerkingsfout.
...
De applicatie kan een subsysteem niet benaderen. De applicatie kan de entiteit niet verwerken omdat bijvoorbeeld de database niet benaderbaar is. In dit geval kan een tijdelijke fout verzonden worden.
De mapping van het AuditEvent
Het AuditEvent wordt volgens de tabel beneden gemapped. In de mapping doen we een aantal aannames die we uitteenzetten.
extension.request-id | De waarde van de betrokken X-Request-Id veld. |
extension.correlation-id | De waarde van de betrokken X-Correlation-Id veld. |
extension.trace-id | De waarde van de betrokken X-Trace-Id veld. |
type | Data error "system":"http://terminology.hl7.org/CodeSystem/iso-21089-lifecycle" "code":"verify" "display":"Verify Record Lifecycle Event" Temp failure & Terminal error "system":"http://terminology.hl7.org/CodeSystem/iso-21089-lifecycle" "code":"transmit" "display":"Transmit Record Lifecycle Event" |
subtype | "system":"http://hl7.org/fhir/restful-interaction" "code":"read" "display":"read" |
action | E |
recorded | now() |
outcome | Temp failure 4 of 12 Data error 4 Terminal error 8 |
agent.who | client_id van de applicatie |
agent.type | Application |
agent.requestor | client_id van de applicatie |
entity.what | "reference":"<ResourceType>/id" |
<ResourceType>".identifier als de resourcetype een identifier gebruikt | |
entity.query | Optioneel de betrokken query |
source.site | Domain |
source.observer | Koppeltaal |
De tracing headers
De tracing headers dienen worden overgenomen uit het originele read request wat betrokken is bij de fout. Verder heeft het POST request van het AuditEvent zelf ook nog de tracing headers. Deze moeten als volgt gevuld worden:
- X-Request-Id, een nieuwe waarde
- X-Correlation-Id, de waarde van de originele X-Request-Id
- X-Trace-Id, de waarde van de originele X-Trace-Id, indien aanwezig.
Het fouttype
De verschillende type fouten worden gemapped door middel van twee velden. De type en outcome. De data error wordt als een validate type weergegeven. Dit omdat hij verwacht is. De andere twee type fouten vallen onder transmit, omdat het uiteindelijk gaat om het uitwisselen van gegevens. Het onderscheid tussen een terminale error wordt door de outcome weergegeven. Een 4 geeft aan “kleine fout”, 8 “serieuze fout” en 12 “fatale fout”. Een terminale error is een 8 “serieuze fout”, een gegevensverwerkingsfout valt onder een 4 “kleine fout”. Een tijdelijke fout is in principe type 4 “kleine fout”, maar het systeem kan ook besluiten dat het niet in staat is gegevens verder te verwerken en een 12 “fatale fout” te sturen om aan te geven helemaal geen gegevens meer te kunnen verwerken.
| Tijdelijke fout | Gegevensverwerkingsfout | Terminale fout |
AuditEvent.type | transmit | verify | transmit |
AuditEvent.outcome | 4 of 12 | 4 | 8 |
De action
De action wordt gemapped op E van Execute, omdat het een verwerking van gegevens betreft.
Entity en query
De overige velden wijken niet af van wat verwacht wordt. De entity heeft betrekking op de entity die onverwerkbaar is, indien er in een resultaat (bundle) meerdere enities voorkomen die niet verwerkt kan worden,, moet voor elke entity een AuditEvent worden aangemaakt. Indien er sprake is van een query moet deze in het query veld gevuld worden.
Eisen
- Een client van de FHIR resource service MOET een AutitEvent aanmaken indien deze niet in staat is de gegevens van de FHIR resource service als door het domein wordt verwacht te verwerken. Het AutitEvent is een manier om het domein te laten weten dat de applicatie het FHIR object niet in goede order verwerkt heeft.
- Het applicatie moet de waarden van de X-Request-Id, X-Correlation-Id en X-Trace-Id uit het originele request in het AuditEvent meesturen, de X-Trace-Id enkel indien van toepassing.
- De POST request headers moet een nieuw X-Request-Id bevatten, de waarde van het originele X-Request-Id als X-Correlation-Id meegeven, en enkel een X-Trace-Id indien van toepassing.
- De mapping uit tabel x (TODO link) is van toepassing op de inhoud van het AuditEvent object.