Configurer les notifications Pub/Sub DICOM

Cette page explique comment utiliser Pub/Sub pour obtenir des notifications sur les événements cliniques dans un magasin DICOM. Vous pouvez recevoir des notifications Pub/Sub lorsqu'une nouvelle instance DICOM est stockée dans un magasin DICOM ou importée depuis Cloud Storage.

Vous pouvez utiliser les notifications Pub/Sub à plusieurs fins, par exemple pour déclencher un traitement en aval ou analyser de nouvelles données. Par exemple, un modèle de machine learning peut recevoir des notifications lorsque de nouvelles données sont disponibles pour l'entraînement et générer des insights pour améliorer les soins aux patients.

La figure suivante montre comment les notifications Pub/Sub sont générées et publiées.

Notifications Pub/Sub DICOM.

Figure 1 : Recevoir des notifications Pub/Sub sur des événements cliniques dans un magasin DICOM

La figure 1 illustre les étapes suivantes:

  1. Un appelant effectue une requête pour stocker ou importer une instance DICOM.
  2. Le magasin DICOM reçoit la requête, crée un message Pub/Sub et l'envoie au sujet Pub/Sub configuré dans le magasin DICOM.
  3. Pub/Sub transfère le message aux abonnements associés au sujet.
  4. Les abonnés reçoivent le message de leur abonnement. Chaque abonnement peut avoir un ou plusieurs abonnés pour accroître le parallélisme.

Avant de commencer

  1. Créez un sujet.
  2. Créez un abonnement pull.

Ajouter des autorisations d'éditeur Pub/Sub

Pour publier des messages de l'API Cloud Healthcare vers Pub/Sub, vous devez ajouter le rôle pubsub.publisher au compte de service de l'agent de service Cloud Healthcare. Pour en savoir plus, consultez la section Autorisations Pub/Sub pour les magasins DICOM, FHIR et HL7v2.

Format et contenu des notifications

Une notification Pub/Sub contient un objet Message qui inclut des informations sur l'événement clinique. Les notifications DICOM Pub/Sub n'incluent pas de champ attributes. L'objet Message ressemble à l'exemple suivant:

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

La valeur du champ data correspond à l'identifiant suivant sous la forme d'une chaîne encodée en base64: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID

Pour en savoir plus sur les champs inclus dans chaque message Pub/Sub, consultez les sections ReceivedMessage et PubsubMessage.

Configurer et afficher les notifications

Cette section explique comment activer les notifications Pub/Sub sur un magasin DICOM, stocker ou importer une instance DICOM pour publier une notification et afficher la notification.

Configurer le magasin DICOM

Les exemples suivants montrent comment activer les notifications Pub/Sub sur un magasin DICOM lorsqu'une nouvelle instance DICOM est stockée ou importée depuis Cloud Storage.

REST

Utilisez la méthode projects.locations.datasets.dicomStores.patch.

La valeur de NotificationConfig.sendForBulkImport étant true, des notifications sont envoyées lors de l'importation de données depuis Cloud Storage.

Avant d'utiliser les données de la requête, effectuez les remplacements suivants:

  • PROJECT_ID : ID de votre projet Google Cloud
  • LOCATION : emplacement de l'ensemble de données
  • DATASET_ID : ensemble de données parent du magasin DICOM
  • DICOM_STORE_ID : ID du magasin DICOM
  • PUBSUB_TOPIC: sujet Pub/Sub dans lequel les messages sont publiés lorsqu'un événement se produit dans un data store.

Corps JSON de la requête :

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

Pour envoyer votre requête, choisissez l'une des options suivantes :

curl

Enregistrez le corps de la requête dans un fichier nommé request.json. Exécutez la commande suivante dans le terminal pour créer ou écraser ce fichier dans le répertoire actuel :

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

Exécutez ensuite la commande suivante pour envoyer votre requête 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

Enregistrez le corps de la requête dans un fichier nommé request.json. Exécutez la commande suivante dans le terminal pour créer ou écraser ce fichier dans le répertoire actuel :

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

Exécutez ensuite la commande suivante pour envoyer votre requête 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

API Explorer

Copiez le corps de la requête et ouvrez la page de référence de la méthode. Le panneau APIs Explorer s'ouvre dans la partie droite de la page. Vous pouvez interagir avec cet outil pour envoyer des requêtes. Collez le corps de la requête dans cet outil, renseignez tous les champs obligatoires, puis cliquez sur Execute (Exécuter).

Vous devriez obtenir un résultat semblable au suivant.

Si vous avez configuré des champs dans la ressource DicomStore, ils apparaissent également dans la réponse.

gcloud

Exécutez la commande gcloud healthcare dicom-stores update.

Avant d'utiliser les données de la commande ci-dessous, effectuez les remplacements suivants :

  • PROJECT_ID : ID de votre projet Google Cloud
  • LOCATION : emplacement de l'ensemble de données
  • DATASET_ID : ensemble de données parent du magasin DICOM
  • DICOM_STORE_ID : ID du magasin DICOM
  • PUBSUB_TOPIC: sujet Pub/Sub dans lequel les messages sont publiés lorsqu'un événement se produit dans un data store.

Exécutez la commande suivante:

Linux, macOS ou 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

Vous devriez obtenir un résultat semblable à celui-ci :

Réponse

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

Stocker ou importer une instance DICOM et afficher la notification Pub/Sub

Pour stocker ou importer une instance DICOM et extraire le message Pub/Sub généré, procédez comme suit:

  1. Stockez ou import une instance DICOM. La requête oblige l'API Cloud Healthcare à publier un message dans le sujet Pub/Sub configuré.

  2. Extrayez le message. Si vous importez plusieurs instances DICOM dans une seule requête, un message est généré pour chaque instance DICOM.

    Pour afficher les autorisations Identity and Access Management nécessaires pour extraire les messages Pub/Sub, consultez la section Contrôle des accès pour Pub/Sub.

    REST

    Exécutez la méthode projects.subscriptions.pull. L'exemple suivant utilise le paramètre de requête ?maxMessages=10 pour spécifier le nombre maximal de messages à renvoyer dans la requête. Adaptez cette valeur à votre cas d'utilisation.

    Avant d'utiliser les données de la requête, effectuez les remplacements suivants:

    • PROJECT_ID : ID de votre projet Google Cloud
    • PUBSUB_SUBSCRIPTION_ID: ID de l'abonnement associé au sujet Pub/Sub configuré sur le store DICOM

    Pour envoyer votre requête, choisissez l'une des options suivantes :

    curl

    exécutez la commande suivante :

    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

    exécutez la commande suivante :

    $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

    API Explorer

    Ouvrez la page de référence de la méthode. Le panneau APIs Explorer s'ouvre dans la partie droite de la page. Vous pouvez interagir avec cet outil pour envoyer des requêtes. Renseignez tous les champs obligatoires, puis cliquez sur Exécuter.

    Vous devriez recevoir une réponse JSON de ce type :

    gcloud

    Exécutez la commande gcloud pubsub subscriptions pull.

    L'exemple utilise les indicateurs Google Cloud CLI suivants:

    • --limit=10: renvoie un maximum de 10 messages. Adaptez cette valeur à votre cas d'utilisation.
    • --format=json: affiche la sortie au format JSON.
    • --auto-ack: confirme automatiquement chaque message extrait.

    Avant d'utiliser les données de la commande ci-dessous, effectuez les remplacements suivants :

    • PROJECT_ID : ID de votre projet Google Cloud
    • PUBSUB_SUBSCRIPTION_ID: ID de l'abonnement associé au sujet Pub/Sub configuré sur le store DICOM

    Exécutez la commande suivante:

    Linux, macOS ou 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
    

    Vous devriez obtenir un résultat semblable à celui-ci :

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

Règles de stockage des messages de l'API Cloud Healthcare et Pub/Sub

Pour vous assurer que les données de l'API Cloud Healthcare et les données associées dans les messages Pub/Sub se trouvent dans la même région, vous devez définir une règle de stockage des messages Pub/Sub.

Vous devez définir explicitement les règles de stockage des messages sur le sujet Pub/Sub configuré sur le data store pour vous assurer que les données restent dans la même région. Par exemple, si l'ensemble de données et le magasin FHIR de l'API Cloud Healthcare sont dans la région us-central1, la règle de stockage des messages doit autoriser uniquement la région us-central1.

Pour configurer une règle de stockage des messages, consultez la page Configurer des règles de stockage des messages.

Résoudre les problèmes liés aux messages Pub/Sub manqués

Si une notification ne peut pas être publiée dans Pub/Sub, une erreur est consignée dans Cloud Logging. Pour en savoir plus, consultez la section Afficher les journaux d'erreurs dans Cloud Logging.

Si le taux de génération d'erreurs dépasse une limite, les erreurs dépassant la limite ne sont pas envoyées à Cloud Logging.

Étapes suivantes