Übung – Erstellen einer Azure-Funktion zum Simulieren von Telemetriedaten

Abgeschlossen

Für das vorliegende Beispiel wird das Ereignissourcing verwendet. Erstellen wir eine Funktion, die Telemetriedaten simuliert und an einen Event Hub sendet. Später kann eine andere Funktion dieses Ereignisses überwachen und verarbeiten und in einer Datenbank speichern, die mit Azure Cosmos DB erstellt wurde.

Visualisierung des Event-Sourcing für den Kaffeekauf in einem Café.

Vorbereiten Ihrer Umgebung

Definieren wir einige Umgebungsvariablen, um die folgenden Befehle so kurz und verständlich wie möglich zu halten. Definieren Sie die <value> Platzhalter, und fügen Sie die folgenden Befehle in Ihr Terminal oder Befehlszeilentool ein, und führen Sie sie aus:

RESOURCE_GROUP=<value>
EVENT_HUB_NAMESPACE=<value>
EVENT_HUB_NAME=<value>
EVENT_HUB_AUTHORIZATION_RULE=<value>
COSMOS_DB_ACCOUNT=<value>
STORAGE_ACCOUNT=<value>
FUNCTION_APP=<value>
LOCATION=<value>

Hinweis

Um die LOCATION-Variable festzulegen, können Sie den az functionapp list-consumption-locations Befehl überprüfen und den nächstgelegenen Speicherort verwenden.

Erstellen der erforderlichen Komponenten

Die Bereitstellung der Ressourcen in Azure dauert einige Zeit. Beginnen wir mit der Komponentenerstellung so früh wie möglich, um lange Wartezeiten später zu vermeiden.

Erstellen einer Ressourcengruppe

Es ist immer ratsam, alle Ressourcen einer Schulung, eines Machbarkeitsnachweises oder eines Prototyps in einer Ressourcengruppe zu binden. Auf diese Weise können Sie alle verwendeten Dienste bequem mit einem Befehl bereinigen. Um eine Ressourcengruppe am angegebenen Speicherort zu erstellen, führen Sie den folgenden Befehl in Ihrem Terminal aus:

az group create \
    --name $RESOURCE_GROUP \
    --location $LOCATION

Erstellen und Konfigurieren eines Event Hubs

Für den Event Hub muss der Namespace angegeben werden, an dem er lauschen soll. Außerdem müssen Sie die Autorisierungsregel auf Listen und Send konfigurieren.

az eventhubs namespace create \
    --resource-group $RESOURCE_GROUP \
    --name $EVENT_HUB_NAMESPACE
az eventhubs eventhub create \
    --resource-group $RESOURCE_GROUP \
    --name $EVENT_HUB_NAME \
    --namespace-name $EVENT_HUB_NAMESPACE \
az eventhubs eventhub authorization-rule create \
    --resource-group $RESOURCE_GROUP \
    --name $EVENT_HUB_AUTHORIZATION_RULE \
    --eventhub-name $EVENT_HUB_NAME \
    --namespace-name $EVENT_HUB_NAMESPACE \
    --rights Listen Send

Erstellen, Konfigurieren und Bereitstellen der Azure-Funktion

Um dieses Beispiel so realistisch wie möglich zu gestalten, erstellen Sie eine Azure-Funktion und simulieren Telemetriedaten. Sie könnten auch ein IoT-Gerät an Ihre Azure-Funktion binden, wodurch dann echte Daten verwendet werden. Da es sich bei dieser Funktion um die ereigniserzeugende Funktion handelt, fügen wir ein p- oder -p-Flag hinzu.

az storage account create \
    --resource-group $RESOURCE_GROUP \
    --name $STORAGE_ACCOUNT"p" \
    --sku Standard_LRS
az functionapp create \
    --resource-group $RESOURCE_GROUP \
    --name $FUNCTION_APP"-p"\
    --storage-account $STORAGE_ACCOUNT"p" \
    --consumption-plan-location $LOCATION \
    --runtime java \
    --functions-version 4

Hinweis

Verwenden Sie Funktionsversion 4, da die Versionen 2 und 3 seit Dezember 2022 als veraltet gelten.

Wenn der az functionapp create Befehl Ihre Funktionsanwendung erstellt, wird auch eine Application Insights-Ressource mit demselben Namen erstellt. Wir verwenden diese Ressource später für unsere Überwachung.

Um die Verbindungszeichenfolgen für das Speicherkonto und den Event Hub abzurufen, verwenden Sie die folgenden Befehle, um sie in Umgebungsvariablen zu speichern und dann mit dem echo Befehl anzuzeigen.

AZURE_WEB_JOBS_STORAGE=$( \
    az storage account show-connection-string \
        --resource-group $RESOURCE_GROUP \
        --name $STORAGE_ACCOUNT"p" \
        --query connectionString \
        --output tsv)
echo $AZURE_WEB_JOBS_STORAGE
EVENT_HUB_CONNECTION_STRING=$( \
    az eventhubs eventhub authorization-rule keys list \
        --resource-group $RESOURCE_GROUP \
        --name $EVENT_HUB_AUTHORIZATION_RULE \
        --eventhub-name $EVENT_HUB_NAME \
        --namespace-name $EVENT_HUB_NAMESPACE \
        --query primaryConnectionString \
        --output tsv)
echo $EVENT_HUB_CONNECTION_STRING

Um die Verbindungszeichenfolgen in den Anwendungseinstellungen Ihres Azure Function-Kontos zu speichern, führen Sie den folgenden Befehl in Ihrem Terminal aus:

az functionapp config appsettings set \
    --resource-group $RESOURCE_GROUP \
    --name $FUNCTION_APP"-p" \
    --settings \
        AzureWebJobsStorage=$AZURE_WEB_JOBS_STORAGE \
        EventHubConnectionString=$EVENT_HUB_CONNECTION_STRING

Jetzt sind Ihre Azure-Ressourcen, der Event Hub und die Azure-Funktion, erstellt und so konfiguriert, dass sie ordnungsgemäß zusammenarbeiten.

Erstellen Sie als Nächstes ein Projekt mit lokalen Funktionen mit Maven.

mvn archetype:generate --batch-mode \
    -DarchetypeGroupId=com.microsoft.azure \
    -DarchetypeArtifactId=azure-functions-archetype \
    -DappName=$FUNCTION_APP"-p" \
    -DresourceGroup=$RESOURCE_GROUP \
    -DappRegion=$LOCATION \
    -DappServicePlanName=$LOCATION"plan" \
    -DgroupId=com.learn \
    -DartifactId=telemetry-functions-producer

Dieser Befehl generiert mehrere Dateien in einem telemetry-functions-producer-Ordner:

  • Die pom.xml Builddatei mit vordefinierten Azure-Abhängigkeiten.
  • Die local.settings.json Datei, die die Anwendungseinstellungen für die lokale Bereitstellung und manuelle Tests enthält.
  • Eine host.json Datei, die das Azure Functions Extension Bundle aktiviert.
  • Eine Function.java Datei, die die standardmäßige HTTP-Triggerfunktion enthält.
  • Einige Testdateien, die dieses Lernmodul nicht verwendet.

Wir berühren die Testdateien in diesem Lernmodul nicht, daher können Sie sie löschen.

cd telemetry-functions-producer
rm -r src/test

Für die lokale Ausführung müssen die Anwendungseinstellungen abgerufen und in der local.settings.json Datei gespeichert werden. Sie können dies automatisch tun, indem Sie den fetch-app-settings Befehl ausführen.

func azure functionapp fetch-app-settings $FUNCTION_APP"-p"

Öffnen Sie als Nächstes die Function.java Datei, und ersetzen Sie den Inhalt durch den folgenden Code:

package com.learn;

import com.microsoft.azure.functions.annotation.EventHubOutput;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.TimerTrigger;
import com.microsoft.azure.functions.ExecutionContext;
public class Function {

    @FunctionName("generateSensorData")
    @EventHubOutput(
        name = "event",
        eventHubName = "", // blank because the value is included in the connection string
        connection = "EventHubConnectionString")
    public TelemetryItem generateSensorData(
        @TimerTrigger(
            name = "timerInfo",
            schedule = "*/10 * * * * *") // every 10 seconds
            String timerInfo,
        final ExecutionContext context) {
            context.getLogger().info("Java Timer trigger function executed at: " + java.time.LocalDateTime.now());
            double temperature = Math.random() * 100;
            double pressure = Math.random() * 50;
        return new TelemetryItem(temperature, pressure);
    }
}

Die Funktion generateSensorData simuliert einen Sensor, der Temperatur- und Druckmesswerte an den Event Hub sendet. Ein Trigger mit Timer führt die Funktion alle 10 Sekunden aus, und eine Event Hub-Ausgabebindung sendet den Rückgabewert an den Event Hub.

Wenn der Event Hub die Nachricht empfängt, generiert er ein Ereignis.

Die von dieser Funktion verwendeten Daten werden mithilfe einer Klasse namens TelemetryItem gespeichert, die Sie implementieren müssen. Erstellen Sie eine neue Datei namens TelemetryItem.java an demselben Speicherort wie Function.java, und fügen Sie den folgenden Code hinzu:

package com.learn;

public class TelemetryItem {

    private String id;
    private double temperature;
    private double pressure;
    private boolean isNormalPressure;
    private status temperatureStatus;
    static enum status {
        COOL,
        WARM,
        HOT
    }

    public TelemetryItem(double temperature, double pressure) {
        this.temperature = temperature;
        this.pressure = pressure;
    }

    public String getId() {
        return id;
    }

    public double getTemperature() {
        return temperature;
    }

    public double getPressure() {
        return pressure;
    }

    @Override
    public String toString() {
        return "TelemetryItem={id=" + id + ",temperature="
            + temperature + ",pressure=" + pressure + "}";
    }

    public boolean isNormalPressure() {
        return isNormalPressure;
    }

    public void setNormalPressure(boolean isNormal) {
        this.isNormalPressure = isNormal;
    }

    public status getTemperatureStatus() {
        return temperatureStatus;
    }

    public void setTemperatureStatus(status temperatureStatus) {
        this.temperatureStatus = temperatureStatus;
    }
}

Lokal ausführen

Wenn Sie Azure-Funktionen lokal ausführen, werden sie bereits auf der ganzen Welt gestreamt! Außerdem können Sie sie in Ihrem Azure-Portal überprüfen.

mvn clean package
mvn azure-functions:run

Nach einigen Build- und Startnachrichten wird eine Ausgabe wie im folgenden Beispiel für jede Ausführung der Funktion angezeigt:

[2021-01-19T16:25:40.005Z] Executing 'Functions.generateSensorData' (Reason='Timer fired at 2021-01-19T17:25:40.0044630+01:00', Id=fcf567a3-03ec-4159-9714-aa4449861b30)
[2021-01-19T16:25:40.011Z] Java Timer trigger function executed at: 2021-01-19T17:25:40.009405
[2021-01-19T16:25:40.013Z] Function "generateSensorData" (Id: fcf567a3-03ec-4159-9714-aa4449861b30) invoked by Java Worker
[2021-01-19T16:25:40.048Z] Executed 'Functions.generateSensorData' (Succeeded, Id=fcf567a3-03ec-4159-9714-aa4449861b30, Duration=43ms)

Hinweis

Bevor Sie Ihre Funktion in der Azure-Cloud bereitstellen und ausführen, können Sie Ereignisse von Ihrem lokalen Computer auf der ganzen Welt senden! Dies ist sehr nützlich für die Entwicklung, das Debuggen und lokale Tests.

Bereitstellen in Azure

Lösen Sie die Bereitstellung in Azure aus, indem Sie den Befehl mvn azure-functions:deploy ausführen, und fahren Sie fort.

mvn azure-functions:deploy