Komponenter

Dette dokument dækker følgende komponenter på NSP:

Migreringskomponenten, der migrerer opentext data til SQL scripts til indlæsning i nxrg databasen.

Konfiguration

Servicekonfiguration

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.fileAngiver 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.mimetypeTilladt MimeType på DocumentEntries i requests til ITI-42, ITI-57 og ITI-61.
iti18.request.validation.enabledAngiver om der skal foretages openehealth-validering af requestet.
iti18.response.validation.enabledAngiver om der skal foretages openehealth-validering af responset.
iti42.request.validation.enabledAngiver om der skal foretages openehealth-validering af requestet.
iti42.response.validation.enabledAngiver om der skal foretages openehealth-validering af responset.
iti57.request.validation.enabledAngiver om der skal foretages openehealth-validering af requestet.
iti57.response.validation.enabledAngiver om der skal foretages openehealth-validering af responset.
iti61.request.validation.enabledAngiver om der skal foretages openehealth-validering af requestet.
iti61.response.validation.enabledAngiver om der skal foretages openehealth-validering af responset.

iti18.request.max.documents.leafclass

Angiver, hvor mange dokumenter en iti 18 søgning må hente. Overskrides antal gives en warning og status er partial success.
iti18.request.max.documents.objectrefAngiver, hvor mange dokumentreferencer en iti 18 søgning må hente. Overskrides antal gives en warning og status er partial success.

log4j konfiguration

Log4j konfiguration findes i samme wildfly modul som servicekonfigurationen

Se yderligere opsætning i installationsvejledningen.

Overvågning

NXRG udstiller en overvågningsside, som findes i listen af komponenter i afsnit 2.

5.1. Fortolkning af HTML overvågningsside

NXRG-overvågningssiden returnerer enten:

5.2. Overvågningstyper

Det overvåges om der kan opnås forbindelse til databasen.

Eksempler på status-sider

200 OK

TODO

203 Non-authoritative Information

TODO

Audit log

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

TypeIndhold
NXRG/ITI-42submissionset uniqueIdCitizenIdSensitivePersonalInformationPatientId


SubmissionSetInformationRegularPersonalInformationIdentifikation (uniqueId) af det submissionset, der indeholder informationen i iti-42 kaldet.


DoucmentEntryInformationRegularPersonalInformationEn 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.


StatusNonPersonalInformationStatus på kaldet. F.eks. OK, ERROR og WARNING


ErrorsRegularPersonalInformationHvis kaldet resulterer i fejl, angives disse her





NXRG/ITI-61Se for ITI42 - indhold er ens





NXRG/ITI-57updatedObjectUuidwriteUpdateOperationNameNonPersonalInformationTypen af opdatering


updatedObjectUuidRegularPersonalInformationUUID der er opdateret.


StatusNonPersonalInformationStatus på kaldet. F.eks. OK, ERROR og WARNING


ErrorsRegularPersonalInformationHvis kaldet resulterer i fejl, angives disse her





NXRG/ITI-18tilfældigt uuidqueryTypeNonPersonalInformationIdentifikation typen af query.


returnTypeNonPersonalInformationDefinerer, hvilken type af objekter, der returneres fra servicen


numberOfResultsNonPersonalInformationAntallet af documententries i svaret


DoucmentEntryInformationRegularPersonalInformationEn liste af entryUUid'er og uniqueId'er, der er hentet. 


StatusNonPersonalInformationStatus på kaldet. F.eks. OK, ERROR og WARNING


ErrorsRegularPersonalInformationHvis kaldet resulterer i fejl, angives disse her

*1) Er nøglen null tildeles et tilfældigt uuid

Logning for ITI-42

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
    }
  }
}

Logning for ITI-61

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
    }
  }
}

Logning for ITI-57 - slette markering

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
    }
  }
}

Logning for ITI-18

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
    }
  }
}

Logning når fejl

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
    }
  }
}



Migreringstool

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:

ENVBeskrivelseEksempelBemærkninger
opentext_data_urlURL til databasen med opentext datajdbc:mysql://localhost:3307/opentext
opentext_data_userBruger til opentext databasenopentext
opentext_data_passPassword for brugeropentext
migrationfilesizeAntal inserts statements per migreringsfil100000Migrering filen prefixes med løbenummer per fil: Eksempel: 11_submissionset_20211020_150541_002.sql
migration_batchsizeAntal records fra Open Text databasen der læses ad gangen *11000
migration_no_of_batchesAntal batches der skal håndteres i een kørsel, default er 0 som betyder alle batches *11000

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

Migreringsverifikationstool

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:

ENVBeskrivelseEksempel
nxrg_data_urlURL til databasen med NXRG datajdbc:mysql://localhost:3307/nxrg
nxrg_data_userBruger til NXRG databasennxrg
nxrg_data_passPassword for brugernxrg




Env, der kan sættes i forbindelse med verifikation:

ENVBeskrivelseEksempel
nxrg_iti18_urlurl til NXRG iti-18 snitfladehttps://nxrg.nspnxrg.medcom.dk/nxrg/iti18
opentext_iti18_urlurl til OpenText iti-18 snitfladehttps://test1-cnsp.ekstern-test.nspop.dk:8443/registry/services/xds-iti18






Replaytool

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:

ENVBeskrivelseEksempel
nxrg_iti18_urlurl til NXRG iti-18 snitfladehttp://localhost:8060/nxrg/iti18
nxrg_iti57_urlurl til NXRG iti-57 snitfladehttp://localhost:8060/nxrg/iti57
nxrg_iti42_urlurl til NXRG iti-42 snitfladehttp://localhost:8060/nxrg/iti42
nxrg_iti61_urlurl til NXRG iti-61 snitfladehttp://localhost:8060/nxrg/iti61


Output i result.csv:

KolonneBeskrivelseNote
IdRequest og response id fra filen
OperationHvilken type kald det, eks iti57
ResultatGik 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.

NoteLidt information omkring en vurdering af Resultat
KaldStatusEnsEr 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.
FejlkodeListeEnsEr 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
HsuidheaderMedEr 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:

Datareperationstool

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:

ENVBeskrivelseEksempel
nxrg_data_urlURL til databasen med NXRG datajdbc:mysql://localhost:3307/nxrg
nxrg_data_userBruger til NXRG databasennxrg
nxrg_data_passPassword for brugernxrg
cpr_fileInputfil med cprnumre, der skal fixes/input/cprinput.txt