Dette dokument dækker følgende komponenter på NSP:
NSP XDS Registry
Type: Webservice
Filnavn: nxrg.war
Url: <serverurl>/nxrg
Servicecheckurl: <serverurl>/nxrg/status
Versionurl: <serverurl>/nxrg/health returnerer en json struktur med denne
Migreringskomponenten, der migrerer opentext data til SQL scripts til indlæsning i nxrg databasen.
Grundlæggende konfiguration foregår ved redigering i filen nxrg.properties, der placeres i følgende WildFly modul:
/pack/wildfly/modules/sds/nxrg/configuration/main/
Moduldefinitionen er at finde i sourcekoden til nxrg under:
/compose/configuration/module.xml
I filen skal følgende properties være definerede:
Property | Beskrivelse |
---|---|
datasource.jndi.name | JNDI navnet på den datasource der giver adgang til NXRG databasen. |
liquibase.changelog.file | Angiver den changelog fil som liquibase skal anvende. Property er ikke krævet. Hvis der skal afvikles integrationstest mod det miljø der installeres skal denne sættes til liquibase-changelog-test.xml. Denne kan også sættes via en environmentvariabel i formen liquibase_changelog_file. |
nxrg.allowed.mimetype | Tilladt MimeType på DocumentEntries i requests til ITI-42, ITI-57 og ITI-61. |
iti18.request.validation.enabled | Angiver om der skal foretages openehealth-validering af requestet. Default: true. |
iti18.response.validation.enabled | Angiver om der skal foretages openehealth-validering af responset. Default: true. |
iti42.request.validation.enabled | Angiver om der skal foretages openehealth-validering af requestet. Default: true. |
iti42.response.validation.enabled | Angiver om der skal foretages openehealth-validering af responset. Default: true. |
iti57.request.validation.enabled | Angiver om der skal foretages openehealth-validering af requestet. Default: true. |
iti57.response.validation.enabled | Angiver om der skal foretages openehealth-validering af responset. Default: true. |
iti61.request.validation.enabled | Angiver om der skal foretages openehealth-validering af requestet. Default: true. |
iti61.response.validation.enabled | Angiver om der skal foretages openehealth-validering af responset. Default: true. |
Log4j konfiguration findes i samme wildfly modul som servicekonfigurationen
Se yderligere opsætning i installationsvejledningen.
NXRG udstiller en overvågningsside, som findes i listen af komponenter i afsnit 2.
NXRG-overvågningssiden returnerer enten:
Det overvåges om der kan opnås forbindelse til databasen.
TODO
TODO
NXRG laver audit log ved hvert kald af de udbudte ITI-services. I det følgende gennemgåes formaterne for hver service.
Alle logninger ender i en dedikeret logfil audit.log.
Loglinjen er formatteret som json og alle logninger har følgende indgange:
*Komponent: NXRG/<operation>, hvor <operation> er navnet på det ITI kald som laves. F.eks. ITI-57.
For hver skrives følgende informationer
Komponent | Kontekst*1 | Felt | Type | Indhold |
---|---|---|---|---|
NXRG/ITI-42 | submissionset uniqueId | CitizenId | SensitivePersonalInformation | PatientId |
SubmissionSetInformation | RegularPersonalInformation | Identifikation (uniqueId) af det submissionset, der indeholder informationen i iti-42 kaldet. | ||
DoucmentEntryInformation | RegularPersonalInformation | En liste af entryUUid'er og uniqueId'er, der oprettes. Hvis en documentEntry i kaldet giver anledning til replace på en anden documentEntry, så angives dette uuid i egenskaben replacesEntryUuid. | ||
Status | NonPersonalInformation | Status på kaldet. F.eks. OK, ERROR og WARNING | ||
Errors | RegularPersonalInformation | Hvis kaldet resulterer i fejl, angives disse her | ||
NXRG/ITI-61 | Se for ITI42 - indhold er ens | |||
NXRG/ITI-57 | updatedObjectUuid | writeUpdateOperationName | NonPersonalInformation | Typen af opdatering |
updatedObjectUuid | RegularPersonalInformation | UUID der er opdateret. | ||
Status | NonPersonalInformation | Status på kaldet. F.eks. OK, ERROR og WARNING | ||
Errors | RegularPersonalInformation | Hvis kaldet resulterer i fejl, angives disse her | ||
NXRG/ITI-18 | tilfældigt uuid | queryType | NonPersonalInformation | Identifikation typen af query. |
returnType | NonPersonalInformation | Definerer, hvilken type af objekter, der returneres fra servicen | ||
numberOfResults | NonPersonalInformation | Antallet af documententries i svaret | ||
DoucmentEntryInformation | RegularPersonalInformation | En liste af entryUUid'er og uniqueId'er, der er hentet. | ||
Status | NonPersonalInformation | Status på kaldet. F.eks. OK, ERROR og WARNING | ||
Errors | RegularPersonalInformation | Hvis kaldet resulterer i fejl, angives disse her |
*1) Er nøglen null tildeles et tilfældigt uuid
Succesfuldt kald til service iti-42 giver anledning til en logningslinje på følgende format:
{ "time": "2021-12-01T05:41:34.053Z", "category": "dk.sds.nsp.audit.log.nxrg/iti-42", "audit": { "timestamp": "2021-12-01T06:41:33.552+01:00", "components": [ { "component": "NXRG/ITI-42", "contexts": [ { "context": "5829933881450595335.691505562960183089.1638337293227", "information": [ { "key": "CitizenId", "type": "SPI", "value": "0101" }, { "key": "SubmissionSetInformation", "type": "RPI", "value": "{\"uniqueId\":\"5829933881450595335.691505562960183089.1638337293227\"}" }, { "key": "DoucmentEntryInformation", "type": "RPI", "value": "{\"entryUUid\":\"urn:uuid:ef04ddc0-b086-436f-a7db-37d4bbef8af6\", \"uniqueId\":\"4654430528298460003.324281175136550912.1638337293167\", \"replacesEntryUuid\":null}" }, { "key": "Status", "type": "NPI", "value": "OK" } ] } ] } ] }, "access": { "code": 200, "duration": 360, "httpHeaders": { "Content-Type": "application/soap+xml; charset=UTF-8" }, "httpHost": "localhost", "method": "POST", "path": "/nxrg/iti42", "query": "", "port": 8060, "protocol": "http", "reqSize": 8528, "resSize": 919, "soapHeaders": { "w3Action": "urn:ihe:iti:2007:RegisterDocumentSet-b", "w3MessageID": "urn:uuid:5d2b8ccb-3a7f-4b0b-becc-4330999c1021", "w3To": "http://localhost:8060/nxrg/iti42" }, "threadId": "default task-1", "time": "2021-12-01T06:41:33.544+01:00", "stats": { "handlerDuration": 121, "RequestContentDuration": 19, "ResponseContentDuration": 0, "SecurityProtocolRequestDuration": 5, "SecurityProtocolResponseDuration": 0, "bufferAllocated": true, "usedBuffers": 2, "activeBuffersInPool": 2, "idleBuffersInPool": 0 } } } |
Succesfuldt kald til service iti-61 giver anledning til en logningslinje på følgende format:
{ "time": "2021-12-01T05:44:20.01Z", "category": "dk.sds.nsp.audit.log.nxrg/iti-61", "audit": { "timestamp": "2021-12-01T06:44:19.821+01:00", "components": [ { "component": "NXRG/ITI-61", "contexts": [ { "context": "6943690717325663174.4847763071154435223.1638337459544", "information": [ { "key": "CitizenId", "type": "SPI", "value": "0101" }, { "key": "SubmissionSetInformation", "type": "RPI", "value": "{\"uniqueId\":\"6943690717325663174.4847763071154435223.1638337459544\"}" }, { "key": "DoucmentEntryInformation", "type": "RPI", "value": "{\"entryUUid\":\"urn:uuid:92ee0d66-a9e0-4931-a90d-d5d708fa80c5\", \"uniqueId\":\"6284022344789100604.4104933276600124364.1638337459491\", \"replacesEntryUuid\":null}" }, { "key": "Status", "type": "NPI", "value": "OK" } ] } ] } ] }, "access": { "code": 200, "duration": 165, "httpHeaders": { "Content-Type": "application/soap+xml; charset=UTF-8" }, "httpHost": "localhost", "method": "POST", "path": "/nxrg/iti61", "query": "", "port": 8060, "protocol": "http", "reqSize": 8211, "resSize": 922, "soapHeaders": { "w3Action": "urn:ihe:iti:2010:RegisterOnDemandDocumentEntry", "w3MessageID": "urn:uuid:af796d78-361d-457e-89ba-df01bca340d0", "w3To": "http://localhost:8060/nxrg/iti61" }, "threadId": "default task-1", "time": "2021-12-01T06:44:19.82+01:00", "stats": { "handlerDuration": 18, "RequestContentDuration": 1, "ResponseContentDuration": 0, "SecurityProtocolRequestDuration": 0, "SecurityProtocolResponseDuration": 0, "bufferAllocated": false, "usedBuffers": 2, "activeBuffersInPool": 2, "idleBuffersInPool": 0 } } } |
Succesfuldt kald til service iti-57 for at slette markere et dokument, giver anledning til en logningslinje på følgende format:
{ "time": "2021-12-01T05:46:05.636Z", "category": "dk.sds.nsp.audit.log.nxrg/iti-57", "audit": { "timestamp": "2021-12-01T06:46:05.406+01:00", "components": [ { "component": "NXRG/ITI-57", "contexts": [ { "context": "urn:uuid:d324c3e0-68b4-4c3e-8988-bff2325f2edb", "information": [ { "key": "CitizenId", "type": "SPI", "value": "0102" }, { "key": "updatedObjectUuid", "type": "RPI", "value": "urn:uuid:d324c3e0-68b4-4c3e-8988-bff2325f2edb" }, { "key": "writeUpdateOperationName", "type": "NPI", "value": "UpdateDocumentEntryAvailabilityStatus" }, { "key": "Status", "type": "NPI", "value": "OK" } ] } ] } ] }, "access": { "code": 200, "duration": 205, "httpHeaders": { "Content-Type": "application/soap+xml; charset=UTF-8" }, "httpHost": "localhost", "method": "POST", "path": "/nxrg/iti57", "query": "", "port": 8060, "protocol": "http", "reqSize": 3524, "resSize": 915, "soapHeaders": { "w3Action": "urn:ihe:iti:2010:UpdateDocumentSet", "w3MessageID": "urn:uuid:8cd0fb3a-cc48-4706-8b6f-025d7dd891fd", "w3To": "http://localhost:8060/nxrg/iti57" }, "threadId": "default task-1", "time": "2021-12-01T06:46:05.405+01:00", "stats": { "handlerDuration": 4, "RequestContentDuration": 0, "ResponseContentDuration": 0, "SecurityProtocolRequestDuration": 0, "SecurityProtocolResponseDuration": 0, "bufferAllocated": false, "usedBuffers": 1, "activeBuffersInPool": 1, "idleBuffersInPool": 1 } } } |
Succesfuldt kald til service iti-18 giver anledning til en logningslinje på følgende format:
{ "time": "2021-12-01T05:48:42.821Z", "category": "dk.sds.nsp.audit.log.nxrg/iti-18", "audit": { "timestamp": "2021-12-01T06:48:42.772+01:00", "components": [ { "component": "NXRG/ITI-18", "contexts": [ { "context": "urn:uuid:36358982-bfa1-4ad9-ba86-9b5ea33196c2", "information": [ { "key": "CitizenId", "type": "SPI", "value": "22222222" }, { "key": "queryType", "type": "NPI", "value": "urn:uuid:14d4debf-8f97-4251-9a74-a90016b0af0d" }, { "key": "returnType", "type": "NPI", "value": "LeafClass" }, { "key": "numberOfResults", "type": "NPI", "value": "2" }, { "key": "DoucmentEntryInformation", "type": "RPI", "value": "{\"entryUUid\":\"urn:uuid:268cd839-11e2-4121-8fea-3f184e5f3efa\", \"uniqueId\":\"5766156196412876102.2822196146951899395.1638337675198\", \"replacesEntryUuid\":null}" }, { "key": "DoucmentEntryInformation", "type": "RPI", "value": "{\"entryUUid\":\"urn:uuid:ccff6d0e-c2bd-4b9d-81d6-874726e9bba4\", \"uniqueId\":\"7402593388400441251.2665840693284483189.1638337722275\", \"replacesEntryUuid\":null}" }, { "key": "Status", "type": "NPI", "value": "OK" } ] } ] } ] }, "access": { "code": 200, "duration": 31, "httpHeaders": { "Content-Type": "application/soap+xml; charset=UTF-8" }, "httpHost": "localhost", "method": "POST", "path": "/nxrg/iti18", "query": "", "port": 8060, "protocol": "http", "reqSize": 2123, "resSize": 11289, "soapHeaders": { "w3Action": "urn:ihe:iti:2007:RegistryStoredQuery", "w3MessageID": "urn:uuid:accc136e-1ca4-4a04-bfe1-4caef4e31328", "w3To": "http://localhost:8060/nxrg/iti18" }, "threadId": "default task-1", "time": "2021-12-01T06:48:42.772+01:00", "stats": { "handlerDuration": 13, "RequestContentDuration": 0, "ResponseContentDuration": 0, "SecurityProtocolRequestDuration": 0, "SecurityProtocolResponseDuration": 0, "bufferAllocated": false, "usedBuffers": 1, "activeBuffersInPool": 1, "idleBuffersInPool": 1 } } } |
Følgende er et eksempel på et ITI-42 kald med, fejl. Konkret mangler CPR numret i kaldet.
{ "time": "2021-12-01T05:50:00.92Z", "category": "dk.sds.nsp.audit.log.nxrg/iti-42", "audit": { "timestamp": "2021-12-01T06:50:00.894+01:00", "components": [ { "component": "NXRG/ITI-42", "contexts": [ { "context": "5912107379890312866.8220644980724288715.1638337800700", "information": [ { "key": "CitizenId", "type": "SPI", "value": "" }, { "key": "SubmissionSetInformation", "type": "RPI", "value": "{\"uniqueId\":\"5912107379890312866.8220644980724288715.1638337800700\"}" }, { "key": "DoucmentEntryInformation", "type": "RPI", "value": "{\"entryUUid\":\"urn:uuid:5ea9015e-75f7-4cc5-85ff-079b56f36499\", \"uniqueId\":\"6660232118599018558.1142303413219772882.1638337800625\", \"replacesEntryUuid\":null}" }, { "key": "Status", "type": "NPI", "value": "ERROR" }, { "key": "Errors", "type": "RPI", "value": "{\"errorCode\":\"XDSRegistryMetadataError\", \"errorMessage\":null, \"codeContext\":\"External identifier value is missing: urn:uuid:6b5aea1a-874d-4603-a4bc-96a0a7b3844 (patientId)\", \"location\":null, \"severity\":\"urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Error\"}" } ] } ] } ] }, "access": { "code": 200, "duration": 17, "httpHeaders": { "Content-Type": "application/soap+xml; charset=UTF-8" }, "httpHost": "localhost", "method": "POST", "path": "/nxrg/iti42", "query": "", "port": 8060, "protocol": "http", "reqSize": 8518, "resSize": 1221, "soapHeaders": { "w3Action": "urn:ihe:iti:2007:RegisterDocumentSet-b", "w3MessageID": "urn:uuid:215c930a-73c0-4a6f-84fe-0c24e3725ba7", "w3To": "http://localhost:8060/nxrg/iti42" }, "threadId": "default task-1", "time": "2021-12-01T06:50:00.894+01:00", "stats": { "handlerDuration": 4, "RequestContentDuration": 0, "ResponseContentDuration": 0, "SecurityProtocolRequestDuration": 0, "SecurityProtocolResponseDuration": 0, "bufferAllocated": false, "usedBuffers": 2, "activeBuffersInPool": 2, "idleBuffersInPool": 0 } } } |
Migreringstoolet læser opentext data fra en Mariadb og producerer opdateringsscripts til indlæsning i NXRG databasen.
Migreringstoolet leveres som et Docker image og containeren kan startes som følger
docker run --env migrationpath=/migrationoutput/ --volume /mymachine/output/run1:/migrationoutput registry.nspop.dk/components/nxrg-migration:snapshot |
Migreringstoolet output'er SQL scripts. Outputsti til scripts kan sættes med en env variabel som vist ovenfor og volume mount til hostmaskinen som vist ovenfor.
Andre env, der kan sættes:
ENV | Beskrivelse | Eksempel | Bemærkninger |
---|---|---|---|
opentext_data_url | URL til databasen med opentext data | jdbc:mysql://localhost:3307/opentext | |
opentext_data_user | Bruger til opentext databasen | opentext | |
opentext_data_pass | Password for bruger | opentext | |
migrationfilesize | Antal inserts statements per migreringsfil | 100000 | Migrering filen prefixes med løbenummer per fil: Eksempel: 11_submissionset_20211020_150541_002.sql |
migration_batchsize | Antal records fra Open Text databasen der læses ad gangen *1 | 1000 | |
migration_no_of_batches | Antal batches der skal håndteres i een kørsel, default er 0 som betyder alle batches *1 | 1000 | Migrering filen prefixes med tidsstempel per kørsel: Eksempel: 11_submissionset_20211020_150541_002.sql Alle filer i samme kørsel vil have samme tidsstempel. Tidstemplet kan ses i log data. |
1) Antal records der hermed håndteres er således migration_batchsize x migration_no_of_batches
Som beskrevet i NXRG - Design- og arkitekturbeskrivelse kan der efter en migrering foretages hhv
Disse to processer er implementeret som en del af NXRG og kan afvikles med følgende kommando
docker run --env filepath=/migrationvalidation/ --volume /mymachine/migrationvalidation/run1:/migrationvalidation registry.nspop.dk/components/nxrg-migration-verification:snapshot validation docker run --env filepath=/migrationverification/ --volume /mymachine/migrationverification/run1:/migrationverification registry.nspop.dk/components/nxrg-migration-verification:snapshot verification |
validation - lave sql'er mod NXRG database:
verification - laver ITI-18 kald mod NXRG og Open Text registry:
Sti'er kan sættes med en env variabel som vist ovenfor og volume mount til hostmaskinen som vist ovenfor.
Env, der kan sættes i forbindelse med validering:
ENV | Beskrivelse | Eksempel |
---|---|---|
nxrg_data_url | URL til databasen med NXRG data | jdbc:mysql://localhost:3307/nxrg |
nxrg_data_user | Bruger til NXRG databasen | nxrg |
nxrg_data_pass | Password for bruger | nxrg |
Env, der kan sættes i forbindelse med verifikation:
ENV | Beskrivelse | Eksempel |
---|---|---|
nxrg_iti18_url | url til NXRG iti-18 snitflade | https://nxrg.nspnxrg.medcom.dk/nxrg/iti18 |
opentext_iti18_url | url til OpenText iti-18 snitflade | https://test1-cnsp.ekstern-test.nspop.dk:8443/registry/services/xds-iti18 |
Som beskrevet i NXRG - Design- og arkitekturbeskrivelse kan der inden idriftsættelse køres en række "anvender integrationstest", som er replay af en række "gamle" open text request. Efter kørsel kan response sammenlignes med det svar som i sin tid blev givet af open text.
Disse er implementeret som en del af NXRG og kan afvikles med følgende kommando
docker run --network=host --env filepath=/replay/ --env replay_file=/replay/logs --volume /mymachine/migrationvalidation/run1:/replay registry.nspop.dk/components/nxrg-migration-verification:snapshot replay |
replay - laver en række kald mod NXRG og vurderer resultatet i forhold til tidligere resultat. Desuden laver den en output fil, som indeholder information om forventet og faktisk rasultat, som man kan bruge til at vurdere forskellene ud fra.
Env, der kan sættes i forbindelse med replay:
ENV | Beskrivelse | Eksempel |
---|---|---|
nxrg_iti18_url | url til NXRG iti-18 snitflade | http://localhost:8060/nxrg/iti18 |
nxrg_iti57_url | url til NXRG iti-57 snitflade | http://localhost:8060/nxrg/iti57 |
nxrg_iti42_url | url til NXRG iti-42 snitflade | http://localhost:8060/nxrg/iti42 |
nxrg_iti61_url | url til NXRG iti-61 snitflade | http://localhost:8060/nxrg/iti61 |
Output i result.csv:
Kolonne | Beskrivelse | Note |
---|---|---|
Id | Request og response id fra filen | |
Operation | Hvilken type kald det, eks iti57 | |
Resultat | Gik det overordnet godt eller ej | Der er en række kombinationer af svar fra kaldende, som vurderes at være ok. F.eks. når NXRG ikke kan finde et specifik dokument i forbindelse med en replace. Dette er implementeret i klassen StatusCodeCombination, hvor kombinationer kan læses for nu. |
Note | Lidt information omkring en vurdering af Resultat | |
KaldStatusEns | Er ForventetKaldStatus og FaktiskKaldStatus ens? | |
FejlkodeAntalEns | Er ForventetFejlkodeAntal og FaktiskFejlkodeAntal ens? FejlKodeAntal er de antal fejl, som er blevet returnernet. | ForventetFejlkodeAntal og FaktiskFejlkodeAntal bør være 0 eller 1 for hver linie, ellers kan FejlkodeListeEns, samt kolonnerne med ForventetFejl* og FaktiskFejl* være ikke fyldesgørende. |
FejlkodeListeEns | Er FejlkodeListeForventet og FejlkodeListeFaktisk ens? (sammenlignet en til en hvis flere) | |
ForventetFejlkode1 ForventetFejlContext1 ForventetFejlLocation1 ForventetFejlSeverity1 | Fejl 1 i det oprindelige svar, hvis nogen | |
FaktiskFejlkode1 FaktiskFejlContext1 FaktiskFejlLocation1 FaktiskFejlSeverity1 | Fejl 1 i det faktisk NXRG svar, hvis nogen | |
HsuidheaderMed | Er hsuidheaderen med i kaldet? | Blev på et tidspunkt brugt til at vurdere om eventuelle forskelle skyldtes denne |
Filen kan med fordel åbnes i et regneark, og funktioner som autofilter og pivot tabeller anvendes til vurdering af dens indhold.
Ved vurdering af resultat:
For at reparere på forkerte data er der lavet et reperationstool.
docker run --network=host --env cpr_file=/input/cprinput.txt --env nxrg_data_url=jdbc:mysql://localhost:3307/nxrg --env nxrg_data_user=nxrg --env nxrg_data_pass=nxrg --volume /mymachine/cprinput.txt:/input/cprinput.txt registry.nspop.dk/components/nxrg-migration-verification:snapshot repair |
Env, der skal sættes i forbindelse med kørsel:
ENV | Beskrivelse | Eksempel |
---|---|---|
nxrg_data_url | URL til databasen med NXRG data | jdbc:mysql://localhost:3307/nxrg |
nxrg_data_user | Bruger til NXRG databasen | nxrg |
nxrg_data_pass | Password for bruger | nxrg |
cpr_file | Inputfil med cprnumre, der skal fixes | /input/cprinput.txt |
Cleanup job sletter DocumentEntries og tilhørende objekter fra NXRG databasen som er ældre end en specificeret dato.
Cleanup jobbet har følgende properties der kan sættes:
Property | Beskrivelse | Default hvis ikke sat |
---|---|---|
delete.after.days | Hvor gamle dokumenter i Registry skal være, før de slettes | 2 år |
delete.type.code | Type Code på de dokumenter der slettes (Her er aftale = "39289-4") | 39289-4 |
delete.output.dir | Directory hvor output filer placeret | /cleanup-output |
Servicen udstiller to HTTP endpoints:
som kan interageres med eks. med curl
curl http://localhost:8060/nxrg/cleanup/status |
Cleanup job logger på standardout vha. log4j. Jobbet vil ved kørsel udskrive følgende INFO statements ud:
Konfigurationsparametre:
Søgning:
Sletning
Efter kørsel af jobbet vil der blive placeret filer i det konfigurerede output bibliotek svarende til dokumenter der skal slettes i XDS repository. Der genereres een fil pr Repository der skal slettes dokumenter i.
Navngivningen på filen/filerne vil være:
Hvor "ddMMyyyyHHmm" svarer til det tidspunkt, hvor jobbet blev startet, og repositoryId er OID på det repository der skal slettes dokumenter i.