你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 事件网格命名空间主题订阅的事件筛选器

本文介绍针对命名空间主题的事件订阅指定筛选器的不同方法。 筛选器允许仅将发布者发送到事件网格的事件子集发送到目标终结点。 创建事件订阅时,有三个选项用于筛选:

  • 事件类型
  • 主题以或结尾开头
  • 高级字段和运算符

事件类型筛选

默认情况下,事件源的所有 事件类型 都会发送到终结点。 可以决定仅将某些事件类型发送到终结点。 例如,可以收到资源更新的通知,但不会通知其他作(例如删除)。 在这种情况下,按 Microsoft.Resources.ResourceWriteSuccess 事件类型进行筛选。 提供包含事件类型的数组,或指定 All 以获取事件源的所有事件类型。

按事件类型筛选的 JSON 语法为:

"filter": {
  "includedEventTypes": [
    "Microsoft.Resources.ResourceWriteFailure",
    "Microsoft.Resources.ResourceWriteSuccess"
  ]
}

主题筛选

对于按主题进行简单筛选,请为主题指定起始值或结束值。 例如,可以指定主题结尾 .txt ,以便仅获取与将文本文件上传到存储帐户相关的事件。 或者,可以筛选主题以 /blobServices/default/containers/testcontainer 获取该容器的所有事件,而不是存储帐户中的其他容器。

将事件发布到自定义主题时,请为事件创建主题,使订阅者能够轻松了解他们是否对事件感兴趣。 订阅服务器使用 使用者 属性筛选和路由事件。 请考虑添加事件发生位置的路径,以便订阅者可以按该路径的段进行筛选。 该路径使订阅者能够缩小或广泛筛选事件。 如果提供三个段路径(如 /A/B/C 主题中所示),则订阅者可以按第一个段 /A 进行筛选以获取广泛的事件集。 这些订阅者获取具有主题的事件,例如 /A/B/C/A/D/E。 其他订阅者可以通过筛选 /A/B 来获取更窄的事件集。

示例(Blob 存储事件)

Blob 事件可以按创建或删除的对象的事件类型、容器名称或名称进行筛选。

Blob 存储事件的主题采用以下格式:

/blobServices/default/containers/<containername>/blobs/<blobname>

若要匹配存储帐户的所有事件,可以将主题筛选器留空。

若要匹配在共享前缀的一组容器中创建的 Blob 的事件,请使用 subjectBeginsWith 如下筛选器:

/blobServices/default/containers/containerprefix

若要匹配特定容器中创建的 Blob 的事件,请使用 subjectBeginsWith 如下筛选器:

/blobServices/default/containers/containername/

若要匹配在特定容器中创建的 blob 的事件,请共享 blob 名称前缀,请使用 subjectBeginsWith 如下筛选器:

/blobServices/default/containers/containername/blobs/blobprefix

若要匹配 Blob 在容器的特定子文件夹中创建的事件,请使用 subjectBeginsWith 如下筛选器:

/blobServices/default/containers/{containername}/blobs/{subfolder}/

若要匹配特定容器中创建的 blob 的事件,请使用 subjectEndsWith “.log”或“.jpg”等筛选器。

高级筛选

若要按数据字段中的值进行筛选并指定比较运算符,请使用高级筛选选项。 在高级筛选中,可以指定:

  • 运算符类型 - 比较类型。
  • 键 - 用于筛选的事件数据中的字段。 它可以是数字、布尔值、字符串或数组。
  • values - 要与键进行比较的值或值。

Key

键是用于筛选的事件数据中的字段。 它可以是以下类型之一:

  • 编号

  • 布尔

  • String

  • 数组。 需要将 enableAdvancedFilteringOnArrays 属性设置为 true 才能使用此功能。

    "filter":
    {
        "subjectBeginsWith": "/blobServices/default/containers/mycontainer/blobs/log",
        "subjectEndsWith": ".jpg",
        "enableAdvancedFilteringOnArrays": true
    }
    

对于云事件架构中的事件,请使用以下键值:eventid、、sourceeventtypeeventtypeversion或事件数据(如data.key1)。

如果使用的是事件网格基本层,则对于事件网格架构中的事件,请使用以下键值:ID、、TopicSubjectEventTypeDataVersion或事件数据(如data.key1)。 对于 自定义输入架构,请使用事件数据字段(如 data.key1)。 若要访问数据节中的字段,请使用 . (dot) 表示法。 例如,data.siteNamedata.appEventTypeDetail.action若要访问siteNameaction访问以下示例事件。

	"data": {
		"appEventTypeDetail": {
			"action": "Started"
		},
		"siteName": "<site-name>",
		"clientRequestId": "None",
		"correlationRequestId": "None",
		"requestId": "292f499d-04ee-4066-994d-c2df57b99198",
		"address": "None",
		"verb": "None"
	},

注释

事件网格不支持对对象数组进行筛选。 它只允许相同类型的 String、Boolean、Numbers 和 Array(如整数数组或字符串数组)。

价值观

值可以是:number、string、boolean 或数组

运营商

数字的可用运算符包括:

NumberIn

如果 值是指定 筛选器 值之一,则 NumberIn 运算符的计算结果为 true。 在下面的示例中,它会检查节中data属性的值counter是 5 还是 1。

"advancedFilters": [{
    "operatorType": "NumberIn",
    "key": "data.counter",
    "values": [
        5,
        1
    ]
}]

如果键是数组,则会根据筛选器值的数组检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 和筛选器: [a, b, c]。 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH filter IN (a, b, c)
    FOR_EACH key IN (v1, v2, v3)
        IF filter == key
            MATCH

NumberNotIn

如果 不是 任何指定的 筛选器 值,则 NumberNotIn 的计算结果为 true。 在以下示例中,它会检查节中data属性的值counter是否不是 41 和 0。

"advancedFilters": [{
    "operatorType": "NumberNotIn",
    "key": "data.counter",
    "values": [
        41,
        0
    ]
}]

如果键是数组,则会根据筛选器值的数组检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 和筛选器: [a, b, c]。 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH filter IN (a, b, c)
    FOR_EACH key IN (v1, v2, v3)
        IF filter == key
            FAIL_MATCH

NumberLessThan

如果 小于 指定的 筛选器 值,NumberLessThan 运算符的计算结果为 true。 在以下示例中,它会检查节中data属性的值counter是否小于 100。

"advancedFilters": [{
    "operatorType": "NumberLessThan",
    "key": "data.counter",
    "value": 100
}]

如果键是数组,则会根据筛选器值检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH key IN (v1, v2, v3)
    IF key < filter
        MATCH

NumberGreaterThan

如果 大于 指定的 筛选器 值,NumberGreaterThan 运算符的计算结果为 true。 在以下示例中,它会检查节中data属性的值counter是否大于 20。

"advancedFilters": [{
    "operatorType": "NumberGreaterThan",
    "key": "data.counter",
    "value": 20
}]

如果键是数组,则会根据筛选器值检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH key IN (v1, v2, v3)
    IF key > filter
        MATCH

NumberLessThanOrEquals

如果 小于或等于 指定的 筛选器 值,NumberLessThanOrEquals 运算符的计算结果为 true。 在以下示例中,它会检查节中data属性的值counter是否小于或等于 100。

"advancedFilters": [{
    "operatorType": "NumberLessThanOrEquals",
    "key": "data.counter",
    "value": 100
}]

如果键是数组,则会根据筛选器值检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH key IN (v1, v2, v3)
    IF key <= filter
        MATCH

NumberGreaterThanOrEquals

如果 大于或等于 指定的 筛选器 值,NumberGreaterThanOrEquals 运算符的计算结果为 true。 在以下示例中,它会检查节中data属性的值counter是否大于或等于 30。

"advancedFilters": [{
    "operatorType": "NumberGreaterThanOrEquals",
    "key": "data.counter",
    "value": 30
}]

如果键是数组,则会根据筛选器值检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH key IN (v1, v2, v3)
    IF key >= filter
        MATCH

NumberInRange

如果 值位于指定 筛选器范围之一,则 NumberInRange 运算符的计算结果为 true。 在以下示例中,它会检查节中的data属性值key1是否位于以下两个范围之一:3.14159 - 999.95、3000 - 4000。

{
    "operatorType": "NumberInRange",
    "key": "data.key1",
    "values": [[3.14159, 999.95], [3000, 4000]]
}

values 属性是范围数组。 在前面的示例中,它是两个范围的数组。 下面是一个数组的示例,其中包含一个要检查的范围。

具有一个范围的数组:

{
    "operatorType": "NumberInRange",
    "key": "data.key1",
    "values": [[3000, 4000]]
}

如果键是数组,则会根据筛选器值的数组检查数组中的所有值。 下面是具有键和筛选器的 [v1, v2, v3] 伪代码:范围数组。 在此伪代码中, a 数组 b 中每个范围的低值和高值。 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH (a,b) IN filter.Values
    FOR_EACH key IN (v1, v2, v3)
       IF key >= a AND key <= b
           MATCH

NumberNotInRange

如果 不在 任何指定的 筛选器范围内,NumberNotInRange 运算符的计算结果为 true。 在以下示例中,它会检查节中的data属性值key1是否位于以下两个范围之一:3.14159 - 999.95、3000 - 4000。 如果是,则运算符返回 false。

{
    "operatorType": "NumberNotInRange",
    "key": "data.key1",
    "values": [[3.14159, 999.95], [3000, 4000]]
}

values 属性是范围数组。 在前面的示例中,它是两个范围的数组。 下面是一个数组的示例,其中包含一个要检查的范围。

具有一个范围的数组:

{
    "operatorType": "NumberNotInRange",
    "key": "data.key1",
    "values": [[3000, 4000]]
}

如果键是数组,则会根据筛选器值的数组检查数组中的所有值。 下面是具有键和筛选器的 [v1, v2, v3] 伪代码:范围数组。 在此伪代码中, a 数组 b 中每个范围的低值和高值。 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH (a,b) IN filter.Values
    FOR_EACH key IN (v1, v2, v3)
        IF key >= a AND key <= b
            FAIL_MATCH

布尔值的可用运算符为:

BoolEquals

如果 值是指定的布尔值 筛选器,BoolEquals 运算符的计算结果为 true。 在下面的示例中,它会检查节中属性的值isEnabled是否为 truedata

"advancedFilters": [{
    "operatorType": "BoolEquals",
    "key": "data.isEnabled",
    "value": true
}]

如果键是数组,则会根据筛选器布尔值检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH key IN (v1, v2, v3)
    IF filter == key
        MATCH

字符串的可用运算符包括:

StringContains

如果包含任何指定的筛选器值(作为子字符串),StringContains 的计算结果为 true。 在下面的示例中,它会检查节中的data特性值key1是否包含指定子字符串之一: microsoftazure。 例如, azure data factory 它包含 azure 其中。

"advancedFilters": [{
    "operatorType": "StringContains",
    "key": "data.key1",
    "values": [
        "microsoft", 
        "azure"
    ]
}]

如果键是数组,则会根据筛选器值的数组检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 和筛选器: [a,b,c]。 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH filter IN (a, b, c)
    FOR_EACH key IN (v1, v2, v3)
        IF key CONTAINS filter
            MATCH

StringNotContains

如果不包含指定筛选器值作为子字符串,StringNotContains 运算符的计算结果为 true。 如果键包含指定值之一作为子字符串,则运算符的计算结果为 false。 在下面的示例中,仅当节中data属性的值key1没有contoso并且fabrikam作为子字符串时,运算符才返回 true。

"advancedFilters": [{
    "operatorType": "StringNotContains",
    "key": "data.key1",
    "values": [
        "contoso", 
        "fabrikam"
    ]
}]

如果键是数组,则会根据筛选器值的数组检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 和筛选器: [a,b,c]。 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH filter IN (a, b, c)
    FOR_EACH key IN (v1, v2, v3)
        IF key CONTAINS filter
            FAIL_MATCH

有关此运算符的当前限制,请参阅 “限制 ”部分。

StringBeginsWith

如果值以任何指定的筛选器开头StringBeginsWith 运算符的计算结果为 true。 在下面的示例中,它会检查节中data属性的值key1是否以eventmessage. 例如, event hubs 以 . 开头 event

"advancedFilters": [{
    "operatorType": "StringBeginsWith",
    "key": "data.key1",
    "values": [
        "event", 
        "message"
    ]
}]

如果键是数组,则会根据筛选器值的数组检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 和筛选器: [a,b,c]。 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH filter IN (a, b, c)
    FOR_EACH key IN (v1, v2, v3)
        IF key BEGINS_WITH filter
            MATCH

StringNotBeginsWith

如果不以任何指定的筛选器值开头,StringNotBeginsWith 运算符的计算结果为 true。 在下面的示例中,它会检查节中data属性的值key1是否不以eventmessage.

"advancedFilters": [{
    "operatorType": "StringNotBeginsWith",
    "key": "data.key1",
    "values": [
        "event", 
        "message"
    ]
}]

如果键是数组,则会根据筛选器值的数组检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 和筛选器: [a,b,c]。 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH filter IN (a, b, c)
    FOR_EACH key IN (v1, v2, v3)
        IF key BEGINS_WITH filter
            FAIL_MATCH

StringEndsWith

如果指定筛选器值之一结尾,StringEndsWith 运算符的计算结果为 true。 在下面的示例中,它会检查节中属性的值key1是否以jpgjpeg或 。pngdata 例如, eventgrid.png 以 . 结尾 png

"advancedFilters": [{
    "operatorType": "StringEndsWith",
    "key": "data.key1",
    "values": [
        "jpg", 
        "jpeg", 
        "png"
    ]
}]

如果键是数组,则会根据筛选器值的数组检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 和筛选器: [a,b,c]。 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH filter IN (a, b, c)
    FOR_EACH key IN (v1, v2, v3)
        IF key ENDS_WITH filter
            MATCH

StringNotEndsWith

如果未以任何指定的筛选器值结尾,则 StringNotEndsWith 运算符的计算结果为 true。 在下面的示例中,它会检查节中属性的值key1是否不以jpgjpeg结尾pngdata

"advancedFilters": [{
    "operatorType": "StringNotEndsWith",
    "key": "data.key1",
    "values": [
        "jpg", 
        "jpeg", 
        "png"
    ]
}]

如果键是数组,则会根据筛选器值的数组检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 和筛选器: [a,b,c]。 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH filter IN (a, b, c)
    FOR_EACH key IN (v1, v2, v3)
        IF key ENDS_WITH filter
            FAIL_MATCH

StringIn

StringIn 运算符检查值是否与指定筛选器值之一完全匹配。 在下面的示例中,它会检查节中属性的值key1是还是 fabrikamfactorydatacontoso

"advancedFilters": [{
    "operatorType": "StringIn",
    "key": "data.key1",
    "values": [
        "contoso", 
        "fabrikam", 
        "factory"
    ]
}]

如果键是数组,则会根据筛选器值的数组检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 和筛选器: [a,b,c]。 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH filter IN (a, b, c)
    FOR_EACH key IN (v1, v2, v3)
        IF filter == key
            MATCH

StringNotIn

StringNotIn 运算符检查值是否与任何指定的筛选器不匹配。 在以下示例中,它会检查节中data属性的值key1是否不awsbridge

"advancedFilters": [{
    "operatorType": "StringNotIn",
    "key": "data.key1",
    "values": [
        "aws", 
        "bridge"
    ]
}]

如果键是数组,则会根据筛选器值的数组检查数组中的所有值。 下面是带有键的伪代码: [v1, v2, v3] 和筛选器: [a,b,c]。 忽略任何数据类型与筛选器数据类型不匹配的键值。

FOR_EACH filter IN (a, b, c)
    FOR_EACH key IN (v1, v2, v3)
        IF filter == key
            FAIL_MATCH

所有字符串比较都不区分大小写。

注释

如果事件 JSON 不包含高级筛选器键, 筛选器的计算结果为 以下运算符不匹配 :NumberGreaterThan、NumberGreaterThanOrEquals、NumberLessThan、NumberLessThanOrEquals、NumberIn、BoolEquals、StringContains、StringNotContains、StringBeginsWith、StringNotBeginsWith、StringEndsWith、StringNotEndsWith、StringNotEndsWith、StringIn。

筛选器的计算结果为以下运算符 的匹配 项:NumberNotIn、StringNotIn。

IsNullOrUndefined

如果键的值为 NULL 或未定义,IsNullOrUndefined 运算符的计算结果为 true。

{
    "operatorType": "IsNullOrUndefined",
    "key": "data.key1"
}

在下面的示例中,key1 缺失,因此运算符的计算结果为 true。

{ 
    "data": 
    { 
        "key2": 5 
    } 
}

在以下示例中,key1 设置为 null,因此运算符的计算结果为 true。

{
    "data": 
    { 
        "key1": null
    }
}

如果 key1 在这些示例中具有任何其他值,则运算符的计算结果为 false。

IsNotNull

如果键的值不为 NULL 或未定义,IsNotNull 运算符的计算结果为 true。

{
    "operatorType": "IsNotNull",
    "key": "data.key1"
}

OR and AND

如果指定具有多个值的单个筛选器,则执行 OR 作,因此键字段的值必须是这些值之一。 下面是一个示例:

"advancedFilters": [
    {
        "operatorType": "StringContains",
        "key": "Subject",
        "values": [
            "/providers/microsoft.devtestlab/",
            "/providers/Microsoft.Compute/virtualMachines/"
        ]
    }
]

如果指定多个不同的筛选器,则会执行 AND 作,因此必须满足每个筛选条件。 下面是一个示例:

"advancedFilters": [
    {
        "operatorType": "StringContains",
        "key": "Subject",
        "values": [
            "/providers/microsoft.devtestlab/"
        ]
    },
    {
        "operatorType": "StringContains",
        "key": "Subject",
        "values": [
            "/providers/Microsoft.Compute/virtualMachines/"
        ]
    }
]

CloudEvents

对于 CloudEvents 架构中的事件,请使用以下键值:id、、sourcetypedataschema或事件数据(如data.key1)。

还可以 在 CloudEvents 1.0 中使用扩展上下文属性。 在以下示例中, comexampleextension1comexampleothervalue 扩展上下文属性。

{
    "specversion" : "1.0",
    "type" : "com.example.someevent",
    "source" : "/mycontext",
    "id" : "C234-1234-1234",
    "time" : "2018-04-05T17:31:00Z",
    "subject": null,
    "comexampleextension1" : "value",
    "comexampleothervalue" : 5,
    "datacontenttype" : "application/json",
    "data" : {
        "appinfoA" : "abc",
        "appinfoB" : 123,
        "appinfoC" : true
    }
}

下面是在筛选器中使用扩展上下文属性的示例。

"advancedFilters": [{
    "operatorType": "StringBeginsWith",
    "key": "comexampleothervalue",
    "values": [
        "5", 
        "1"
    ]
}]

局限性

高级筛选具有以下限制:

  • 每个事件网格订阅的所有筛选器中 25 个高级筛选器和 25 个筛选器值
  • 每个字符串值 512 个字符
  • 键中带有 . (点) 字符。 例如:http://schemas.microsoft.com/claims/authnclassreferencejohn.doe@contoso.com。 目前,不支持键中的转义字符。

同一个键可用于多个筛选器。

后续步骤