筛选事件网格的事件

本文介绍如何在创建事件网格订阅时筛选事件。 若要了解事件筛选的选项,请参阅了解事件网格订阅的事件筛选

按事件类型筛选

创建事件网格订阅时,可以指定要发送到终结点的事件类型。 本部分中的示例创建资源组的事件订阅,但会限制发送到 Microsoft.Resources.ResourceWriteFailureMicrosoft.Resources.ResourceWriteSuccess 的事件。 如果在按事件类型筛选事件时需要更多灵活性,请参阅按运算符和数据进行筛选

Azure PowerShell

对于 PowerShell,请在创建订阅时使用 -IncludedEventType 参数。

$includedEventTypes = "Microsoft.Resources.ResourceWriteFailure", "Microsoft.Resources.ResourceWriteSuccess"

New-AzEventGridSubscription `
  -EventSubscriptionName demoSubToResourceGroup `
  -ResourceGroupName myResourceGroup `
  -Endpoint <endpoint-URL> `
  -IncludedEventType $includedEventTypes

Azure CLI

对于 Azure CLI,请使用 --included-event-types 参数。 以下示例在 Bash shell 中使用 Azure CLI:

includedEventTypes="Microsoft.Resources.ResourceWriteFailure Microsoft.Resources.ResourceWriteSuccess"

az eventgrid event-subscription create \
  --name demoSubToResourceGroup \
  --resource-group myResourceGroup \
  --endpoint <endpoint-URL> \
  --included-event-types $includedEventTypes

Azure 门户

创建系统主题的事件订阅时,请使用下拉列表选择事件类型,如下图所示。

Screenshot showing the Create Subscription page with event types selected.

对于系统主题的现有订阅,请使用“事件订阅”页的“筛选器”选项卡,如下图所示。

Screenshot showing the Event Subscription page with the Filters tab selected.

通过选择“添加事件类型”链接,可以在创建自定义主题时指定筛选器,如下图所示。

Screenshot showing the Create Event Subscription page for a custom topic.

若要为自定义主题的现有订阅指定筛选器,请使用“事件订阅”页中的“筛选器”选项卡。

Screenshot of the Event Subscription page with Add Event Type button selected.

Azure 资源管理器模板

对于资源管理器模板,请使用 includedEventTypes 属性。

"resources": [
  {
    "type": "Microsoft.EventGrid/eventSubscriptions",
    "name": "[parameters('eventSubName')]",
    "apiVersion": "2018-09-15-preview",
    "properties": {
      "destination": {
        "endpointType": "WebHook",
        "properties": {
          "endpointUrl": "[parameters('endpoint')]"
        }
      },
      "filter": {
        "subjectBeginsWith": "",
        "subjectEndsWith": "",
        "isSubjectCaseSensitive": false,
        "includedEventTypes": [
          "Microsoft.Resources.ResourceWriteFailure",
          "Microsoft.Resources.ResourceWriteSuccess"
        ]
      }
    }
  }
]

注意

若要详细了解这些筛选器(事件类型、主题和高级),请参阅了解事件网格订阅的事件筛选

按主题筛选

可以按事件数据中的主题筛选事件。 可以指定一个值来匹配主题的开头或结尾。 如果在按主题筛选事件时需要更多灵活性,请参阅按运算符和数据进行筛选

在以下 PowerShell 示例中,会创建一个按主题开头筛选的事件订阅。 使用 -SubjectBeginsWith 参数将事件限制为特定资源的事件。 然后传递网络安全组的资源 ID。

Azure PowerShell

$resourceId = (Get-AzResource -ResourceName demoSecurityGroup -ResourceGroupName myResourceGroup).ResourceId

New-AzEventGridSubscription `
  -Endpoint <endpoint-URL> `
  -EventSubscriptionName demoSubscriptionToResourceGroup `
  -ResourceGroupName myResourceGroup `
  -SubjectBeginsWith $resourceId

下一个 PowerShell 示例创建 blob 存储的订阅。 其中将事件限制为主题以 .jpg 结尾的事件。

$storageId = (Get-AzStorageAccount -ResourceGroupName myResourceGroup -AccountName $storageName).Id

New-AzEventGridSubscription `
  -EventSubscriptionName demoSubToStorage `
  -Endpoint <endpoint-URL> `
  -ResourceId $storageId `
  -SubjectEndsWith ".jpg"

Azure CLI

在以下 Azure CLI 示例中,会创建一个按主题开头筛选的事件订阅。 使用 --subject-begins-with 参数将事件限制为特定资源的事件。 然后传递网络安全组的资源 ID。

resourceId=$(az resource show --name demoSecurityGroup --resource-group myResourceGroup --resource-type Microsoft.Network/networkSecurityGroups --query id --output tsv)

az eventgrid event-subscription create \
  --name demoSubscriptionToResourceGroup \
  --resource-group myResourceGroup \
  --endpoint <endpoint-URL> \
  --subject-begins-with $resourceId

下一个 Azure CLI 示例创建 blob 存储的订阅。 其中将事件限制为主题以 .jpg 结尾的事件。

storageid=$(az storage account show --name $storageName --resource-group myResourceGroup --query id --output tsv)

az eventgrid event-subscription create \
  --source-resource-id $storageid \
  --name demoSubToStorage \
  --endpoint <endpoint-URL> \
  --subject-ends-with ".jpg"

Azure 门户

对于现有事件订阅:

  1. 在“事件订阅”页上选择“启用主题筛选”。

  2. 为以下一个或多个字段输入值:“主题开头为”和“主题结尾为”。 在以下选项中,选择两个选项。

    Screenshot of Event Subscription page with subject filtering example.

  3. 如果希望事件的主题与指定的筛选器的大小写匹配,选择“区分大小写的主题匹配”选项。

创建事件订阅时,请使用创建向导上的“筛选器”选项卡。

Screenshot of Create Event Subscription page with the Filters tab selected.

Azure 资源管理器模板

在以下资源管理器模板示例中,会创建一个按主题开头筛选的事件订阅。 使用 subjectBeginsWith 属性将事件限制为特定资源的事件。 然后传递网络安全组的资源 ID。

"resources": [
  {
    "type": "Microsoft.EventGrid/eventSubscriptions",
    "name": "[parameters('eventSubName')]",
    "apiVersion": "2018-09-15-preview",
    "properties": {
      "destination": {
        "endpointType": "WebHook",
        "properties": {
          "endpointUrl": "[parameters('endpoint')]"
        }
      },
      "filter": {
        "subjectBeginsWith": "[resourceId('Microsoft.Network/networkSecurityGroups','demoSecurityGroup')]",
        "subjectEndsWith": "",
        "isSubjectCaseSensitive": false,
        "includedEventTypes": [ "All" ]
      }
    }
  }
]

下一个资源管理模板示例创建 blob 存储的订阅。 其中将事件限制为主题以 .jpg 结尾的事件。

"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts/providers/eventSubscriptions",
    "name": "[concat(parameters('storageName'), '/Microsoft.EventGrid/', parameters('eventSubName'))]",
    "apiVersion": "2018-09-15-preview",
    "properties": {
      "destination": {
        "endpointType": "WebHook",
        "properties": {
          "endpointUrl": "[parameters('endpoint')]"
        }
      },
      "filter": {
        "subjectEndsWith": ".jpg",
        "subjectBeginsWith": "",
        "isSubjectCaseSensitive": false,
        "includedEventTypes": [ "All" ]
      }
    }
  }
]

注意

若要详细了解这些筛选器(事件类型、主题和高级),请参阅了解事件网格订阅的事件筛选

按运算符和数据进行筛选

为提高筛选灵活性,可以使用运算符和数据属性来筛选事件。

订阅高级筛选器

若要了解可用于高级筛选的运算符和密钥,请参阅高级筛选

这些示例创建自定义主题。 它们订阅自定义主题,并按数据对象中的值进行筛选。 将颜色属性设置为“蓝色”、“红色”或“绿色”的事件会发送到订阅。

Azure PowerShell

对于 PowerShell,请使用:

$topicName = <your-topic-name>
$endpointURL = <endpoint-URL>

New-AzResourceGroup -Name gridResourceGroup -Location chinaeast2
New-AzEventGridTopic -ResourceGroupName gridResourceGroup -Location chinaeast2 -Name $topicName

$topicid = (Get-AzEventGridTopic -ResourceGroupName gridResourceGroup -Name $topicName).Id

$expDate = '<mm/dd/yyyy hh:mm:ss>' | Get-Date
$AdvFilter1=@{operator="StringIn"; key="Data.color"; Values=@('blue', 'red', 'green')}

New-AzEventGridSubscription `
  -ResourceId $topicid `
  -EventSubscriptionName <event_subscription_name> `
  -Endpoint $endpointURL `
  -ExpirationDate $expDate `
  -AdvancedFilter @($AdvFilter1)

Azure CLI

对于 Azure CLI,请使用:

topicName=<your-topic-name>
endpointURL=<endpoint-URL>

az group create -n gridResourceGroup -l chinaeast2
az eventgrid topic create --name $topicName -l chinaeast2 -g gridResourceGroup

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

az eventgrid event-subscription create \
  --source-resource-id $topicid \
  -n demoAdvancedSub \
  --advanced-filter data.color stringin blue red green \
  --endpoint $endpointURL \
  --expiration-date "<yyyy-mm-dd>"

请注意为订阅设置到期日期

Azure 门户

  1. 在“事件订阅”页上,选择“高级筛选器”部分中的“添加新筛选器”。

    Screenshot showing the Event Subscription page with Add new filter link highlighted.

  2. 指定要比较的密钥、运算符和值。 在以下示例中,“data.color”用作密钥,“字符串在”用作运算符,而“蓝色”、“红色”和“绿色”值为指定的值。

    Screenshot showing an example of an advanced filter.

    注意

    若要详细了解高级筛选器,请参阅了解事件网格订阅的事件筛选

测试筛选器

若要测试筛选器,请发送将颜色字段设置为“绿色”的事件。 由于绿色是筛选器中的值之一,因此该事件将传递到终结点。

Azure PowerShell

对于 PowerShell,请使用:

$endpoint = (Get-AzEventGridTopic -ResourceGroupName gridResourceGroup -Name $topicName).Endpoint
$keys = Get-AzEventGridTopicKey -ResourceGroupName gridResourceGroup -Name $topicName

$eventID = Get-Random 99999
$eventDate = Get-Date -Format s

$htbody = @{
    id= $eventID
    eventType="recordInserted"
    subject="myapp/vehicles/cars"
    eventTime= $eventDate
    data= @{
        model="SUV"
        color="green"
    }
    dataVersion="1.0"
}

$body = "["+(ConvertTo-Json $htbody)+"]"

Invoke-WebRequest -Uri $endpoint -Method POST -Body $body -Headers @{"aeg-sas-key" = $keys.Key1}

若要测试未发送事件的情形,请发送将颜色字段设置为“黄色”的事件。 “黄色”不是订阅中所指定的其中一个值,因此不会将事件发送到订阅。

$htbody = @{
    id= $eventID
    eventType="recordInserted"
    subject="myapp/vehicles/cars"
    eventTime= $eventDate
    data= @{
        model="SUV"
        color="yellow"
    }
    dataVersion="1.0"
}

$body = "["+(ConvertTo-Json $htbody)+"]"

Invoke-WebRequest -Uri $endpoint -Method POST -Body $body -Headers @{"aeg-sas-key" = $keys.Key1}

Azure CLI

对于 Azure CLI,请使用:

topicEndpoint=$(az eventgrid topic show --name $topicName -g gridResourceGroup --query "endpoint" --output tsv)
key=$(az eventgrid topic key list --name $topicName -g gridResourceGroup --query "key1" --output tsv)

event='[ {"id": "'"$RANDOM"'", "eventType": "recordInserted", "subject": "myapp/vehicles/cars", "eventTime": "'`date +%Y-%m-%dT%H:%M:%S%z`'", "data":{ "model": "SUV", "color": "green"},"dataVersion": "1.0"} ]'

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

若要测试未发送事件的情形,请发送将颜色字段设置为“黄色”的事件。 “黄色”不是订阅中所指定的其中一个值,因此不会将事件发送到订阅。

对于 Azure CLI,请使用:

event='[ {"id": "'"$RANDOM"'", "eventType": "recordInserted", "subject": "myapp/vehicles/cars", "eventTime": "'`date +%Y-%m-%dT%H:%M:%S%z`'", "data":{ "model": "SUV", "color": "yellow"},"dataVersion": "1.0"} ]'

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

后续步骤

若要详细了解筛选器(事件类型、主题和高级),请参阅了解事件网格订阅的事件筛选