Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Navitabs
rootNSP XDS Registry/SDS Patientindex (NXRG) - Leverancebeskrivelse


Table of Contents

Komponenter

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
  • Notifikationsjob url: <serverurl>/nxrg/nas-notification-job
  • Notifikationsjob status url: <serverurl>/nxrg/nas-notification-job-status

For felt migrerings servicen, se "NXRG - driftvejledning til felt migrering"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:

...

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.

...

NXRG-overvågningssiden returnerer enten:

  • HTTP 200, hvis servicen i øjeblikket kører fint.
  • HTTP 203, hvis der er opstået en fejl der kræver indgriben.

...

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

...

handled.type.codesAngiver en liste af, hvilke type codes NXRG håndterer. Er listen tom (property findes, men ingen værdi efter =) accepteres alle type codes. Eksempel på liste: 39289-4,39290-2,53576-5,52460-3,81215-6
iti57.cpr.validation.enabledAngiver, om der ved ITI-57 kald (opdateringskald) skal laves validering på at patientid matcher det tidligere patientid

 
Properties relateret til NAS integration: 
nxrg.httpclient.pooling.totalconnectionsTotale antal HttpClients forbindelser der kan åbnes
nxrg.httpclient.pooling.maxconnections.pr.routeAntal HttpClients forbindelser der kan åbnes pr. rute
nas.notification.job.max.durationDen tilladte varighed af jobbet. Angives som duration i ISO-8601 formattet; dog bør kun sekunder angives. Default er PT15S
nas.notification.job.batch.sizeAntallet af adviseringer der sendes til NAS af gangen per SOAP request. Default er 10000.
nas.notification.job.nas.bundle.sizeAntallet af adviseringer der hentes fra tabellen af gangen. Default er 50.
nas.sts.endpointEndpointet, hvor NAS-integrationen skal trække et idkort på baggrund af sts.keystore
nas.sts.keystoreKeystore der indeholder funktionscertifikatet
nas.sts.keystore.passwordPassword til at åbne keystore
nas.endpointEndpointet hvor NAS skal kaldes
nas.idcard.subject.nameSubject name på idkortet
nas.idcard.subject.idSubject Id på idkortet
nas.idcard.system.nameSystemnavn på idkortet


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:

  • HTTP 200, hvis servicen i øjeblikket kører fint.
  • HTTP 203, hvis der er opstået en fejl der kræver indgriben.

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:

Code Block
collapsetrue
{
  "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

...

*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:

Code Block
collapsetrue
{
  "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",
        "contexts": [
       "type": "RPI",
  {
              "valuecontext": "{\"uniqueId\":\"5829933881450595335.691505562960183089.1638337293227\"}",
              },"information": [
              {
                "key": "DoucmentEntryInformationCitizenId",
                "type": "RPISPI",
                "value": "{\"entryUUid\":\"urn:uuid:ef04ddc0-b086-436f-a7db-37d4bbef8af6\", \"uniqueId\":\"4654430528298460003.324281175136550912.1638337293167\", \"replacesEntryUuid\":null}"0101"
              },
              {
                "key": "StatusSubmissionSetInformation",
                "type": "NPIRPI",
                "value": "OK{\"uniqueId\":\"5829933881450595335.691505562960183089.1638337293227\"}"
              },
              ]{
          }
      "key": "DoucmentEntryInformation",
 ]
      }
     ]
  },
  "accesstype": {
    "codeRPI": 200,
    "duration": 360,
    "httpHeaders": {
      "Content-Typevalue": "application/soap+xml; charset=UTF-8"
    },
    "httpHost": "localhost",
    "method": "POST",
    "path": "/nxrg/iti42",
    "query": """{\"entryUUid\":\"urn:uuid:ef04ddc0-b086-436f-a7db-37d4bbef8af6\", \"uniqueId\":\"4654430528298460003.324281175136550912.1638337293167\", \"replacesEntryUuid\":null}"
              },
    "port": 8060,
    "protocol": "http",
    "reqSize": 8528, {
    "resSize": 919,
    "soapHeaders": {
      "w3Actionkey": "urn:ihe:iti:2007:RegisterDocumentSet-bStatus",
        "w3MessageID": "urn:uuid:5d2b8ccb-3a7f-4b0b-becc-4330999c1021",
        "w3Totype": "http://localhost:8060/nxrg/iti42"
NPI",
     },
     "threadId": "default task-1",
    "timevalue": "2021-12-01T06:41:33.544+01:00",OK"
    "stats": {
         "handlerDuration": 121,
 }
       "RequestContentDuration": 19,
    ]
  "ResponseContentDuration": 0,
      "SecurityProtocolRequestDuration": 5, }
      "SecurityProtocolResponseDuration": 0,  ]
      "bufferAllocated": true,
   }
    ]
  },
  "access": {
    "usedBufferscode": 2200,
    "duration": 360,
    "activeBuffersInPoolhttpHeaders": 2,{
      "idleBuffersInPoolContent-Type": 0"application/soap+xml; charset=UTF-8"
    },
  }
}

Logning for ITI-61

Succesfuldt kald til service iti-61 giver anledning til en logningslinje på følgende format:

Code Block
collapsetrue
{
  "time": "2021-12-01T05:44:20.01Z",
  "category": "dk.sds.nsp.audit.log.nxrg/iti-61",
  "audit": {  "httpHost": "localhost",
    "method": "POST",
    "path": "/nxrg/iti42",
    "timestampquery": "2021-12-01T06:44:19.821+01:00",
    "componentsport": [
      {8060,
        "componentprotocol": "NXRG/ITI-61http",
        "contextsreqSize": [8528,
    "resSize": 919,
    "soapHeaders": {
      "w3Action": "urn:ihe:iti:2007:RegisterDocumentSet-b",
      "contextw3MessageID": "6943690717325663174.4847763071154435223.1638337459544urn:uuid:5d2b8ccb-3a7f-4b0b-becc-4330999c1021",
            "informationw3To": ["http://localhost:8060/nxrg/iti42"
              {
  },
              "key"threadId": "CitizenIddefault task-1",
       "time": "2021-12-01T06:41:33.544+01:00",
         "typestats": "SPI",{
         "handlerDuration": 121,
       "valueRequestContentDuration": "0101"19,
      "ResponseContentDuration": 0,
      "SecurityProtocolRequestDuration": }5,
      "SecurityProtocolResponseDuration": 0,
       {"bufferAllocated": true,
         "usedBuffers": 2,
       "keyactiveBuffersInPool": "SubmissionSetInformation"2,
      "idleBuffersInPool": 0
    }
  }
}

Logning for ITI-61

Succesfuldt kald til service iti-61 giver anledning til en logningslinje på følgende format:

Code Block
collapsetrue
{
  "time": "2021-12-01T05:44:20.01Z     "type": "RPI",
  "category": "dk.sds.nsp.audit.log.nxrg/iti-61",
  "audit": {
      "timestamp": "2021-12-01T06:44:19.821+01:00",
    "valuecomponents": "{\"uniqueId\":\[
      {
        "component": "NXRG/ITI-61",
        "contexts": [
          {
            "context": "6943690717325663174.4847763071154435223.1638337459544\"}",
              },"information": [
              {
                "key": "DoucmentEntryInformationCitizenId",
                "type": "RPISPI",
                "value": "{\"entryUUid\":\"urn:uuid:92ee0d66-a9e0-4931-a90d-d5d708fa80c5\", \"uniqueId\":\"6284022344789100604.4104933276600124364.1638337459491\", \"replacesEntryUuid\":null}"
0101"
                 },
              {
                "key": "StatusSubmissionSetInformation",
                "type": "NPIRPI",
                "value": "OK"{\"uniqueId\":\"6943690717325663174.4847763071154435223.1638337459544\"}"
              },
            ]  {
          }
      "key": "DoucmentEntryInformation",
  ]
      }
    ]
  },
  "accesstype": {
    "code": 200"RPI",
    "duration": 165,
    "httpHeaders": {
      "Content-Typevalue": "application/soap+xml; charset=UTF-8"
    },
    "httpHost": "localhost",
    "method": "POST",
    "path": "/nxrg/iti61",
    "query": """{\"entryUUid\":\"urn:uuid:92ee0d66-a9e0-4931-a90d-d5d708fa80c5\", \"uniqueId\":\"6284022344789100604.4104933276600124364.1638337459491\", \"replacesEntryUuid\":null}"
              },
    "port": 8060,
    "protocol": "http",
    "reqSize": 8211, {
    "resSize": 922,
    "soapHeaders": {
      "w3Actionkey": "urn:ihe:iti:2010:RegisterOnDemandDocumentEntryStatus",
         "w3MessageID       "type": "urn:uuid:af796d78-361d-457e-89ba-df01bca340d0NPI",
      "w3To          "value": "http://localhost:8060/nxrg/iti61OK"
    },
    "threadId": "default task-1",
    "time": "2021-12-01T06:44:19.82+01:00", }
    "stats": {
      "handlerDuration": 18,
 ]
         "RequestContentDuration": 1,
 }
       "ResponseContentDuration": 0, ]
      "SecurityProtocolRequestDuration": 0,
}
    ]
  },
  "SecurityProtocolResponseDurationaccess": 0,{
      "code"bufferAllocated": false200,
      "usedBuffersduration": 2165,
      "activeBuffersInPoolhttpHeaders": 2,{
      "idleBuffersInPoolContent-Type": 0 "application/soap+xml; charset=UTF-8"
    },
  }
}

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:

Code Block
collapsetrue
{
  "timehttpHost": "2021-12-01T05:46:05.636Zlocalhost",
    "categorymethod": "dk.sds.nsp.audit.log.nxrg/iti-57POST",
    "auditpath": {"/nxrg/iti61",
    "timestampquery": "2021-12-01T06:46:05.406+01:00",
    "componentsport": [8060,
      {
        "component"protocol": "NXRG/ITI-57http",
        "contextsreqSize": [8211,
    "resSize": 922,
    "soapHeaders": {
            "context"w3Action": "urn:ihe:uuid:d324c3e0-68b4-4c3e-8988-bff2325f2edbiti:2010:RegisterOnDemandDocumentEntry",
      "w3MessageID": "urn:uuid:af796d78-361d-457e-89ba-df01bca340d0",
      "informationw3To": ["http://localhost:8060/nxrg/iti61"
    },
    "threadId":      {"default task-1",
    "time": "2021-12-01T06:44:19.82+01:00",
    "stats": {
      "keyhandlerDuration": "CitizenId"18,
      "RequestContentDuration": 1,
         "typeResponseContentDuration": "SPI"0,
                "valueSecurityProtocolRequestDuration": "0102"0,
              }"SecurityProtocolResponseDuration": 0,
              {
        "bufferAllocated": false,
        "keyusedBuffers": "updatedObjectUuid"2,
                "type"activeBuffersInPool": "RPI"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:

Code Block
collapsetrue
{
     "valuetime": "urn:uuid:d324c3e0-68b4-4c3e-8988-bff2325f2edb"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": [
      {
                "keycomponent": "writeUpdateOperationNameNXRG/ITI-57",
        "contexts": [
       "type": "NPI",
  {
              "valuecontext": "UpdateDocumentEntryAvailabilityStatus"urn:uuid:d324c3e0-68b4-4c3e-8988-bff2325f2edb",
              },"information": [
              {
                "key": "StatusCitizenId",
                "type": "NPISPI",
                "value": "OK0102"
              },
            ]
  {
        }
        ]"key": "updatedObjectUuid",
      }
      ]
  },
  "accesstype": {
    "code": 200"RPI",
    "duration": 205,
    "httpHeaders": {
      "Content-Typevalue": "application/soap+xml; charset=UTF-8urn:uuid:d324c3e0-68b4-4c3e-8988-bff2325f2edb"
    },
    "httpHost": "localhost",
    "method": "POST" },
     "path": "/nxrg/iti57",
      "query": "",
   {
      "port": 8060,
    "protocol": "http",
    "reqSizekey": 3524"writeUpdateOperationName",
    "resSize": 915,
    "soapHeaders": {
      "w3Actiontype": "urn:ihe:iti:2010:UpdateDocumentSetNPI",
      "w3MessageID": "urn:uuid:8cd0fb3a-cc48-4706-8b6f-025d7dd891fd",
          "w3Tovalue": "http://localhost:8060/nxrg/iti57UpdateDocumentEntryAvailabilityStatus"
    },
    "threadId": "default task-1"      },
    "time": "2021-12-01T06:46:05.405+01:00",
    "stats": {
    {
  "handlerDuration": 4,
      "RequestContentDuration": 0,
      "ResponseContentDurationkey": 0"Status",
         "SecurityProtocolRequestDuration": 0,
      "SecurityProtocolResponseDurationtype": 0"NPI",
      "bufferAllocated": false,
          "usedBuffersvalue": 1,"OK"
      "activeBuffersInPool": 1,
        "idleBuffersInPool": 1}
            ]
          }
        ]
      }
}

Logning for ITI-18

Succesfuldt kald til service iti-18 giver anledning til en logningslinje på følgende format:

Code Block
collapsetrue
{    ]
  },
  "timeaccess": "2021-12-01T05:48:42.821Z",
{
    "categorycode": "dk.sds.nsp.audit.log.nxrg/iti-18",
  "audit200,
    "duration": 205,
    "httpHeaders": {
      "timestampContent-Type": "2021-12-01T06:48:42.772+01:00"application/soap+xml; charset=UTF-8"
    },
    "componentshttpHost": ["localhost",
      {"method": "POST",
        "componentpath": "NXRG/ITI-18/nxrg/iti57",
        "contextsquery": ["",
          {
 "port": 8060,
           "context"protocol": "urn:uuid:36358982-bfa1-4ad9-ba86-9b5ea33196c2http",
    "reqSize": 3524,
       "informationresSize": [915,
             "soapHeaders": {
      "w3Action": "urn:ihe:iti:2010:UpdateDocumentSet",
         "keyw3MessageID": "CitizenIdurn:uuid:8cd0fb3a-cc48-4706-8b6f-025d7dd891fd",
      "w3To": "http://localhost:8060/nxrg/iti57"
    },
     "typethreadId": "SPIdefault task-1",
    "time": "2021-12-01T06:46:05.405+01:00",
    "stats": {
      "valuehandlerDuration": "22222222"4,
      "RequestContentDuration": 0,
      "ResponseContentDuration": }0,
      "SecurityProtocolRequestDuration": 0,
       {"SecurityProtocolResponseDuration": 0,
        "bufferAllocated": false,
        "keyusedBuffers": "queryType"1,
                "typeactiveBuffersInPool": "NPI"1,
      "idleBuffersInPool": 1
    }
  }
}

Logning for ITI-18

Succesfuldt kald til service iti-18 giver anledning til en logningslinje på følgende format:

Code Block
collapsetrue
{
     "valuetime": "urn:uuid:14d4debf-8f97-4251-9a74-a90016b0af0d"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": [
      {
          "keycomponent": "returnTypeNXRG/ITI-18",
        "contexts": [
       "type": "NPI",
  {
              "valuecontext": "LeafClass"urn:uuid:36358982-bfa1-4ad9-ba86-9b5ea33196c2",
              },"information": [
              {
                "key": "numberOfResultsCitizenId",
                "type": "NPISPI",
                "value": "222222222"
              },
              {
                "key": "DoucmentEntryInformationqueryType",
                "type": "RPINPI",
                "value": "{\"entryUUid\":\"urn:uuid:268cd83914d4debf-11e28f97-41214251-8fea-3f184e5f3efa\", \"uniqueId\":\"5766156196412876102.2822196146951899395.1638337675198\", \"replacesEntryUuid\":null}"9a74-a90016b0af0d"
              },
              {
                "key": "DoucmentEntryInformationreturnType",
                "type": "RPINPI",
                "value": "{\"entryUUid\":\"urn:uuid:ccff6d0e-c2bd-4b9d-81d6-874726e9bba4\", \"uniqueId\":\"7402593388400441251.2665840693284483189.1638337722275\", \"replacesEntryUuid\":null}"
     LeafClass"
              },
              {
                "key": "StatusnumberOfResults",
                "type": "NPI",
                "value": "OK2"
              },
              ]{
           }
     "key": "DoucmentEntryInformation",
  ]
      }
    ]
  },
  "accesstype": {
    "codeRPI": 200,
    "duration": 31,
    "httpHeaders": {
      "Content-Typevalue": "application/soap+xml; charset=UTF-8"
    },
    "httpHost": "localhost",
    "method": "POST",{\"entryUUid\":\"urn:uuid:268cd839-11e2-4121-8fea-3f184e5f3efa\", \"uniqueId\":\"5766156196412876102.2822196146951899395.1638337675198\", \"replacesEntryUuid\":null}"
    "path": "/nxrg/iti18",
    "query": "",
    "port": 8060},
    "protocol": "http",
    "reqSize": 2123,
    "resSize": 11289,
{
         "soapHeaders": {
      "w3Actionkey": "urn:ihe:iti:2007:RegistryStoredQueryDoucmentEntryInformation",
      "w3MessageID": "urn:uuid:accc136e-1ca4-4a04-bfe1-4caef4e31328",
          "w3Totype": "http://localhost:8060/nxrg/iti18"RPI",
    },
      "threadId": "default task-1",
    "timevalue": "2021-12-01T06:48:42.772+01:00",
    "stats": {"{\"entryUUid\":\"urn:uuid:ccff6d0e-c2bd-4b9d-81d6-874726e9bba4\", \"uniqueId\":\"7402593388400441251.2665840693284483189.1638337722275\", \"replacesEntryUuid\":null}"
      "handlerDuration": 13,
      "RequestContentDuration": 0},
      "ResponseContentDuration": 0,
      "SecurityProtocolRequestDuration": 0, {
      "SecurityProtocolResponseDuration": 0,
          "bufferAllocatedkey": false"Status",
        "usedBuffers": 1,
        "activeBuffersInPooltype": 1"NPI",
      "idleBuffersInPool": 1
      }
  }
}

Logning når fejl

Følgende er et eksempel på et ITI-42 kald med, fejl. Konkret mangler CPR numret i kaldet.

Code Block
collapsetrue
{
  "timevalue": "2021-12-01T05:50:00.92Z",
  "category": "dk.sds.nsp.audit.log.nxrg/iti-42",
  "audit": {OK"
              }
    "timestamp": "2021-12-01T06:50:00.894+01:00",
    "components": [
  ]
    {
        "component": "NXRG/ITI-42",}
        "contexts": []
      }
    {]
  },
      "access": {
    "contextcode": "5912107379890312866.8220644980724288715.1638337800700"200,
    "duration": 31,
       "informationhttpHeaders": [{
          "Content-Type": "application/soap+xml; charset=UTF-8"
    {},
    "httpHost": "localhost",
    "method": "POST",
      "keypath": "CitizenId/nxrg/iti18",
    "query": "",
    "port": 8060,
      "typeprotocol": "SPIhttp",
    "reqSize": 2123,
    "resSize": 11289,
      "valuesoapHeaders": ""{
      "w3Action": "urn:ihe:iti:2007:RegistryStoredQuery",
       }"w3MessageID": "urn:uuid:accc136e-1ca4-4a04-bfe1-4caef4e31328",
      "w3To": "http://localhost:8060/nxrg/iti18"
       {},
    "threadId": "default task-1",
          "key"time": "SubmissionSetInformation2021-12-01T06:48:42.772+01:00",
    "stats": {
           "typehandlerDuration": "RPI"13,
      "RequestContentDuration": 0,
         "valueResponseContentDuration": "{\"uniqueId\":\"5912107379890312866.8220644980724288715.1638337800700\"}"0,
      "SecurityProtocolRequestDuration": 0,
      "SecurityProtocolResponseDuration": }0,
              {
  "bufferAllocated": false,
              "key"usedBuffers": "DoucmentEntryInformation"1,
                "type"activeBuffersInPool": "RPI"1,
      "idleBuffersInPool": 1
    }
  }
}

Logning for ITI-18 når ugyldige frasorterede dokumenter

Succesfuldt kald til service iti-18 giver anledning til en logningslinje på følgende format. Her ses at der er returneret 2 dokumenter, samt et er sorteret fra pga. manglende hash værdi (der er en fejl, hvor "location" er det frasorterede documententry (entryuuid)

Code Block
collapsetrue
{
   "time":"2022-04-27T08:50:38.171Z",
   "category":"dk.sds.nsp.audit.log.nxrg/iti-18",
   "audit":{     "value": "{\"entryUUid\":\"urn:uuid:5ea9015e-75f7-4cc5-85ff-079b56f36499\", \"uniqueId\":\"6660232118599018558.1142303413219772882.1638337800625\", \"replacesEntryUuid\":null}"
      "timestamp":"2022-04-27T10:50:37.985+02:00",
        },
     "components":[
         {
                "keycomponent": "StatusNXRG/ITI-18",
                "typecontexts": "NPI",[
               {
 "value": "ERROR"
              },  "context":"urn:uuid:4c50a699-c757-4d72-bce0-ef0e4284d5ff",
                  "information":[
                     {
                        "key": "ErrorsCitizenId",
                        "type": "RPISPI",
                        "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\"}"
27272727"
                     },
         }
            ]{
          }
        ]
      }"key":"queryType",
    ]
  },
  "access": {
      "code": 200,
    "duration": 17,
    "httpHeaderstype": {
"NPI",
         "Content-Type": "application/soap+xml; charset=UTF-8"
    },
    "httpHost": "localhost",
    "methodvalue": "POST","urn:uuid:14d4debf-8f97-4251-9a74-a90016b0af0d"
    "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",
      "w3Tokey": "http://localhost:8060/nxrg/iti42"
"returnType",
     },
    "threadId": "default task-1",
               "timetype": "2021-12-01T06:50:00.894+01:00"NPI",
    "stats": {
      "handlerDuration": 4,
      "RequestContentDuration": 0,
      "ResponseContentDurationvalue": 0,"LeafClass"
      "SecurityProtocolRequestDuration": 0,
      "SecurityProtocolResponseDuration": 0,
      "bufferAllocated": false},
      "usedBuffers": 2,
      "activeBuffersInPool": 2,
      "idleBuffersInPool": 0
 {
                        "key":"numberOfResults",
       }
  }
}

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

Code Block
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:

...

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.

          "type":"NPI",
                        "value":"2"
                     },
                     {
                        "key":"DoucmentEntryInformation",
                        "type":"RPI",
                        "value":"{\"entryUUid\":\"urn:uuid:b263be94-8ae8-428c-a08e-07e815e9c4f3\", \"uniqueId\":\"8232413550820834039.3966522250150692715.1651049436633\", \"replacesEntryUuid\":null}"
                     },
                     {
                        "key":"DoucmentEntryInformation",
                        "type":"RPI",
                        "value":"{\"entryUUid\":\"urn:uuid:3632b062-c449-4d80-9f17-92ffe033985b\", \"uniqueId\":\"8463246857834336090.1917624010876404532.1651049437586\", \"replacesEntryUuid\":null}"
                     },
                     {
                        "key":"DoucmentEntryInformation",
                        "type":"RPI",
                        "value":"{\"entryUUid\":\"urn:uuid:2f9ec238-55a6-48ad-baae-ca3f02783892\", \"uniqueId\":\"7463408028766553712.8751492382280798024.1651049437729\", \"replacesEntryUuid\":null}"
                     },
                     {
                        "key":"Status",
                        "type":"NPI",
                        "value":"WARNING"
                     },
                     {
                        "key":"Errors",
                        "type":"RPI",
                        "value":"{\"errorCode\":\"XDSRegistryMetadataError\", \"errorMessage\":null, \"codeContext\":\"XDSRegistryMetadataError Slot contains incorrect amount of values. Slot = hash, allowed = [ 1-  1], Was =    0\", \"location\":\"Entryuuid: urn:uuid:2f9ec238-55a6-48ad-baae-ca3f02783892\", \"severity\":\"urn:oasis:names:tc:ebxml-regrep:ErrorSeverityType:Error\"}"
                     }
                  ]
               }
            ]
         }
      ]
   },
   "access":{
      "code":200,
      "duration":164,
      "httpHeaders":{
         "Content-Type":"application/soap+xml; charset=UTF-8"
      },
      "httpHost":"localhost",
      "method":"POST",
      "path":"/nxrg/iti18",
      "query":"",
      "port":8060,
      "protocol":"http",
      "reqSize":2123,
      "resSize":11645,
      "soapHeaders":{
         "w3Action":"urn:ihe:iti:2007:RegistryStoredQuery",
         "w3MessageID":"urn:uuid:b8abf188-a545-4388-ab2d-01593c51e7ff",
         "w3To":"http://localhost:8060/nxrg/iti18"
      },
      "threadId":"default task-1",
      "time":"2022-04-27T10:50:37.985+02:00",
      "stats":{
         "handlerDuration":5,
         "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.

Code Block
collapsetrue
{
  "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
    }
  }
}


Adviseringer

NXRG kan advisere via NAS, når der sendes et ny dokument eller et dokumentregistreres via ITI-41, ITI-61 og ITI-57 snitfladerne (ikke opdatering af availability status med ITI-57).

Opsætning

Konfiguration af selve NAS integrationen kan ses ovenfor i beskrivelse af property filen.

Derudover skal der sættes notifikations kriterier op, som matches mod det enkelte dokument, og afgør om der skal sendes, en notifikation, hvilken topic der skal anvendes, og hvilken notifikationstype der skal bruges.

Pt kan kun notifikationstype "simple" anvendes. (En tilføjelse af flere typer, kræver ændringer i NXRG komponenten selv.)

Man kan indsætte notifikationskriterier ved at udføre følgende sql mod databasen:


insert into notification_configuration (classcode_codename, classcode_schemename, typecode_codename, typecode_schemename, formatcode_codename, formatcode_schemename, topic, notification_type)

values ('*', '*', '*', '*', 'urn:ad:dk:medcom:apd-v2.0.1:full', '*', 'http://sundhedsdatastyrelsen.dk/PsychiatricCarePlan/2024/01/01:CarePlanUpdated', 'simple');


Eksemplet her, vil for dokumenter med formatcodename = urn:ad:dk:medcom:apd-v2.0.1:full oprette en notifikation med det angivne topic og type. Værdien * indikerer at alle værdier matcher.

Afsendelse til NAS - adviseringsjob

Baggrundsjobbet har til formål at sende alle ikke-afsendte NAS-adviseringer, der er oprettet på baggrund af dokument registrering eller opdatering. Adviseringer lagres i tabellen "unsent_notifications".

Baggrundsjobbet startes med et HTTP GET kald til

  • <serverurl>/nxrg/nas-notification-job

Jobbets seneste status kan aflæses på komponentens statusside med et HTTP kald til:

  • <serverurl>/nxrg/nas-notification-job-status

Jobbet konfigureres med parametrene beskrevet i afsnittet ovenfor.

Detaljer om de enkelte kørsler (antal rækker behandlet mm.) skrives direkte til komponentens log-fil. Jobbet sender altså notifikationer først.

Er der konfigureret notifikationstyper ukendte for NXRG forbliver de i unsent_notifications tabellen og vil fremgå af log filen efter kørsel.

Migrering af data

Den oprindelige data migrering fra openText registry er ikke længere aktuel, og indholdet der indeholder migreringstool - og relaterede tools til verification etc - er flyttet til "Yderligere dokumentation - Migration"

NXRG har en selvstændig service, der kan migrere eksisterende metadata til søgbare felter. Denne service har sin egen driftvejledning som findes her: "NXRG - driftvejledning til felt migrering"

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

  • validering
  • verifikation

Disse to processer er implementeret som en del af NXRG og kan afvikles med følgende kommando

Code Block
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:

  • output'er lister med CPR numre i angivet sti
    • cprAssociations.txt
    • cprDocumententries.txt
    • cprSubmissionset.txt
    • cprTop100.txt
  • output'er resultater til std out samt en fil i den angivet sti
    • result.txt

verification - laver ITI-18 kald mod NXRG og Open Text registry:

  • indlæser liste med CPR numre til anvendelse i kald fra angivet sti
    • cpr.txt (på samme format som cprDocumententries.txt eller cprTop100.txt (output af validation kan anvendes med omdøbning af fil til cpr.txt))
  • output'er sammenligninger til std out samt to filer i den angivet sti
    • result.txt
    • resultCount.csv - mulighed for hurtigere søgning på forskelle ved at åbne  som regneark og anvende funktioner heri
  • output'er request og response kald indhold
    • 0101010304_nxrg_request.txt
    • 0101010304_nxrg_response.txt
    • 0101010304_opentext_request.txt
    • 0101010304_opentext_response.txt
    • etc

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, der kan sættes i forbindelse med verifikation:

...

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

Code Block
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.

  • filePath skal pege ned den folder, hvor output af kørslen skal placeres.
    • result.txt: alle id'er og om det gik godt eller eller ej
    • result.csv: resultatet med flere detaljer (se nedenfor)
  • replay_file skal pege på de request/ response som skal genspilles
    • skal være en specifik fil eller et bibliotek med filer, hvor request og response er
    • format skal være som filen testlog18.txt, der findes i NXRG projektet under modulet nxrg-migration-verification i resources

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

...

Output i result.csv:

...

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.

...

Er ForventetFejlkodeAntal og FaktiskFejlkodeAntal ens?

FejlKodeAntal er de antal fejl, som er blevet returnernet. 

...

ForventetFejlkode1

ForventetFejlContext1

ForventetFejlLocation1

ForventetFejlSeverity1

...

FaktiskFejlkode1

FaktiskFejlContext1

FaktiskFejlLocation1

FaktiskFejlSeverity1

...

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:

  • Resultat kolonnen bør være "OK"
  • ForventetFejlkodeAntal og FaktiskFejlkodeAntal bør kun indeholde værdien 0 eller 1 (se ovenfor)
  • Kig på Operation, ForventetFejl*  og FaktiskFejl* og vurder

Datareperationstool

For at reparere på forkerte data er der lavet et reperationstool.

Code Block
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:

...

Cleanup job

Cleanup job sletter DocumentEntries og tilhørende objekter fra NXRG databasen som er ældre end en specificeret dato.

Servicekonfiguration

Cleanup jobbet har følgende properties der kan sættes:

...

Brug af service

Servicen udstiller to HTTP endpoints:

  • /cleanup/status
  • /cleanup/start

som kan interageres med eks. med curl

Code Block
curl http://localhost:8060/nxrg/cleanup/status

Logning

Cleanup job logger på standardout vha. log4j. Jobbet vil ved kørsel udskrive følgende INFO statements ud:

Konfigurationsparametre:

  • delete.after.days = x (evt. default hvis ikke sat)
  • delete.type.code = x (evt. default hvis ikke sat)
  • delete.output.dir = x (evt. default hvis ikke sat)

Søgning:

  • Searching for documents to delete of type: 39289-4 created before: Tue Aug 13 14:39:15 CEST 2019
  • Found documents to delete: 33

Sletning

  • Successfully deleted documents: 33

Output

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:

  • deleted-ddMMyyyyHHmm-repositoryId.txt

...

.