Skapa WASM-moduler för dataflöden

Den anpassade databearbetningsfunktionen WebAssembly (WASM) i Azure IoT Operations möjliggör databearbetning i realtid i ditt Azure IoT Operations kluster. Genom att distribuera anpassade WASM-moduler kan du definiera och köra datatransformeringar som en del av dataflödesdiagrammet, HTTP/REST-anslutningsappen eller MQTT-anslutningsappen.

I den här artikeln beskrivs hur du använder tillägget Azure IoT Operations Data Flow VS Code, dataflow-dev CLI eller standardverktyg som är installerade i din miljö för att utveckla och testa WASM-modulerna lokalt innan du distribuerar dem till ditt Azure IoT Operations kluster. Du får lära dig att:

  • Kör ett grafprogram lokalt genom att köra en fördefinierad graf med exempeldata för att förstå det grundläggande arbetsflödet.
  • Skapa anpassade WASM-moduler genom att skapa nya operatorer i Python och Rust med kart- och filterfunktioner.

Använd VS Code-tillägget för en inre utvecklingsloop när du aktivt skapar operatorer och grafer, till exempel: skriva kod, skapa, granska fel, felsöka, göra ändringar, uppdatera diagrammet och publicera.

dataflow-dev Använd CLI för CI/CD-fokuserade diagramkvalitetsarbetsflöden, till exempel: skapa befintlig kod, köra grafen, testa utdata mot kända bra resultat och övervaka kvalitet över tid.

Använd standardverktyg som är installerade i din miljö för scenarier där du vill ha mer kontroll över bygg- och testprocessen, eller när du behöver integrera med andra utvecklingsverktyg och arbetsflöden.

Den här artikeln beskriver hur du skapar och testar dina WASM-moduler lokalt. Om du vill använda dem i Azure IoT Operations dataflöden och anslutningsappar måste du distribuera dem till ditt Azure IoT Operations kluster och referera till dem i grafen eller anslutningskonfigurationen:

Mer avancerade scenarier finns i Skapa tillståndskänsliga WASM-grafer med tillståndsarkivet, Använda schemaregister med WASM-moduler, Felsöka WASM-moduler och Testa WASM-moduler.

Tillägget och CLI-verktyget stöds på följande plattformar:

  • Linux
  • Windows-undersystem för Linux (WSL)
  • Windows (se till att använda ett Windows-gränssnitt som PowerShell eller kommandotolken när du kör tilläggskommandona på Windows)

Mer information om diagram och WASM i Azure IoT Operations finns i:

Förutsättningar

Utvecklingsmiljö:

Docker-avbildningar:

docker pull mcr.microsoft.com/azureiotoperations/processor-app:1.1.5
docker tag mcr.microsoft.com/azureiotoperations/processor-app:1.1.5 host-app

docker pull mcr.microsoft.com/azureiotoperations/devx-runtime:0.1.8
docker tag mcr.microsoft.com/azureiotoperations/devx-runtime:0.1.8 devx

docker pull mcr.microsoft.com/azureiotoperations/statestore-cli:0.0.2
docker tag mcr.microsoft.com/azureiotoperations/statestore-cli:0.0.2 statestore-cli

docker pull eclipse-mosquitto

Köra ett grafprogram lokalt

I det här exemplet används en exempelarbetsyta som innehåller alla nödvändiga resurser för att skapa och köra ett grafprogram lokalt med hjälp av VS Code-tillägget.

Öppna exempelarbetsytan i VS Code

Klona lagringsplatsen Explore IoT Operations om du inte redan har gjort det.

Öppna mappen samples/wasm i Visual Studio Code genom att välja File > Öppna mapp och navigera till mappen samples/wasm.

Skapa operatorerna

Tryck på Ctrl+Shift+P för att öppna kommandopaletten och sök efter Azure IoT Operations: Skapa alla operatorer. Välj version som byggläge.

Det här kommandot skapar alla operatorer på arbetsytan och skapar .wasm filer i operators mappen. Du använder .wasm filerna för att köra grafprogrammet lokalt.

Köra grafprogrammet lokalt

Starta den lokala körningsmiljön genom att trycka på Ctrl+Shift+P för att öppna kommandopaletten och söka efter Azure IoT Operations: Starta utvecklingsmiljön. Välj släpp som körningsläge.

När den lokala körningsmiljön körs trycker du på Ctrl+Shift+P för att öppna kommandopaletten och söka efter Azure IoT Operations: Kör Application Graph. Välj släpp som körningsläge. Det här kommandot kör grafprogrammet lokalt med hjälp av den lokala körningsmiljön med graph.dataflow.yaml filen på arbetsytan.

Den läser också från hostapp.env.list för att ange miljövariabeln TK_CONFIGURATION_PARAMETERS för konfigurationsparametrar för dataflödesoperatorer.

När du uppmanas att ange indata väljer du data-and-images mappen på arbetsytan. Den här mappen innehåller indatafilerna för grafprogrammet, inklusive temperatur- och luftfuktighetsdata och några bilder för modulen ögonblicksbild.

Vänta tills du ser ett VS Code-meddelande om att loggarna är klara: Log files for the run can be found at ...\wasm\data-and-images\output\logs.

Utdata finns i output mappen under data-and-images mappen . Du kan öppna output mappen på arbetsytan för att se utdatafilerna. Filen .txt med datum och tid för filnamn innehåller bearbetade data och ser ut som i följande exempel:

{"tst":"2025-09-19T04:19:13.530381+0000","topic":"sensors","qos":0,"retain":0,"payloadlen":312,"properties":{"payload-format-indicator":1,"message-expiry-interval":10,"correlation-data":"...","user-properties":{"__ts":"001758255553528:00000:...","__protVer":"1.0","__srcId":"mqtt-source"},"content-type":"application/json"},"payload":{"temperature":[{"count":2,"max":653.888888888889,"min":204.44444444444449,"average":429.16666666666669,"last":204.44444444444449,"unit":"C","overtemp":true}],"humidity":[{"count":3,"max":85,"min":45,"average":69.666666666666671,"last":79}],"object":[{"result":"notebook, notebook computer; sliding door"}]}}

Utdata visar att grafprogrammet bearbetade indata och genererade utdata. Utdata innehåller temperatur- och luftfuktighetsdata och de objekt som identifieras i bilderna.

Skapa en ny graf med anpassade WASM-moduler

Det här scenariot visar hur du skapar ett nytt grafprogram med anpassade WASM-moduler. Grafprogrammet består av två operatorer: en map operator som konverterar temperaturvärden från Fahrenheit till Celsius och en filter operator som filtrerar bort meddelanden med temperaturvärden över 500°C.

Använd för närvarande inte bindestreck (-) eller understreck (_) i operatornamn. VS Code-tillägget tillämpar det här kravet, men om du skapar eller byter namn på moduler manuellt orsakar det problem. Använd enkla alfanumeriska namn för moduler som filter, map, stateenricheller schemafilter.

I stället för att använda en befintlig exempelarbetsyta skapar du en ny arbetsyta från grunden. Med den här processen kan du lära dig hur du skapar ett nytt grafprogram och programmerar operatorerna i Python och Rust.

Skapa ett nytt diagramprogramprojekt i Python

Tryck på Ctrl+Shift+P för att öppna kommandopaletten för VS Code och sök efter Azure IoT Operations: Skapa program:

  1. För mappen väljer du en mapp där du vill skapa projektet. Du kan skapa en ny mapp för det här projektet.
  2. Ange my-graph som namn.
  3. Välj Python som språk.
  4. Välj Mappa som typ.
  5. Ange map som namn.

Nu har du en ny VS Code-arbetsyta med den grundläggande projektstrukturen och startfilerna. Startfilerna graph.dataflow.yaml innehåller filen och källkoden för kartoperatorns mall.

Viktigt!

Om du vill använda en Python modul i en distribuerad Azure IoT Operations-instans måste du distribuera instansen med koordinatorminnesprofilen inställd på Medium eller High. Om du ställer in minnesprofilen på Low eller Tiny kan instansen inte hämta modulen Python.

Lägg till Python kod för kartoperatormodulen

operators/map/map.py Öppna filen och ersätt innehållet med följande kod för att konvertera ett inkommande temperaturvärde från Fahrenheit till Celsius:

import json
from map_impl import exports
from map_impl import imports
from map_impl.imports import types

class Map(exports.Map):
    def init(self, configuration) -> bool:
        imports.logger.log(imports.logger.Level.INFO, "module4/map", "Init invoked")
        return True

    def process(self, message: types.DataModel) -> types.DataModel:
        # TODO: implement custom logic for map operator
        imports.logger.log(imports.logger.Level.INFO, "module4/map", "processing from python")

        # Ensure the input is of the expected type
        if not isinstance(message, types.DataModel_Message):
            raise ValueError("Unexpected input type: Expected DataModel_Message")

        # Extract and decode the payload
        payload_variant = message.value.payload
        if isinstance(payload_variant, types.BufferOrBytes_Buffer):
            # It's a Buffer handle - read from host
            imports.logger.log(imports.logger.Level.INFO, "module4/map", "Reading payload from Buffer")
            payload = payload_variant.value.read()
        elif isinstance(payload_variant, types.BufferOrBytes_Bytes):
            # It's already bytes
            imports.logger.log(imports.logger.Level.INFO, "module4/map", "Reading payload from Bytes")
            payload = payload_variant.value
        else:
            raise ValueError("Unexpected payload type")

        decoded = payload.decode("utf-8")

        # Parse the JSON data
        json_data = json.loads(decoded)

        # Check and update the temperature value
        if "temperature" in json_data and "value" in json_data["temperature"]:
            temp_f = json_data["temperature"]["value"]
            if isinstance(temp_f, int):
                # Convert Fahrenheit to Celsius
                temp_c = round((temp_f - 32) * 5.0 / 9.0)

                # Update the JSON data
                json_data["temperature"]["value"] = temp_c
                json_data["temperature"]["unit"] = "C"

                # Serialize the updated JSON back to bytes
                updated_payload = json.dumps(json_data).encode("utf-8")

                # Update the message payload
                message.value.payload = types.BufferOrBytes_Bytes(value=updated_payload)

        return message

Kontrollera att Docker körs. Tryck sedan på Ctrl+Shift+P för att öppna kommandopaletten och söka efter Azure IoT Operations: Skapa alla operatorer. Skapa en release-modul.

Byggprocessen placerar map.wasm filen för operatorn map i operators/map/bin/release mappen .

Lägg till Rust-kod för filteroperatormodulen

Skapa en ny operator genom att trycka på Ctrl+Shift+P för att öppna kommandopaletten och söka efter Azure IoT Operations: Skapa operator:

  1. Välj Rust som språk.
  2. Välj Filtrera som operatortyp.
  3. Ange filter som namn.

operators/filter/src/lib.rs Öppna filen och ersätt innehållet med följande kod för att filtrera bort värden där temperaturen är över 500°C:

mod filter_operator {
    use wasm_graph_sdk::macros::filter_operator;
    use serde_json::Value;

    fn filter_init(_configuration: ModuleConfiguration) -> bool {
        // Add code here to process the module init properties and module schemas from the configuration

        true
    }

    #[filter_operator(init = "filter_init")]
    fn filter(input: DataModel) -> Result<bool, Error> {

        // Extract payload from input to process
        let payload = match input {
            DataModel::Message(Message {
                payload: BufferOrBytes::Buffer(buffer),
                ..
            }) => buffer.read(),
            DataModel::Message(Message {
                payload: BufferOrBytes::Bytes(bytes),
                ..
            }) => bytes,
            _ => return Err(Error { message: "Unexpected input type".to_string() }),
        };

        // ... perform filtering logic here and return boolean
        if let Ok(payload_str) = std::str::from_utf8(&payload) {
            if let Ok(json) = serde_json::from_str::<Value>(payload_str) {
                if let Some(temp_c) = json["temperature"]["value"].as_i64() {
                    // Return true if temperature is above 500°C
                    return Ok(temp_c > 500);
                }
            }
        }

        Ok(false)
   }
}

operators/filter/Cargo.toml Öppna filen och lägg till följande beroenden:

[dependencies]
# ...
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

Kontrollera att Docker körs. Tryck sedan på Ctrl+Shift+P för att öppna kommandopaletten och söka efter Azure IoT Operations: Skapa alla operatorer. Skapa en release-modul.

Byggprocessen placerar filter.wasm filen för operatorn filter i operators/filter/bin/release mappen .

Köra grafprogrammet lokalt med exempeldata

graph.dataflow.yaml Öppna filen och ersätt innehållet med följande kod:

metadata:
    $schema: "https://www.schemastore.org/aio-wasm-graph-config-1.0.0.json"
    name: "Temperature Monitoring"
    description: "A graph that converts temperature from Fahrenheit to Celsius, if temperature is above 500°C, then sends the processed data to the sink."
    version: "1.0.0"
    vendor: "Microsoft"
moduleRequirements:
    apiVersion: "1.1.0"
    runtimeVersion: "1.1.0"
operations:
  - operationType: source
    name: source
  - operationType: map
    name: map
    module: map
  - operationType: filter
    name: filter
    module: filter
  - operationType: sink
    name: sink
connections:
  - from:
      name: source
    to:
      name: map
  - from:
      name: map
    to:
      name: filter
  - from:
      name: filter
    to:
      name: sink

Kopiera mappen data som innehåller exempeldata från den klonade exempellagringsplatsen explore-iot-operations\samples\wasm\data till den aktuella arbetsytan. Mappen data innehåller tre JSON-filer med exempeldata för indatatemperatur.

Om du tidigare stoppade den lokala körningsmiljön trycker du på Ctrl+Shift+P för att öppna kommandopaletten och söka efter Azure IoT Operations: Starta utvecklingsmiljön. Välj släpp som körningsläge.

Tryck på Ctrl+Shift+P för att öppna kommandopaletten och sök efter Azure IoT Operations: Kör Application Graph:

  1. Välj graph.dataflow.yaml graffilen.
  2. Välj släpp som körningsläge.
  3. Välj mappen som data du kopierade till arbetsytan.

DevX-containern startas för att köra diagrammet. Det bearbetade resultatet sparas i data/output mappen. Textfilen i output mappen innehåller bearbetade data med temperaturen konverterad till Celsius och filtrerad baserat på tröskelvärdet.

Information om hur du distribuerar dina anpassade WASM-moduler och diagram till din Azure IoT Operations-instans finns i Distribuera WASM-moduler och dataflödesdiagram.

När du har skapat dina WASM-moduler och ditt grafprogram har konfigurerats kan du distribuera dem till ditt Azure IoT Operations kluster och referera till dem i grafen eller anslutningskonfigurationen:

Felsökning

Build-fel

Error Orsak Reparera
error[E0463]: can't find crate for std WASM-mål saknas Kör rustup target add wasm32-wasip2
error: no matching package found för wasm_graph_sdk Lastregister saknas Lägg till blocket [registries] på det .cargo/config.toml sätt som visas i Kör ett grafprogram lokalt
componentize-py kan inte hitta WIT-filer Felaktig sökväg för schema Använd -d flaggan med den fullständiga sökvägen till schemakatalogen. Alla .wit filer måste finnas eftersom de refererar till varandra.
componentize-py versionskonflikt Bindningar som genereras med en annan version Ta bort den genererade bindningskatalogen och återskapa med samma componentize-py version
wasm-tools komponentkontrollen misslyckas Fel målgrupp eller komponentadapter saknas Kontrollera att du använder wasm32-wasip2 (inte wasm32-wasi eller wasm32-unknown-unknown)

Körningsfel

Symptom Orsak Reparera
Operatorn kraschar med WASM-bakåtriktad spårning Saknade eller ogiltiga konfigurationsparametrar Lägg till defensiv parsning i init med standardvärden. Se Modulkonfigurationsparametrar.
init returnerar false, dataflödet startar inte Konfigurationsverifieringen misslyckades Kontrollera om det finns felmeddelanden i dataflödesloggarna. Kontrollera att moduleConfigurations namnen matchar din kod.
Modulen läses in men ger inga utdata process returnerar fel eller filtrerar bort allt Lägg till loggning i process för att spåra dataflödet.
Unexpected input type Modulen mottog fel data-model variant Lägg till en typkontroll i början av process och hantera oväntade varianter.
Modulen fungerar ensam men kraschar i komplex graf Konfiguration saknas när den återanvänds mellan noder Varje nod i grafen behöver en egen moduleConfigurations inmatning.

Vanliga problem

  • Glömmer --artifact-type ORAS-push. Utan den visar användargränssnittet för driftsupplevelsen inte modulen korrekt.
  • Matchningsfel name i moduleConfigurations. Namnet måste vara <module>/<operator> (till exempel module-temperature/filter), som matchar grafdefinitionens operations avsnitt.
  • Använda wasm32-wasi i stället för wasm32-wasip2. Azure IoT Operations kräver WASI Preview 2-målet.
  • Python: arbeta utanför lagringsplatsen för exempel utan att kopiera schemakatalogen. Alla .wit filer måste finnas samtidigt eftersom de refererar till varandra.

Kända problemområden

  • Booleska värden i YAML: Booleska värden måste anges som strängar för att undvika valideringsfel. Använd till exempel "True" och "False" i stället för true och false.

    Exempelfel vid användning av ociterade booleska värden:

    * spec.connections[2].from.arm: Invalid value: "boolean": spec.connections[2].from.arm in body must be of type string: "boolean"
    * spec.connections[2].from.arm: Unsupported value: false: supported values: "False", "True"
    
  • Python modulkrav: Om du vill använda Python-moduler måste Azure IoT Operations distribueras med MQTT-broker konfigurerad för att använda Medium eller High minnesprofil. Python moduler kan inte hämtas när minnesprofilen är inställd på Low eller Tiny.

  • Tidsinställning för moduldistribution: Det kan ta lite tid att hämta och tillämpa WASM-moduler, vanligtvis ungefär en minut, beroende på nätverksförhållanden och modulstorlek.

  • Information om build-fel: När ett bygge misslyckas kanske felmeddelandet i popup-meddelandet inte innehåller tillräckligt med information. Kontrollera terminalutdata för mer specifik felinformation.

  • Windows kompatibilitet: Första gången du kör ett diagramprogram på Windows kan det uppstå ett felmeddelande om att kommandot misslyckades med slutkod 1. Om det här felet inträffar försöker du utföra åtgärden igen och det bör fungera korrekt.

  • Värdappens stabilitet: Den lokala körningsmiljön kan ibland sluta fungera och kräva omstart för att återställa.

  • Remote felsökningsbegränsningar: För närvarande kan du inte fjärrfelsöka WASM-moduler som körs i Azure Linux 3.0 på grund av inkompatibla LLDB-versioner.

Återställningsprocedurer

Återställning av VS Code-tillägget: Om VS Code-tillägget fungerar oväntat kan du prova att avinstallera och installera om det och sedan starta om VS Code.