Dieses Dokument ergänzt die Referenzdokumentation für projects.alertPolicies
, projects.notificationChannels
und projects.uptimeCheckConfigs
in der Cloud Monitoring API.
Sie liefert syntaktische Details zu den Parametern filter
und orderBy
, wenn sie von der API verwendet werden.
Die folgenden API-Methoden unterstützen die Parameter filter
und orderBy
:
Die folgende API-Methode unterstützt nur den Parameter filter
:
Grundlagen zum Sortieren und Filtern
Die Unterstützung für das Sortieren und Filtern in einem list
-Vorgang wird durch das Vorhandensein der Stringfelder filter
und orderBy
im Anfragetext der Liste angegeben. In der API-Referenzdokumentation finden Sie Informationen dazu, ob der Anfragetext diese Felder enthält. Beide Felder verwenden eine einfache Sprache, um auf die Felder in dem Objekt zu verweisen, das sortiert oder gefiltert wird.
Syntax der Sortierreihenfolge
Das Feld orderBy
besteht aus einer durch Kommas getrennten Liste von Feldpfaden, denen optional ein Minuszeichen vorangestellt wird, um die Reihenfolge umzukehren.
Beispielsweise ordnet user_label.team,display_name
nach Teamnamen in aufsteigender Reihenfolge und – bei Einträgen mit demselben Team – nach dem Anzeigenamen, ebenfalls in aufsteigender Reihenfolge. Wenn Sie vor einem der durch Kommas getrennten Felder ein Minuszeichen einfügen, wird dieses Feld in absteigender Reihenfolge sortiert. Wenn Sie beispielsweise versuchen, die Ausführlichkeit Ihrer Titel zu reduzieren, können Sie -display_name.size
verwenden, um nach Titellänge zu sortieren, wobei die Objekte vom wortreichsten bis zum kürzesten Titel sortiert werden.
Für ein realistischeres Beispiel gruppiert user_label.team,display_name
die Ergebnisse zuerst nach Team (in lexikografischer Reihenfolge) und dann innerhalb jeder Teamgruppierung nach dem Titel (auch in lexikografischer Reihenfolge).
Formell kann die Syntax so beschrieben werden:
ORDER_BY_SPEC := # Comma-separated list of fields. ORDERED_FIELD_LIST ORDERED_FIELD_LIST := # Single field on which to sort. ORDERED_FIELD # Sort by the first field and then by the remaining fields. | ORDERED_FIELD "," ORDERED_FIELD_LIST ORDERED_FIELD := # Sort by the field in ascending order. FIELD_REFERENCE # Sort by the field in descending order. | "-" FIELD_REFERENCE FIELD_REFERENCE := # Simple field reference FIELD_NAME # Map value or list index lookup. For string-valued keys, the # supplied key in this notation must be quoted. | FIELD_NAME "[" LITERAL "]" FIELD_NAME := # Immediate element IDENTIFIER # Subfield dereference or map element dereference. Note that, # in the case of maps, the IDENTIFIER on the left can also # be the singular form of the name of the map. That is, it is # permitted to use `user_label.mykey` and not just # `user_labels.mykey`. This is done for consistency with the # metric filters which permit `resource.label.` and `metric.label.` # which are in the singular form even though the map is `labels`. | IDENTIFIER "." FIELD_NAME LITERAL := # Number [0-9]+(.[0.9]+)? # String literal using single quotes. Note that strings must # always be quoted. This is to avoid ambiguity with attempting # to refer to the value of a field. | '[^']*' # String literal using double quotes. Note that strings must # always be quoted. This is to avoid ambiguity with attempting # to refer to the value of a field. | "[^"]*" # Literal boolean true. | true # Literal boolean false. | false IDENTIFIER := # Non-digit followed by any number of letters or digits. [a-zA-Z_]+[a-zA-Z0-9_]*
Filtersyntax
Die Filtersyntax besteht aus einer einfachen Ausdruckssprache zum Erstellen eines Prädikats aus einem oder mehreren Feldern der gefilterten Objekte. Negation, Verbindung und Disjunktion werden mit den Keywords NOT
, AND
und OR
geschrieben.
Felder können mithilfe von :
(einschließlich), =
(gleich), >
(größer), <
(kleiner als), >=
(größer als oder gleich), <=
(kleiner oder gleich) und !=
(ungleich). Die integrierten Funktionen starts_with
. ends_with
. monitoring.regex.full_match
RE2 sowie die integrierten Attribute empty
und size
Unterstützung für komplexere Vergleiche.
Beispiele
So geben Sie alle Einträge mit einem nicht leeren Anzeigenamen oder einer Beschreibung zurück, bei denen im Feld user_labels
der Schlüssel active
(mit einem beliebigen Wert) festgelegt ist:
(NOT display_name.empty OR NOT description.empty) AND user_labels='active'
So geben Sie alle Einträge zurück, deren Beschreibung "cloud" enthält:
description:'cloud'
So geben Sie alle Einträge zurück, deren Titel mit "Temp XXXX" übereinstimmt:
display_name=monitoring.regex.full_match('Temp \\d{4}')
Formale Spezifikation
Die Syntax des Filterausdrucks kann so zusammengefasst werden:
FILTER_EXPRESSION := # Negation "NOT" FILTER_EXPRESSION # Short-circuiting AND | FILTER_EXPRESSION "AND" FILTER_EXPRESSION # Short-circuiting OR | FILTER_EXPRESSION "OR" FILTER_EXPRESSION # Implicit short-circuiting AND | FILTER_EXPRESSION FILTER_EXPRESSION # Parenthesized sub-expression | "(" FILTER_EXPRESSION ")" # Basic expression | SIMPLE_EXPRESSION SIMPLE_EXPRESSION := # Field implicitly converted to boolean FIELD_REFERENCE # Field binary comparison. Note that the right-hand side must # be compatible with the type on the left-hand side; one cannot # compare a number with a string. Sensible implicit conversions # are permitted, however; comparing an integer and double will # succeed with appropriate conversion/widening taking place. | FIELD_REFERENCE OP LITERAL # Function invocation | FIELD_REFERENCE "=" FUNCTION_EXPRESSION FIELD_REFERENCE := # Simple field reference FIELD_NAME # Map value or list index lookup. For string-valued keys, the # supplied key in this notation must be quoted. | FIELD_NAME "[" LITERAL "]" FIELD_NAME := # Immediate element IDENTIFIER # Subfield dereference or map element dereference. Note that, # in the case of maps, the IDENTIFIER on the left can also # be the singular form of the name of the map. That is, it is # permitted to use `user_label.mykey` and not just # `user_labels.mykey`. This is done for consistency with the # metric filters which permit `resource.label.` and `metric.label.` # which are in the singular form even though the map is `labels`. | IDENTIFIER "." FIELD_NAME OP := # Equality comparison. Should be avoided for double-valued fields. "=" # Less than. | "<" # Greater than. | ">" # Less than or equal. | "<=" # Greater than or equal. | ">=" # Containment. This is equivalent to '=' for numeric types. | ":" # Not equal. | "!=" LITERAL := # Number [0-9]+(.[0.9]+)? # String literal using single quotes. Note that strings must # always be quoted. This is to avoid ambiguity with attempting # to refer to the value of a field. | '[^']*' # String literal using double quotes. Note that strings must # always be quoted. This is to avoid ambiguity with attempting # to refer to the value of a field. | "[^"]*" # Literal boolean true. | true # Literal boolean false. | false FUNCTION_EXPRESSION := # Starts with. "starts_with" "(" LITERAL ")" # Ends with. | "ends_with" "(" LITERAL ")" # Has substring. Takes an optional second argument that indicates whether # the substring matching is case-sensitive (true) or not (false). # The default is false, providing case-insensitive matches. | "has_substring" "(" LITERAL [, [true|false]] ")" # Regular expression match. | "monitoring.regex.full_match" "(" LITERAL ")" IDENTIFIER := # Non-digit followed by any number of letters or digits. [a-zA-Z_]+[a-zA-Z0-9_]*
Unterstützte Felder
Auf welche Felder in den Feldern filter
oder orderBy
verwiesen werden kann, hängt vom Typ des aufgelisteten Objekts ab.
AlertPolicy
Auf die folgenden Felder kann in filter
und orderBy
verwiesen werden, wenn AlertPolicy
-Objekte aufgezählt werden:
- name
- display_name
- documentation.content
- documentation.mime_type
- user_labels
- conditions.size
- Kombinator
- Aktiviert
- notification_channels
NotificationChannel
Auf die folgenden Felder kann in filter
und orderBy
verwiesen werden, wenn NotificationChannel
-Objekte aufgezählt werden:
- name
- Typ
- display_name
- description
- labels
- user_labels
UptimeCheckConfig
Auf die folgenden Felder kann in filter
verwiesen werden, wenn UptimeCheckConfig
-Objekte aufgezählt werden:
- display_name
- user_labels
- selected_regions
- http_check.path
- http_check.headers
- http_check.port
- tcp_check.port
- monitored_resource.type
- monitored_resource.labels
Themen für Fortgeschrittene
Feld-Groß-/Kleinschreibung
Feldnamen können sowohl in lower_case_with_underscores
- als auch in camelCase
-Formen ausgedrückt werden. Das heißt, sowohl display_name
als auch displayName
werden unterstützt.
Strings
Integrierte Attribute
Bei Feldern mit Stringwerten wird automatisch die Eigenschaft size
generiert, die die Anzahl der Unicode-Zeichen im String berechnet. Dadurch wird beispielsweise ein Filter wie display_name.size > 3 AND display_name.size < 10
aktiviert.
Neben size
haben Strings auch eine boolesche empty
-Eigenschaft.
Sortierfolge
Beim Auflisten eines Strings in orderBy
werden die Strings mithilfe der byteweisen lexikografischen Reihenfolge in der UTF-8-Darstellung des Strings verglichen; die Strings werden nicht nach der Unicode-Sortierreihenfolge sortiert.
implizite boolesche Konvertierung
Es ist möglich, einen String in einem Filter wie in user_label.enabled
implizit in einen booleschen Wert zu konvertieren. Beachten Sie, dass diese Konvertierung nicht identisch mit dem Testen ist, ob der String nicht leer ist. Unter dieser Konvertierung wird der Inhalt des Strings in einen booleschen Wert geparst und Strings, die diesen booleschen Wert eindeutig parsen, nehmen diesen Wert an. Wenn der String nicht eindeutig boolesch ist, werden nicht leere Strings als wahr und leere Strings als falsch interpretiert.
Strings, bei denen die Groß- und Kleinschreibung nicht mit "false", "f", "no", "n" oder "0" übereinstimmt, werden als eindeutig falsch eingestuft. Strings, bei denen die Groß- und Kleinschreibung nicht mit "true", "t", "yes", "y" oder "1" übereinstimmt, gelten als eindeutig.
Listen
Integrierte Attribute
Für Felder mit Listenwerten wird automatisch das Attribut size
generiert, das die Anzahl der Elemente in dieser Liste berechnet. Beispielsweise können Sie notification_channels.size
in orderBy
verwenden, um Benachrichtigungsrichtlinien nach der Anzahl der zu benachrichtigenden Channels zu sortieren.
Verwendung in binären Vergleichen
Wenn Sie ein Listenwertfeld mit einem Literal mit einem der verschiedenen binären Operatoren vergleichen, wird der Vergleich so interpretiert, als würde ein elementweiser Vergleich angewendet und dann das ODER der Ergebnisse berechnet. Der Filter notification_channels:"123"
ergibt beispielsweise "true", wenn einer der Benachrichtigungskanäle "123" als Teilstring enthält. Speziell für den Operator !=
wird der Vergleich zwischen Elementen UND und nicht ODER; mit anderen Worten: Für !=
darf keines der Elemente übereinstimmen. Oder x!=y
entspricht logisch dem Pseudocode x[0]!=y AND x[1]!=y AND ... AND x[x.size-1]!=y
, während x=y
logisch dem Pseudocode x[0]=y OR x[1]=y OR ... OR x[x.size-1]=y
entspricht. Diese Inkonsistenz wurde entwickelt, um den wahrscheinlichen Intent von x!=y
zu beheben und Verwechslungen mit einem Ausdruck zu vermeiden, der Ergebnisse zurückgibt, die den unzulässigen/gefilterten Wert enthalten.
Zusätzlich zur Einschränkung der gesamten Liste können Sie auch über den Indexierungsoperator ([]
) auf bestimmte Listeneinträge verweisen. Beispielsweise können Sie mit notification_channels[0]:"123"
nur das erste Element testen. Im Fall von Indexen, die außerhalb des gültigen Bereichs liegen, wird ein Standardwert (leer, null usw.) generiert.
Implizite Konvertierung in Bool
Bei Angabe in einem Filter ohne binären Vergleich wird eine Liste implizit in einen booleschen Wert umgewandelt. Diese Conversion unterscheidet sich vom Testen, ob die Liste nicht leer ist. a_list
und NOT a_list.empty
geben unterschiedliche Ergebnisse für {false, false, false}
oder eine andere nicht leere Liste zurück, deren Werte alle implizit in den booleschen Wert false
konvertiert werden.
Maps
Integrierte Attribute
Felder mit Kartenwerten haben automatisch eine size
-Eigenschaft, die die Anzahl der Elemente in dieser Karte berechnet. Sie können beispielsweise user_labels.size
in orderBy
verwenden, um nach der Anzahl der definierten Nutzerlabels zu sortieren.
In ähnlicher Weise wird auch eine boolesche Eigenschaft empty
automatisch generiert.
Auf Schlüsselexistenz testen
Zuordnungen können über die verschiedenen unterstützten Binäroperatoren mit Literalwerten verglichen werden. Die Interpretation entspricht logisch der Projektion der Karte in eine Liste, indem die Schlüssel der Karte extrahiert und dann der Vergleich ausgeführt wird.
Als Beispiel können Sie mit user_labels="phase"
ermitteln, ob die user_labels
-Zuordnung einen Schlüssel enthält, dessen Wert gleich "Phase" ist.
Werte nach Schlüssel referenzieren
Auf Karteneinträge kann mit einer von zwei Notationen verwiesen werden: Punkt (.
) und Index ([]
). Sie können beispielsweise user_labels.team
oder user_labels['team']
verwenden, um auf den Wert zu verweisen, der dem Schlüssel "team" im Feld user_labels
entspricht. Damit die Messwert-API die Präfixe metric.label.
und resource.label.
anstelle von metric.labels.
und resource.labels.
verwendet, können Zuordnungsfelder auch im Singular des Namens referenziert werden (z. B. ist auch user_label.team
zulässig).
Beachten Sie, dass Sie bei Schlüsseln mit dem Namen size
oder empty
die Indexnotation verwenden müssen. Bei Verwendung der Punktnotation wird auf die integrierten Kartenattribute Bezug genommen.
Implizite Konvertierung in Bool
Bei impliziten Konvertierungen in den booleschen Wert wird eine Zuordnung als „true“ betrachtet, wenn sie nicht leer ist und mindestens ein Zuordnungswert (*value) implizit in „true“ konvertiert wird. Dies entspricht nicht dem Testen, ob die Karte nicht leer ist.
Nach zusammengesetzten Typen sortieren
Alle Felder, auf die in einem Filter verwiesen werden kann, kann auch in order_by
referenziert werden. Dies gilt auch für komplexe und zusammengesetzte Typen. Die Sortierreihenfolge für diese Typen ist stabil und klar definiert, aber nicht unbedingt intuitiv. Daher wird von dieser Verwendung abgeraten, sie ist jedoch zulässig.
Listen
Listen werden mithilfe eines lexikografischen Elements verglichen, wobei die kleinere Liste zuerst folgt, wenn die gemeinsamen Elemente gleich sind.
Ein Beispiel: {0, 1}
ist kleiner als {0, 2}
, aber größer als {0}
.
Maps
Karten werden miteinander verglichen, indem die Kartenwerte, die der Vereinigung ihrer Schlüssel entsprechen, auf Elementbasis verglichen werden. Für Schlüssel, die in einer Zuordnung, aber nicht in der anderen definiert sind, wird ein Standardwert (leer, null usw.) für den Vergleich verwendet.
Beispiel: {"x":0, "y":0}
ist kleiner als {"x":1, "y":1}
, aber größer als {"a":-1}
und ist gleich {}
.