Omówienie filtrowania zdarzeń dla subskrypcji usługi Event Grid

W tym artykule opisano różne sposoby filtrowania zdarzeń wysyłanych do punktu końcowego. Podczas tworzenia subskrypcji zdarzeń dostępne są trzy opcje filtrowania:

  • Typy zdarzeń
  • Temat zaczyna się od lub kończy się na
  • Zaawansowane pola i operatory

Szablon usługi Azure Resource Manager

Przykłady przedstawione w tym artykule to fragmenty kodu JSON służące do definiowania filtrów w szablonach usługi Azure Resource Manager (ARM). Aby zapoznać się z przykładem kompletnego szablonu usługi ARM i wdrażania szablonu usługi ARM, zobacz Szybki start: kierowanie zdarzeń usługi Blob Storage do internetowego punktu końcowego przy użyciu szablonu usługi ARM. Poniżej przedstawiono kilka sekcji dotyczących filter sekcji z przykładu w przewodniku Szybki start. Szablon usługi ARM definiuje następujące zasoby.

  • Konto magazynu Azure
  • Temat systemowy dla konta magazynu
  • Subskrypcja zdarzeń dla tematu systemowego. Podsekcja zostanie wyświetlona filter w sekcji subskrypcji zdarzeń.

W poniższym przykładzie subskrypcja zdarzeń filtruje wartości Microsoft.Storage.BlobCreated i Microsoft.Storage.BlobDeleted zdarzenia.

{
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-08-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    },
    {
      "type": "Microsoft.EventGrid/systemTopics",
      "apiVersion": "2021-12-01",
      "name": "[parameters('systemTopicName')]",
      "location": "[parameters('location')]",
      "properties": {
        "source": "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]",
        "topicType": "Microsoft.Storage.StorageAccounts"
      },
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.EventGrid/systemTopics/eventSubscriptions",
      "apiVersion": "2021-12-01",
      "name": "[format('{0}/{1}', parameters('systemTopicName'), parameters('eventSubName'))]",
      "properties": {
        "destination": {
          "properties": {
            "endpointUrl": "[parameters('endpoint')]"
          },
          "endpointType": "WebHook"
        },
        "filter": {
          "includedEventTypes": [
            "Microsoft.Storage.BlobCreated",
            "Microsoft.Storage.BlobDeleted"
          ]
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.EventGrid/systemTopics', parameters('systemTopicName'))]"
      ]
    }
  ]
}

Filtrowanie typów zdarzeń

Domyślnie wszystkie typy zdarzeń dla źródła zdarzeń są wysyłane do punktu końcowego. Możesz zdecydować się na wysyłanie tylko niektórych typów zdarzeń do punktu końcowego. Możesz na przykład otrzymywać powiadomienia o aktualizacjach zasobów, ale otrzymywać powiadomienia o innych operacjach, takich jak usunięcia. W takim przypadku filtruj Microsoft.Resources.ResourceWriteSuccess według typu zdarzenia. Podaj tablicę z typami zdarzeń lub określ All , aby pobrać wszystkie typy zdarzeń dla źródła zdarzeń.

Składnia JSON do filtrowania według typu zdarzenia to:

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

Filtrowanie tematu

W przypadku prostego filtrowania według tematu określ wartość początkową lub końcową tematu. Na przykład można określić, że temat kończy się na .txt , aby pobierać tylko zdarzenia związane z przekazywaniem pliku tekstowego na konto magazynu. Możesz też filtrować temat, zaczynając od /blobServices/default/containers/testcontainer , aby pobrać wszystkie zdarzenia dla tego kontenera, ale nie inne kontenery na koncie magazynu.

Podczas publikowania zdarzeń w tematach niestandardowych utwórz tematy dla Twoich zdarzeń, które ułatwiają subskrybentom sprawdzenie, czy są zainteresowani wydarzeniem. Subskrybenci używają właściwości tematu do filtrowania i kierowania zdarzeń. Rozważ dodanie ścieżki do miejsca wystąpienia zdarzenia, aby subskrybenci mogli filtrować według segmentów tej ścieżki. Ścieżka umożliwia subskrybentom filtrowanie zdarzeń wąsko lub szeroko. Jeśli podasz trzy ścieżki segmentu, takie jak /A/B/C w temacie, subskrybenci będą mogli filtrować według pierwszego segmentu /A , aby uzyskać szeroki zestaw zdarzeń. Ci subskrybenci otrzymują zdarzenia z tematami takimi jak /A/B/C lub /A/D/E. Inni subskrybenci mogą filtrować /A/B , aby uzyskać węższy zestaw zdarzeń.

Przykłady (zdarzenia usługi Blob Storage)

Zdarzenia obiektów blob można filtrować według typu zdarzenia, nazwy kontenera lub nazwy obiektu, który został utworzony lub usunięty.

Temat zdarzeń usługi Blob Storage używa formatu:

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

Aby dopasować wszystkie zdarzenia dla konta magazynu, można pozostawić puste filtry tematu.

Aby dopasować zdarzenia z obiektów blob utworzonych w zestawie kontenerów współużytkowania prefiksu, użyj filtru, subjectBeginsWith takiego jak:

/blobServices/default/containers/containerprefix

Aby dopasować zdarzenia z obiektów blob utworzonych w określonym kontenerze, użyj filtru, subjectBeginsWith takiego jak:

/blobServices/default/containers/containername/

Aby dopasować zdarzenia z obiektów blob utworzonych w określonym kontenerze współużytkowania prefiksu nazwy obiektu blob, użyj filtru, subjectBeginsWith takiego jak:

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

Aby dopasować zdarzenia z obiektów blob utworzonych w określonym podfolderze kontenera, użyj filtru, subjectBeginsWith takiego jak:

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

Aby dopasować zdarzenia z obiektów blob utworzonych w określonym kontenerze współużytkowania sufiksu obiektu blob, użyj filtru subjectEndsWith , takiego jak ".log" lub ".jpg".

Filtrowanie zaawansowane

Aby filtrować według wartości w polach danych i określić operator porównania, użyj opcji zaawansowanego filtrowania. W zaawansowanym filtrowaniu należy określić następujące elementy:

  • typ operatora — typ porównania.
  • key — pole w danych zdarzenia, których używasz do filtrowania. Może to być liczba, wartość logiczna, ciąg lub tablica.
  • values — wartość lub wartości do porównania z kluczem.

Klawisz

Klucz to pole w danych zdarzenia, których używasz do filtrowania. Może to być jeden z następujących typów:

  • telefonu

  • Wartość logiczna

  • String

  • Tablicy. Aby użyć tej funkcji, należy ustawić enableAdvancedFilteringOnArrays właściwość na true.

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

W przypadku zdarzeń w schemacie Zdarzenia w chmurze użyj następujących wartości dla klucza: eventid, , sourceeventtype, eventtypeversionlub danych zdarzeń (takich jak data.key1).

Jeśli używasz warstwy podstawowej usługi Event Grid, w przypadku zdarzeń w schemacie usługi Event Grid użyj następujących wartości dla klucza: ID, TopicDataVersionSubjectEventTypelub danych zdarzeń (takich jak ).data.key1 W przypadku niestandardowego schematu danych wejściowych użyj pól danych zdarzenia (na przykład data.key1). Aby uzyskać dostęp do pól w sekcji danych, użyj . notacji (kropka). Na przykład , data.siteNamedata.appEventTypeDetail.action aby uzyskać dostęp do siteName następującego przykładowego zdarzenia lub action dla następującego przykładowego zdarzenia.

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

Uwaga

Usługa Event Grid nie obsługuje filtrowania w tablicy obiektów. Zezwala tylko na typy String, Boolean, Numbers i Array (na przykład tablica całkowita lub tablica ciągów).

Wartości

Wartości mogą być następujące: liczba, ciąg, wartość logiczna lub tablica

Operatory

Dostępne operatory dla liczb to:

NumberIn

Operator NumberIn zwraca wartość true, jeśli wartość klucza jest jedną z określonych wartości filtru . W poniższym przykładzie sprawdza, czy wartość atrybutu counter w data sekcji wynosi 5 lub 1.

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem tablicy wartości filtru. Oto kod pseudo z kluczem: [v1, v2, v3] i filtr: [a, b, c]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

NumberNotIn

Wartość NumberNotIn daje wartość true, jeśli wartość klucza nie jest żadną z określonych wartości filtru. W poniższym przykładzie sprawdza, czy wartość atrybutu counter w data sekcji nie wynosi 41 i 0.

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem tablicy wartości filtru. Oto kod pseudo z kluczem: [v1, v2, v3] i filtr: [a, b, c]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

NumberLessThan

Operator NumberLessThan daje wartość true, jeśli wartość klucza jest mniejsza niż określona wartość filtru . W poniższym przykładzie sprawdza, czy wartość atrybutu counter w data sekcji jest mniejsza niż 100.

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem wartości filtru. Oto pseudo kod z kluczem: [v1, v2, v3]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

NumberGreaterThan

Operator NumberGreaterThan daje wartość true, jeśli wartość klucza jest większa niż określona wartość filtru . W poniższym przykładzie sprawdza, czy wartość atrybutu counter w data sekcji jest większa niż 20.

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem wartości filtru. Oto pseudo kod z kluczem: [v1, v2, v3]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

NumberLessThanOrEquals

Operator NumberLessThanOrEquals zwraca wartość true, jeśli wartość klucza jest mniejsza lub równa określonej wartości filtru . W poniższym przykładzie sprawdza, czy wartość atrybutu counter w data sekcji jest mniejsza lub równa 100.

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem wartości filtru. Oto pseudo kod z kluczem: [v1, v2, v3]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

NumberGreaterThanOrEquals

Operator NumberGreaterThanOrEquals zwraca wartość true, jeśli wartość klucza jest większa lub równa określonej wartości filtru . W poniższym przykładzie sprawdza, czy wartość atrybutu counter w data sekcji jest większa lub równa 30.

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem wartości filtru. Oto pseudo kod z kluczem: [v1, v2, v3]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

NumberInRange

Operator NumberInRange daje wartość true, jeśli wartość klucza znajduje się w jednym z określonych zakresów filtrów. W poniższym przykładzie sprawdza, czy wartość atrybutu key1 w data sekcji znajduje się w jednym z dwóch zakresów: 3.14159 - 999.95, 3000 - 4000.

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

Właściwość values jest tablicą zakresów. W poprzednim przykładzie jest to tablica dwóch zakresów. Oto przykład tablicy z jednym zakresem do sprawdzenia.

Tablica z jednym zakresem:

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem tablicy wartości filtru. Oto pseudo kod z kluczem: [v1, v2, v3] i filtr: tablica zakresów. W tym pseudokodze a i b są niskimi i wysokimi wartościami każdego zakresu w tablicy. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

NumberNotInRange

Operator NumberNotInRange daje wartość true, jeśli wartość klucza nie znajduje się w żadnym z określonych zakresów filtrów. W poniższym przykładzie sprawdza, czy wartość atrybutu key1 w data sekcji znajduje się w jednym z dwóch zakresów: 3.14159 - 999.95, 3000 - 4000. Jeśli tak jest, operator zwraca wartość false.

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

Właściwość values jest tablicą zakresów. W poprzednim przykładzie jest to tablica dwóch zakresów. Oto przykład tablicy z jednym zakresem do sprawdzenia.

Tablica z jednym zakresem:

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem tablicy wartości filtru. Oto pseudo kod z kluczem: [v1, v2, v3] i filtr: tablica zakresów. W tym pseudokodze a i b są niskimi i wysokimi wartościami każdego zakresu w tablicy. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

Dostępny operator wartości logicznych to:

BoolEquals

Operator BoolEquals daje wartość true, jeśli wartość klucza jest określonym filtrem wartości logicznej. W poniższym przykładzie sprawdza, czy wartość atrybutu isEnabled w data sekcji to true.

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem wartości logicznej filtru. Oto pseudo kod z kluczem: [v1, v2, v3]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

Dostępne operatory dla ciągów to:

CiągContains

Wartość StringContains daje wartość true, jeśli wartość klucza zawiera dowolną z określonych wartości filtru (jako podciąg). W poniższym przykładzie sprawdza, czy wartość atrybutu key1 w data sekcji zawiera jeden z określonych podciągów: microsoft lub azure. Na przykład azure data factory ma azure w nim wartość .

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem tablicy wartości filtru. Oto kod pseudo z kluczem: [v1, v2, v3] i filtr: [a,b,c]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

StringNotContains

Operator StringNotContains daje wartość true, jeśli klucz nie zawiera określonych wartości filtru jako podciągów. Jeśli klucz zawiera jedną z określonych wartości jako podciąg, operator oblicza wartość false. W poniższym przykładzie operator zwraca wartość true tylko wtedy, gdy wartość atrybutu key1 w data sekcji nie ma contoso i fabrikam jako podciągów.

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem tablicy wartości filtru. Oto kod pseudo z kluczem: [v1, v2, v3] i filtr: [a,b,c]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

Zobacz sekcję Ograniczenia, aby zapoznać się z bieżącym ograniczeniem tego operatora.

StringBeginsWith

Operator StringBeginsWith daje wartość true, jeśli wartość klucza zaczyna się od dowolnej z określonych wartości filtru. W poniższym przykładzie sprawdza, czy wartość atrybutu key1 w data sekcji zaczyna się od event lub message. Na przykład event hubs zaczyna się od event.

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem tablicy wartości filtru. Oto kod pseudo z kluczem: [v1, v2, v3] i filtr: [a,b,c]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

StringNotBeginsWith

Operator StringNotBeginsWith daje wartość true, jeśli wartość klucza nie rozpoczyna się od żadnej z określonych wartości filtru. W poniższym przykładzie sprawdza, czy wartość atrybutu key1 w data sekcji nie zaczyna się od event , czy message.

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem tablicy wartości filtru. Oto kod pseudo z kluczem: [v1, v2, v3] i filtr: [a,b,c]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

StringEndsWith

Operator StringEndsWith daje wartość true, jeśli wartość klucza kończy się jednym z określonych wartości filtru. W poniższym przykładzie sprawdza, czy wartość atrybutu key1 w data sekcji kończy się ciągiem jpg lub jpeg .png Na przykład eventgrid.png kończy się ciągiem png.

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem tablicy wartości filtru. Oto kod pseudo z kluczem: [v1, v2, v3] i filtr: [a,b,c]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

StringNotEndsWith

Operator StringNotEndsWith daje wartość true, jeśli wartość klucza nie kończy się żadnym z określonych wartości filtru . W poniższym przykładzie sprawdza, czy wartość atrybutu key1 w data sekcji nie kończy się wartością jpg lub jpegpng.

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem tablicy wartości filtru. Oto kod pseudo z kluczem: [v1, v2, v3] i filtr: [a,b,c]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

CiągIn

Operator StringIn sprawdza, czy wartość klucza dokładnie pasuje do jednej z określonych wartości filtru. W poniższym przykładzie sprawdza, czy wartość atrybutu key1 w data sekcji to contoso , czy fabrikam .factory

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem tablicy wartości filtru. Oto kod pseudo z kluczem: [v1, v2, v3] i filtr: [a,b,c]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

StringNotIn

Operator StringNotIn sprawdza, czy wartość klucza nie jest zgodna z żadnym z określonych wartości filtru. W poniższym przykładzie sprawdza, czy wartość atrybutu key1 w data sekcji nie aws jest i bridge.

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

Jeśli klucz jest tablicą, wszystkie wartości w tablicy są sprawdzane względem tablicy wartości filtru. Oto kod pseudo z kluczem: [v1, v2, v3] i filtr: [a,b,c]. Wszystkie wartości klucza z typami danych, które nie są zgodne z typem danych filtru, są ignorowane.

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

Wszystkie porównania ciągów nie są uwzględniane wielkości liter.

Uwaga

Jeśli kod JSON zdarzenia nie zawiera zaawansowanego klucza filtru, filtr jest oceniany jako niezgodny z następującymi operatorami: NumberGreaterThan, NumberGreaterThanOrEquals, NumberLessThan, NumberLessThanOrEquals, NumberIn, BoolEquals, StringContains, StringNotContains, StringBeginsWith, StringNotBeginsWith, StringEndsWith, StringNotEndsWith, StringNotEndsWith, StringIn.

Filtr jest oceniany zgodnie z dopasowaniem dla następujących operatorów: NumberNotIn, StringNotIn.

IsNullOrUndefined

Operator IsNullOrUndefined daje wartość true, jeśli wartość klucza ma wartość NULL lub jest niezdefiniowana.

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

W poniższym przykładzie brakuje klucza key1, więc operator zwróci wartość true.

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

W poniższym przykładzie wartość key1 jest ustawiona na wartość null, więc operator zwróci wartość true.

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

Jeśli w tych przykładach klucz1 ma inną wartość, operator zwróci wartość false.

IsNotNull

Operator IsNotNull daje wartość true, jeśli wartość klucza nie jest równa NULL lub niezdefiniowana.

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

OR and AND

Jeśli określisz jeden filtr z wieloma wartościami, wykonywana jest operacja OR , więc wartość pola klucza musi być jedną z tych wartości. Oto przykład:

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

Jeśli określisz wiele różnych filtrów, wykonywana jest operacja AND , więc każdy warunek filtru musi zostać spełniony. Oto przykład:

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

CloudEvents

W przypadku zdarzeń w schemacie CloudEvents użyj następujących wartości dla klucza: eventid, , sourceeventtype, eventtypeversionlub danych zdarzeń (na przykład data.key1).

Można również użyć atrybutów kontekstu rozszerzenia w rozwiązaniu CloudEvents 1.0. W poniższym przykładzie comexampleextension1 i comexampleothervalue są atrybutami kontekstu rozszerzenia.

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

Oto przykład użycia atrybutu kontekstu rozszerzenia w filtrze.

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

Ograniczenia

Filtrowanie zaawansowane ma następujące ograniczenia:

  • 25 zaawansowanych filtrów i 25 wartości filtrów we wszystkich filtrach dla subskrypcji usługi Event Grid
  • 512 znaków na wartość ciągu
  • Klucze z znakiem . (kropka) w nich. Na przykład: http://schemas.microsoft.com/claims/authnclassreference lub john.doe@contoso.com. Obecnie w kluczach nie ma obsługi znaków ucieczki.

Ten sam klucz może być używany w więcej niż jednym filtrze.

Następne kroki