biblioteca cliente de Azure Event Grid para Python: versión 4.16.0
Azure Event Grid es un servicio de enrutamiento de eventos inteligente completamente administrado que permite el consumo de eventos uniforme mediante un modelo de publicación-suscripción.
Código | fuentePaquete (PyPI) | Paquete (Conda) | Documentación | de referencia de APIDocumentación | del productoMuestras | Changelog
Introducción
Requisitos previos
- Se requiere Python 3.7 o posterior para usar este paquete.
- Debe tener una suscripción de Azure y un recurso de tema de Event Grid para usar este paquete. Siga este tutorial paso a paso para registrar el proveedor de recursos de Event Grid y crear temas de Event Grid mediante el Azure Portal. Hay un tutorial similar con la CLI de Azure.
Instalar el paquete
Instale la biblioteca cliente de Azure Event Grid para Python con pip:
pip install azure-eventgrid
- Se requiere un tema o dominio de Event Grid existente. Puede crear el recurso mediante Azure Portal o la CLI de Azure.
Si usa la CLI de Azure, reemplace <resource-group-name>
y <resource-name>
por sus propios nombres únicos.
Crear un tema de Event Grid
az eventgrid topic --create --location <location> --resource-group <resource-group-name> --name <resource-name>
Crear un dominio de Event Grid
az eventgrid domain --create --location <location> --resource-group <resource-group-name> --name <resource-name>
Autenticar el cliente
Para interactuar con el servicio Event Grid, deberá crear una instancia de un cliente. Se necesita un punto de conexión y una credencial para crear una instancia del objeto de cliente.
Uso de Azure Active Directory (AAD)
Azure Event Grid proporciona integración con Azure Active Directory (Azure AD) para la autenticación basada en identidades de las solicitudes. Con Azure AD, puede usar el control de acceso basado en rol (RBAC) para conceder acceso a los recursos de Azure Event Grid a usuarios, grupos o aplicaciones.
Para enviar eventos a un tema o dominio con , TokenCredential
la identidad autenticada debe tener asignado el rol "Remitente de datos de EventGrid".
Con el azure-identity
paquete, puede autorizar sin problemas las solicitudes en entornos de desarrollo y producción. Para más información sobre Azure Active Directory, consulte el azure-identity
archivo Léame.
Por ejemplo, puede usar DefaultAzureCredential
para construir un cliente que se autenticará mediante 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)
Búsqueda del punto de conexión
Puede encontrar el punto de conexión del tema en el recurso tema de Event Grid en el Azure Portal. Esto tendrá un aspecto similar al siguiente: "https://<event-grid-topic-name>.<topic-location>.eventgrid.azure.net/api/events"
Creación del cliente con AzureKeyCredential
Para usar una clave de acceso como credential
parámetro, pase la clave como una cadena a una instancia de AzureKeyCredential.
Nota: La clave de acceso se puede encontrar en Azure Portal en el menú "Claves de acceso" del recurso tema de Event Grid. También se pueden obtener a través de la CLI de Azure o la
azure-mgmt-eventgrid
biblioteca. Puede encontrar una guía para obtener las claves de acceso aquí.
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: Un cliente también se puede autenticar a través de la firma SAS, mediante .
AzureSasCredential
Un ejemplo que muestra esto está disponible aquí (async_version).
Nota: El
generate_sas
método se puede usar para generar una firma de acceso compartido. Aquí se puede ver un ejemplo que muestra esto.
Conceptos clave
Tema
Un tema es un canal dentro del servicio EventGrid para enviar eventos. El esquema de eventos que acepta un tema se decide en el momento de la creación del tema. Si los eventos de un tipo de esquema se envían a un tema que requiere un tipo de esquema diferente, se producirán errores.
Dominio
Un dominio de eventos es una herramienta de administración para un gran número de temas de Event Grid relacionados con la misma aplicación. Le permiten publicar eventos en miles de temas. Los dominios también le proporcionan autorización y control de autenticación sobre cada tema. Para obtener más información, visite Introducción al dominio de eventos.
Cuando se crea un dominio de eventos, se pone a su disposición un punto de conexión de publicación para este dominio. Este proceso es similar a la creación de un tema de Event Grid. La única diferencia es que, al publicar en un dominio, debe especificar el tema dentro del dominio al que desea que se entregue el evento.
Esquemas de eventos
Un evento es la menor cantidad de información que describe completamente algo que sucedió en el sistema. Cuando se crea un tema o dominio personalizado, debe especificar el esquema que se usará al publicar eventos.
Event Grid admite varios esquemas para codificar eventos.
Esquema de Event Grid
Aunque puede configurar el tema para usar un esquema personalizado, es más común usar el esquema de Event Grid ya definido. Consulte las especificaciones y los requisitos aquí.
Esquema de CloudEvents v1.0
Otra opción es usar el esquema CloudEvents v1.0. CloudEvents es un proyecto de Cloud Native Computing Foundation que genera una especificación para describir los datos de eventos de una manera común. Puede encontrar el resumen del servicio de CloudEvents aquí.
EventGridPublisherClient
EventGridPublisherClient
proporciona operaciones para enviar datos de eventos a un nombre de host de tema especificado durante la inicialización del cliente.
Independientemente del esquema que el tema o dominio esté configurado para su uso, EventGridPublisherClient
se usará para publicar eventos en él. Use los eventos de publicación de send
métodos.
Se permiten enviar los siguientes formatos de eventos:
Una lista o una sola instancia de EventGridEvents fuertemente tipadas.
Representación dict de un objeto EventGridEvent serializado.
Una lista o una sola instancia de CloudEvents fuertemente tipadas.
Representación dict de un objeto CloudEvent serializado.
Representación dict de cualquier esquema personalizado.
Consulte los ejemplos para obtener ejemplos detallados.
Nota: Es importante saber si el tema admite CloudEvents o EventGridEvents antes de publicarlo. Si envía a un tema que no admite el esquema del evento que está enviando, send() producirá una excepción.
Temas del sistema
Un tema del sistema de Event Grid representa uno o varios eventos publicados por servicios de Azure, como Azure Storage o Azure Event Hubs. Por ejemplo, un tema del sistema puede representar todos los eventos de blob o solo los eventos de creación de blobs y eliminación de blobs publicados para una cuenta de almacenamiento específica.
Los nombres de los distintos tipos de eventos para los eventos del sistema publicados en Azure Event Grid están disponibles en azure.eventgrid.SystemEventNames
.
Para obtener una lista completa de temas reconocibles del sistema, visite Temas del sistema.
Para más información sobre los conceptos clave de Event Grid, consulte Conceptos en Azure Event Grid.
Event Grid en Kubernetes con Azure Arc
Event Grid en Kubernetes con Azure Arc es una oferta que le permite ejecutar Event Grid en su propio clúster de Kubernetes. Esta funcionalidad se habilita mediante el uso de Kubernetes habilitado para Azure Arc. Mediante Kubernetes habilitado para Azure Arc, se conecta a Azure un clúster de Kubernetes compatible. Una vez conectado, puede instalar Event Grid en él. Obtenga más información al respecto aquí.
Compatibilidad con eventos en la nube de CNCF
A partir de v4.7.0, este paquete también admite la publicación de un evento en la nube CNCF desde https://pypi.org/project/cloudevents/. Podría pasar un objeto CloudEvent de esta biblioteca a la send
API.
from cloudevents.http import CloudEvent
event = CloudEvent(...)
client.send(event)
Ejemplos
En las secciones siguientes se proporcionan varios fragmentos de código que abarcan algunas de las tareas más comunes de Event Grid, entre las que se incluyen:
- Envío de un evento de Event Grid
- Envío de un evento en la nube
- Enviar varios eventos
- Envío de eventos como diccionarios
- Consumo de una carga de la cola de almacenamiento
- Consumir desde ServiceBus
Envío de un evento de Event Grid
En este ejemplo se publica un evento de 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)
Envío de un evento en la nube
En este ejemplo se publica un evento en la nube.
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)
Envío de varios eventos
Es posible enviar eventos como un lote al enviar varios eventos a un tema o un dominio. En este ejemplo se envía una lista de CloudEvents mediante el método send.
ADVERTENCIA: Al enviar una lista de varios eventos a la vez, la iteración y el envío de cada evento no dará como resultado un rendimiento óptimo. Para obtener el mejor rendimiento, se recomienda enviar una 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)
Envío de eventos como diccionarios
También se puede usar una representación dict de los modelos serializados respectivos para publicar Eventos en la nube o EventGridEvent(s) aparte de los objetos fuertemente tipados.
Use una representación de tipo dict para enviar a un tema con un esquema personalizado, como se muestra a continuación.
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 desde la cola de almacenamiento
En este ejemplo se consume un mensaje recibido de la cola de almacenamiento y se deserializa en un 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 desde servicebus
En este ejemplo se consume un mensaje de carga recibido de ServiceBus y se deserializa en un 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]
Seguimiento distribuido con EventGrid
Puede usar OpenTelemetry para Python como de costumbre con EventGrid, ya que es compatible con la integración del seguimiento principal de Azure.
Este es un ejemplo del uso de OpenTelemetry para realizar un seguimiento del envío de un objeto CloudEvent.
En primer lugar, establezca OpenTelemetry como complemento de seguimiento habilitado para EventGrid.
from azure.core.settings import settings
from azure.core.tracing.ext.opentelemetry_span import OpenTelemetrySpan
settings.tracing_implementation = OpenTelemetrySpan
Uso de telemetría abierto normalmente desde aquí. Consulte OpenTelemetry para obtener más información.
En este ejemplo se usa un exportador de consola simple para exportar los seguimientos. Cualquier exportador se puede usar aquí, como azure-monitor-opentelemetry-exporter
, jaeger
, etc zipkin
.
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)
)
tracer
Una vez establecido y exporter
, siga el ejemplo siguiente para empezar a recopilar seguimientos mientras se usa el send
método de EventGridPublisherClient
para enviar un 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)
Solución de problemas
- Habilite el
azure.eventgrid
registrador para recopilar seguimientos de la biblioteca.
General
La biblioteca cliente de Event Grid generará excepciones definidas en Azure Core.
Registro
Esta biblioteca usa la biblioteca de registro estándar para el registro. La información básica sobre las sesiones HTTP (direcciones URL, encabezados, etc.) se registra en el nivel INFO.
Configuración opcional
Los argumentos de palabra clave opcionales se pueden pasar en el nivel de cliente y por operación. En la documentación de referencia de azure-core se describen las configuraciones disponibles para reintentos, registro, protocolos de transporte, etc.
Pasos siguientes
En la sección siguiente se proporcionan varios fragmentos de código que ilustran patrones comunes que se usan en la API de Python de Event Grid.
Más código de ejemplo
Estos ejemplos de código muestran operaciones de escenario de campeón comunes con la biblioteca cliente de Azure Event Grid.
Generar firma de acceso compartido: sample_generate_sas.py
Autenticación del cliente: sample_authentication.py (async_version)
Publicación de eventos en un tema mediante SAS: sample_publish_events_to_a_topic_using_sas_credential_async.py (async_version)
Publicar eventos de Event Grid en un tema: sample_publish_eg_events_to_a_topic.py (async_version)
Publicar eventos de EventGrid en un tema de dominio: sample_publish_eg_events_to_a_domain_topic.py (async_version)
Publicación de un evento en la nube: sample_publish_events_using_cloud_events_1.0_schema.py (async_version)
Publicar un esquema personalizado: sample_publish_custom_schema_to_a_topic.py (async_version)
En los ejemplos siguientes se tratan la publicación y el consumo dict
de representaciones de EventGridEvents y CloudEvents.
Publique EventGridEvent como representación similar: sample_publish_eg_event_using_dict.py (async_version)
Publicar CloudEvent como representación similar: sample_publish_cloud_event_using_dict.py (async_version)
Consumo de una carga personalizada de datos cloudevent sin procesar: sample_consume_custom_payload.py
Puede encontrar más ejemplos aquí.
- Puede ver más ejemplos relacionados con el escenario de envío aquí.
- Para ver más ejemplos relacionados con el consumo de una carga de diferentes servicios de mensajería como un objeto con tipo, visite Consumir ejemplos.
Documentación adicional
Para obtener documentación más amplia sobre Azure Event Grid, consulte la documentación de Event Grid sobre docs.microsoft.com.
Contribuciones
Este proyecto agradece las contribuciones y sugerencias. La mayoría de las contribuciones requieren que acepte un Contrato de licencia para el colaborador (CLA) que declara que tiene el derecho a concedernos y nos concede los derechos para usar su contribución. Para más información, visite cla.microsoft.com.
Cuando se envía una solicitud de incorporación de cambios, un bot de CLA determinará de forma automática si tiene que aportar un CLA y completar la PR adecuadamente (por ejemplo, la etiqueta, el comentario). Solo siga las instrucciones que le dará el bot. Solo será necesario que lo haga una vez en todos los repositorios con nuestro CLA.
Este proyecto ha adoptado el Código de conducta de Microsoft Open Source. Para más información, consulte las preguntas más frecuentes del código de conducta o póngase en contacto con opencode@microsoft.com si tiene cualquier otra pregunta o comentario.
Azure SDK for Python