Driftsvejledningen indeholder information der er relevant for driften af Det Fælles Stamkort 1.5-servicen (FSK), herunder oplysninger om standard placering af log- og konfigurationsfiler, eksterne afhængigheder, start/stop/genstart og fejlfinding.
I produktion består Det Fælles Stamkort servicen af én komponent fsk-service (war-arkiv), der er deployet på en Wildfly applikationsserver.
Servicen har følgende afhængigheder:
Version | Dato | Ændring | Ansvarlig |
---|---|---|---|
2.0.0 | 2018-08-27 | Initialt dokument | Trifork |
2.0.8 | 2019-07-31 | Tilføjet information om ny overgågningsside | Trifork |
Servicen udstiller data som beskrevet i anvenderguiden. Komponenten kaldes alene af Dokumentdelingsservicen (DDS). Servicen udstiller derudover en række administrative og konfigurationsrelaterede funktionaliteter.
URL | Funktionalitet |
---|---|
<server>/fsk/actuator/info | Status-side. Se afsnittet versionsinformation. |
<server>/fsk/actuator/health | Status-side. Viser om servicen fungerer korrekt, se afsnittet Overvågning. |
Servicen kræver ingen daglig vedligeholdelse udover sædvanlig systemovervågning.
Alt data for en borger fjernes 1 år efter borgerens død ved hjælp af et integreret job kaldet SyncJob. Dette job fjerner både data fra servicens primære database samt fra DDS registry.
Servicen udstiller en statusside med versionsinformation. Der returneres en body med JSON-data.
Property'en "build" indeholder oplysninger om versionen og hvornår den blev bygget.
Property'en "time" indeholder oplysninger om det aktuelle tidspunkt og tidspunktet for hvornår servicen blev deployed.
Eksempel:
{ "build": { "version": "2.0.8", "artifact": "fsk-service", "name": "fsk-service", "group": "dk.sundhedsdatastyrelsen.stamkort", "time": "2019-07-30T07:30:22.496Z" }, "time": { "currentTime": "2019-07-30T13:16:18.761Z", "deployed": "2019-07-30T13:16:10.382Z" } } |
De følgende afsnit beskriver emner i servicen der kræver opmærksomhed ift. driften.
Servicen udstiller en Health-statusside (også typisk kendt som isAlive), der viser om applikationen er sund, eller om noget kræver indgriben. Health-statussiden returnerer en body med JSON-data, der beskriver sundhedsstatus for forskellig funktionalitet i applikationen.
Health-statussiden er opbygget vha. Spring Boot Actuator, som er konfigureret med nogle specialfremstillede HealthIndicators.
Actuator beregner en overordnet status for applikationens tilstand, som baseres på den HealthIndicator, der returnerer den mest fatale status. Denne overordnede status vises i JSON-property'en "$.status". Se eksempler længere nede.
Der er udover standard Actuator statusser defineret en specielfremstillet status (NEEDS_ATTENTION). Den følgende tabel viser alle statusser i rækkefølge fra sund til fatal. Tabellen viser også den HTTP statuskode, som Health-statussiden vil returnere til en given overordnet status:
Status | HTTP statuskode | Beskrivelse |
---|---|---|
UP | 200 OK | Ingen fejl. |
UNKNOWN | 200 OK | Ingen status tilgængelig. Typisk fordi applikationen netop er blevet deployed. |
NEEDS_ATTENTION | 202 Accepted | En fejl kræver måske indgriben, men applikationen fungerer fortsat med nedsat funktion. |
OUT_OF_SERVICE | 500 Internal Server Error | Applikationen/funktionen er deaktiveret. Denne status anvendes pt. ikke. |
DOWN | 500 Internal Server Error | Applikationen/funktionen er nede og kræver øjeblikkelig indgriben. |
Nogle HealthIndicators anvender ikke nødvendigvis alle statusser men kun udvalgte. Følgende tabel viser, hvad de enkelte HealthIndicators tjekker, og hvornår de returnerer en specifik status.
Bemærk, at det kun er "db"-HealthIndicator'en der kan returnere statussen "DOWN" og dermed udløse HTTP statuskoden "500 Internal Server Error".
Navn (på property i JSON-response) | Beskrivelse |
---|---|
$.details.certificateExpiry | Tjekker om konfigurede certifikater er tæt på udløb. Der tjekkes alle certifikater i de to keystores der er angivet i property'erne application.properties:"client.keystore.filesystem.path" og i minlogclient.properties:"sts.keystore". Derudover vises detaljer om udløbsdato for alle certifikater (dvs. hvis en keystore indeholder flere certifikater, så vises detaljer for alle). UP: OK |
$.details.organDonorClient, $.details.livingWillClient, $.details.treatmentWillClient, $.details.personalDataCardRegisterClient, $.details.scesClient | Tjekker om det seneste kald med den pågældende integration var succesfuldt. Hvis det ikke var succesfuldt, så viser "error" en toString() på den exception der opstod. Der vises eventuelt "timeOfLastExecution", som angiver det seneste tidspunkt, hvor et kald blev forsøgt (uanset om det var successfuldt eller ikke-successfuldt). UP: OK |
$.details.syncJob | Tjekker om den seneste afvikling af jobbet var successfuld. Hvis den ikke var succesfuld, så viser "error" en toString() på den exception der opstod. Der vises eventuelt "timeOfLastExecution", som angiver det seneste tidspunkt, hvor jobbet blev forsøgt afviklet. UP: OK |
$.details.db | Er baseret på Actuor's indbyggede DataSourceHealthIndicator og tjekker, at der kan udføres en "SELECT 1" query på alle applikationens datasources. Query'en udføres i det øjeblik Health-statussiden forespørges. Der vises detaljer om status for de enkelte datasources. UP: OK |
HTTP statuskode: 200 OK
{ "status": "UP", "details": { "certificateExpiry": { "status": "UP", "details": { "certificates": [ { "file": "test1/FMK-KRS-TEST.jks", "alias": "sosi:alias_system", "validFrom": "2017-04-04T13:39:50Z", "validUntil": "2020-04-04T13:39:27Z" }, { "file": "test1/FMK-KRS-TEST.jks", "alias": "sosi:alias_system", "validFrom": "2017-04-04T13:39:50Z", "validUntil": "2020-04-04T13:39:27Z" } ] } }, "organDonorClient": { "status": "UP", "details": { "timeOfLastExecution": "2019-07-30T17:31:13.245Z" } }, "livingWillClient": { "status": "UP", "details": { "timeOfLastExecution": "2019-07-30T17:31:13.246Z" } }, "treatmentWillClient": { "status": "UP", "details": { "timeOfLastExecution": "2019-07-30T17:31:13.245Z" } }, "personalDataCardRegisterClient": { "status": "UP", "details": { "timeOfLastExecution": "2019-07-30T17:31:13.246Z" } }, "scesClient": { "status": "UP", "details": { "timeOfLastExecution": "2019-07-30T17:31:13.566Z" } }, "syncJob": { "status": "UP", "details": { "timeOfLastExecution": "2019-07-30T18:00:05.321Z" } }, "db": { "status": "UP", "details": { "primaryDataSource": { "status": "UP", "details": { "database": "MySQL", "hello": 1 } }, "stamdataDataSource": { "status": "UP", "details": { "database": "MySQL", "hello": 1 } } } } } } |
HTTP statuskode: 202 Accepted
{ "status": "NEEDS_ATTENTION", "details": { "certificateExpiry": { "status": "UP", "details": { "certificates": [ { "file": "test1/FMK-KRS-TEST.jks", "alias": "sosi:alias_system", "validFrom": "2017-04-04T13:39:50Z", "validUntil": "2020-04-04T13:39:27Z" }, { "file": "test1/FMK-KRS-TEST.jks", "alias": "sosi:alias_system", "validFrom": "2017-04-04T13:39:50Z", "validUntil": "2020-04-04T13:39:27Z" } ] } }, "organDonorClient": { "status": "UP", "details": { "timeOfLastExecution": "2019-07-30T17:31:13.245Z" } }, "livingWillClient": { "status": "NEEDS_ATTENTION", "details": { "error": "java.io.IOException: HTTP POST failed (404): Not Found", "timeOfLastExecution": "2019-07-30T17:31:13.246Z" } }, "treatmentWillClient": { "status": "UP", "details": { "timeOfLastExecution": "2019-07-30T17:31:13.245Z" } }, "personalDataCardRegisterClient": { "status": "UP", "details": { "timeOfLastExecution": "2019-07-30T17:31:13.246Z" } }, "scesClient": { "status": "UP", "details": { "timeOfLastExecution": "2019-07-30T17:31:13.566Z" } }, "syncJob": { "status": "UP", "details": { "timeOfLastExecution": "2019-07-30T18:00:05.321Z" } }, "db": { "status": "UP", "details": { "primaryDataSource": { "status": "UP", "details": { "database": "MySQL", "hello": 1 } }, "stamdataDataSource": { "status": "UP", "details": { "database": "MySQL", "hello": 1 } } } } } } |
Servicens logfiler bør tjekkes for ERROR-logninger.
En service eller et job kan genstartes ved at kalde touch på den tilsvarende war-fil. I yderste konsekvens kan Wildfly genstartes.
Jobbet sørger for oprettelse/nedlæggelse af metadata i DDS registry i takt med ændringer i CPR-registeret (fødsler/dødsfald). Ifm. midlertidige fejl fra DDS, vil jobbet standse og forsøge igen senere (afhængigt af CRON-udtrykket i "jobs.ddssync.schedule" i application.properties). Det er dog også tænkeligt at DDS returnerer en logisk fejl, hvor det ikke giver mening at forsøge igen senere. Derfor er FSK udstyret med en property "jobs.ddssync.max.errors", hvor det er muligt at angive hvor mange fejl jobbet accepterer før det standser. Normalt bør værdien være '0', hvilket betyder at man ikke accepterer fejl, og at jobbet derfor vil forsøge igen med den samme besked. For at tillade jobbet at ignorere den ene fejl, kan værdien sættes til '1', og så bør der kigges nærmere på hvad der gemmer sig bag fejlen, så der kan ske manuelt data-opret.
Følgende logning kan ses hvis SyncJob støder på et midlertidigt problem, og derfor opgiver videre behandling før CRON-udtrykket tillader det:
2018-08-27 15:14:18.627 [main] WARN dk.stamkort.integrations.dds.SyncJob [] - CPR -> DDS synchronization job stopped due to temporary error. Sync will pause and retry later dk.stamkort.dao.exceptions.DDSTemporaryException: at dk.stamkort.integrations.dds.SyncJob.createDDRegistryEntry(SyncJob.java:245) ~[classes/:?] at dk.stamkort.integrations.dds.SyncJob.runSyncPersonIds(SyncJob.java:144) [classes/:?] at dk.stamkort.integrations.dds.SyncJobTest.runSynchronizationJob(SyncJobTest.java:329) [test-classes/:?] at dk.stamkort.integrations.dds.SyncJobTest.testJobErrorHandlingForTemporaryError(SyncJobTest.java:282) [test-classes/:?] at ... |
Nedenstånde logning ses hvis antallet af logiske fejl overskrides, så jobbet opgiver videre behandling:
2018-08-27 15:14:14.495 [main] WARN dk.stamkort.integrations.dds.SyncJob [] - DDS logical error for documentId=urn:sds:fsk:stamkort:3ed5c350-f71d-4337-9d20-1d7d3911f461 dk.stamkort.dao.exceptions.DDSPermanentException: at dk.stamkort.integrations.dds.SyncJob.createDDRegistryEntry(SyncJob.java:245) ~[classes/:?] at dk.stamkort.integrations.dds.SyncJob.runSyncPersonIds(SyncJob.java:144) [classes/:?] at dk.stamkort.integrations.dds.SyncJobTest.runSynchronizationJob(SyncJobTest.java:329) [test-classes/:?] at dk.stamkort.integrations.dds.SyncJobTest.testJobErrorHandlingForPermanentError(SyncJobTest.java:304) [test-classes/:?] at ... 2018-08-27 15:14:14.496 [main] ERROR dk.stamkort.integrations.dds.SyncJob [] - Max number of errors (2) exceeded for SyncJob (max allowed is 1) |
Alle logfiler er at finde i ”log” under Wildfly. Herunder findes en liste over logfiler, med en beskrivelse af hvilke komponenter der skriver til dem. Log konfigurationen for servicen er konfigureret i modules/dk/sundhedsdatastyrelsen/fsk/main/resources/log4j2.xml som der også er vist et eksempel på i Installationsvejledning (FSK) .
Alle logs benytter en rolling file appender, og indeholder derfor et postfix i filnavnet, der ikke er præsenteret i nedenstående.
Logfilnavn | Indhold |
---|---|
fsk_service.log | Applikationslog fra FSKservicen, som indeholder de vigtigste systemhændelser (INFO), fejl (ERROR) og advarsler (WARN). |
fsk_audit.log | Auditlog fra FSK-servicen, som indeholder logning af, hvem der har kaldt, hvilken service der blev kaldt, hvordan der blev kaldt, hvornår der blev kaldt samt kaldets varighed. Bemærk, Da FSK-servicen kun udstiller én webservice, som er on-demand servicen til kald fra DDS, vil mange oplysninger være éns fra kald til kald. |
Der bør foretages backup af data på en forsvarlig måde, i tilfælde af behov for en genetablering af data. Disse skal opbevares på en forsvarlig måde, jfr. regler om personhenførbare data.