Azure Event Grid biblioteca de cliente para Python - versão 4.16.0
O Azure Event Grid é um serviço inteligente de encaminhamento de eventos integralmente gerido que permite um consumo de eventos uniforme através de um modelo de publicação-subscrição.
Código fonte | Pacote (PyPI) | Pacote (Conda) | Documentação | de referência da APIDocumentação do | produtoExemplos | Registo de alterações
Introdução
Pré-requisitos
- O Python 3.7 ou posterior é necessário para utilizar este pacote.
- Tem de ter uma subscrição do Azure e um recurso do Tópico do Event Grid para utilizar este pacote. Siga este tutorial passo a passo para registar o fornecedor de recursos do Event Grid e criar tópicos do Event Grid com o portal do Azure. Existe um tutorial semelhante com a CLI do Azure.
Instalar o pacote
Instale a biblioteca de cliente Azure Event Grid para Python com pip:
pip install azure-eventgrid
- É necessário um tópico ou domínio do Event Grid existente. Pode criar o recurso com o Portal do Azure ou a CLI do Azure
Se utilizar a CLI do Azure, substitua <resource-group-name>
e <resource-name>
pelos seus próprios nomes exclusivos.
Criar um Tópico do Event Grid
az eventgrid topic --create --location <location> --resource-group <resource-group-name> --name <resource-name>
Criar um Domínio do Event Grid
az eventgrid domain --create --location <location> --resource-group <resource-group-name> --name <resource-name>
Autenticar o cliente
Para interagir com o serviço Event Grid, terá de criar uma instância de um cliente. É necessário um ponto final e uma credencial para instanciar o objeto de cliente.
Utilizar o Azure Active Directory (AAD)
Azure Event Grid fornece integração com o Azure Active Directory (Azure AD) para autenticação baseada em identidade de pedidos. Com Azure AD, pode utilizar o controlo de acesso baseado em funções (RBAC) para conceder acesso aos seus recursos Azure Event Grid a utilizadores, grupos ou aplicações.
Para enviar eventos para um tópico ou domínio com um TokenCredential
, a identidade autenticada deve ter a função "EventGrid Data Sender" atribuída.
Com o azure-identity
pacote, pode autorizar pedidos de forma totalmente integrada em ambientes de desenvolvimento e produção. Para saber mais sobre o Azure Active Directory, veja o azure-identity
README.
Por exemplo, pode utilizar DefaultAzureCredential
para construir um cliente que se autenticará com o Azure Active Directory:
from azure.identity import DefaultAzureCredential
from azure.eventgrid import EventGridPublisherClient, EventGridEvent
default_az_credential = DefaultAzureCredential()
endpoint = os.environ["EVENTGRID_TOPIC_ENDPOINT"]
client = EventGridPublisherClient(endpoint, default_az_credential)
Procurar o ponto final
Pode encontrar o ponto final do tópico no recurso tópico do Event Grid no portal do Azure. Terá o seguinte aspeto: "https://<event-grid-topic-name>.<topic-location>.eventgrid.azure.net/api/events"
Criar o cliente com o AzureKeyCredential
Para utilizar uma chave de Acesso como parâmetro credential
, transmita a chave como uma cadeia para uma instância do AzureKeyCredential.
Nota: A Chave de Acesso pode ser encontrada no portal do Azure no menu "Chaves de Acesso" do recurso do Tópico do Event Grid. Também podem ser obtidos através da CLI do Azure ou da
azure-mgmt-eventgrid
biblioteca. Pode encontrar um guia para obter chaves de acesso aqui.
import os
from azure.eventgrid import EventGridPublisherClient
from azure.core.credentials import AzureKeyCredential
topic_key = os.environ["EVENTGRID_TOPIC_KEY"]
endpoint = os.environ["EVENTGRID_TOPIC_ENDPOINT"]
credential_key = AzureKeyCredential(topic_key)
client = EventGridPublisherClient(endpoint, credential_key)
Nota: Um cliente também pode ser autenticado através da assinatura SAS, com o
AzureSasCredential
. Está disponível um exemplo que demonstra isto aqui (async_version).
Nota: O
generate_sas
método pode ser utilizado para gerar uma assinatura de acesso partilhado. Pode ver um exemplo que demonstra isto aqui.
Conceitos-chave
Tópico
Um tópico é um canal no serviço EventGrid para enviar eventos. O esquema de evento que um tópico aceita é decidido no momento da criação do tópico. Se os eventos de um tipo de esquema forem enviados para um tópico que requer um tipo de esquema diferente, serão gerados erros.
Domínio
Um domínio de eventos é uma ferramenta de gestão para um grande número de tópicos do Event Grid relacionados com a mesma aplicação. Permitem-lhe publicar eventos em milhares de tópicos. Os domínios também lhe dão autorização e controlo de autenticação sobre cada tópico. Para obter mais informações, visite Descrição geral do domínio de eventos.
Quando cria um domínio de evento, é disponibilizado um ponto final de publicação para este domínio. Este processo é semelhante à criação de um Tópico do Event Grid. A única diferença é que, ao publicar num domínio, tem de especificar o tópico no domínio ao qual pretende que o evento seja entregue.
Esquemas de eventos
Um evento é a menor quantidade de informações que descreve totalmente algo que aconteceu no sistema. Quando é criado um tópico ou domínio personalizado, tem de especificar o esquema que será utilizado ao publicar eventos.
O Event Grid suporta vários esquemas para eventos de codificação.
Esquema do Event Grid
Embora possa configurar o tópico para utilizar um esquema personalizado, é mais comum utilizar o esquema do Event Grid já definido. Veja as especificações e os requisitos aqui.
Esquema CloudEvents v1.0
Outra opção é utilizar o esquema CloudEvents v1.0. O CloudEvents é um projeto do Cloud Native Computing Foundation que produz uma especificação para descrever os dados de eventos de uma forma comum. O resumo do serviço do CloudEvents pode ser encontrado aqui.
EventGridPublisherClient
EventGridPublisherClient
fornece operações para enviar dados de eventos para um nome de anfitrião de tópico especificado durante a inicialização do cliente.
Independentemente do esquema que o seu tópico ou domínio está configurado para utilizar, EventGridPublisherClient
será utilizado para publicar eventos no mesmo. Utilize os eventos de publicação do send
método.
Os seguintes formatos de eventos podem ser enviados:
Uma lista ou uma única instância de EventGridEvents fortemente escritos.
Uma representação dict de um objeto EventGridEvent serializado.
Uma lista ou uma única instância de CloudEvents fortemente escritos.
Uma representação dict de um objeto CloudEvent serializado.
Uma representação de ditado de qualquer Esquema Personalizado.
Veja os exemplos para obter exemplos detalhados.
Nota: É importante saber se o seu tópico suporta CloudEvents ou EventGridEvents antes de publicar. Se enviar para um tópico que não suporta o esquema do evento que está a enviar, enviar() apresentará uma exceção.
Tópicos do Sistema
Um tópico de sistema no Event Grid representa um ou mais eventos publicados pelos serviços do Azure, como o Armazenamento do Azure ou Hubs de Eventos do Azure. Por exemplo, um tópico de sistema pode representar todos os eventos de blobs ou apenas eventos de criação e eliminação de blobs publicados para uma conta de armazenamento específica.
Os nomes dos vários tipos de eventos para os eventos de sistema publicados no Azure Event Grid estão disponíveis no azure.eventgrid.SystemEventNames
.
Para obter uma lista completa de tópicos de sistema reconhecíveis, visite Tópicos do Sistema.
Para obter mais informações sobre os principais conceitos no Event Grid, veja Conceitos no Azure Event Grid.
Event Grid no Kubernetes com o Azure Arc
O Event Grid no Kubernetes com o Azure Arc é uma oferta que lhe permite executar o Event Grid no seu próprio cluster do Kubernetes. Esta capacidade é ativada pela utilização do Kubernetes compatível com o Azure Arc. Através do Kubernetes compatível com o Azure Arc, um cluster do Kubernetes suportado liga-se ao Azure. Assim que estiver ligado, poderá instalar o Event Grid no mesmo. Saiba mais sobre o assunto aqui.
Suporte para Eventos na Cloud CNCF
A partir da v4.7.0, este pacote também suporta a publicação de um evento na cloud CNCF a partir de https://pypi.org/project/cloudevents/. Poderia transmitir um objeto CloudEvent desta biblioteca para a send
API.
from cloudevents.http import CloudEvent
event = CloudEvent(...)
client.send(event)
Exemplos
As secções seguintes fornecem vários fragmentos de código que abrangem algumas das tarefas mais comuns do Event Grid, incluindo:
- Enviar um Evento do Event Grid
- Enviar um Evento na Cloud
- Enviar Múltiplos Eventos
- Enviar eventos como Dicionários
- Consumir um payload da fila de armazenamento
- Consumir a partir do ServiceBus
Enviar um Evento do Event Grid
Este exemplo publica um evento do Event Grid.
import os
from azure.core.credentials import AzureKeyCredential
from azure.eventgrid import EventGridPublisherClient, EventGridEvent
key = os.environ["EG_ACCESS_KEY"]
endpoint = os.environ["EG_TOPIC_HOSTNAME"]
event = EventGridEvent(
data={"team": "azure-sdk"},
subject="Door1",
event_type="Azure.Sdk.Demo",
data_version="2.0"
)
credential = AzureKeyCredential(key)
client = EventGridPublisherClient(endpoint, credential)
client.send(event)
Enviar um Evento na Cloud
Este exemplo publica um evento da Cloud.
import os
from azure.core.credentials import AzureKeyCredential
from azure.core.messaging import CloudEvent
from azure.eventgrid import EventGridPublisherClient
key = os.environ["CLOUD_ACCESS_KEY"]
endpoint = os.environ["CLOUD_TOPIC_HOSTNAME"]
event = CloudEvent(
type="Azure.Sdk.Sample",
source="https://egsample.dev/sampleevent",
data={"team": "azure-sdk"}
)
credential = AzureKeyCredential(key)
client = EventGridPublisherClient(endpoint, credential)
client.send(event)
Enviar Vários eventos
É possível enviar eventos como um lote ao enviar vários eventos para um tópico ou domínio. Este exemplo envia uma lista de CloudEvents com o método de envio.
AVISO: Ao enviar uma lista de vários eventos de uma só vez, iterar e enviar cada evento não resultará num desempenho ideal. Para obter o melhor desempenho, é altamente recomendado enviar uma lista de eventos.
import os
from azure.core.credentials import AzureKeyCredential
from azure.core.messaging import CloudEvent
from azure.eventgrid import EventGridPublisherClient
key = os.environ["CLOUD_ACCESS_KEY"]
endpoint = os.environ["CLOUD_TOPIC_HOSTNAME"]
event0 = CloudEvent(
type="Azure.Sdk.Sample",
source="https://egsample.dev/sampleevent",
data={"team": "azure-sdk"}
)
event1 = CloudEvent(
type="Azure.Sdk.Sample",
source="https://egsample.dev/sampleevent",
data={"team2": "azure-eventgrid"}
)
events = [event0, event1]
credential = AzureKeyCredential(key)
client = EventGridPublisherClient(endpoint, credential)
client.send(events)
Enviar eventos como dicionários
Uma representação de ditado dos respetivos modelos serializados também pode ser utilizada para publicar CloudEvent(s) ou EventGridEvent(s) para além dos objetos fortemente escritos.
Utilize uma representação semelhante a um ditado para enviar para um tópico com esquema personalizado, conforme mostrado abaixo.
import os
import uuid
import datetime as dt
from msrest.serialization import UTC
from azure.core.credentials import AzureKeyCredential
from azure.eventgrid import EventGridPublisherClient
key = os.environ["CUSTOM_SCHEMA_ACCESS_KEY"]
endpoint = os.environ["CUSTOM_SCHEMA_TOPIC_HOSTNAME"]
event = custom_schema_event = {
"customSubject": "sample",
"customEventType": "sample.event",
"customDataVersion": "2.0",
"customId": uuid.uuid4(),
"customEventTime": dt.datetime.now(UTC()).isoformat(),
"customData": "sample data"
}
credential = AzureKeyCredential(key)
client = EventGridPublisherClient(endpoint, credential)
client.send(event)
Consumir a partir da fila de armazenamento
Este exemplo consome uma mensagem recebida da fila de armazenamento e desseleciona-a para um objeto CloudEvent.
from azure.core.messaging import CloudEvent
from azure.storage.queue import QueueServiceClient, BinaryBase64DecodePolicy
import os
import json
# all types of CloudEvents below produce same DeserializedEvent
connection_str = os.environ['STORAGE_QUEUE_CONN_STR']
queue_name = os.environ['STORAGE_QUEUE_NAME']
with QueueServiceClient.from_connection_string(connection_str) as qsc:
payload = qsc.get_queue_client(
queue=queue_name,
message_decode_policy=BinaryBase64DecodePolicy()
).peek_messages()
## deserialize payload into a list of typed Events
events = [CloudEvent.from_dict(json.loads(msg.content)) for msg in payload]
Consumir a partir do servicebus
Este exemplo consome uma mensagem de payload recebida do ServiceBus e aninha-a para um objeto EventGridEvent.
from azure.eventgrid import EventGridEvent
from azure.servicebus import ServiceBusClient
import os
import json
# all types of EventGridEvents below produce same DeserializedEvent
connection_str = os.environ['SERVICE_BUS_CONN_STR']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient.from_connection_string(connection_str) as sb_client:
payload = sb_client.get_queue_receiver(queue_name).receive_messages()
## deserialize payload into a list of typed Events
events = [EventGridEvent.from_dict(json.loads(next(msg.body).decode('utf-8'))) for msg in payload]
Rastreio Distribuído com EventGrid
Pode utilizar o OpenTelemetry para Python como habitualmente com o EventGrid, uma vez que é compatível com a integração de rastreio do azure-core.
Eis um exemplo de utilização do OpenTelemetry para rastrear o envio de um CloudEvent.
Primeiro, defina OpenTelemetry como plug-in de rastreio ativado para EventGrid.
from azure.core.settings import settings
from azure.core.tracing.ext.opentelemetry_span import OpenTelemetrySpan
settings.tracing_implementation = OpenTelemetrySpan
Utilização de telemetria aberta regular a partir daqui. Consulte OpenTelemetry para obter detalhes.
Este exemplo utiliza um exportador de consola simples para exportar os rastreios. Qualquer exportador pode ser utilizado aqui, incluindo azure-monitor-opentelemetry-exporter
, jaeger
, zipkin
etc.
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import ConsoleSpanExporter
from opentelemetry.sdk.trace.export import SimpleSpanProcessor # this requires opentelemetry >= 1.0.0
# Simple console exporter
exporter = ConsoleSpanExporter()
trace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)
trace.get_tracer_provider().add_span_processor(
SimpleSpanProcessor(exporter)
)
Assim que o tracer
e exporter
estiver definido, siga o exemplo abaixo para começar a recolher rastreios ao utilizar o send
método do EventGridPublisherClient
para enviar um objeto CloudEvent.
import os
from azure.eventgrid import EventGridPublisherClient
from azure.core.messaging import CloudEvent
from azure.core.credentials import AzureKeyCredential
hostname = os.environ['CLOUD_TOPIC_HOSTNAME']
key = AzureKeyCredential(os.environ['CLOUD_ACCESS_KEY'])
cloud_event = CloudEvent(
source = 'demo',
type = 'sdk.demo',
data = {'test': 'hello'},
)
with tracer.start_as_current_span(name="MyApplication"):
client = EventGridPublisherClient(hostname, key)
client.send(cloud_event)
Resolução de problemas
- Ative
azure.eventgrid
o logger para recolher rastreios da biblioteca.
Geral
A biblioteca de cliente do Event Grid irá gerar exceções definidas no Azure Core.
Registo
Esta biblioteca utiliza a biblioteca de registos padrão para registos. As informações básicas sobre as sessões HTTP (URLs, cabeçalhos, etc.) são registadas ao nível da INFORMAÇÃO.
Configuração opcional
Os argumentos de palavra-chave opcionais podem ser transmitidos ao nível do cliente e por operação. A documentação de referência do azure-core descreve as configurações disponíveis para repetições, registos, protocolos de transporte e muito mais.
Passos seguintes
A secção seguinte fornece vários fragmentos de código que ilustram padrões comuns utilizados na API python do Event Grid.
Mais código de exemplo
Estes exemplos de código mostram operações de cenário de campeão comuns com a biblioteca de cliente Azure Event Grid.
Gerar Assinatura de Acesso Partilhado: sample_generate_sas.py
Autenticar o cliente: sample_authentication.py (async_version)
Publicar eventos num tópico com SAS: sample_publish_events_to_a_topic_using_sas_credential_async.py (async_version)
Publicar Eventos do Event Grid num tópico: sample_publish_eg_events_to_a_topic.py (async_version)
Publicar Eventos EventGrid num tópico de domínio: sample_publish_eg_events_to_a_domain_topic.py (async_version)
Publicar um Evento na Cloud: sample_publish_events_using_cloud_events_1.0_schema.py (async_version)
Publicar um Esquema Personalizado: sample_publish_custom_schema_to_a_topic.py (async_version)
Os exemplos seguintes abrangem a publicação e o consumo dict
de representações de EventGridEvents e CloudEvents.
Publicar EventGridEvent como dict como representação: sample_publish_eg_event_using_dict.py (async_version)
Publicar o CloudEvent como dict como representação: sample_publish_cloud_event_using_dict.py (async_version)
Consumir um Payload Personalizado de dados cloudevent não processados: sample_consume_custom_payload.py
Pode encontrar mais exemplos aqui.
- Pode ver mais exemplos relacionados com o cenário de envio aqui.
- Para ver mais exemplos relacionados com o consumo de um payload de diferentes serviços de mensagens como um objeto escrito, visite Consumir Amostras
Documentação adicional
Para obter documentação mais extensa sobre Azure Event Grid, consulte a documentação do Event Grid sobre docs.microsoft.com.
Contribuir
Agradecemos todas as contribuições e sugestões para este projeto. A maioria das contribuições requerem que celebre um Contrato de Licença de Contribuição (CLA) no qual se declare que tem o direito de conceder e que, na verdade, concede-nos os direitos para utilizar a sua contribuição. Para obter detalhes, visite cla.microsoft.com.
Quando submete um pedido Pull, um bot do CLA determina automaticamente se tem de fornecer um CLA e decorar o PR de forma adequada (por exemplo, etiqueta, comentário). Só tem de seguir as instruções fornecidas pelo bot. Apenas terá de fazer isto uma vez em todos os repositórios com o nosso CLA.
Este projeto adotou o Microsoft Open Source Code of Conduct (Código de Conduta do Microsoft Open Source). Para obter mais informações, consulte as FAQ do Código de Conduta ou o contacto opencode@microsoft.com com quaisquer perguntas ou comentários adicionais.
Azure SDK for Python