Compartilhar via


Filtros de evento para assinaturas para tópicos de namespace da Grade de Eventos do Azure

Este artigo descreve diferentes maneiras de especificar filtros em assinaturas de eventos para tópicos de namespace. Os filtros permitem que você envie apenas um subconjunto de eventos que o publicador envia à Grade de Eventos para o ponto de extremidade de destino. Ao criar uma assinatura de evento, você tem três opções de filtragem:

  • Tipos de evento
  • Assunto começa com ou termina com
  • Campos avançados e operadores

Filtragem de tipo de evento

Por padrão, todos os tipos de evento para a origem do evento são enviadas para o ponto de extremidade. Você pode optar por enviar somente determinados tipos de evento para seu ponto de extremidade. Por exemplo, você pode ser notificado sobre atualizações para seus recursos, mas não é notificado para outras operações, como exclusões. Nesse caso, filtre pelo Microsoft.Resources.ResourceWriteSuccess tipo de evento. Forneça uma matriz com os tipos de evento ou especifique All para obter todos os tipos de evento para a origem do evento.

A sintaxe JSON para filtrar por tipo de evento é:

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

Filtro de assunto

Para filtragem simples por assunto, especifique um valor inicial ou final para o assunto. Por exemplo, você pode especificar o assunto que termina com .txt para obter apenas os eventos relacionados ao carregamento de um arquivo de texto para a conta de armazenamento. Ou, você pode filtrar o assunto começa com /blobServices/default/containers/testcontainer para obter todos os eventos para esse contêiner, mas não para outros contêineres na conta de armazenamento.

Ao publicar eventos em tópicos personalizados, crie assuntos para os eventos que tornem mais fácil aos assinantes reconhecer se estão interessados no evento. Os assinantes usam a propriedade assunto para filtrar e rotear eventos. Considere adicionar o caminho do acontecimento do evento para que os assinante possam filtrar por segmentos desse caminho. O caminho permite que os assinantes filtrem eventos de maneira restrita ou ampla. Se você fornecer um caminho de três segmentos como /A/B/C no assunto, os assinantes poderão filtrar pelo primeiro segmento /A para obter um conjunto amplo de eventos. Esses assinantes recebem eventos com assuntos como /A/B/C ou /A/D/E. Outros assinantes podem filtrar por /A/B para obter um conjunto de eventos mais restrito.

Exemplos (eventos de Armazenamento de Blobs)

Os eventos de blob podem ser filtrados pelo tipo de evento, pelo nome do contêiner ou pelo objeto que foi criado ou excluído.

O assunto de eventos do Armazenamento de Blobs usa o formato:

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

Para corresponder todos os eventos de uma conta de armazenamento, você pode deixar os filtros de assunto vazios.

Para corresponder os eventos de blobs criados em um conjunto de contêineres que compartilham um prefixo, use um filtro subjectBeginsWith como:

/blobServices/default/containers/containerprefix

Para corresponder os eventos de blobs criados em um contêiner específico, use um filtro subjectBeginsWith como:

/blobServices/default/containers/containername/

Para corresponder os eventos de blobs criados em um contêiner específico que compartilha um prefixo de nome de blob, use um filtro subjectBeginsWith como:

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

Para encontrar eventos de blobs criados em uma subpasta específica de um contêiner, use um filtro subjectBeginsWith como:

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

Para corresponder os eventos de blobs criados em um contêiner específico que compartilha um sufixo de nome de blob, use um filtro subjectEndsWith como “.log” ou “.jpg”.

Filtragem avançada

Para filtrar por valores nos campos de dados e especificar o operador de comparação, use a opção de filtragem avançada. Na filtragem avançada, você especifica o:

  • tipo de operador: o tipo de comparação.
  • chave – o campo nos dados do evento que você está usando para filtragem. Pode ser um número, um booliano, uma cadeia de caracteres ou uma matriz.
  • valores – os valores a serem comparados com a chave.

Chave

Chave é o campo nos dados de evento que você está usando para filtragem. Pode ser um dos seguintes tipos:

  • Número

  • Boolean

  • String

  • Matriz. Você precisa definir a propriedade enableAdvancedFilteringOnArrays como true para usar esse recurso.

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

Para eventos no esquema Eventos de Nuvem, use os seguintes valores para a chave: eventid, source, eventtype, eventtypeversion ou dados de evento (como data.key1).

Se você estiver usando a camada básica da Grade de Eventos, para eventos no esquema da Grade de Eventos, use os seguintes valores para a chave:ID, Topic, Subject, EventType, DataVersionou dados de evento (como data.key1). Para esquema de entrada personalizada, use os campos de dados de evento (comodata.key1). Para acessar campos na seção de dados, use a notação . (ponto). Por exemplo, data.siteName, data.appEventTypeDetail.action para acessar siteName ou action para a amostra de evento a seguir.

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

Observação

A Grade de Eventos não suporta a filtragem em uma matriz de objetos. Ela só permite String, Boolean, Numbers e Array dos mesmos tipos (como integer array ou string array).

Valores

Os valores podem ser: número, cadeia de caracteres, booliano ou matriz.

Operadores

Os operadores disponíveis para números são:

NumberIn

O operador NumberIn será avaliado como true se o valor da chave for um dos valores de filtro especificados. No exemplo a seguir, ele verifica se o valor do atributo counter na seção data é 5 ou 1.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação à matriz dos valores de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3] e o filtro: [a, b, c]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

NumberNotIn

O operador NumberNotIn será avaliado como true se o valor da chavenão for nenhum dos valores defiltro especificados. No exemplo a seguir, ele verifica se o valor do atributo counter na seção data não é 41 e 0.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação à matriz dos valores de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3] e o filtro: [a, b, c]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

NumberLessThan

O operador NumberLessThan será avaliado como true se o valor da chave for menor que o valor de filtro especificado. No exemplo a seguir, ele verifica se o valor do atributo counter na seção data é menor que 100.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação ao valor de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

NumberGreaterThan

O operador NumberGreaterThan será avaliado como true se o valor da chave for maior que o valor de filtro especificado. No exemplo a seguir, ele verifica se o valor do atributo counter na seção data é maior que 20.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação ao valor de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

NumberLessThanOrEquals

O operador NumberLessThanOrEquals será avaliado como true se o valor da chave for menor ou igual ao valor de filtro especificado. No exemplo a seguir, ele verifica se o valor do atributo counter na seção data é menor ou igual a 100.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação ao valor de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

NumberGreaterThanOrEquals

O operador NumberGreaterThanOrEquals será avaliado como true se o valor da chave for maior ou igual ao valor de filtro especificado. No exemplo a seguir, ele verifica se o valor do atributo counter na seção data é maior ou igual a 30.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação ao valor de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

NumberInRange

O operadorNumberInRange será avaliado como true se o valor da chave estiver em um dos intervalos de filtro especificados. No exemplo a seguir, ele verifica se o valor do atributo key1 na seção data está em um dos dois intervalos: 3.14159 - 999.95, 3000 - 4000.

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

A propriedade values é uma matriz de intervalos. No exemplo anterior, ela é uma matriz de dois intervalos. Veja a seguir um exemplo de matriz com um intervalo a ser verificado.

Matriz com um intervalo:

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação à matriz dos valores de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3] e o filtro: uma matriz de intervalos. Nesse pseudo-código, a e b são valores altos e baixos de cada intervalo na matriz. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

NumberNotInRange

O operador NumberNotInRange será avaliado como true se o valor da chavenãoestiver em um dos intervalos de filtro especificados. No exemplo a seguir, ele verifica se o valor do atributo key1 na seção data está em um dos dois intervalos: 3.14159 - 999.95, 3000 - 4000. Nesse caso, o operador retornará false.

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

A propriedade values é uma matriz de intervalos. No exemplo anterior, ela é uma matriz de dois intervalos. Veja a seguir um exemplo de matriz com um intervalo a ser verificado.

Matriz com um intervalo:

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação à matriz dos valores de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3] e o filtro: uma matriz de intervalos. Nesse pseudo-código, a e b são valores altos e baixos de cada intervalo na matriz. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

O operador disponível para boolianos é:

BoolEquals

O operador BoolEquals será avaliado como true se o valor da chave for o filtro de valor booliano especificado. No exemplo a seguir, ele verifica se o valor do atributo isEnabled na seção data é true.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação ao valor booliano do filtro. Este é o pseudocódigo com a chave: [v1, v2, v3]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

Os operadores disponíveis para cadeias de caracteres são:

StringContains

O operador StringContains será avaliado como true se o valor da chavecontiver qualquer um dos valores de filtro especificados (como substrings). No exemplo a seguir, ele verifica se o valor do atributo key1 na seção data contém uma das substrings especificadas: microsoft ou azure. Por exemplo, azure data factory contém azure.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação à matriz dos valores de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3] e o filtro: [a,b,c]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

StringNotContains

O operador StringNotContains será avaliado como true se a chavenão contiver os valores de filtro especificados como substrings. Se a chave contiver um dos valores especificados como uma substring, o operador será avaliado como false. No exemplo a seguir, o operador retornará true somente se o valor do atributo key1 na seção data não tiver contoso e fabrikam como substrings.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação à matriz dos valores de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3] e o filtro: [a,b,c]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

Consulte a seção Limitações para obter a limitação atual deste operador.

StringBeginsWith

O operador StringBeginsWith será avaliado como true se o valor da chavecomeçar com qualquer um dos valores de filtro especificados. No exemplo a seguir, ele verifica se o valor do atributo key1 na seção data começa com event ou message. Por exemplo, event hubs começa com event.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação à matriz dos valores de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3] e o filtro: [a,b,c]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

StringNotBeginsWith

O operador StringNotBeginsWith será avaliado como true se o valor da chavenão começar com nenhum dos valores de filtro especificados. No exemplo a seguir, ele verifica se o valor do atributo key1 na seção data não começa com event ou message.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação à matriz dos valores de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3] e o filtro: [a,b,c]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

StringEndsWith

O operador StringBeginsWith será avaliado como true se o valor da chaveterminar com um dos valores de filtro especificados. No exemplo a seguir, ele verifica se o valor do atributo key1 na seção data termina com jpg, jpeg ou png. Por exemplo, eventgrid.png termina com png.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação à matriz dos valores de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3] e o filtro: [a,b,c]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

StringNotEndsWith

O operador StringNotEndsWith será avaliado como true se o valor da chavenão terminar com nenhum dos valores de filtro especificados. No exemplo a seguir, ele verifica se o valor do atributo key1 na seção data não termina com jpg, jpeg ou png.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação à matriz dos valores de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3] e o filtro: [a,b,c]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

StringIn

O operador StringIn verifica se o valor da chavecorresponde exatamente a um dos valores de filtro especificados. No exemplo a seguir, ele verifica se o valor do atributo key1 na seção data é contoso, fabrikam ou factory.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação à matriz dos valores de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3] e o filtro: [a,b,c]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

StringNotIn

O operador StringNotIn verifica se o valor da chavenão corresponde a nenhum dos valores de filtro especificados. No exemplo a seguir, ele verifica se o valor do atributo key1 na seção data não é aws e bridge.

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

Se a chave for uma matriz, todos os valores na matriz serão verificados em relação à matriz dos valores de filtro. Este é o pseudocódigo com a chave: [v1, v2, v3] e o filtro: [a,b,c]. Os valores de chave com tipos de dados que não correspondem ao tipo de dados do filtro são ignorados.

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

As comparações de cadeia de caracteres não diferenciam maiúsculas de minúsculas.

Observação

Se o JSON de evento não contiver a chave de filtro avançado, o filtro será avaliado como não correspondente para os seguintes operadores: NumberGreaterThan, NumberGreaterThanOrEquals, NumberLessThan, NumberLessThanOrEquals, NumberIn, BoolEquals, StringContains, StringNotContains, StringBeginsWith, StringNotBeginsWith, StringEndsWith, StringNotEndsWith, StringIn.

O filtro é avaliado como correspondente para os seguintes operadores: NumberNotIn, StringNotIn.

IsNullOrUndefined

O operador IsNullOrUndefined será avaliado como true se o valor da chave for nulo ou indefinido.

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

No exemplo a seguir, como key1 está ausente, o operador deve ser avaliado como true.

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

No exemplo a seguir, como key1 está definida como nula, o operador deve ser avaliado como true.

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

Se key1 tiver qualquer outro valor nesses exemplos, o operador será avaliado como false.

IsNotNull

O operador IsNotNull será avaliado como true se o valor da chave não for nulo ou indefinido.

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

OR e AND

Se você especificar um único filtro com diversos valores, uma operação OR será executada, por isso o valor do campo de chave deve ser um desses valores. Aqui está um exemplo:

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

Se você especificar vários filtros diferentes, uma operação AND será executada, por isso cada condição de filtro deve ser atendida. Veja um exemplo:

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

CloudEvents

Para eventos no esquema CloudEvents, use os seguintes valores para a chave: eventid, source, eventtype, eventtypeversion ou dados de evento (como data.key1).

Também é possível usar atributos de contexto de extensão no CloudEvents 1.0. No exemplo a seguir, comexampleextension1 e comexampleothervalue são atributos de contexto de extensão.

{
    "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
    }
}

Veja a seguir um exemplo de como usar um atributo de contexto de extensão em um filtro.

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

Limitações

No entanto, o MakeCert tem as seguintes limitações:

  • 25 filtros avançados e 25 valores de filtros em todos os filtros por assinatura da Grade de Eventos
  • 512 caracteres por valor de cadeia de caracteres
  • Chaves com o caractere . (ponto) . Por exemplo: http://schemas.microsoft.com/claims/authnclassreference ou john.doe@contoso.com. No momento, não há suporte para caracteres de escape em chaves.

A mesma chave pode ser usada em mais de um filtro.

Próximas etapas