Configurare le notifiche Pub/Sub DICOM

Questa pagina descrive come utilizzare Pub/Sub per ricevere notifiche sugli eventi clinici in un archivio DICOM. Puoi ricevere notifiche Pub/Sub quando una nuova istanza DICOM viene memorizzata in un archivio DICOM o importata da Cloud Storage.

Puoi utilizzare le notifiche Pub/Sub per più scopi, ad esempio per attivare l'elaborazione a valle o analizzare nuovi dati. Ad esempio, un modello di machine learning può ricevere notifiche quando sono disponibili nuovi dati per l'addestramento e generare approfondimenti per migliorare la cura dei pazienti.

La figura seguente mostra come vengono generate e pubblicate le notifiche Pub/Sub.

Notifiche Pub/Sub DICOM.

Figura 1. Ricezione di notifiche Pub/Sub relative a eventi clinici in un archivio DICOM.

La figura 1 mostra i seguenti passaggi:

  1. Un chiamante effettua una richiesta per archiviare o importare un'istanza DICOM.
  2. L'archivio DICOM riceve la richiesta, crea un messaggio Pub/Sub e lo invia all'argomento Pub/Sub configurato nell'archivio DICOM.
  3. Pub/Sub inoltra il messaggio alle sottoscrizioni associate all'argomento.
  4. Gli abbonati ricevono il messaggio dal loro abbonamento. Ogni abbonamento può avere uno o più abbonati per un maggiore parallelismo.

Prima di iniziare

  1. Crea un argomento.
  2. Crea una sottoscrizione pull.

Aggiungere le autorizzazioni del publisher Pub/Sub

Per pubblicare messaggi dall'API Cloud Healthcare in Pub/Sub, devi aggiungere il ruolo pubsub.publisher all'account di servizio dell'agente di servizio Cloud Healthcare del progetto. Per ulteriori informazioni, consulta Autorizzazioni Pub/Sub per gli archivi DICOM, FHIR e HL7v2.

Formato e contenuti delle notifiche

Una notifica Pub/Sub contiene un oggetto Message che include informazioni sull'evento clinico. Le notifiche Pub/Sub DICOM non includono un campo attributes. L'oggetto Message ha un aspetto simile al seguente:

{
  "message": {
    "data": "BASE_64_ENCODED_DATA",
    "messageId": "MESSAGE_ID",
    "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
  }
}

Il valore nel campo data è il seguente identificatore come stringa con codifica base 64: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID

Per ulteriori informazioni sui campi inclusi in ogni messaggio Pub/Sub, consulta ReceivedMessage e PubsubMessage.

Configurare e visualizzare le notifiche

Questa sezione descrive come attivare le notifiche Pub/Sub su un archivio DICOM, archiviare o importare un'istanza DICOM per pubblicare una notifica e visualizzarla.

Configurare l'archivio DICOM

Gli esempi riportati di seguito mostrano come attivare le notifiche Pub/Sub in un archivio DICOM quando viene archiviata o importata una nuova istanza DICOM da Cloud Storage.

REST

Utilizza il metodo projects.locations.datasets.dicomStores.patch.

Il valore di NotificationConfig.sendForBulkImport è true, quindi le notifiche vengono inviate durante l'importazione dei dati da Cloud Storage.

Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:

  • PROJECT_ID: l'ID del tuo progetto Google Cloud
  • LOCATION: la posizione del set di dati
  • DATASET_ID: il set di dati principale dell'archivio DICOM
  • DICOM_STORE_ID: l'ID dell'archivio DICOM
  • PUBSUB_TOPIC: un argomento Pub/Sub a cui vengono pubblicati i messaggi quando si verifica un evento in un datastore

Corpo JSON della richiesta:

{
  "notificationConfig": {
    "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC",
    "sendForBulkImport": "true"
  }
}

Per inviare la richiesta, scegli una delle seguenti opzioni:

curl

Salva il corpo della richiesta in un file denominato request.json. Esegui questo comando nel terminale per creare o sovrascrivere questo file nella directory corrente:

cat > request.json << 'EOF'
{
  "notificationConfig": {
    "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC",
    "sendForBulkImport": "true"
  }
}
EOF

Quindi, esegui il seguente comando per inviare la richiesta REST:

curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID?updateMask=notificationConfig"

PowerShell

Salva il corpo della richiesta in un file denominato request.json. Esegui questo comando nel terminale per creare o sovrascrivere questo file nella directory corrente:

@'
{
  "notificationConfig": {
    "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC",
    "sendForBulkImport": "true"
  }
}
'@  | Out-File -FilePath request.json -Encoding utf8

Quindi, esegui il seguente comando per inviare la richiesta REST:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID?updateMask=notificationConfig" | Select-Object -Expand Content

Explorer API

Copia il corpo della richiesta e apri la pagina di riferimento del metodo. Il riquadro Esplora API si apre sul lato destro della pagina. Puoi interagire con questo strumento per inviare richieste. Incolla il corpo della richiesta in questo strumento, compila gli altri campi obbligatori e fai clic su Esegui.

Dovresti ricevere una risposta simile alla seguente.

Se nella risorsa DicomStore hai configurato dei campi, questi vengono visualizzati anche nella risposta.

gcloud

Esegui il comando gcloud healthcare dicom-stores update.

Prima di utilizzare i dati dei comandi riportati di seguito, effettua le seguenti sostituzioni:

  • PROJECT_ID: l'ID del tuo progetto Google Cloud
  • LOCATION: la posizione del set di dati
  • DATASET_ID: il set di dati principale dell'archivio DICOM
  • DICOM_STORE_ID: l'ID dell'archivio DICOM
  • PUBSUB_TOPIC: un argomento Pub/Sub a cui vengono pubblicati i messaggi quando si verifica un evento in un datastore

Esegui il seguente comando:

Linux, macOS o Cloud Shell

gcloud healthcare dicom-stores update DICOM_STORE_ID \
  --dataset=DATASET_ID \
  --location=LOCATION \
  --pubsub-topic=projects/PROJECT_ID/topics/PUBSUB_TOPIC \
  --send-for-bulk-import

Windows (PowerShell)

gcloud healthcare dicom-stores update DICOM_STORE_ID `
  --dataset=DATASET_ID `
  --location=LOCATION `
  --pubsub-topic=projects/PROJECT_ID/topics/PUBSUB_TOPIC `
  --send-for-bulk-import

Windows (cmd.exe)

gcloud healthcare dicom-stores update DICOM_STORE_ID ^
  --dataset=DATASET_ID ^
  --location=LOCATION ^
  --pubsub-topic=projects/PROJECT_ID/topics/PUBSUB_TOPIC ^
  --send-for-bulk-import

Dovresti ricevere una risposta simile alla seguente:

Risposta

Updated dicomStore [DICOM_STORE_ID].
...
name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID
notificationConfig:
  pubsubTopic: projects/PROJECT_ID/topics/PUBSUB_TOPIC
  sendForBulkImport: true

Archivia o importa un'istanza DICOM e visualizza la notifica Pub/Sub

Per archiviare o importare un'istanza DICOM e recuperare il messaggio Pub/Sub generato, completa i seguenti passaggi:

  1. Archivia o import un'istanza DICOM. La richiesta fa sì che l'API Cloud Healthcare pubblichi un messaggio nell'argomento Pub/Sub configurato.

  2. Estrai il messaggio. Se importi più istanze DICOM in una singola richiesta, viene generato un messaggio per ogni istanza DICOM.

    Per visualizzare le autorizzazioni di Identity and Access Management necessarie per estrarre i messaggi Pub/Sub, consulta Controllo dell'accesso per Pub/Sub.

    REST

    Utilizza il metodo projects.subscriptions.pull. Il seguente esempio utilizza il parametro di query ?maxMessages=10 per specificare il numero massimo di messaggi da restituire nella richiesta. Modifica questo valore in base al tuo caso d'uso.

    Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:

    • PROJECT_ID: l'ID del tuo progetto Google Cloud
    • PUBSUB_SUBSCRIPTION_ID: l'ID dell'abbonamento associato all'argomento Pub/Sub configurato nell'archivio DICOM

    Per inviare la richiesta, scegli una delle seguenti opzioni:

    curl

    Esegui questo comando:

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d "" \
    "https://pubsub.googleapis.com/v1/projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID:pull?maxMessages=10"

    PowerShell

    Esegui questo comando:

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -Uri "https://pubsub.googleapis.com/v1/projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID:pull?maxMessages=10" | Select-Object -Expand Content

    Explorer API

    Apri la pagina di riferimento del metodo. Il riquadro Esplora API si apre sul lato destro della pagina. Puoi interagire con questo strumento per inviare richieste. Compila i campi obbligatori e fai clic su Esegui.

    Dovresti ricevere una risposta JSON simile alla seguente:

    gcloud

    Esegui il comando gcloud pubsub subscriptions pull.

    L'esempio utilizza i seguenti flag Google Cloud CLI:

    • --limit=10: restituisce un massimo di 10 messaggi. Modifica questo valore in base al tuo caso d'uso.
    • --format=json: esegue il rendering dell'output come JSON.
    • --auto-ack: conferma automaticamente ogni messaggio estratto.

    Prima di utilizzare i dati dei comandi riportati di seguito, effettua le seguenti sostituzioni:

    • PROJECT_ID: l'ID del tuo progetto Google Cloud
    • PUBSUB_SUBSCRIPTION_ID: l'ID dell'abbonamento associato all'argomento Pub/Sub configurato nell'archivio DICOM

    Esegui il seguente comando:

    Linux, macOS o Cloud Shell

    gcloud pubsub subscriptions pull \
        projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID \
        --limit=10 \
        --auto-ack \
        --format=json

    Windows (PowerShell)

    gcloud pubsub subscriptions pull `
        projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID `
        --limit=10 `
        --auto-ack `
        --format=json

    Windows (cmd.exe)

    gcloud pubsub subscriptions pull ^
        projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID ^
        --limit=10 ^
        --auto-ack ^
        --format=json

    Dovresti ricevere una risposta simile alla seguente:

    [
      {
        "ackId": "RFAGFixdRkhRNxkIaFEOT14jPzUgKEUaAggUBXx9cEFLdVhUcGhRDRlyfWB9bQ5GAgpGWixfURsHaE5tdR",
        "ackStatus": "SUCCESS",
        "message": {
          "data": "cHJvamVjdHMvbXlwcm9qZWN0L2xvY2F0aW9ucy91cy1jZW50cmFsMS9kYXRhc2V0cy9teS1kYXRhc2V0L2RpY29tU3RvcmVzL215LWRpY29tLXN0b3JlL2RpY29tV2ViL3N0dWRpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjExMTM5NjM5OTM2MTk2OTg5ODIwNTM2NDQwMDU0OTc5OTI1Mjg1NzYwNC9zZXJpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE5NTYyODIxMzY5NDMwMDQ5ODk0Njc2MDc2NzQ4MTI5MTI2MzUxMTcyNC9pbnN0YW5jZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE1Mzc1MTAwOTgzNTEwNzYxNDY2NjgzNDU2MzI5NDY4NDMzOTc0NjQ4MA==",
          "messageId": "7586159156345265",
          "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
        }
      }
    ]
    

API Cloud Healthcare e criterio di archiviazione dei messaggi Pub/Sub

Per assicurarti che i dati dell'API Cloud Healthcare e i dati associati nei messaggi Pub/Sub si trovino nella stessa regione, devi impostare un criterio di archiviazione dei messaggi Pub/Sub.

Devi impostare esplicitamente il criterio di archiviazione dei messaggi nell'argomento Pub/Sub configurato nell'datastore per assicurarti che i dati rimangano nella stessa regione. Ad esempio, se il set di dati e l'archivio FHIR dell'API Cloud Healthcare si trovano in us-central1, il criterio di archiviazione dei messaggi deve consentire solo la regione us-central1.

Per configurare un criterio di archiviazione dei messaggi, consulta Configurare i criteri del magazzino dei messaggi.

Risolvere i problemi relativi ai messaggi Pub/Sub persi

Se non è possibile pubblicare una notifica in Pub/Sub, viene registrato un errore in Cloud Logging. Per ulteriori informazioni, consulta Visualizzazione dei log degli errori in Cloud Logging.

Se la frequenza di generazione di errori supera un limite, gli errori in eccesso non vengono inviati a Cloud Logging.

Passaggi successivi