GOOGLE ADS

Donnerstag, 14. April 2022

Azure-Funktion erfasst keine Eventhub-Ereignisse

Ich habe angefangen, mit Azure Functions herumzuspielen und habe das Problem, dass meine Funktion nicht durch Ereignisse ausgelöst wird, die in meinen Eventhub eintreten.

Dies ist der Code für meine Funktion:

host.json:

 "version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[2.*, 3.0.0)"
}
}

function.json:

 "scriptFile": "__init__.py",
"bindings": [
{
"type": "eventHubTrigger",
"name": "events",
"direction": "in",
"eventHubName": "eventhub",
"connection": "eventhub_connection",
"cardinality": "many",
"consumerGroup": "$Default",
"dataType": "stream"
}
]
}

init.py:

import logging
import azure.functions as func
def main(events: List[func.EventHubEvent]):
for event in events:
logging.info('Python EventHub trigger processed an event: %s',
event.get_body().decode('utf-8'))
logging.info(f'Function triggered to process a message: {event.get_body().decode()}')
logging.info(f' EnqueuedTimeUtc = {event.enqueued_time}')
logging.info(f' SequenceNumber = {event.sequence_number}')
logging.info(f' Offset = {event.offset}')
# def main(event: func.EventHubEvent):
# logging.info(f'Function triggered to process a message: {event.get_body().decode()}')
# logging.info(f' EnqueuedTimeUtc = {event.enqueued_time}')
# logging.info(f' SequenceNumber = {event.sequence_number}')
# logging.info(f' Offset = {event.offset}')
# # Metadata
# for key in event.metadata:
# logging.info(f'Metadata: {key} = {event.metadata[key]}')

 "IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "python",
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=storageaccount;AccountKey=storageacciuntaccesskey=;EndpointSuffix=core.windows.net",
"eventhub_connection": "Endpoint=sb://eventhub01.servicebus.windows.net/;SharedAccessKeyName=function;SharedAccessKey=0omitted;EntityPath=eventhub"
}
}

Ich habe mit dem grundlegenden Eventhub-Python-Code begonnen, der von den Azure Function Core-Tools bereitgestellt wird. Und ich habe verschiedene Codeteile getestet, die in Online-Beispielen aus Blogs von Leuten und der Microsoft-Dokumentation gefunden wurden.

Beim Umschalten auf Kardinalität: Eins -> ich wechsle auf den Code, der gerade auskommentiert ist. Ich weiß nicht, ob das so gehen soll, es fühlt sich für mich einfach richtig an.

In jedem Fall, unabhängig von der Kardinalitätseinstellung oder dem Datentyp, der zwischen Binär, Stream oder String geändert wird. Meine Funktion wird einfach nicht ausgelöst.

Ich kann meinen Eventhub abfragen und die Ereignisse sehen/lesen. Ich weiß also, dass meine Richtlinie und der Sharedkey und so gut funktionieren. Ich verwende auch nur die Verbrauchergruppe $Default.

Ich habe auch versucht, eine HTTP-ausgelöste Funktion einzurichten, und diese Funktion wird von Azure Monitor ausgelöst. Ich kann in den Protokollen jede Anfrage sehen, die in die Funktion eingeht.

Mache ich im Code für meine Eventhub-Funktion etwas falsch? Übersehe ich vielleicht eine andere Konfigurationseinstellung? Ich habe bereits die Zugriffsregeln für die Funktion überprüft, aber das spielt keine Rolle, oder? Die Funktion zieht das Ereignis aus dem Eventhub. Es werden keine Daten von einem Initiator gesendet.

Bearbeiten: Die Konfiguration der Datei local.settings.json hinzugefügt und die Datei function.json aktualisiert. Bearbeiten 2: Die Lösung für mein spezifisches Problem befindet sich in den Kommentaren der Antwort.


Lösung des Problems

Aktualisieren:

__init__.py der Funktion:

from typing import List
import logging
import azure.functions as func
def main(events: List[func.EventHubEvent]):
for event in events:
logging.info('Python EventHub trigger processed an event: %s',
event.get_body().decode('utf-8'))

Nachricht an Event Hub senden:

import asyncio
from azure.eventhub.aio import EventHubProducerClient
from azure.eventhub import EventData
async def run():
# Create a producer client to send messages to the event hub.
# Specify a connection string to your event hubs namespace and
# the event hub name.
producer = EventHubProducerClient.from_connection_string(conn_str="Endpoint=sb://testbowman.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxxxxx;EntityPath=test", eventhub_name="test")
async with producer:
# Create a batch.
event_data_batch = await producer.create_batch()
# Add events to the batch.
event_data_batch.add(EventData('First event '))
event_data_batch.add(EventData('Second event'))
event_data_batch.add(EventData('Third event'))
# Send the batch of events to the event hub.
await producer.send_batch(event_data_batch)
loop = asyncio.get_event_loop()
loop.run_until_complete(run())

Und stellen Sie bitte sicher, dass Sie den richtigen Event-Hub-Namen angeben:

Geben Sie hier die Bildbeschreibung ein

Es scheint, dass Sie function.jsonein Problem haben, die Verbindungszeichenfolge sollte nicht direkt in das Bindungselement eingefügt werden.

Es sollte wie folgt sein:

function.json

{
"scriptFile": "__init__.py",
"bindings": [
{
"type": "eventHubTrigger",
"name": "events",
"direction": "in",
"eventHubName": "test",
"connection": "testbowman_RootManageSharedAccessKey_EVENTHUB",
"cardinality": "many",
"consumerGroup": "$Default",
"dataType": "binary"
}
]
}

local.settings.json

{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=0730bowmanwindow;AccountKey=xxxxxx;EndpointSuffix=core.windows.net",
"FUNCTIONS_WORKER_RUNTIME": "python",
"testbowman_RootManageSharedAccessKey_EVENTHUB": "Endpoint=sb://testbowman.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xxxxxx;EntityPath=test"
}
}

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...