Configurar notificações do Pub/Sub DICOM

Nesta página, descrevemos como usar o Pub/Sub para receber notificações sobre eventos clínicos em um armazenamento DICOM. Você pode receber notificações do Pub/Sub quando uma nova instância DICOM é armazenada em um armazenamento DICOM ou importada do Cloud Storage.

É possível usar as notificações do Pub/Sub para várias finalidades, como acionar o processamento downstream ou analisar novos dados. Por exemplo, um modelo de machine learning pode receber notificações quando novos dados estão disponíveis para treinamento e gerar insights para melhorar o atendimento ao paciente.

A figura a seguir mostra como as notificações do Pub/Sub são geradas e publicadas.

Notificações do Pub/Sub DICOM.

Figura 1. Receber notificações do Pub/Sub sobre eventos clínicos em um armazenamento DICOM.

A Figura 1 mostra as seguintes etapas:

  1. Um usuário faz uma solicitação para armazenar ou importar uma instância DICOM.
  2. O armazenamento DICOM recebe a solicitação, cria uma mensagem do Pub/Sub e a envia para o tópico do Pub/Sub configurado no armazenamento DICOM.
  3. O Pub/Sub encaminha a mensagem para as assinaturas anexadas ao tópico.
  4. Os assinantes recebem a mensagem da assinatura. Cada assinatura pode ter um ou mais assinantes para aumentar o paralelismo.

Antes de começar

  1. Crie um tópico.
  2. Crie uma assinatura de pull.

Adicionar permissões de editor do Pub/Sub

Para publicar mensagens da API Cloud Healthcare no Pub/Sub, adicione o papel pubsub.publisher à conta de serviço do Agente de serviço do Cloud Healthcare . Para mais informações, consulte Permissões do Pub/Sub para armazenamento DICOM, FHIR e HL7v2.

Formato e conteúdo da notificação

Uma notificação do Pub/Sub contém um objeto Message que inclui informações sobre o evento clínico. O objeto Message é semelhante a este:

{
  "message": {
    "attributes": {
      "action": "ACTION",
      "lastUpdatedTime": "RFC_1123_FORMAT_DATETIME",
      "storeName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID",
      "studyInstanceUID": "STUDY_UID",
      "seriesInstanceUID": "SERIES_UID",
      "sopInstanceUID": "INSTANCE_UID",
      "versionId": "VERSION_ID",
      "modality": "MODALITY",
      "storageClass": "STORAGE_CLASS",
      "previousStorageClass": "PREVIOUS_STORAGE_CLASS"
    },
    "data": "BASE_64_ENCODED_DATA",
    "messageId": "MESSAGE_ID",
    "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
  }
}

Para mais informações sobre os campos incluídos em cada mensagem do Pub/Sub, consulte ReceivedMessage e PubsubMessage.

A tabela a seguir descreve cada campo no objeto attributes:

Atributo Descrição Exemplo
action A ação que ocorreu em um recurso DICOM. Os valores possíveis incluem:
  • StoreInstances
  • ImportDicomData
  • SetBlobSettings
  • DeleteInstances
StoreInstances
lastUpdatedTime Um carimbo de data/hora da última vez em que o recurso DICOM foi modificado. O carimbo de data/hora usa o formato RFC 1123. Mon, 01 Jan 2020 00:00:00 UTC
storeName O nome completo do recurso do armazenamento DICOM em que a ação ocorreu. projects/my-project/locations/us/datasets/my-dataset/dicomStores/my-dicom-store
studyInstanceUID O identificador exclusivo da instância de estudo DICOM (UID). 1.2.3.4.5.6
seriesInstanceUID O identificador exclusivo da instância da série DICOM (UID). 1.2.3.4.5.6
sopInstanceUID O identificador exclusivo da instância SOP DICOM (UID). 1.2.3.4.5.6
versionId O ID da versão mais recente do recurso DICOM em que a ação ocorreu. MTY4MzA2MDQzOTI5NjIxMDAwMA
modality A tag de modalidade do recurso DICOM. Os valores possíveis incluem, entre outros:
  • CT
  • MR
  • MG
CT
storageClass A classe de armazenamento do recurso DICOM. Os valores possíveis incluem:
  • STANDARD
  • NEARLINE
  • COLDLINE
  • ARCHIVE
STANDARD
previousStorageClass A classe de armazenamento anterior do recurso DICOM. Os valores possíveis incluem:
  • STANDARD
  • NEARLINE
  • COLDLINE
  • ARCHIVE
NEARLINE

A tabela a seguir descreve os campos restantes no objeto message:

Campo Descrição
data Uma string codificada em base64 do seguinte identificador: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID
messageId Um identificador da mensagem do Pub/Sub.
publishTime O horário em que o servidor do Pub/Sub publicou a mensagem.

Configurar e ver notificações

Nesta seção, descrevemos como ativar as notificações do Pub/Sub em um armazenamento DICOM, armazenar ou importar uma instância DICOM para publicar uma notificação e visualizar a notificação.

Configurar o armazenamento DICOM

Os exemplos a seguir mostram como ativar as notificações do Pub/Sub em um armazenamento DICOM quando uma nova instância DICOM é armazenada ou importada do Cloud Storage.

REST

Use o método projects.locations.datasets.dicomStores.patch.

O valor de NotificationConfig.sendForBulkImport é true. Portanto, as notificações são enviadas ao importar dados do Cloud Storage.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • PROJECT_ID: o ID do seu Google Cloud projeto
  • LOCATION: o local do conjunto de dados;
  • DATASET_ID: o conjunto de dados pai do armazenamento DICOM
  • DICOM_STORE_ID: o ID do armazenamento DICOM
  • PUBSUB_TOPIC: um tópico do Pub/Sub em que as mensagens são publicadas quando um evento ocorre em um repositório de dados.

Corpo JSON da solicitação:

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

Para enviar a solicitação, escolha uma destas opções:

curl

Salve o corpo da solicitação em um arquivo chamado request.json. Execute o comando a seguir no terminal para criar ou substituir esse arquivo no diretório atual:

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

Depois execute o comando a seguir para enviar a solicitação 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

Salve o corpo da solicitação em um arquivo chamado request.json. Execute o comando a seguir no terminal para criar ou substituir esse arquivo no diretório atual:

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

Depois execute o comando a seguir para enviar a solicitação 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

APIs Explorer

Copie o corpo da solicitação e abra a página de referência do método. O painel "APIs Explorer" é aberto no lado direito da página. Interaja com essa ferramenta para enviar solicitações. Cole o corpo da solicitação nessa ferramenta, preencha todos os outros campos obrigatórios e clique em Executar.

Você vai receber uma resposta semelhante a esta.

Se você tiver configurado algum campo no recurso DicomStore, ele também vai aparecer na resposta.

gcloud

Execute o comando gcloud healthcare dicom-stores update .

Antes de usar os dados do comando abaixo, faça estas substituições:

  • PROJECT_ID: o ID do seu Google Cloud projeto
  • LOCATION: o local do conjunto de dados;
  • DATASET_ID: o conjunto de dados pai do armazenamento DICOM
  • DICOM_STORE_ID: o ID do armazenamento DICOM
  • PUBSUB_TOPIC: um tópico do Pub/Sub em que as mensagens são publicadas quando um evento ocorre em um repositório de dados.

Execute o seguinte comando:

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

Você receberá uma resposta semelhante a esta:

Resposta

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

Armazenar ou importar uma instância DICOM e visualizar a notificação do Pub/Sub

Para armazenar ou importar uma instância DICOM e extrair a mensagem do Pub/Sub gerada, siga estas etapas:

  1. Armazene ou importe uma instância DICOM. A solicitação faz com que a API Cloud Healthcare publique uma mensagem no tópico do Pub/Sub configurado.

  2. Puxe a mensagem. Se você importar várias instâncias DICOM em uma única solicitação, uma mensagem será gerada para cada instância.

    Para conferir as permissões do Identity and Access Management necessárias para extrair mensagens do Pub/Sub, consulte Controle de acesso do Pub/Sub.

    REST

    Use o método projects.subscriptions.pull. O exemplo a seguir usa o parâmetro de consulta ?maxMessages=10 para especificar o número máximo de mensagens a serem retornadas na solicitação. Ajuste esse valor ao seu caso de uso.

    Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

    • PROJECT_ID: o ID do seu Google Cloud projeto
    • PUBSUB_SUBSCRIPTION_ID: o ID da assinatura anexada ao tópico do Pub/Sub configurado no armazenamento DICOM

    Para enviar a solicitação, escolha uma destas opções:

    curl

    execute o seguinte 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

    Execute o seguinte 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

    APIs Explorer

    Abra a página de referência do método. O painel "APIs Explorer" é aberto no lado direito da página. Interaja com essa ferramenta para enviar solicitações. Preencha todos os campos obrigatórios e clique em Executar.

    Você receberá uma resposta JSON semelhante a esta:

    gcloud

    Execute o comando gcloud pubsub subscriptions pull.

    O exemplo usa as seguintes flags da Google Cloud CLI:

    • --limit=10: retorna um máximo de 10 mensagens. Ajuste esse valor ao seu caso de uso.
    • --format=json: renderiza a saída como JSON.
    • --auto-ack: confirma automaticamente todas as mensagens extraídas.

    Antes de usar os dados do comando abaixo, faça estas substituições:

    • PROJECT_ID: o ID do seu Google Cloud projeto
    • PUBSUB_SUBSCRIPTION_ID: o ID da assinatura anexada ao tópico do Pub/Sub configurado no armazenamento DICOM

    Execute o seguinte comando:

    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

    Você receberá uma resposta semelhante a esta:

    [
      {
        "ackId": "RFAGFixdRkhRNxkIaFEOT14jPzUgKEUaAggUBXx9cEFLdVhUcGhRDRlyfWB9bQ5GAgpGWixfURsHaE5tdR",
        "ackStatus": "SUCCESS",
        "message": {
          "attributes": {
            "action": "ImportDicomData",
            "lastUpdatedTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ",
            "storeName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID",
            "studyInstanceUID": "1.3.6.1.4.1.1129.5.111396399361969898205364400549799252857604",
            "seriesInstanceUID": "1.3.6.1.4.1.1129.5.111396399361969898205364400549799252857605",
            "sopInstanceUID": "1.3.6.1.4.1.1129.5.111396399361969898205364400549799252857606",
            "versionId": "MTY4MzA2MDQzOTI5NjIxMDAwMA",
            "modality": "CT",
            "storageClass": "STANDARD",
          },
          "data": "cHJvamVjdHMvbXlwcm9qZWN0L2xvY2F0aW9ucy91cy1jZW50cmFsMS9kYXRhc2V0cy9teS1kYXRhc2V0L2RpY29tU3RvcmVzL215LWRpY29tLXN0b3JlL2RpY29tV2ViL3N0dWRpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjExMTM5NjM5OTM2MTk2OTg5ODIwNTM2NDQwMDU0OTc5OTI1Mjg1NzYwNC9zZXJpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE5NTYyODIxMzY5NDMwMDQ5ODk0Njc2MDc2NzQ4MTI5MTI2MzUxMTcyNC9pbnN0YW5jZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE1Mzc1MTAwOTgzNTEwNzYxNDY2NjgzNDU2MzI5NDY4NDMzOTc0NjQ4MA==",
          "messageId": "7586159156345265",
          "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
        }
      }
    ]
    

Política de armazenamento de mensagens do Pub/Sub e da API Cloud Healthcare

Para garantir que os dados da API Cloud Healthcare e os dados associados nas mensagens do Pub/Sub residam na mesma região, defina uma política de armazenamento de mensagens do Pub/Sub.

Você precisa definir explicitamente a política de armazenamento de mensagens no tópico do Pub/Sub configurado no repositório de dados para garantir que os dados permaneçam na mesma região. Por exemplo, se o conjunto de dados e o armazenamento FHIR da API Cloud Healthcare estiverem em us-central1, a política de armazenamento de mensagens só poderá permitir a região us-central1.

Para configurar uma política de armazenamento de mensagens, consulte Configurar políticas de armazenamento de mensagens.

Resolver problemas de mensagens perdidas do Pub/Sub

Se não for possível publicar uma notificação no Pub/Sub, será registrado um erro no Cloud Logging. Para mais informações, consulte Como visualizar registros de erros no Cloud Logging.

Se a taxa de geração de erros exceder um limite, os erros que ultrapassarem esse limite não serão enviados ao Cloud Logging.

A seguir