Beispiele

Diese Seite bietet eine Einführung in die Monitoring Query Language (MQL) mit einer Reihe von Beispielen. Es wird nicht versucht, alle Aspekte der Sprache abzudecken. MQL ist in der Referenz zur Monitoring-Abfragesprache ausführlich dokumentiert.

Sie können eine bestimmte Abfrage in vielen Formen schreiben. Die Sprache ist sehr flexibel und es gibt viele Tastenkombinationen, die Sie verwenden können, sobald Sie mit der Syntax vertraut sind. Weitere Informationen finden Sie unter Strikte und prägnante Abfragen.

Hinweis

In diesen Beispielen wird der Tab "Abfrageeditor" im Metrics Explorer verwendet. Um sie auszuführen, fügen Sie die Abfrage in den Editor ein und klicken Sie auf Abfrage ausführen. Eine Einführung in diesen Editor finden Sie unter Abfrageeditor verwenden.

Ein wenig Erfahrung mit Cloud Monitoring-Konzepten wie Messwerttypen, Typen überwachter Ressourcen und Zeitachsen ist hilfreich. Eine Einführung in diese Konzepte finden Sie unter Messwerte, Zeitachsen und Ressourcen.

Datenmodell

MQL-Abfragen rufen Daten in der Zeitachsendatenbank von Cloud Monitoring ab und bearbeiten sie. In diesem Abschnitt werden einige Konzepte und Begriffe der Datenbank vorgestellt. Ausführliche Informationen finden Sie im Referenzthema Datenmodell.

Jede Zeitachse stammt aus einem bestimmten Typ von überwachter Ressource und jede Zeitachse erfasst Daten eines Messwerttyps. Die Typen für überwachte Ressourcen und Messwerte haben eine Standardstruktur, die durch einen Deskriptor und Messwertdeskriptor für überwachte Ressourcen definiert wird. Beispielsweise kann der Ressourcentyp gce_instance, eine Compute Engine-VM, und der Messwerttyp compute.googleapis.com/instance/cpu/utilization, die CPU-Auslastung der Compute Engine-VM, sein.

Diese Deskriptoren geben auch eine Reihe von Labels an, mit denen Informationen zu anderen Attributen des Messwerts oder Ressourcentyps erfasst werden. Ressourcen haben beispielsweise normalerweise das Label zone, mit dem der geografische Standort der Ressource aufgezeichnet wird.

Für jede Kombination von Werten für die Labels aus dem Paar aus Messwertdeskriptor und Deskriptor für überwachte Ressourcen wird eine Zeitachse erstellt.

Die verfügbaren Labels für den Ressourcentyp finden Sie im Liste der überwachten Ressourcen , zum Beispiel gce_instance , und für den Messwerttyp in der Liste der Messwerte , zum Beispiel Messwerte aus Compute Engine.

Weitere Informationen zu Messwert- und Ressourcentypen sowie Labels finden Sie unter Komponenten des Messwertmodells.

Die Cloud Monitoring-Datenbank speichert alle Zeitachsen eines bestimmten Messwerts und Ressourcentyps in einer Tabelle. Der Messwert und der Ressourcentyp dienen als Kennung für die Tabelle. Diese MQL-Abfrage ruft die Tabelle der Zeitachsen ab, die die CPU-Auslastung für Compute Engine-Instanzen aufzeichnen:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization

Die einzelnen Zeitachsen in der Tabelle werden durch die Werte gekennzeichnet, die für die mit Messwert- und Ressourcentypen verknüpften Labels geschrieben wurden.

MQL-Abfragen rufen Zeitachsendaten aus diesen Tabellen ab und wandeln sie in Ausgabetabellen um. Diese Ausgabetabellen können an andere Vorgänge übergeben werden. Sie können beispielsweise die Zeitachsen isolieren, die von Ressourcen in einer bestimmten Zone oder einer Gruppe von Zonen geschrieben werden, indem Sie die abgerufene Tabelle als Eingabe an einen filter - Vorgang übergeben:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| filter zone =~ 'us-central.*'

Die vorherige Abfrage führt zu einer Tabelle, die nur die Zeitachsen von Ressourcen in einer Zone enthält, die mit us-central beginnt:

MQL-Abfragen werden strukturiert, indem die Ausgabe eines Vorgangs als Eingabe an den nächsten übergeben wird. Bei diesem tabellenbasierten Ansatz können Sie Vorgänge verknüpfen, um diese Daten durch Filterung, Auswahl und andere bekannte Datenbankvorgänge wie Innen- und Outer Joins zu bearbeiten. Sie können auch eine Vielzahl von Funktionen für die Daten in der Zeitachse ausführen, wenn diese von einem Vorgang an einen anderen übergeben werden.

Die in MQL verfügbaren Vorgänge und Funktionen sind in der Referenz zur Monitoring-Abfragesprache vollständig dokumentiert.

Abfragestruktur

Eine Abfrage besteht aus einem oder mehreren Vorgängen. Vorgänge sind miteinander verknüpft oder in Pipelines zusammengefasst, sodass die Ausgabe eines Vorgangs die Eingabe für den nächsten ist. Daher hängt das Ergebnis einer Abfrage von der Reihenfolge der Vorgänge ab. Sie können unter anderem Folgendes tun:

  • Starten Sie eine Abfrage mit einem fetch oder einem anderen Auswahlvorgang.
  • Erstellen Sie eine Abfrage mit mehreren Vorgängen, die miteinander verbunden sind.
  • Wählen Sie eine gewünschte Teilmenge von Informationen mit filter - Vorgängen aus.
  • Aggregieren Sie verwandte Informationen mit group_by - Vorgängen.
  • Sehen Sie sich Ausreißer mit top - und bottom - Vorgängen an.
  • Kombinieren Sie mehrere Abfragen mit den Vorgängen { ; } und join.
  • Verwenden Sie die value - Operation und -Funktionen, um Verhältnisse und andere Werte zu berechnen.

Nicht alle Abfragen verwenden alle diese Optionen.

In diesen Beispielen werden nur einige der verfügbaren Vorgänge und Funktionen vorgestellt. Ausführliche Informationen zur Struktur von MQL-Abfragen finden Sie unter Abfragestruktur.

Diese Beispiele geben keine zwei Dinge an, die Sie erwarten könnten: Zeiträume und Ausrichtung. In den folgenden Abschnitten wird erläutert, warum.

Zeiträume

Wenn Sie den Abfrageeditor verwenden, wird der Zeitraum für Abfragen implizit durch die Einstellung im Diagramm festgelegt. Standardmäßig beträgt der Zeitraum des Diagramms 1 Stunde. Weitere Informationen zu Zeiträumen im Abfrageeditor finden Sie unter Zeiträume, Diagramme und Abfrageeditor.

Ausrichtung

Viele der in diesen Beispielen verwendeten Vorgänge, wie die Vorgänge join und group_by, hängen von allen Zeitachsenpunkten in einer Tabelle ab, die in regelmäßigen Abständen auftreten. Der Vorgang, bei dem alle Punkte mit regelmäßigen Zeitstempeln ausgerichtet werden, wird als Ausrichtung bezeichnet. Sie wird in der Regel implizit durchgeführt und ist in keinem der Beispiele zu sehen.

MQL richtet Tabellen für join - und group_by - Vorgänge bei Bedarf automatisch aus. Mit MQL können Sie die Ausrichtung jedoch auch explizit vornehmen.

Abrufen und Filtern

MQL-Abfragen beginnen mit dem Abrufen und Auswählen oder Filtern von Daten. In diesem Abschnitt werden einige grundlegende Abruf-, Gruppierungs- und Filterfunktionen mit MQL erläutert.

Zeitachsendaten werden abgerufen

Eine Abfrage beginnt immer mit einem fetch - Vorgang, der Zeitachsen aus dem Cloud Monitoring-Datenspeicher abruft.

Die einfachste Abfrage besteht aus einem einzelnen fetch - Vorgang und einem Argument, das die abzurufende Zeitachse angibt. Beispiel:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization

Das Argument besteht aus einem überwachten Ressourcentyp gce_instance, einem Doppelpunktzeichenpaar :: und einem Messwerttyp compute.googleapis.com/instance/cpu/utilization.

Diese Abfrage ruft alle von Compute Engine-Instanzen geschriebenen Zeitachsen für den Messwerttyp compute.googleapis.com/instance/cpu/utilization ab, der die CPU-Auslastung dieser Instanzen aufzeichnet.

Wenn Sie die Abfrage im Abfrageeditor im Messwert-Explorer ausführen, erhalten Sie ein Diagramm mit allen angeforderten Zeitachsen:

Das Diagramm zeigt CPU-Auslastungsdaten für Compute Engine-Instanzen.

Jede angeforderte Zeitachse wird als Linie im Diagramm angezeigt. Jede Zeitachse enthält eine Liste mit Zeitstempeln aus dem CPU-Auslastungsmesswert für eine VM-Instanz in diesem Projekt.

Im von Cloud Monitoring verwendeten Back-End-Speicher werden Zeitachsen in Tabellen gespeichert. Der Vorgang fetch organisiert die Zeitachsen für die angegebenen Typen von überwachten Ressourcen und Messwerten in einer Tabelle, die dann vom Vorgang fetch zurückgegeben wird. Die zurückgegebenen Daten werden im Diagramm angezeigt.

Der fetch - Vorgang wird zusammen mit seinen Argumenten auf der fetch - Referenzseite beschrieben. Weitere Informationen zu den von Vorgängen generierten Daten finden Sie auf den Referenzseiten für Zeitachsen und Tabellen.

Filtern

Abfragen bestehen in der Regel aus mehreren Vorgängen, die miteinander kombiniert werden. Die einfachste Kombination besteht darin, die Ausgabe eines Vorgangs mithilfe des Pipe-Operators | in die Eingabe des nächsten zu leiten. Im folgenden Beispiel wird gezeigt, wie die Tabelle mithilfe einer Pipe in einen Filtervorgang eingegeben wird:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| filter instance_name =~ 'gke.*'

Diese Abfrage leitet die vom vorherigen fetch - Vorgang zurückgegebene Tabelle in einen filter - Vorgang weiter, der als Ausdruck verwendet wird, der einen booleschen Wert ergibt, in diesem Fall "instance_name beginnt mit gke".

Der filter - Vorgang nimmt die Eingabetabelle, entfernt die Zeitachse, für die der Filter falsch ist, und gibt die resultierende Tabelle aus. Der folgende Screenshot zeigt das resultierende Diagramm:

Das Diagramm zeigt Ergebnisse, die nach

Wenn Sie keine Instanznamen haben, die mit gke beginnen, ändern Sie den Filter, bevor Sie diese Abfrage ausführen. Wenn Sie beispielsweise VM-Instanzen mit apache am Anfang ihrer Namen haben, verwenden Sie den folgenden Filter:

 | filter instance_name =~ 'apache.*'

Der Ausdruck filter wird für jede Eingabezeitachse einmal ausgewertet. Wenn der Ausdruck true ergibt, ist diese Zeitachse in der Ausgabe enthalten. In diesem Beispiel führt der Filterausdruck eine Übereinstimmung mit einem regulären Ausdruck, =~, für das Label instance_name jeder Zeitachse durch. Wenn der Wert des Labels mit dem regulären Ausdruck 'gke.*' übereinstimmt, wird die Zeitachse in die Ausgabe aufgenommen. Ist dies nicht der Fall, wird die Zeitachse aus der Ausgabe entfernt.

Weitere Informationen zum Filtern finden Sie auf der filter-Referenzseite. Das Prädikat filter kann ein beliebiger Ausdruck sein, der einen booleschen Wert zurückgibt. Weitere Informationen finden Sie unter Ausdrücke.

Gruppierung und Zusammenfassung

Mit der Gruppierung können Sie Zeitachsen nach bestimmten Dimensionen gruppieren. Bei der Aggregation werden alle Zeitachsen in einer Gruppe zu einer Ausgabezeitachse kombiniert.

Die folgende Abfrage filtert die Ausgabe des anfänglichen fetch - Vorgangs, um nur die Zeitachsen von Ressourcen in einer Zone beizubehalten, die mit us-central beginnt. Anschließend werden die Zeitachsen nach Zone gruppiert und mithilfe der mean - Aggregation kombiniert.

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| filter zone =~ 'us-central.*'
| group_by [zone], mean(val())

Die aus dem group_by - Vorgang resultierende Tabelle enthält eine Zeitachse pro Zone. Der folgende Screenshot zeigt das resultierende Diagramm:

Das Diagramm zeigt einen nach Zone gruppierten gefilterten Abruf.

Der Vorgang group_by akzeptiert zwei Argumente, die durch ein Komma getrennt sind: ,. Diese Argumente bestimmen das genaue Gruppierungsverhalten. In diesem Beispiel group_by [zone], mean(val()) verhalten sich die Argumente wie folgt:

  • Das erste Argument, [zone], steuert die Gruppierung von Zeitachsen. Dies ist ein Zuordnungsausdruck und hier werden die für die Gruppierung zu verwendenden Labels angegeben. Beim Gruppierungsschritt werden alle Eingabezeitachsen mit denselben zone - Ausgabewerten in einer Gruppe zusammengefasst, in diesem Fall die Zeitachsen, die von den Compute Engine-VMs in einer Zone erfasst wurden.

    Die Ausgabezeitachse hat nur das Label zone, wobei der Wert aus der Eingabezeitachse in der Gruppe kopiert wird. Andere Labels in der Eingabe-Zeitachse werden aus der Ausgabe-Zeitachse entfernt.

    Der Kartenausdruck kann viel mehr als nur Listenlabels. Weitere Informationen finden Sie auf der map-Referenzseite.

  • Das zweite Argument, mean(val()), steuert, wie die Zeitachsen in jeder Gruppe zu einer Ausgabe-Zeitachse kombiniert oder zusammengefasst werden. Jeder Punkt in der Ausgabezeitachse für eine Gruppe ist das Ergebnis der Zusammenfassung der Punkte mit demselben Zeitstempel aus allen Eingabezeitachsen in der Gruppe.

    Der aus der Aggregation resultierende Wert wird durch die angewendete Aggregationsfunktion bestimmt, in diesem Beispiel mean. Die Funktion wird auf die Werte der zu aggregierenden Punkte angewendet, die von der Funktion val() zurückgegeben werden. In diesem Beispiel erhalten Sie den Mittelwert der CPU-Auslastung der virtuellen Maschinen in der Zone zu jedem Ausgabezeitpunkt.

    Der Ausdruck mean(val()) ist ein Beispiel für einen Aggregationsausdruck.

Der Vorgang group_by kombiniert immer Gruppierung und Aggregation. Wenn Sie eine Gruppierung angeben, aber das Aggregationsargument weglassen, verwendet group_by die Standardaggregation aggregate(val()), mit der eine geeignete Funktion für den Datentyp ausgewählt wird. Eine Liste der Standardaggregationsfunktionen finden Sie unter aggregate.

Zeitachsen werden ausgewählt

Die Beispiele in diesem Abschnitt zeigen, wie Sie bestimmte Zeitachsen aus einer Eingabetabelle auswählen.

Auswählen der oberen oder unteren Zeitachse

Geben Sie die folgende Abfrage ein, um die Zeitachsendaten für die drei Compute Engine-Instanzen mit der höchsten CPU-Auslastung in Ihrem Projekt anzuzeigen:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| top 3

Der folgende Screenshot zeigt das Ergebnis eines Projekts:

Das Diagramm zeigt die drei Zeitachsen mit der höchsten Auslastung.

Sie können die Zeitachse mit der geringsten CPU-Auslastung abrufen, indem Sie top durch bottom ersetzen.

Der top -Vorgang gibt eine Tabelle mit einer angegebenen Anzahl von Zeitachsen aus der Eingabetabelle aus. Die in der Ausgabe enthaltenen Zeitachsen haben für einige Aspekte der Zeitachse den größten Wert. Hier gibt das Argument 3 an, drei Zeitachsen auszuwählen.

Da diese Abfrage keine Möglichkeit zum Sortieren der Zeitachsen angibt, gibt sie diejenigen mit dem größten Wert für den neuesten Punkt zurück. Optional können Sie der top - Operation ein zusätzliches Argument hinzufügen: einen Ausdruck, der angibt, wie die Zeitachse ermittelt wird, die am längsten ist. Die vorherige Abfrage entspricht:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| top 3, val()

Der Ausdruck val() wählt den Wert des letzten Punkts in jeder Zeitachse aus, auf die er angewendet wird. Die Abfrage gibt also diejenigen mit dem größten Wert für den neuesten Punkt zurück.

Sie können einen Ausdruck angeben, der Aggregationen über einige oder alle Punkte in einer Zeitachse ausführt, um den Sortierwert zu erhalten. Im Folgenden wird der Mittelwert aller Punkte der letzten 10 Minuten verwendet:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| top 3, mean(val()).within(10m)

Wenn die Funktion within nicht verwendet wird, wird die Funktion mean auf die Werte aller angezeigten Punkte in der Zeitachse angewendet.

Der Vorgang bottom funktioniert ähnlich. Die folgende Abfrage ermittelt den Wert des größten Punkts in jeder Zeitachse mit max(val()) und wählt dann die drei Zeitachsen aus, für die dieser Wert am kleinsten ist:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| bottom 3, max(val())

Dies kann man sich als Streams mit den geringsten Spitzen vorstellen. Der folgende Screenshot zeigt ein Diagramm:

Das Diagramm zeigt die drei Zeitachsen mit der höchsten Auslastung.

Auswahl der obersten oder untersten Gruppe

Die Tabellenvorgänge top und bottom wählen Zeitachsen aus der gesamten Eingabetabelle aus. Die Vorgänge top_by und bottom_by gruppieren die Zeitachsen in einer Tabelle und wählen dann eine bestimmte Anzahl von Zeitachsen aus jeder Gruppe aus.

Mit der folgenden Abfrage wird die Zeitachse in jeder Zone mit dem höchsten Spitzenwert ausgewählt und :

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| top_by [zone], 1, max(val())

Das Diagramm zeigt den größten Spitzenwert nach Zone.

Der Ausdruck [zone] gibt an, dass eine Gruppe aus allen Zeitachsen mit demselben Wert der Spalte zone besteht. Die 1 in der top_by gibt an, wie viele Zeitachsen aus den Gruppen der einzelnen Zonen ausgewählt werden sollen. Der Ausdruck max(val()) sucht nach dem größten Wert des Diagrammzeitraums in jeder Zeitachse.

Anstelle von max können Sie eine beliebige Aggregationsfunktion verwenden. Im folgenden Beispiel wird der Aggregator mean und mit within der Sortierbereich von 20 Minuten angegeben. Es werden die zwei wichtigsten Zeitachsen in jeder Zone ausgewählt:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| top_by [zone], 2, mean(val()).within(20m)

Das Diagramm zeigt innerhalb von 20 Minuten den zweithöchsten Spitzenwert pro Zone.

Beachten Sie, dass es nur eine Instanz in der Zone us-central-c gibt, sodass nur eine Zeitachse zurückgegeben wird. Es gibt keine "Top 2" in der Gruppe.

Auswahl mit union kombinieren

Sie können Auswahlvorgänge wie top und bottom kombinieren, um Diagramme zu erstellen, die beide enthalten. Die folgende Abfrage gibt beispielsweise die einzelne Zeitachse mit dem Höchstwert und die einzelne Zeitachse mit dem Mindestwert zurück:

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| {
    top 1, max(val())
  ;
    bottom 1, min(val())
  }
| union

Das resultierende Diagramm enthält zwei Linien, eine mit dem höchsten Wert und eine mit dem niedrigsten:

Das Diagramm zeigt die Zeitachsen mit den höchsten und niedrigsten Werten.

Sie können geschweifte Klammern ({ }) verwenden, um Abfolgen von Vorgängen anzugeben, die jeweils eine Tabelle mit Zeitachsen als Ausgabe liefern. Die einzelnen Vorgänge werden durch einen Doppelpunkt (;) getrennt.

In diesem Beispiel gibt der fetch - Vorgang eine einzelne Tabelle zurück, die an jeden der beiden Vorgänge in der Sequenz, einen top - und einen bottom - Vorgang, weitergeleitet wird. Jeder dieser Vorgänge führt zu einer Ausgabetabelle, die auf derselben Eingabetabelle basiert. Der Vorgang union kombiniert dann die beiden Tabellen zu einer, die im Diagramm angezeigt wird.

Weitere Informationen zu mehreren Vorgangssequenzen mit { } finden Sie im Referenzthema Abfragestruktur.

Computing-Verhältnisse

Angenommen, Sie haben einen verteilten Webdienst erstellt, der auf Compute Engine-VM-Instanzen ausgeführt wird und Cloud Load Balancing verwendet.

Sie möchten ein Diagramm sehen, in dem das Verhältnis der Anfragen, die HTTP 500 - Antworten (interne Fehler) zurückgeben, zur Gesamtzahl der Anfragen angezeigt wird. also das Anfrage-Fehler-Verhältnis. In diesem Abschnitt werden mehrere Möglichkeiten zum Berechnen des Verhältnisses zwischen Anfrage und Fehler erläutert.

Cloud Load Balancing verwendet den Typ http_lb_rule der überwachten Ressource. Der Typ der überwachten Ressource http_lb_rule hat das Label matched_url_path_rule, dass das Präfix der für die Regel definierten URLs aufzeichnet. der Standardwert ist UNMATCHED.

Der Messwerttyp loadbalancing.googleapis.com/https/request_count hat das Label response_code_class. Mit diesem Label wird die Klasse der Antwortcodes erfasst.

outer_join und div verwenden

Die folgende Abfrage ermittelt die 500 - Antworten für jeden Wert des Labels matched_url_path_rule in jeder überwachten http_lb_rule - Ressource in Ihrem Projekt. Anschließend wird die Fehlerzählungstabelle mit der Originaltabelle verknüpft, die alle Antwortzählungen enthält und die Werte unterteilt, um das Verhältnis der Fehlerantworten zu den Gesamtantworten anzuzeigen:

fetch https_lb_rule::loadbalancing.googleapis.com/https/request_count
| {
    filter response_code_class = 500
  ;
    ident
  }
| group_by [matched_url_path_rule]
| outer_join 0
| div

Das folgende Diagramm zeigt das Ergebnis eines Projekts:

Das Diagramm zeigt das Verhältnis von fehlgeschlagenen Anfragen zur Gesamtzahl nach Beitritt.

Der Vorgang fetch gibt eine Tabelle mit Zeitachsen aus, die die Anzahl der Anfragen für alle Abfragen mit Load-Balancing enthält. Diese Tabelle wird auf zwei Arten von den beiden Vorgangssequenzen in den geschweiften Klammern verarbeitet.

  • filter response_code_class = 500 gibt nur die Zeitachsen aus, die das Label response_code_class mit dem Wert 500 haben. Die resultierende Zeitachse zählt die Anfragen mit HTTP 5xx-Antwortcodes (Fehler).

    Diese Tabelle ist der Zähler des Verhältnisses.

  • Der Vorgang ident oder Identität gibt seine Eingabe aus, sodass die ursprünglich abgerufene Tabelle zurückgegeben wird. Dies ist die Tabelle, die Zeitachsen mit Anzahlen für jeden Antwortcode enthält.

    Diese Tabelle ist der Nenner des Verhältnisses.

Die von den Vorgängen filter und ident erstellten Zähler- und Nennertabellen werden vom Vorgang group_by separat verarbeitet. Der group_by - Vorgang gruppiert die Zeitachsen in jeder Tabelle nach dem Wert des Labels matched_url_path_rule und addiert die Anzahl für jeden Wert des Labels. Dieser group_by - Vorgang gibt die Aggregatorfunktion nicht explizit an, daher wird der Standardwert sum verwendet.

  • Für die gefilterte Tabelle ist das Ergebnis group_by die Anzahl der Anfragen, die für jeden matched_url_path_rule - Wert eine 500 - Antwort zurückgeben.

  • Für die Identitätstabelle sind die group_by - Ergebnisse die Gesamtzahl der Anfragen für jeden matched_url_path_rule - Wert.

Diese Tabellen werden an den Vorgang outer_join weitergeleitet, der Zeitachsen mit übereinstimmenden Labelwerten koppelt, eine aus jeder der beiden Eingabetabellen. Die gekoppelte Zeitachse wird gezippt, indem der Zeitstempel jedes Punkts in einer Zeitachse mit dem Zeitstempel eines Punkts in der anderen Zeitachse abgeglichen wird. Für jedes übereinstimmende Punktepaar erzeugt outer_join einen einzelnen Ausgabepunkt mit zwei Werten, einen aus jeder der Eingabetabellen. Die komprimierte Zeitachse wird vom Join mit denselben Labels wie die beiden Eingabezeitachsen ausgegeben.

Da dies ein Outer Join ist, muss ein Ersatzwert angegeben werden, wenn ein Punkt aus der zweiten Tabelle keinen übereinstimmenden Punkt in der ersten Tabelle hat. In diesem Beispiel wird ein Punkt mit dem Wert 0 - dem Argument für den outer_join - Vorgang verwendet.

Schließlich nimmt der div - Vorgang jeden Punkt mit zwei Werten auf und teilt die Werte, um einen einzelnen Ausgabepunkt zu erzeugen: das Verhältnis von 500 Antworten zu allen Antworten für jede URL-Zuordnung.

Der String div ist hier der Name der Funktion div, die zwei numerische Werte teilt. Aber es wird hier als Vorgang verwendet. Wenn sie als Vorgänge verwendet werden, erwarten Funktionen wie div an jedem Eingabepunkt zwei Werte (was durch join sichergestellt wird) und erzeugen einen einzelnen Wert für den entsprechenden Ausgabepunkt.

Der Teil | div der Abfrage ist eine Verknüpfung für | value val(0) / val(1). Der value - Vorgang ermöglicht beliebige Ausdrücke in den Wertspalten einer Eingabetabelle, um die Wertspalten der Ausgabetabelle zu erzeugen. Weitere Informationen finden Sie auf den Referenzseiten zum Vorgang value und zu Ausdrücken.

ratio wird verwendet

Die div - Funktion könnte durch eine beliebige Funktion für zwei Werte ersetzt werden, aber da Verhältnisse so häufig verwendet werden, bietet MQL einen ratio -Tabellenvorgang, der Verhältnisse direkt berechnet.

Die folgende Abfrage entspricht der vorherigen Version mit outer_join und div:

fetch https_lb_rule::loadbalancing.googleapis.com/https/request_count
| {
    filter response_code_class = 500
  ;
    ident
  }
| group_by [matched_url_path_rule]
| ratio

In dieser Version ersetzt der ratio - Vorgang die outer_join 0 | div - Vorgänge in der früheren Version und führt zum selben Ergebnis.

group_by und / verwenden

Es gibt noch eine weitere Möglichkeit, das Verhältnis von Fehlerantworten zu allen Antworten zu berechnen. In diesem Fall können Sie das Verhältnis auch allein durch Gruppierung berechnen, da Zähler und Nenner für das Verhältnis aus derselben Zeitachse abgeleitet werden. Die folgende Abfrage zeigt diesen Ansatz:

fetch https_lb_rule::loadbalancing.googleapis.com/https/request_count
| group_by [matched_url_path_rule],
    sum(if(response_code_class = 500, val(), 0)) / sum(val())

Diese Abfrage verwendet einen Aggregationsausdruck, der auf dem Verhältnis von zwei Summen basiert:

  • Im ersten sum wird die Funktion if verwendet, um Labels mit 500 Werten und 0 für andere zu zählen. Die Funktion sum berechnet die Anzahl der Anfragen, die 500 zurückgegeben haben.

  • Die zweite sum addiert die Anzahl für alle Anfragen, val().

Die beiden Summen werden dann aufgeteilt, sodass sich das Verhältnis von 500 Antworten zu allen Antworten ergibt. Diese Abfrage führt zu demselben Ergebnis wie die Abfragen in outer_join und div und ratio verwenden.

filter_ratio_by wird verwendet

Da Verhältnisse häufig durch Teilen von zwei aus derselben Tabelle abgeleiteten Summen berechnet werden, stellt MQL zu diesem Zweck den filter_ratio_by -Vorgang bereit. Die folgende Abfrage führt das Gleiche wie die vorherige Version aus, bei der die Summen explizit geteilt werden:

fetch https_lb_rule::loadbalancing.googleapis.com/https/request_count
| filter_ratio_by [matched_url_path_rule], response_code_class = 500

Der erste Operand des filter_ratio_by - Vorgangs, hier [matched_url_path_rule], gibt an, wie die Antworten gruppiert werden. Der zweite Vorgang, hier response_code_class = 500, fungiert als Filterausdruck für den Zähler.

  • Die Tabelle "Denominator" ist das Ergebnis der Gruppierung der abgerufenen Tabelle nach matched_url_path_rule und die Zusammenfassung mithilfe von sum.
  • Die Zähler-Tabelle ist die abgerufene Tabelle, die nach Zeitachsen mit dem HTTP-Antwortcode 5xx gefiltert, dann nach matched_url_path_rule gruppiert und mit sum zusammengefasst wird.

Zeitverschiebung

Manchmal möchten Sie das, was jetzt passiert, mit dem, was in der Vergangenheit passiert ist, vergleichen. MQL bietet den Tabellenvorgang time_shift, mit dem Daten aus der Vergangenheit in den aktuellen Zeitraum verschoben werden, damit sie mit den aktuellen Werten verglichen werden können.

Im Laufe der Zeit

Die folgende Abfrage verwendet time_shift, join und div, um das Verhältnis der mittleren Auslastung in beiden zu berechnen Zone zwischen heute und vor einer Woche.

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| group_by [zone], mean(val())
| {
    ident
  ;
    time_shift 1w
  }
| join | div

Das folgende Diagramm zeigt ein mögliches Ergebnis dieser Abfrage:

Das Diagramm zeigt das Verhältnis von aktuellen und zeitversetzten Daten.

Die ersten beiden Vorgänge rufen die gewünschte Zeitachse ab und gruppieren sie dann nach Zone, wobei die Mittelwerte für jede berechnet werden. Die resultierende Tabelle wird dann an zwei Vorgänge übergeben. Der erste Vorgang, ident, übergibt die Tabelle unverändert.

Der zweite Vorgang, time_shift, fügt den Zeitraum (1 Woche) den Zeitstempeln für Werte in der Tabelle hinzu, wodurch Daten von einer Woche vorwärts verschoben werden. Durch diese Änderung werden die Zeitstempel für ältere Daten in der zweiten Tabelle mit den Zeitstempeln für die aktuellen Daten in der ersten Tabelle abgeglichen.

Die unveränderte Tabelle und die zeitversetzte Tabelle werden dann mit einem internen join kombiniert. join erzeugt eine Tabelle mit Zeitachsen, in denen jeder Punkt zwei Werte hat: die aktuelle Auslastung und die Auslastung vor einer Woche. Die Abfrage verwendet dann den div - Vorgang, um das Verhältnis des aktuellen Werts zum ein Wochen alten Wert zu berechnen.

Bisherige und aktuelle Daten

Durch die Kombination von time_shift mit union können Sie ein Diagramm erstellen, in dem vergangene und aktuelle Daten gleichzeitig angezeigt werden. Die folgende Abfrage gibt beispielsweise die durchschnittliche Gesamtauslastung jetzt und vor einer Woche zurück. Mit union können Sie diese beiden Ergebnisse im selben Diagramm anzeigen.

fetch gce_instance::compute.googleapis.com/instance/cpu/utilization
| group_by []
| {
     add [when: "now"]
  ;
     add [when: "then"] | time_shift 1w
  }
| union

Das folgende Diagramm zeigt ein mögliches Ergebnis dieser Abfrage:

Das Diagramm zeigt die aktuelle und vergangene durchschnittliche Auslastung.

Diese Abfrage ruft die gewünschte Zeitachse ab und kombiniert sie dann mit group_by [] zu einer einzigen Zeitachse ohne Labels, sodass nur die Datenpunkte der CPU-Auslastung verbleiben. Dieses Ergebnis wird an zwei Vorgänge übergeben. Die erste fügt eine Spalte für ein neues Label namens when mit dem Wert now hinzu. Der zweite fügt ein Label namens when mit dem Wert then hinzu und übergibt das Ergebnis an den Vorgang time_shift, um die Werte um eine Woche zu verschieben. Diese Abfrage verwendet den Kartenmodifikator add. Weitere Informationen finden Sie unter Maps.

Die beiden Tabellen, die jeweils Daten für eine einzelne Zeitachse enthalten, werden an union übergeben, wodurch eine Tabelle mit den Zeitachsen aus beiden Eingabetabellen erstellt wird.

Nächste Schritte

Eine Übersicht über die MQL-Sprachstrukturen finden Sie unter Über die MQL-Sprache.

Eine vollständige Beschreibung von MQL finden Sie in der Referenz zur Monitoring-Abfragesprache.

Informationen zur Interaktion mit Diagrammen, einschließlich derer, die vom Abfrageeditor erstellt wurden, finden Sie unter Mit Diagrammen arbeiten.