Condividi tramite


Usare WebAssembly (WASM) con grafici del flusso di dati (anteprima)

Importante

WebAssembly (WASM) con grafici del flusso di dati è disponibile in ANTEPRIMA. Questa funzionalità presenta limitazioni e non è per i carichi di lavoro di produzione.

Vedere le Condizioni per l'utilizzo supplementari per le anteprime di Microsoft Azure per le condizioni legali applicabili alle funzionalità di Azure in versione beta, in anteprima o non ancora rilasciate nella disponibilità generale.

I grafici dei flussi di dati di Operazioni di Azure IoT supportano moduli WebAssembly (WASM) per l'elaborazione dei dati personalizzata nella rete perimetrale. È possibile distribuire trasformazioni di dati e logica di business personalizzate come parte delle pipeline del flusso di dati.

Suggerimento

Si vuole eseguire l'intelligenza artificiale in banda? Vedere Eseguire l'inferenza ONNX nei grafici del flusso di dati di WebAssembly per creare pacchetti ed eseguire modelli ONNX di piccole dimensioni all'interno degli operatori WASM.

Importante

I grafici del flusso di dati supportano attualmente solo gli endpoint MQTT, Kafka e OpenTelemetry. Altri tipi di endpoint come Data Lake, Microsoft Fabric OneLake, Esplora dati di Azure e Archiviazione locale non sono supportati. Per altre informazioni, vedere Problemi noti.

Prerequisiti

  • Distribuire un'istanza di Operazioni IoT di Azure in un cluster Kubernetes abilitato per Arc. Per altre informazioni, vedere Distribuire le operazioni di Azure IoT.
  • Usare Registro Azure Container per archiviare moduli e grafici WASM.
  • Installare l'interfaccia della riga di comando di OCI Registry As Storage (ORAS) per eseguire il push dei moduli WASM nel registro.
  • Sviluppare moduli WASM personalizzati seguendo le indicazioni riportate in Sviluppare moduli WebAssembly per i grafici del flusso di dati.

Informazioni generali

I moduli WebAssembly (WASM) nei grafici del flusso di dati di Operazioni di Azure IoT consentono di elaborare i dati nella rete perimetrale con prestazioni e sicurezza elevate. WASM viene eseguito in un ambiente in modalità sandbox e supporta Rust e Python.

Funzionamento dei grafici del flusso di dati WASM

L'implementazione del flusso di dati WASM segue questo flusso di lavoro:

  1. Sviluppare moduli WASM: scrivere la logica di elaborazione personalizzata in un linguaggio supportato e compilarla nel formato Modello componente WebAssembly.
  2. Sviluppare la definizione dei grafici: definire il modo in cui i dati si spostano tra i moduli usando i file di configurazione YAML. Per informazioni dettagliate, vedere Configurare le definizioni dei grafici WebAssembly.
  3. Archiviare gli artefatti nel registro: eseguire il push dei moduli WASM compilati in un registro contenitori usando strumenti compatibili con OCI, ad esempio ORAS.
  4. Configurare gli endpoint del registro: configurare i dettagli di autenticazione e connessione in modo che Operazioni di Azure IoT possa accedere al registro contenitori.
  5. Creare un grafico del flusso di dati: definire le origini dati, il nome dell'artefatto e le destinazioni.
  6. Distribuire ed eseguire: Operazioni di Azure IoT esegue il pull dei moduli WASM dal registro e li esegue in base alla definizione del grafico.

Gli esempi seguenti illustrano come configurare e distribuire grafici del flusso di dati WASM per scenari comuni. Gli esempi usano valori hardcoded e configurazioni semplificate per consentire di iniziare rapidamente.

Configurare il registro contenitori

Per eseguire il pull di moduli WASM e delle definizioni dei grafici, Operazioni di Azure IoT necessita di un registro contenitori. È possibile usare Registro Azure Container o un altro registro compatibile con OCI.

Per creare e configurare un'istanza del Registro Azure Container, vedere Distribuire Registro Azure Container.

Installare l'interfaccia della riga di comando di ORAS

Usare l'interfaccia della riga di comando di ORAS per eseguire il push di moduli WASM e delle definizioni dei grafici nel registro contenitori. Per istruzioni di installazione, vedere Installare ORAS.

Eseguire il pull dei moduli di esempio dal registro pubblico

Usare moduli di esempio predefiniti:

# Pull sample modules and graphs
oras pull ghcr.io/azure-samples/explore-iot-operations/graph-simple:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/graph-complex:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/temperature:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/window:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/snapshot:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/format:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/humidity:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/collection:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/enrichment:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/filter:1.0.0

Eseguire il push dei moduli nel registro

Dopo aver ottenuto i moduli e i grafici di esempio, esegui il push dei moduli e dei grafici nel registro contenitori. Sostituire <YOUR_ACR_NAME> con il nome del Registro Azure Container. Per assicurarsi che i grafici e i moduli siano visibili nell'interfaccia utente Web dell'esperienza operativa, aggiungere i --config flag e --artifact-type come illustrato nell'esempio seguente:

# Log in to your ACR
az acr login --name <YOUR_ACR_NAME>

# Push modules to your registry
oras push <YOUR_ACR_NAME>.azurecr.io/graph-simple:1.0.0 --config /dev/null:application/vnd.microsoft.aio.graph.v1+yaml graph-simple.yaml:application/yaml --disable-path-validation
oras push <YOUR_ACR_NAME>.azurecr.io/graph-complex:1.0.0 --config /dev/null:application/vnd.microsoft.aio.graph.v1+yaml graph-complex.yaml:application/yaml --disable-path-validation
oras push <YOUR_ACR_NAME>.azurecr.io/temperature:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm temperature-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/window:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm window-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/snapshot:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm snapshot-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/format:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm format-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/humidity:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm humidity-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/collection:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm collection-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/enrichment:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm enrichment-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/filter:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm filter-1.0.0.wasm:application/wasm

Suggerimento

È anche possibile eseguire il push di moduli personalizzati e creare grafici personalizzati, vedere Configurazione dei grafici del flusso di dati personalizzati.

Creare un endpoint del registro

Un endpoint del registro definisce la connessione al registro contenitori. I grafici del flusso di dati usano gli endpoint del registro per eseguire il pull di moduli WASM e definizioni dei grafici dai registri contenitori. Per informazioni dettagliate sulla configurazione degli endpoint del registro con diversi metodi di autenticazione e tipi di registro, vedere Configurare gli endpoint del registro.

Per creare endpoint del Registro di sistema, è possibile usare il portale di Azure, Bicep o i manifesti Kubernetes. Dopo aver creato un endpoint del Registro di sistema, i grafici di cui è stato eseguito il push nel registro contenitori sono pronti per essere usati nell'esperienza operativa nei grafici del flusso di dati.

Per una configurazione rapida con Registro Azure Container, creare un endpoint del registro con l'autenticazione basata su identità gestita assegnata dal sistema:

È possibile usare il portale di Azure per creare endpoint del Registro di sistema. L'esperienza del portale consente di specificare e fornire i dettagli dell'host di un Registro Azure Container e, facoltativamente, specificare le credenziali. Prima di iniziare, assicurarsi di avere le informazioni seguenti:

  • Nome dell'endpoint del Registro di sistema.
  • Nome host per il Registro Azure Container.
  • Sono supportati quattro tipi di autenticazione:
    • Anonimo
    • Identità gestita dal sistema
    • Identità gestita dall'utente
    • Artefatto segreto

Per creare un endpoint del Registro di sistema nel portale di Azure, seguire questa procedura.

Creare endpoint del Registro di sistema con autenticazione anonima

È possibile creare un nuovo endpoint del Registro di sistema specificando i dettagli host di un Registro Azure Container, abilitare l'accesso anonimo per il recupero di immagini pubbliche e archiviare la configurazione per il riutilizzo. Selezionare prima di tutto il tipo di autenticazione da usare. In questo esempio viene usata l'autenticazione anonima:

Screenshot del modulo di autenticazione selezionato.

Screenshot della configurazione di autenticazione anonima completata per l'endpoint del Registro di sistema.

Creare endpoint del Registro di sistema con l'autenticazione dell'identità gestita dal sistema

È possibile creare un nuovo endpoint del Registro di sistema specificando i dettagli host di un Registro Azure Container, eseguire l'autenticazione usando un'identità gestita assegnata dal sistema per l'accesso sicuro e archiviare la configurazione per il riutilizzo.

Screenshot della configurazione completata dell'autenticazione dell'identità gestita dal sistema per l'endpoint del registro.

Creare endpoint del registro con identità gestita dall'utente

È possibile creare un nuovo endpoint del Registro di sistema specificando i dettagli host di un Registro Azure Container, eseguire l'autenticazione usando un'identità gestita assegnata dall'utente per l'accesso sicuro e archiviare la configurazione per il riutilizzo.

Annotazioni

Gli ID client e tenant sono necessari per abilitare l'identità gestita dall'utente.

Screenshot della configurazione di autenticazione dell'identità gestita dall'utente completata per l'endpoint del Registro di sistema.

Creare endpoint del Registro di sistema con segreti degli artefatti

I segreti degli artefatti vengono usati per l'autenticazione con registri di container privati, come Azure Container Registry, Docker Hub o MCR, quando si eseguono pull delle immagini dei container. I segreti sono essenziali quando il Registro di sistema richiede credenziali e l'immagine non è accessibile pubblicamente. Questo scenario consente di gestire i grafici del flusso di dati tra le operazioni di Azure IoT e l'esperienza operativa. È possibile configurare i segreti degli artefatti da Azure Key Vault selezionando i segreti esistenti.

È possibile creare un nuovo endpoint del registro specificando i dettagli host di un'ACR, autenticandosi usando i segreti degli artefatti per un accesso sicuro e archiviare la configurazione affinché possa essere riutilizzata:

Screenshot dell'interfaccia di selezione dei segreti di Azure Key Vault per i segreti degli artefatti.

È possibile configurare i segreti degli artefatti da Azure Key Vault creando nuovi segreti e archiviandoli in Azure Key Vault:

Schermata del modulo Crea nuovo segreto in Azure Key Vault per i segreti degli artefatti.

Annotazioni

È possibile riutilizzare gli endpoint del registro di sistema tra più grafici del flusso di dati e altri componenti di Operazioni di Azure IoT, ad esempio i connettori Akri.

Ottenere il nome dell'estensione

# Get extension name
az k8s-extension list \
  --resource-group <RESOURCE_GROUP> \
  --cluster-name <CLUSTER_NAME> \
  --cluster-type connectedClusters \
  --query "[?extensionType=='microsoft.iotoperations'].name" \
  --output tsv

Il primo comando restituisce il nome dell'estensione, ad esempio azure-iot-operations-4gh3y.

Configurare le autorizzazioni per l'identità gestita

Per consentire a Operazioni di Azure IoT di eseguire il pull dei moduli WASM dal registro contenitori, assegnare all'identità gestita le autorizzazioni appropriate. L'estensione Operazioni IoT usa un'identità gestita assegnata dal sistema che richiede il ruolo AcrPull nel Registro Azure Container. Assicurarsi di avere i prerequisiti seguenti:

  • Autorizzazioni di proprietario nel Registro Azure Container.
  • Il registro contenitori può trovarsi in una sottoscrizione o un gruppo di risorse diverso, ma deve trovarsi nello stesso tenant della distribuzione di Operazioni IoT.

Eseguire questi comandi per assegnare il ruolo AcrPull all'identità gestita da Operazioni IoT:

# Get the IoT Operations extension managed identity
export EXTENSION_OBJ_ID=$(az k8s-extension list --cluster-name $CLUSTER_NAME -g $RESOURCE_GROUP --cluster-type connectedClusters --query "[?extensionType=='microsoft.iotoperations'].identity.principalId" -o tsv)

# Get the application ID for the managed identity
export SYSTEM_ASSIGNED_MAN_ID=$(az ad sp show --id $EXTENSION_OBJ_ID --query "appId" -o tsv)

# Assign the AcrPull role to the managed identity
az role assignment create --role "AcrPull" --assignee $SYSTEM_ASSIGNED_MAN_ID --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"

Per altre informazioni sui ruoli del registro contenitori, vedere Ruoli e autorizzazioni del Registro Azure Container.

Se si verificano errori di autenticazione relativi all'interfaccia della riga di comando di Azure, assegnare le autorizzazioni nel portale di Azure:

  1. Passare a Registro Azure Container nel portale di Azure.
  2. Selezionare Controllo di accesso (IAM) dal menu.
  3. Seleziona Aggiungi>Aggiungi assegnazione ruolo.
  4. Scegliere il ruolo predefinito AcrPull.
  5. Selezionare Utente, gruppo o entità servizio come opzione per l'assegnazione dell'accesso.
  6. Cercare e selezionare il nome dell'estensione Operazioni IoT, ad esempio azure-iot-operations-4gh3y.
  7. Selezionare Salva per completare l'assegnazione di ruolo.

Per istruzioni dettagliate, vedere Assegnare ruoli di Azure usando il portale di Azure.

Esempio 1: Distribuzione di base con un modulo WASM

Questo esempio converte i dati relativi alla temperatura da Fahrenheit a Celsius usando un modulo WASM. Il codice sorgente del modulo temperature è disponibile in GitHub. Usare la versione graph-simple:1.0.0 precompilata di cui è stato eseguito il push nel registro contenitori.

Come funziona

La definizione del grafico crea una pipeline semplice e a tre fasi:

  1. Origine: riceve i dati sulla temperatura da MQTT
  2. Mappa: elabora i dati con il modulo WASM TEMPERATURE
  3. Sink: invia nuovamente i dati convertiti a MQTT

Per informazioni dettagliate sul funzionamento della definizione del grafico semplice e sulla relativa struttura, vedere Esempio 1: Definizione di grafico semplice.

Formato di input:

{"temperature": {"value": 100.0, "unit": "F"}}

Formato output:

{"temperature": {"value": 37.8, "unit": "C"}}

La configurazione seguente crea un grafico del flusso di dati che usa questa pipeline di conversione della temperatura. Il grafico fa riferimento all'artefatto graph-simple:1.0.0, che contiene la definizione YAML ed esegue il pull del modulo temperature dal registro contenitori.

Configurare il grafico del flusso di dati

Questa configurazione definisce tre nodi che implementano il flusso di lavoro di conversione della temperatura: un nodo di origine che sottoscrive i dati relativi alla temperatura in ingresso, un nodo di elaborazione del grafo che esegue il modulo WASM e un nodo di destinazione che pubblica i risultati convertiti.

La risorsa del grafico del flusso di dati "esegue il wrapping" dell'artefatto della definizione del grafico e connette le operazioni astratte di origine/sink agli endpoint concreti:

  • L'operazione source della definizione del grafico si connette al nodo di origine del flusso di dati (argomento MQTT)
  • L'operazione sink della definizione del grafico si connette al nodo di destinazione del flusso di dati (argomento MQTT)
  • Le operazioni di elaborazione della definizione del grafico vengono eseguite all'interno del nodo di elaborazione del grafico

Questa separazione consente di distribuire la stessa definizione del grafico con endpoint diversi nei diversi ambienti mantenendo al contempo invariata la logica di elaborazione.

  1. Per creare un grafico del flusso di dati nell'esperienza operativa, passare alla scheda Flusso di dati .

  2. Selezionare il menu a discesa accanto a + Crea e selezionare Crea un grafico del flusso di dati

    Screenshot dell'interfaccia dell'esperienza operativa che mostra come creare un grafico del flusso di dati.

  3. Selezionare il nome segnaposto new-data-flow per impostare le proprietà del flusso di dati. Immettere il nome del grafico del flusso di dati e scegliere il profilo del flusso di dati da usare.

  4. Nel diagramma del flusso di dati selezionare Origine per configurare il nodo di origine. In Dettagli origine, selezionare Asset o Endpoint flusso di dati.

    Screenshot dell'interfaccia dell'esperienza operativa che mostra come selezionare un'origine per il grafico del flusso di dati.

    1. Se si seleziona Asset, scegliere l'asset da cui estrarre i dati e fare clic su Applica.

    2. Selezionando Endpoint flusso di dati, inserisci i dettagli seguenti e fai clic su Applica.

      Impostazione Description
      Endpoint del flusso di dati Selezionare l'impostazione predefinita per usare l'endpoint predefinito del broker messaggi MQTT.
      Argomento Filtro dell'argomento a cui sottoscrivere per i messaggi in arrivo. Usare Argomento/i>Aggiungi riga per aggiungere più argomenti.
      Schema del messaggio Schema da utilizzare per deserializzare i messaggi in arrivo.
  5. Nel diagramma del flusso di dati selezionare Aggiungi trasformazione grafico (facoltativo) per aggiungere un nodo di elaborazione del grafo. Nel riquadro di selezione Grafico selezionare graph-simple:1 e fare clic su Applica.

    Screenshot dell'interfaccia dell'esperienza operativa che mostra come creare un semplice grafico del flusso di dati.

    Importante

    Questo esempio usa l'artefatto graph-simple:1.0.0 di cui è stato eseguito il push nel registro contenitori. È possibile creare grafici personalizzati sviluppando moduli WASM personalizzati ed eseguendone il push nel registro contenitori. I grafici di cui si esegue il push nel registro contenitori sono disponibili nel pannello di selezione grafico.

  6. È possibile configurare alcune impostazioni dell'operatore del grafo selezionando il nodo del grafo nel diagramma. Ad esempio, è possibile selezionare l'operatore module-temperature/map e immettere nel key2 valore example-value-2. Fare clic su Applica per salvare le modifiche.

    Screenshot dell'interfaccia dell'esperienza operativa che mostra come configurare un semplice grafico del flusso di dati.

  7. Nel diagramma del flusso di dati selezionare Destinazione per configurare il nodo di destinazione.

  8. Selezionare Salva sotto il nome del grafico del flusso di dati per salvare il grafico del flusso di dati.

Testare il flusso di dati

Per testare il flusso di dati, inviare messaggi MQTT dall'interno del cluster. Distribuire prima di tutto il pod client MQTT seguendo le istruzioni riportate in Testare la connettività al broker MQTT con i client MQTT. Il client MQTT fornisce i token di autenticazione e i certificati per la connessione al broker. Per distribuire il client MQTT, eseguire il comando seguente:

kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml

Inviare messaggi relativi alla temperatura

Nella prima sessione del terminale creare ed eseguire uno script per inviare dati sulla temperatura in Fahrenheit:

# Connect to the MQTT client pod
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh -c '
# Create and run temperature.sh from within the MQTT client pod
while true; do
  # Generate a random temperature value between 0 and 6000 Fahrenheit
  random_value=$(shuf -i 0-6000 -n 1)
  payload="{\"temperature\":{\"value\":$random_value,\"unit\":\"F\"}}"

  echo "Publishing temperature: $payload"

  # Publish to the input topic
  mosquitto_pub -h aio-broker -p 18883 \
    -m "$payload" \
    -t "sensor/temperature/raw" \
    -d \
    --cafile /var/run/certs/ca.crt \
    -D PUBLISH user-property __ts $(date +%s)000:0:df \
    -D CONNECT authentication-method 'K8S-SAT' \
    -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

  sleep 1
done'

Annotazioni

La proprietà utente MQTT __ts viene usata per aggiungere un timestamp ai messaggi per garantire l'elaborazione tempestiva dei messaggi tramite clock logico ibrido (HLC). La presenza del timestamp consente al flusso di dati di decidere se accettare o rimuovere il messaggio. Il formato della proprietà è <timestamp>:<counter>:<nodeid>. Rende l'elaborazione del flusso di dati più accurata, ma non è obbligatoria.

Lo script pubblica dati di temperatura casuali nell'argomento sensor/temperature/raw ogni secondo. L'aspetto dovrebbe risultare simile al seguente:

Publishing temperature: {"temperature":{"value":1234,"unit":"F"}}
Publishing temperature: {"temperature":{"value":5678,"unit":"F"}}

Lasciare lo script in esecuzione per continuare a pubblicare i dati relativi alla temperatura.

Sottoscrivere messaggi elaborati

Nella seconda sessione del terminale, anch'essa connessa al pod client MQTT, sottoscrivere l'argomento di output per visualizzare i valori di temperatura convertiti:

# Connect to the MQTT client pod
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh -c '
mosquitto_sub -h aio-broker -p 18883 -t "sensor/temperature/processed" --cafile /var/run/certs/ca.crt \
-D CONNECT authentication-method "K8S-SAT" \
-D CONNECT authentication-data "$(cat /var/run/secrets/tokens/broker-sat)"'

Vengono visualizzati dati relativi alla temperatura convertiti da Fahrenheit a Celsius dal modulo WASM.

{"temperature":{"value":1292.2222222222222,"count":0,"max":0.0,"min":0.0,"average":0.0,"last":0.0,"unit":"C","overtemp":false}}
{"temperature":{"value":203.33333333333334,"count":0,"max":0.0,"min":0.0,"average":0.0,"last":0.0,"unit":"C","overtemp":false}}

Esempio 2: Distribuire un grafico complesso

In questo esempio viene illustrato un flusso di lavoro di elaborazione dati sofisticato che gestisce più tipi di dati, tra cui temperatura, umidità e dati di immagine. La definizione del grafico complesso orchestra più moduli WASM per eseguire analisi avanzate e rilevamento degli oggetti.

Come funziona

Il grafico complesso elabora tre flussi di dati e li combina nell'analisi dei sensori arricchita:

  • Elaborazione della temperatura: converte i dati da Fahrenheit in Celsius, filtra le letture non valide e calcola le statistiche
  • Elaborazione dell'umidità: accumula le misurazioni dell'umidità negli intervalli di tempo
  • Elaborazione immagini: esegue il rilevamento oggetti sugli snapshot della fotocamera e formatta i risultati

Per informazioni dettagliate sul funzionamento della definizione del grafico complesso, sulla relativa struttura e sul flusso di dati attraverso più fasi di elaborazione, vedere Esempio 2: Definizione di grafico complesso.

Il grafico usa moduli specializzati degli esempi di Rust.

Configurare il grafico del flusso di dati complesso

Questa configurazione implementa il flusso di lavoro di elaborazione a più sensori usando l'artefatto graph-complex:1.0.0. Si noti che la distribuzione del grafico del flusso di dati è simile all'esempio 1: entrambi usano lo stesso modello a tre nodi (origine, processore grafico, destinazione) anche se la logica di elaborazione è diversa.

Questa somiglianza è presente perché la risorsa del grafico del flusso di dati funge da ambiente host che carica ed esegue definizioni di grafico. La logica di elaborazione effettiva risiede nell'artefatto di definizione del grafico (graph-simple:1.0.0 rispetto a graph-complex:1.0.0), che contiene la specifica YAML delle operazioni e delle connessioni tra i moduli WASM. La risorsa del grafico del flusso di dati fornisce l'infrastruttura di runtime per eseguire il pull dell'artefatto, creare un'istanza dei moduli e instradare i dati attraverso il flusso di lavoro definito.

  1. Per creare un grafico del flusso di dati nell'esperienza operativa, passare alla scheda Flusso di dati .

  2. Selezionare il menu a discesa accanto a + Crea e selezionare Crea un grafico del flusso di dati

    Screenshot dell'interfaccia dell'esperienza operativa che mostra come creare un grafico complesso del flusso di dati.

  3. Selezionare il nome segnaposto new-data-flow per impostare le proprietà del flusso di dati. Immettere il nome del grafico del flusso di dati e scegliere il profilo del flusso di dati da usare.

  4. Nel diagramma del flusso di dati selezionare Origine per configurare il nodo di origine. In Dettagli origine, selezionare Asset o Endpoint flusso di dati.

    Screenshot dell'interfaccia dell'esperienza operativa che mostra come selezionare un'origine per il grafico del flusso di dati.

    1. Se si seleziona Asset, scegliere l'asset da cui estrarre i dati e fare clic su Applica.

    2. Selezionando Endpoint flusso di dati, inserisci i dettagli seguenti e fai clic su Applica.

      Impostazione Description
      Endpoint del flusso di dati Selezionare l'impostazione predefinita per usare l'endpoint predefinito del broker messaggi MQTT.
      Argomento Filtro dell'argomento a cui sottoscrivere per i messaggi in arrivo. Usare Argomento/i>Aggiungi riga per aggiungere più argomenti.
      Schema del messaggio Schema da utilizzare per deserializzare i messaggi in arrivo.
  5. Nel diagramma del flusso di dati selezionare Aggiungi trasformazione grafico (facoltativo) per aggiungere un nodo di elaborazione del grafo. Nel riquadro di selezione Grafico selezionare graph-complex:1 e fare clic su Applica.

    Screenshot dell'interfaccia dell'esperienza operativa che mostra come creare un grafico di flusso di dati complesso.

    Importante

    Questo esempio usa l'artefatto graph-complex:1.0.0 di cui è stato eseguito il push nel registro contenitori. È possibile creare grafici personalizzati sviluppando moduli WASM personalizzati ed eseguendone il push nel registro contenitori. I grafici di cui si esegue il push nel registro contenitori sono disponibili nel pannello di selezione grafico.

  6. È possibile configurare alcune impostazioni dell'operatore del grafo selezionando il nodo del grafo nel diagramma.

    Screenshot dell'interfaccia dell'esperienza operativa che mostra come configurare un grafico del flusso di dati complesso.

    Operator Description
    module-snapshot/branch Configura il modulo per eseguire il snapshot rilevamento degli oggetti sulle immagini. È possibile impostare la snapshot_topic chiave di configurazione per specificare l'argomento di input per i dati dell'immagine.
    module-temperature/map Trasforma i key2 valori di temperatura in una scala diversa.
  7. Fare clic su Applica per salvare le modifiche.

  8. Nel diagramma del flusso di dati selezionare Destinazione per configurare il nodo di destinazione.

  9. Selezionare Salva sotto il nome del grafico del flusso di dati per salvare il grafico del flusso di dati.

Testare il flusso di dati complesso

Prima di poter visualizzare l'output, è necessario ottenere la configurazione dei dati di origine.

Caricare file di immagine RAW nel pod mqtt-client

I file di immagine sono destinati al modulo snapshot per rilevare gli oggetti nelle immagini. Si trovano nella cartella images in GitHub.

Prima di tutto, clonare il repository per ottenere l'accesso ai file di immagine:

git clone https://github.com/Azure-Samples/explore-iot-operations.git
cd explore-iot-operations

Per caricare i file di immagine RAW dalla cartella ./samples/wasm/images al pod mqtt-client, è possibile usare il comando seguente:

kubectl cp ./samples/wasm/images azure-iot-operations/mqtt-client:/tmp

Verificare che i file siano stati caricati:

kubectl exec -it mqtt-client -n azure-iot-operations -- ls /tmp/images

Verrà visualizzato l'elenco dei file nella cartella /tmp/images.

beaker.raw          laptop.raw          sunny2.raw
binoculars.raw      lawnmower.raw       sunny4.raw
broom.raw           milkcan.raw         thimble.raw
camera.raw          photocopier.raw     tripod.raw
computer_mouse.raw  radiator.raw        typewriter.raw
daisy3.raw          screwdriver.raw     vacuum_cleaner.raw
digital_clock.raw   sewing_machine.raw
hammer.raw          sliding_door.raw

Pubblicare dati simulati sulla temperatura e sull'umidità e inviare immagini

È possibile combinare i comandi per la pubblicazione di dati relativi a temperatura, umidità e invio di immagini in un unico script. Usare il comando seguente:

# Connect to the MQTT client pod and run the script
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh -c '
while true; do 
  # Generate a random temperature value between 0 and 6000
  temp_value=$(shuf -i 0-6000 -n 1)
  temp_payload="{\"temperature\":{\"value\":$temp_value,\"unit\":\"F\"}}"
  echo "Publishing temperature: $temp_payload"
  mosquitto_pub -h aio-broker -p 18883 \
    -m "$temp_payload" \
    -t "sensor/temperature/raw" \
    --cafile /var/run/certs/ca.crt \
    -D CONNECT authentication-method "K8S-SAT" \
    -D CONNECT authentication-data "$(cat /var/run/secrets/tokens/broker-sat)" \
    -D PUBLISH user-property __ts $(date +%s)000:0:df

  # Generate a random humidity value between 30 and 90
  humidity_value=$(shuf -i 30-90 -n 1)
  humidity_payload="{\"humidity\":{\"value\":$humidity_value}}"
  echo "Publishing humidity: $humidity_payload"
  mosquitto_pub -h aio-broker -p 18883 \
    -m "$humidity_payload" \
    -t "sensor/humidity/raw" \
    --cafile /var/run/certs/ca.crt \
    -D CONNECT authentication-method "K8S-SAT" \
    -D CONNECT authentication-data "$(cat /var/run/secrets/tokens/broker-sat)" \
    -D PUBLISH user-property __ts $(date +%s)000:0:df

  # Send an image every 2 seconds
  if [ $(( $(date +%s) % 2 )) -eq 0 ]; then
    file=$(ls /tmp/images/*.raw | shuf -n 1)
    echo "Sending file: $file"
    mosquitto_pub -h aio-broker -p 18883 \
      -f $file \
      -t "sensor/images/raw" \
      --cafile /var/run/certs/ca.crt \
      -D CONNECT authentication-method "K8S-SAT" \
      -D CONNECT authentication-data "$(cat /var/run/secrets/tokens/broker-sat)" \
      -D PUBLISH user-property __ts $(date +%s)000:0:df
  fi

  # Wait for 1 second before the next iteration
  sleep 1
done'

Controllare l'output

In un nuovo terminale sottoscrivere l'argomento di output:

kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh -c '
mosquitto_sub -h aio-broker -p 18883 -t "analytics/sensor/processed" --cafile /var/run/certs/ca.crt \
-D CONNECT authentication-method "K8S-SAT" \
-D CONNECT authentication-data "$(cat /var/run/secrets/tokens/broker-sat)"'

L'output dovrebbe essere simile al seguente

{"temperature":[{"count":9,"max":2984.4444444444443,"min":248.33333333333337,"average":1849.6296296296296,"last":2612.222222222222,"unit":"C","overtemp":true}],"humidity":[{"count":10,"max":76.0,"min":30.0,"average":49.7,"last":38.0}],"object":[{"result":"milk can; broom; screwdriver; binoculars, field glasses, opera glasses; toy terrier"}]}
{"temperature":[{"count":10,"max":2490.5555555555557,"min":430.55555555555554,"average":1442.6666666666667,"last":1270.5555555555557,"unit":"C","overtemp":true}],"humidity":[{"count":9,"max":87.0,"min":34.0,"average":57.666666666666664,"last":42.0}],"object":[{"result":"broom; Saint Bernard, St Bernard; radiator"}]}

In questo caso, l'output contiene i dati relativi a temperatura e umidità, nonché gli oggetti rilevati nelle immagini.

Aggiornare un modulo in un grafico in esecuzione

È possibile aggiornare un modulo WASM in un grafico in esecuzione senza arrestare il grafico. Ciò è utile quando si vuole aggiornare la logica di un operatore senza arrestare il flusso di dati. Ad esempio, per aggiornare il modulo di conversione della temperatura dalla versione 1.0.0 a 2.0.0, caricare la nuova versione come indicato di seguito:

oras push <YOUR_ACR_NAME>.azurecr.io/temperature:2.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm temperature-2.0.0.wasm:application/wasm

Il grafico del flusso di dati preleva automaticamente la nuova versione del modulo senza alcuna configurazione aggiuntiva. Il grafico continua a essere eseguito senza interruzioni e la nuova versione del modulo viene usata per l'elaborazione dei dati successiva.

Sviluppare moduli WASM personalizzati

Per creare logica di elaborazione dati personalizzata per i grafici del flusso di dati, sviluppare moduli WebAssembly in Rust o Python. I moduli personalizzati consentono di implementare logica di business specializzata, trasformazioni dei dati e analisi non disponibili negli operatori predefiniti.

Per indicazioni complete sullo sviluppo, tra cui:

  • Configurazione dell'ambiente di sviluppo
  • Creazione di operatori in Rust e Python
  • Informazioni sul modello di dati e sulle interfacce
  • Compilazione e test dei moduli

Vedere Sviluppare moduli WebAssembly per grafici del flusso di dati.

Per informazioni dettagliate sulla creazione e la configurazione delle definizioni di grafici YAML che definiscono i flussi di lavoro di elaborazione dati, vedere Configurare le definizioni dei grafici WebAssembly.

Configurazione dei grafici del flusso di dati personalizzati

In questa sezione vengono fornite informazioni dettagliate sulla configurazione dei grafici del flusso di dati con i moduli WASM. Vengono illustrate tutte le opzioni di configurazione, gli endpoint del flusso di dati e le impostazioni avanzate.

Panoramica del grafico del flusso di dati

Un grafico del flusso di dati definisce il modo in cui i dati passano attraverso i moduli WebAssembly per l'elaborazione. Ogni grafico è costituito da:

  • Modalità che controlla se il grafico è abilitato o disabilitato
  • Riferimento al profilo che collega a un profilo del flusso di dati che definisce le impostazioni di ridimensionamento e risorse
  • Persistenza del disco che, facoltativamente, abilita l'archiviazione permanente per lo stato del grafico
  • Nodi che definiscono i componenti di origine, elaborazione e destinazione
  • Connessioni di nodi che specificano il modo in cui i dati scorrono tra i nodi

Configurazione della modalità

La proprietà mode determina se il grafico del flusso di dati sta elaborando attivamente i dati. È possibile impostare la modalità su Enabled o Disabled (senza distinzione tra maiuscole e minuscole). Se è disabilitato, il grafico interrompe l'elaborazione dei dati ma ne mantiene la configurazione.

Quando si crea o si modifica un grafico del flusso di dati, nel riquadro Proprietà flusso di dati è possibile selezionare Abilita flusso di dati su per impostare la modalità su Enabled. Se si lascia deselezionata, la modalità è impostata su Disabled.

Screenshot dell'interfaccia esperienza di operazioni che mostra come abilitare o disabilitare la modalità di configurazione.

Riferimento al profilo

Il riferimento al profilo connette il grafico del flusso di dati a un profilo del flusso di dati, che definisce le impostazioni di ridimensionamento, i conteggi delle istanze e i limiti delle risorse. Se non si specifica un riferimento al profilo, è necessario usare invece un riferimento al proprietario di Kubernetes. La maggior parte degli scenari usa il profilo predefinito fornito da Operazioni di Azure IoT.

Quando si crea o si modifica un grafico del flusso di dati, nel riquadro Proprietà flusso di dati selezionare il profilo del flusso di dati. Il profilo del flusso di dati predefinito è selezionato per impostazione predefinita. Per altre informazioni sui profili del flusso di dati, vedere Configurare il profilo del flusso di dati.

Importante

È possibile scegliere il profilo del flusso di dati solo durante la creazione di un grafico del flusso di dati. Non è possibile modificare il profilo del flusso di dati dopo la creazione del grafico del flusso di dati. Se si vuole modificare il profilo del flusso di dati di un grafico del flusso di dati esistente, eliminare il grafico del flusso di dati originale e crearne uno nuovo con il nuovo profilo del flusso di dati.

Richiedere la persistenza del disco

Importante

Esiste un problema noto relativo alla persistenza del disco per i grafici del flusso di dati. Questa funzionalità non funziona attualmente come previsto. Per altre informazioni, vedere Problemi noti.

La richiesta di persistenza del disco consente ai grafici del flusso di dati di mantenere lo stato tra i riavvii. Quando si abilita questa funzionalità, il grafico può ripristinare lo stato di elaborazione se il broker connesso viene riavviato. Questa funzionalità è utile per gli scenari di elaborazione con stato in cui la perdita di dati intermedi sarebbe problematica. Quando si abilita la richiesta di persistenza del disco, il broker salva in modo permanente i dati MQTT, ad esempio i messaggi nella coda del sottoscrittore, su disco. Questo approccio garantisce che l'origine dati del flusso di dati non subisca perdite di dati durante interruzioni dell'alimentazione o riavvii del broker. Il broker mantiene prestazioni ottimali perché la persistenza è configurata per ogni flusso di dati, quindi solo i flussi di dati che necessitano di persistenza usano questa funzionalità.

Il grafico del flusso di dati effettua questa richiesta di persistenza durante la sottoscrizione usando una proprietà utente MQTTv5. Questa funzionalità funziona solo quando:

  • Il flusso di dati usa il broker MQTT come origine (nodo di origine con endpoint MQTT)
  • Il broker MQTT ha la persistenza abilitata con la modalità di persistenza dinamica impostata su Enabled per il tipo di dati, ad esempio le code dei sottoscrittori

Questa configurazione consente ai client MQTT come i grafici del flusso di dati di richiedere la persistenza del disco per le sottoscrizioni usando le proprietà utente MQTTv5. Per informazioni dettagliate sulla configurazione della persistenza del broker MQTT, vedere Configurare la persistenza del broker MQTT.

L'impostazione accetta Enabled o Disabled, con Disabled come impostazione predefinita.

Quando si crea o si modifica un grafico del flusso di dati, nel riquadro Proprietà flusso di dati è possibile selezionare Richiedi persistenza dei dati su per impostare la persistenza del disco della richiesta su Enabled. Se lo si lascia deselezionato, l'impostazione è Disabled.

Configurazione nodi

I nodi sono i blocchi predefiniti di un grafico del flusso di dati. Ogni nodo ha un nome univoco all'interno del grafico ed esegue una funzione specifica. Esistono tre tipi di nodi:

Nodi di origine

I nodi di origine definiscono il punto in cui i dati entrano nel grafico. Si connettono agli endpoint del flusso di dati che ricevono dati da broker MQTT o topic Kafka. Ogni nodo di origine deve specificare:

  • Riferimento all'endpoint che punta a un endpoint del flusso di dati configurato
  • Origini dati come elenco di argomenti MQTT o argomenti Kafka da sottoscrivere
  • Riferimento all'asset (facoltativo) che collega a un asset del Registro Dispositivi Azure per l'inferenza dello schema

La matrice di origini dati consente di sottoscrivere più argomenti senza modificare la configurazione dell'endpoint. Questa flessibilità consente il riutilizzo degli endpoint in flussi di dati diversi.

Annotazioni

Attualmente, solo gli endpoint MQTT e Kafka sono supportati come origini dati per i grafici del flusso di dati. Per altre informazioni, vedere Configurare gli endpoint del flusso di dati.

Nel diagramma del flusso di dati selezionare Origine per configurare il nodo di origine. In Dettagli origine selezionare Endpoint flusso di dati, quindi usare il campo Argomenti per specificare i filtri degli argomenti MQTT da sottoscrivere per i messaggi in arrivo. È possibile aggiungere più argomenti MQTT selezionando Aggiungi riga e immettendo un nuovo argomento.

Nodi di elaborazione del grafico

I nodi di elaborazione del grafico contengono i moduli WebAssembly che trasformano i dati. Questi nodi eseguono il pull degli artefatti WASM dai registri contenitori e li eseguono con i parametri di configurazione specificati. Ogni nodo del grafico richiede:

  • Riferimento all'endpoint del registro che punta a un endpoint del registro per il pull degli artefatti
  • Specifica dell'artefatto che definisce il nome del modulo e la versione di cui eseguire il pull
  • Parametri di configurazione come coppie chiave-valore passate al modulo WASM

La matrice di configurazione consente di personalizzare il comportamento del modulo senza ricompilare l'artefatto WASM. Le opzioni di configurazione comuni includono parametri di elaborazione, soglie, impostazioni di conversione e flag di funzionalità.

Nel diagramma del flusso di dati selezionare Aggiungi trasformazione grafico (facoltativo) per aggiungere un nodo di elaborazione del grafo. Nel riquadro di selezione Grafico selezionare l'elemento grafico desiderato, semplice o complesso, e fare clic su Applica. È possibile configurare alcune impostazioni dell'operatore del grafo selezionando il nodo del grafo nel diagramma.

Le coppie chiave-valore di configurazione vengono passate al modulo WASM in fase di esecuzione. Il modulo può accedere a questi valori per personalizzarne il comportamento. Tale approccio consente di:

  • Distribuire lo stesso modulo WASM con configurazioni diverse
  • Modificare i parametri di elaborazione senza ricompilare i moduli
  • Abilitare o disabilitare le funzionalità in base ai requisiti di distribuzione
  • Impostare valori specifici dell'ambiente, ad esempio soglie o endpoint

Nodi di destinazione

I nodi di destinazione definiscono dove vengono inviati i dati elaborati. Si connettono agli endpoint del flusso di dati che inviano dati a broker MQTT, archiviazione cloud o altri sistemi. Ogni nodo di destinazione specifica:

  • Riferimento all'endpoint che punta a un endpoint del flusso di dati configurato
  • Destinazione dati come argomento, percorso o posizione specifici per i dati di output
  • Impostazioni dello schema di output (facoltativo) che definiscono il formato di serializzazione e la convalida dello schema

Per le destinazioni di archiviazione come Azure Data Lake o Fabric OneLake, è possibile specificare le impostazioni dello schema di output per controllare la modalità di serializzazione e convalida dei dati.

Annotazioni

Attualmente, solo gli endpoint MQTT, Kafka e OpenTelemetry sono supportati come destinazioni dati per i grafici del flusso di dati. Per altre informazioni, vedere Configurare gli endpoint del flusso di dati.

  1. Nel diagramma del flusso di dati selezionare il nodo Destinazione .
  2. Selezionare l'endpoint del flusso di dati desiderato dall'elenco a discesa Dettagli dell'endpoint del flusso di dati.
  3. Selezionare Continua per configurare la destinazione.
  4. Immettere le impostazioni necessarie per la destinazione, incluso l'argomento o la tabella a cui inviare i dati. Il campo destinazione dati viene interpretato automaticamente in base al tipo di endpoint. Ad esempio, se l'endpoint del flusso di dati è un endpoint MQTT, la pagina dei dettagli di destinazione richiede di immettere l'argomento.

Connessioni ai nodi

Le connessioni ai nodi definiscono il percorso del flusso di dati tra i nodi. Ogni connessione specifica un nodo di origine e un nodo di destinazione, creando la pipeline di elaborazione. Le connessioni possono includere facoltativamente la convalida dello schema per garantire l'integrità dei dati tra le fasi di elaborazione.

Quando si specifica la convalida dello schema, il sistema convalida il formato e la struttura dei dati durante il flusso tra i nodi. La convalida consente di intercettare in anticipo le incoerenze dei dati e garantisce che i moduli WASM ricevano i dati nel formato previsto.

L'esperienza operativa crea automaticamente connessioni ai nodi quando si seleziona il nodo di elaborazione del grafo. Non è possibile modificare le connessioni dopo la creazione del grafico.

Endpoint del flusso di dati

I grafici del flusso di dati si connettono a sistemi esterni tramite endpoint del flusso di dati. Il tipo di endpoint determina se può essere usato come origine, destinazione o entrambi:

Endpoint MQTT

Gli endpoint MQTT possono fungere sia da origini che da destinazioni. Si connettono a broker MQTT, tra cui:

  • Broker MQTT locale di Operazioni di Azure IoT (obbligatorio in ogni flusso di dati)
  • MQTT di Griglia di eventi di Azure
  • Broker MQTT personalizzati

Per informazioni dettagliate sulla configurazione, vedere Configurare gli endpoint del flusso di dati MQTT.

Endpoint Kafka

Gli endpoint Kafka possono fungere sia da origini che da destinazioni. Si connettono a sistemi compatibili con Kafka, tra cui:

  • Hub eventi di Azure (compatibile con Kafka)
  • Cluster Apache Kafka
  • Confluent Cloud

Per informazioni dettagliate sulla configurazione, vedere Configurare Hub eventi di Azure ed endpoint del flusso di dati Kafka.

Endpoint di archiviazione

Gli endpoint di archiviazione possono essere usati solo come destinazioni. Si connettono ai sistemi di archiviazione nel cloud per la conservazione e l'analisi dei dati a lungo termine:

  • Archiviazione di Azure Data Lake
  • Microsoft Fabric OneLake
  • Archiviazione locale

Gli endpoint di archiviazione richiedono in genere impostazioni dello schema di output per definire il formato di serializzazione dei dati.

Endpoint del registro

Gli endpoint del registro forniscono l'accesso ai registri contenitori per il pull di moduli WASM e definizioni di grafo. Non vengono usati direttamente nel flusso di dati, ma i nodi di elaborazione del grafo vi fanno riferimento.

Per informazioni dettagliate sulla configurazione, vedere Configurare gli endpoint del registro.