Eseguire il mapping di campi personalizzati allo schema di Griglia di eventi

Se i dati dell'evento non corrispondono allo schema di Griglia di eventi previsto, è comunque possibile usare Griglia di eventi per instradare l'evento ai sottoscrittori. Questo articolo descrive come eseguire il mapping di uno schema personalizzato allo schema di Griglia di eventi.

Schema di eventi di origine

Si supponga che un'applicazione invii gli eventi nel formato seguente:

[
  {
    "myEventTypeField":"Created",
    "resource":"Users/example/Messages/1000",
    "resourceData":{"someDataField1":"SomeDataFieldValue"}
  }
]

Anche se questo formato non corrisponde allo schema previsto, Griglia di eventi consente di eseguire il mapping dei campi allo schema. In alternativa è possibile ricevere i valori nello schema di origine.

Creare un argomento personalizzato con i campi di cui è stato eseguito il mapping

Quando si crea un argomento personalizzato, specificare come eseguire il mapping dei campi dall'evento di origine allo schema di griglia di eventi. Per personalizzare il mapping, si usano tre valori:

  • Il valore relativo allo schema di input specifica il tipo di schema. Le opzioni disponibili sono lo schema CloudEvents, lo schema evento personalizzato e lo schema griglia di eventi. Il valore predefinito è lo schema griglia di eventi. Quando si crea un mapping personalizzato tra lo schema personalizzato e lo schema griglia di eventi, usare lo schema evento personalizzato. Quando gli eventi si trovano nel formato CloudEvents, usare lo schema CloudEvents.

  • La proprietà relativa ai valori predefiniti di mapping specifica i valori predefiniti per i campi nello schema griglia di eventi. È possibile impostare i valori predefiniti per subject, eventtype e dataversion. In genere, questo parametro si usa quando lo schema personalizzato non include un campo corrispondente a uno di questi tre campi. È ad esempio possibile specificare che la versione di dati sia sempre impostata su 1.0.

  • Il valore relativo ai campi di mapping esegue il mapping dei campi dallo schema in uso allo schema griglia di eventi. I valori vengono specificati in coppie chiave/valore separate da spazi. Per il nome della chiave usare il nome del campo della griglia di eventi. Per il valore usare il nome del campo personalizzato. È possibile usare i nomi delle chiavi id, topic, eventtime, subject, eventtype e dataversion.

Per creare un argomento personalizzato con l'interfaccia della riga di comando di Azure, usare:

az eventgrid topic create \
  -n demotopic \
  -l eastus2 \
  -g myResourceGroup \
  --input-schema customeventschema \
  --input-mapping-fields eventType=myEventTypeField \
  --input-mapping-default-values subject=DefaultSubject dataVersion=1.0

Per PowerShell, usare:

New-AzEventGridTopic `
  -ResourceGroupName myResourceGroup `
  -Name demotopic `
  -Location eastus2 `
  -InputSchema CustomEventSchema `
  -InputMappingField @{eventType="myEventTypeField"} `
  -InputMappingDefaultValue @{subject="DefaultSubject"; dataVersion="1.0" }

Eseguire la sottoscrizione all'argomento di griglia di eventi

Quando si esegue la sottoscrizione all'argomento personalizzato, specificare lo schema da usare per la ricezione di eventi. È necessario specificare lo schema CloudEvents, lo schema evento personalizzato o lo schema griglia di eventi. Il valore predefinito è lo schema griglia di eventi.

L'esempio seguente indica come eseguire la sottoscrizione a un argomento di griglia di eventi e usa lo schema griglia di eventi. Per l'interfaccia della riga di comando di Azure usare:

topicid=$(az eventgrid topic show --name demoTopic -g myResourceGroup --query id --output tsv)

az eventgrid event-subscription create \
  --source-resource-id $topicid \
  --name eventsub1 \
  --event-delivery-schema eventgridschema \
  --endpoint <endpoint_URL>

L'esempio successivo usa lo schema di input dell'evento:

az eventgrid event-subscription create \
  --source-resource-id $topicid \
  --name eventsub2 \
  --event-delivery-schema custominputschema \
  --endpoint <endpoint_URL>

L'esempio seguente indica come eseguire la sottoscrizione a un argomento di griglia di eventi e usa lo schema griglia di eventi. Per PowerShell, usare:

$topicid = (Get-AzEventGridTopic -ResourceGroupName myResourceGroup -Name demoTopic).Id

New-AzEventGridSubscription `
  -ResourceId $topicid `
  -EventSubscriptionName eventsub1 `
  -EndpointType webhook `
  -Endpoint <endpoint-url> `
  -DeliverySchema EventGridSchema

L'esempio successivo usa lo schema di input dell'evento:

New-AzEventGridSubscription `
  -ResourceId $topicid `
  -EventSubscriptionName eventsub2 `
  -EndpointType webhook `
  -Endpoint <endpoint-url> `
  -DeliverySchema CustomInputSchema

Pubblicare l'evento nell'argomento

A questo punto, si è pronti a inviare un evento all'argomento personalizzato e visualizzare il risultato del mapping. Lo script seguente invia un evento nello schema di esempio:

Per l'interfaccia della riga di comando di Azure usare:

endpoint=$(az eventgrid topic show --name demotopic -g myResourceGroup --query "endpoint" --output tsv)
key=$(az eventgrid topic key list --name demotopic -g myResourceGroup --query "key1" --output tsv)

event='[ { "myEventTypeField":"Created", "resource":"Users/example/Messages/1000", "resourceData":{"someDataField1":"SomeDataFieldValue"} } ]'

curl -X POST -H "aeg-sas-key: $key" -d "$event" $endpoint

Per PowerShell, usare:

$endpoint = (Get-AzEventGridTopic -ResourceGroupName myResourceGroup -Name demotopic).Endpoint
$keys = Get-AzEventGridTopicKey -ResourceGroupName myResourceGroup -Name demotopic

$htbody = @{
    myEventTypeField="Created"
    resource="Users/example/Messages/1000"
    resourceData= @{
        someDataField1="SomeDataFieldValue"
    }
}

$body = "["+(ConvertTo-Json $htbody)+"]"
Invoke-WebRequest -Uri $endpoint -Method POST -Body $body -Headers @{"aeg-sas-key" = $keys.Key1}

A questo punto, esaminare l'endpoint del WebHook. Le due sottoscrizioni hanno recapitato gli eventi in schemi diversi.

La prima sottoscrizione ha usato lo schema della griglia di eventi. Il formato dell'evento recapitato è:

{
  "id": "aa5b8e2a-1235-4032-be8f-5223395b9eae",
  "eventTime": "2018-11-07T23:59:14.7997564Z",
  "eventType": "Created",
  "dataVersion": "1.0",
  "metadataVersion": "1",
  "topic": "/subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.EventGrid/topics/demotopic",
  "subject": "DefaultSubject",
  "data": {
    "myEventTypeField": "Created",
    "resource": "Users/example/Messages/1000",
    "resourceData": {
      "someDataField1": "SomeDataFieldValue"
    }
  }
}

Questi campi contengono i mapping da un argomento personalizzato. Viene eseguito il mapping di myEventTypeField a EventType. Vengono usati i valori predefiniti di DataVersion e Subject. L'oggetto Data contiene i campi dello schema di eventi di origine.

La seconda sottoscrizione ha usato lo schema di eventi di input. Il formato dell'evento recapitato è:

{
  "myEventTypeField": "Created",
  "resource": "Users/example/Messages/1000",
  "resourceData": {
    "someDataField1": "SomeDataFieldValue"
  }
}

Si noti che i campi di origine sono stati recapitati.

Passaggi successivi