Esempio di schema Avro per telemetria dei dispositivi

Usa queste tre definizioni Avro per provare la creazione di schema, l'importazione in massa e il confronto delle versioni. L'esempio descrive un dispositivo che riporta letture ambientali, firmware, posizione e informazioni diagnostiche.

Ogni versione conserva il nome record DeviceTelemetryEventData e lo spazio dei nomi Fabrikam.IoT. Il nome del file identifica la versione di esempio; non sostituisce il numero di versione assegnato dal registro.

Version Changes Nome del file
1 Definisce identificatori di dispositivi e inquilini, cattura tempo, temperatura, umidità e letture della batteria. Fabrikam.DeviceTelemetryEventData.v1.avsc
2 Aggiunge informazioni firmware e un record opzionale di posizione annidata. Fabrikam.DeviceTelemetryEventData.v2.avsc
3 Aggiunge un enum di stato, un array di codici diagnostici e una mappa dei tag. Fabrikam.DeviceTelemetryEventData.v3.avsc

Salva i file di esempio

Copia ogni definizione JSON completa in un file di testo UTF-8 separato con il nome del file mostrato. Questi file sono definizioni di schema, non payload di eventi.

Versione 1

La prima versione definisce le letture originali del dispositivo.

{
  "type": "record",
  "name": "DeviceTelemetryEventData",
  "namespace": "Fabrikam.IoT",
  "doc": "Device environmental readings.",
  "fields": [
    { "name": "deviceid", "type": "string", "doc": "Unique device identifier." },
    { "name": "tenantid", "type": "string", "doc": "Tenant identifier." },
    { "name": "capturedAt", "type": { "type": "long", "logicalType": "timestamp-millis" }, "doc": "Capture time in UTC." },
    { "name": "temperatureC", "type": "double", "doc": "Temperature in degrees Celsius." },
    { "name": "humidityPct", "type": "double", "doc": "Relative humidity percentage." },
    { "name": "batteryPct", "type": "int", "doc": "Battery level percentage." }
  ]
}

Versione 2

La seconda versione aggiunge informazioni firmware e un record di posizione nullabile. Il record annidato eredita lo spazio di nomi del record esterno.

{
  "type": "record",
  "name": "DeviceTelemetryEventData",
  "namespace": "Fabrikam.IoT",
  "doc": "Device environmental readings with firmware and location.",
  "fields": [
    { "name": "deviceid", "type": "string", "doc": "Unique device identifier." },
    { "name": "tenantid", "type": "string", "doc": "Tenant identifier." },
    { "name": "capturedAt", "type": { "type": "long", "logicalType": "timestamp-millis" }, "doc": "Capture time in UTC." },
    { "name": "temperatureC", "type": "double", "doc": "Temperature in degrees Celsius." },
    { "name": "humidityPct", "type": "double", "doc": "Relative humidity percentage." },
    { "name": "batteryPct", "type": "int", "doc": "Battery level percentage." },
    { "name": "firmwareVersion", "type": "string", "default": "1.0.0", "doc": "Firmware version reported by the device." },
    {
      "name": "location",
      "type": [
        "null",
        {
          "type": "record",
          "name": "DeviceLocation",
          "fields": [
            { "name": "latitude", "type": "double", "doc": "Latitude in decimal degrees." },
            { "name": "longitude", "type": "double", "doc": "Longitude in decimal degrees." }
          ]
        }
      ],
      "default": null,
      "doc": "Optional location data."
    }
  ]
}

Versione 3

La terza versione aggiunge la salute e la diagnostica del dispositivo. L'array e la mappa hanno valori predefiniti vuoti.

{
  "type": "record",
  "name": "DeviceTelemetryEventData",
  "namespace": "Fabrikam.IoT",
  "doc": "Device environmental readings with health and diagnostics.",
  "fields": [
    { "name": "deviceid", "type": "string", "doc": "Unique device identifier." },
    { "name": "tenantid", "type": "string", "doc": "Tenant identifier." },
    { "name": "capturedAt", "type": { "type": "long", "logicalType": "timestamp-millis" }, "doc": "Capture time in UTC." },
    { "name": "temperatureC", "type": "double", "doc": "Temperature in degrees Celsius." },
    { "name": "humidityPct", "type": "double", "doc": "Relative humidity percentage." },
    { "name": "batteryPct", "type": "int", "doc": "Battery level percentage." },
    { "name": "firmwareVersion", "type": "string", "default": "1.0.0", "doc": "Firmware version reported by the device." },
    {
      "name": "location",
      "type": [
        "null",
        {
          "type": "record",
          "name": "DeviceLocation",
          "fields": [
            { "name": "latitude", "type": "double", "doc": "Latitude in decimal degrees." },
            { "name": "longitude", "type": "double", "doc": "Longitude in decimal degrees." }
          ]
        }
      ],
      "default": null,
      "doc": "Optional location data."
    },
    {
      "name": "status",
      "type": { "type": "enum", "name": "DeviceStatus", "symbols": ["ONLINE", "DEGRADED", "OFFLINE"] },
      "default": "ONLINE",
      "doc": "Current health status of the device."
    },
    { "name": "diagnosticCodes", "type": { "type": "array", "items": "string" }, "default": [], "doc": "Active diagnostic codes." },
    { "name": "tags", "type": { "type": "map", "values": "string" }, "default": {}, "doc": "Additional key-value metadata." }
  ]
}

Prova il flusso di lavoro di versioning

  1. Crea un insieme di schema chiamato Fabrikam device telemetry.
  2. Importa insieme i tre file. Controlla l'ordine rilevato prima di confermare l'importazione.
  3. Apri lo schema importato e verifica che la versione 3 sia l'ultima definizione.
  4. Passa alla versione 1 e conferma che i campi firmware, posizione e diagnostica non siano presenti.
  5. Confronta la versione 1 con la versione 3, e poi confronta la versione 2 con la versione 3.

In alternativa, crea uno schema dalla versione 1 e aggiornalo con le versioni 2 e 3 in ordine. Usa uno schema set separato per questo esercizio, così da non confondere aggiornamenti manuali con il risultato dell'importazione in massa.

Annotazioni

Gli esempi utilizzano modifiche additive e valori predefiniti per rendere le differenze facili da esaminare. I valori predefiniti in una definizione Avro non garantiscono che ogni produttore, codifica del payload o destinazione accetti la modifica. Testa la tua pipeline end-to-end prima di adottare una nuova versione.