Ich schlage vor, das Transkript des Berichts von Roman Khavronenko âExtendedPromQLâ zu lesen.


Kurz ĂŒber mich. Mein Name ist Roman. Ich arbeite fĂŒr CloudFlare und lebe in London. Aber ich bin auch ein VictoriaMetrics-Betreuer.
Und ich bin der Autor fĂŒr Grafana und ist ein kleiner Proxy fĂŒr ClickHouse.

Wir beginnen mit dem ersten Teil, der âĂbersetzungsschwierigkeitenâ heiĂt, und darin werde ich darĂŒber sprechen, dass jede Sprache oder auch nur eine Kommunikationssprache sehr wichtig ist. Denn so ĂŒbermitteln Sie Ihre Gedanken einer anderen Person oder einem anderen System, so formulieren Sie eine Bitte. Im Internet streiten sich die Leute darĂŒber, welche Sprache besser ist â Java oder eine andere. FĂŒr mich selbst habe ich entschieden, dass es notwendig ist, eine Aufgabe auszuwĂ€hlen, weil dies alles spezifisch ist.

Fangen wir ganz von vorne an. Was ist PromQL? PromQL ist die Prometheus-Abfragesprache. Auf diese Weise bilden wir in Prometheus Abfragen, um Zeitreihendaten und Zeitreihen zu erhalten.

Was sind Zeitreihendaten? Im wahrsten Sinne des Wortes sind dies drei Parameter.
Diese sind:
- Was schauen wir uns an.
- Wenn wir es betrachten.
- Und welchen Wert zeigt es.

Wenn Sie sich dieses Diagramm ansehen (dieses Diagramm stammt von meinem Telefon und zeigt die Statistiken meiner Schritte), können Sie diese Fragen hier schnell beantworten.
Wir betrachten Schritte. Wir sehen die Bedeutung und wir sehen die Zeit, wenn wir es betrachten. Das heiĂt, wenn man sich dieses Diagramm ansieht, kann man leicht sagen, dass ich am Sonntag etwa 15 Schritte gegangen bin. Hierbei handelt es sich um Zeitreihendaten.

Lassen Sie uns sie nun in ein anderes Datenmodell in Form einer Tabelle âaufbrechenâ (transformieren). Hier haben wir auch, was wir sehen. Hier habe ich ein paar zusĂ€tzliche Daten hinzugefĂŒgt, die wir Metadaten nennen werden, das heiĂt, nicht ich bin durchgegangen, sondern zwei Personen, zum Beispiel Jay und Silent Bob. Das ist es, was wir sehen; was es anzeigt und wann es diesen Wert anzeigt.

Versuchen wir nun, alle diese Daten in der Datenbank zu speichern. Ich habe zum Beispiel die ClickHouse-Syntax verwendet. Und hier erstellen wir eine Tabelle mit dem Namen âSchritteâ, d. h. das, was wir betrachten. Es gibt hier eine Zeit, in der wir es betrachten; was es zeigt und einige Metadaten, in denen wir speichern werden, wer es ist: Jay und Silent Bob.

Und um zu versuchen, das alles zu visualisieren, werden wir Grafana verwenden, weil es erstens wunderschön ist.

Auch wir werden dieses Plugin verwenden. DafĂŒr gibt es zwei GrĂŒnde. Das erste liegt daran, dass ich es geschrieben habe. Und ich weiĂ genau, wie schwierig es ist, Zeitreihendaten aus ClickHouse abzurufen, um sie in Grafana anzuzeigen.

Wir werden im Diagrammbereich angezeigt. Dies ist das beliebteste Panel in Grafana und zeigt den Wert im VerhÀltnis zur Zeit, daher benötigen wir nur zwei Parameter.

Schreiben wir die einfachste Abfrage â wie man Schrittstatistiken in Grafana anzeigt und diese Daten in ClickHouse in der von uns erstellten Tabelle speichert. Und wir schreiben eine so einfache Abfrage. Wir wĂ€hlen aus Schritten. Wir wĂ€hlen einen Wert und die Zeit dieser Werte aus, also dieselben drei Parameter, ĂŒber die wir gesprochen haben.

Und als Ergebnis erhalten wir diese Grafik. Wer weiĂ, warum er so seltsam ist?

Das ist richtig, Sie mĂŒssen nach Zeit sortieren.

Und am Ende bekommen wir einen besseren, aber immer noch seltsamen Zeitplan. Wer weiĂ warum? Richtig, es gibt zwei Teilnehmer, und wir verschenken zwei Zeitreihen in Grafana, denn wenn wir uns noch einmal mit dem Datenmodell befassen, dann ist jede Zeitreihe eine eindeutige Kombination aus einem Namen und allen Labels-SchlĂŒsselwerten.

Daher mĂŒssen wir eine bestimmte Person auswĂ€hlen. Wir entscheiden uns fĂŒr Jay.

Und noch einmal zeichnen. Jetzt sieht die Grafik wie die Wahrheit aus. Jetzt ist es ein normaler Zeitplan und alles funktioniert gut.

Und wahrscheinlich wissen Sie, wie man ungefĂ€hr dasselbe macht, aber in Prometheus ĂŒber PromQL. UngefĂ€hr so. Etwas einfacher. Und lassen Sie uns alles aufschlĂŒsseln. Wir haben Schritte unternommen. Und filtern Sie nach Jay. Wir geben hier nicht an, dass wir einen Wert erhalten mĂŒssen, und wir wĂ€hlen keinen Zeitpunkt.

Versuchen wir nun, die Bewegungsgeschwindigkeit von Jay oder Silent Bob zu berechnen. In ClickHouse mĂŒssen wir ârunningDifferenceâ ausfĂŒhren, d. h. die Differenz zwischen Punktpaaren berechnen und sie durch die Zeit dividieren, um die genaue Geschwindigkeit zu erhalten. Die Anfrage wird in etwa so aussehen.

Und er wird ungefÀhr diese Werte anzeigen, also ungefÀhr 1,8 Schritte pro Sekunde macht Silent Bob oder Jay.

Und in Prometheus wissen Sie auch, wie es geht. Viel einfacher als zuvor.
Und um es auch in Grafana einfacher zu machen, habe ich einen solchen Wrapper hinzugefĂŒgt, der PromQL sehr Ă€hnlich sieht. Es heiĂt âRate Macrosâ oder wie auch immer Sie es nennen möchten. In Grafana schreibt man einfach âRateâ, aber irgendwo tief im Inneren verwandelt sich das in eine so groĂe Anfrage. Und Sie mĂŒssen es nicht einmal ansehen, es ist irgendwo da, aber Sie sparen viel Zeit, weil das Schreiben solch groĂer SQL-Abfragen immer teuer ist. Man kann leicht einen Fehler machen und dann lange Zeit nicht verstehen, was passiert.

Und das ist eine Abfrage, die nicht einmal auf eine Folie passte, und ich musste sie sogar in zwei Spalten aufteilen. Dies ist auch eine Anfrage in ClickHouse, die die gleiche Rate macht, aber fĂŒr beide Zeitreihen: Silent Bob und Jay, sodass wir zwei Zeitreihen auf dem Panel haben. Und das ist meiner Meinung nach schon sehr schwierig.

Und laut Prometheus wird es Summe (Rate) sein. FĂŒr ClickHouse habe ich ein separates Makro namens RateColumns erstellt, das wie eine Prometheus-Abfrage aussieht.

Wir haben nachgeschaut und es scheint, dass PromQL so cool ist, aber es hat natĂŒrlich EinschrĂ€nkungen.
Diese sind:
- Begrenzte Auswahl.
- Edge JOINs.
- Keine HAVING-UnterstĂŒtzung.
Und wenn Sie schon lange damit arbeiten, wissen Sie, dass es manchmal sehr schwierig ist, etwas in PromQL zu tun, und in SQL kann man fast alles tun, weil alle diese Optionen, ĂŒber die wir gerade gesprochen haben, in SQL möglich sind . Aber wĂ€re es praktisch, es zu verwenden? Und das lĂ€sst mich denken, dass nicht immer die mĂ€chtigste Sprache auch die bequemste sein kann.

Daher mĂŒssen Sie manchmal eine Sprache fĂŒr Aufgaben auswĂ€hlen. Es ist wie ein Kampf zwischen Batman und Superman. Es ist klar, dass Superman stĂ€rker ist, aber Batman konnte ihn besiegen, weil er praktischer ist und genau wusste, was er tat.

Und der nÀchste Teil ist die Erweiterung von PromQL.

Noch einmal zu VictoriaMetrics. Was ist VictoriaMetrics? Dies ist eine Zeitreihendatenbank, sie ist in OpenSource, wir vertreiben ihre Einzel- und Clusterversionen. Laut unseren Benchmarks ist es das schnellste, was derzeit auf dem Markt ist, und es ist Àhnlich in Bezug auf die Komprimierung, d. h. lebende Menschen berichten von einer Komprimierung von etwa 0,4 Bytes pro Punkt, wÀhrend Prometheus 1,2-1,4 hat.
Wir unterstĂŒtzen nicht nur Prometheus. Wir unterstĂŒtzen InfluxDB, Graphite, OpenTSDB.
Sie können bei uns âschreibenâ, also alte Daten ĂŒbertragen.
Und auch mit Prometheus und Grafana arbeiten wir perfekt zusammen, d.h. wir unterstĂŒtzen die PromQL-Engine. Und in Grafana können Sie einfach den Prometheus-Endpunkt in VictoriaMetrics Ă€ndern und alle Ihre Dashboards funktionieren wie bisher.
Sie können aber auch zusÀtzliche Chips von VictoriaMetrics verwenden.
Wir werden die von uns hinzugefĂŒgten Funktionen kurz durchgehen.

Intervallparameter weglassen â Sie können das Parameterintervall in Grafana ĂŒberspringen. Wenn Sie beim VergröĂern/Verkleinern des Panels keine seltsamen Diagramme erhalten möchten, wird die Verwendung der Variablen empfohlen $__interval. Dies ist eine interne Grafana-Ănderung und wĂ€hlt den Datenbereich selbst aus. Und VictoriaMetrics kann selbst verstehen, wie dieser Bereich aussehen sollte. Und Sie mĂŒssen nicht alle Ihre Anfragen aktualisieren. Es wird viel einfacher sein.

Die zweite Funktion ist die Intervallreferenzierung. Sie können diesen Abstand in Ihren AusdrĂŒcken verwenden. Sie können es multiplizieren, dividieren, ĂŒbertragen und darauf verweisen.

Als nĂ€chstes folgt die Rollup-Funktionsfamilie. Die Rollup-Funktion wandelt jede Ihrer Zeitreihen in drei separate Zeitreihen um. Dies sind Min., Max. und Durchschnitt. Ich finde es sehr praktisch, weil es manchmal AusreiĂer (Anomalien) und Ungenauigkeiten zeigen kann.

Und wenn Sie nur âirateâ oder ârateâ machen, können Sie wahrscheinlich einige FĂ€lle ĂŒbersehen, in denen sich die Zeitreihe nicht so verhĂ€lt, wie Sie es beabsichtigt haben. Mit dieser Funktion ist es viel einfacher zu erkennen, nehmen wir an, dass Max sehr weit vom Durchschnitt abweicht.

Als nĂ€chstes folgt die Standardvariable. Standard â das bedeutet, welchen Wert wir in Grafana zeichnen mĂŒssen, wenn wir im Moment keine Zeitreihe haben. Wann passiert es? Nehmen wir an, Sie exportieren einige Fehlermetriken. Und Sie haben eine so coole Anwendung, dass Sie beim Start keine Fehler haben und sogar in den nĂ€chsten drei Stunden oder sogar einem Tag keine Fehler mehr haben. Und Sie verfĂŒgen ĂŒber Dashboards, die ZusammenhĂ€nge vom Erfolg bis zum Fehler aufzeigen. Und sie zeigen Ihnen nichts, weil Sie keine Fehlermetrik haben. Und standardmĂ€Ăig können Sie alles angeben.

Keep_last_Value â speichert den letzten Wert der Metrik, wenn dieser fehlt. Wenn Prometheus es nach dem nĂ€chsten Scraping nicht innerhalb von 5 Minuten gefunden hat, speichern wir hier seinen letzten Wert und Ihre Charts werden nicht erneut kaputt gehen.

Scrape_interval â zeigt an, wie oft und mit welcher HĂ€ufigkeit Prometheus Daten zu Ihrer Metrik sammelt. Hier können Sie sich zum Beispiel den Pass ansehen.

Das Ersetzen von Etiketten ist eine beliebte Funktion. Aber wir denken, dass es etwas kompliziert ist, weil es ganzzahlige Argumente erfordert. Und Sie mĂŒssen sich nicht nur die 5 Argumente merken, sondern auch deren Reihenfolge.

Warum also nicht einfacher machen? Das heiĂt, zerlegen Sie es in kleine Funktionen mit klarer Syntax.

Und jetzt das Interessanteste. Warum glauben wir, dass es sich um erweitertes PromQL handelt? Weil wir Common Table Expressions unterstĂŒtzen. Sie können dem QR-Code folgen (), siehe Links mit Beispielen aus dem Playground, wo Sie Abfragen direkt in VictoriaMetrics ausfĂŒhren können, ohne es einfach im Browser zu installieren.

Und was ist das? Diese Anfrage von oben ist eine ziemlich beliebte Anfrage. Ich denke, dass man in vielen Unternehmen in jedem Dashboard fĂŒr alles den gleichen Filter verwendet. Normalerweise so. Wenn Sie jedoch einen neuen Filter hinzufĂŒgen mĂŒssen, mĂŒssen Sie jedes Panel aktualisieren oder das Dashboard herunterladen, es in JSON öffnen und eine Suche nach Ersetzen durchfĂŒhren, was ebenfalls Zeit kostet. Warum diesen Wert nicht in einer Variablen speichern und wiederverwenden? Es sieht meiner Meinung nach viel einfacher und klarer aus.

Zum Beispiel, wenn ich die Filter in Grafana in allen Anfragen aktualisieren muss und das Dashboard riesig sein kann oder sogar mehrere davon umfassen kann. Und wie möchte ich dieses Problem in Grafana lösen?

Ich löse dieses Problem folgendermaĂen: Ich erstelle einen commonFilter, definiere diesen Filter darin und verwende ihn dann in Abfragen wieder. Wenn Sie jetzt jedoch dasselbe tun, funktioniert es nicht, da Grafana die Verwendung von Variablen innerhalb von Abfragevariablen nicht zulĂ€sst. Und es ist ein bisschen seltsam.

Deshalb habe ich eine Option entwickelt, die Ihnen dies ermöglicht. Und wenn Sie Interesse an einer solchen Funktion haben oder diese wĂŒnschen, dann unterstĂŒtzen Sie sie oder lehnen Sie sie ab, wenn Ihnen diese Idee nicht gefĂ€llt.

Mehr ĂŒber PromQL erweitert. Hier definieren wir nicht nur eine Variable, sondern direkt eine ganze Funktion. Und wir nennen es ru (Ressourcennutzung). Und diese Funktion akzeptiert freie Ressourcen, ein Ressourcenlimit und einen Filter. Die Syntax scheint einfach zu sein. Und es ist sehr einfach, diese Funktion zu verwenden und den Prozentsatz des freien Speichers zu berechnen, den wir haben. Das heiĂt, wie viel Speicher wir haben, welches Limit und wie wir filtern. Es sieht viel besser aus, wenn Sie alles unter Wiederverwendung derselben Filter schreiben wĂŒrden, da dies zu einer sehr groĂen Abfrage fĂŒhren wĂŒrde.

Und hier ist ein Beispiel fĂŒr eine so groĂe, groĂe Anfrage. Es stammt aus dem offiziellen NodeExporter-Dashboard fĂŒr Grafana. Aber ich verstehe nicht wirklich, was hier vor sich geht. Das ist natĂŒrlich verstĂ€ndlich, wenn man genau hinschaut, aber die Anzahl der Klammern kann die Motivation, zu verstehen, was hier passiert, sofort verringern. Und warum nicht einfacher und klarer machen?

So können Sie beispielsweise wichtige Dinge oder Teile in Variablen hervorheben. Und dann machen Sie Ihre Grundrechenarten. Das ist eher eine Art Programmierung, das ist es, was ich in Zukunft gerne in Grafana sehen wĂŒrde.

Hier ist ein zweites Beispiel, wie wir es noch einfacher machen können, wenn wir diese ru-Funktion bereits hĂ€tten und sie bereits direkt in VictoriaMetrics existiert. Und dann ĂŒbergeben Sie einfach den zwischengespeicherten Wert, den Sie im CTE deklariert haben.

Ich habe bereits darĂŒber gesprochen, wie wichtig es ist, die richtige Programmiersprache zu verwenden. Und wahrscheinlich passiert in Grafana in jedem Unternehmen etwas anderes. Und wahrscheinlich gewĂ€hren Sie Ihren Entwicklern immer noch Zugriff auf Grafana, und die Entwickler machen etwas Eigenes. Und sie alle machen es auf unterschiedliche Weise. Aber ich wollte es irgendwie gleich, also reduziert auf einen gemeinsamen Standard.
Nehmen wir an, Sie haben nicht nur Systemingenieure, sondern vielleicht sogar Experten, Entwickler oder SREs. Vielleicht haben Sie Experten, die wissen, was Monitoring ist, wissen, was Grafana ist, d. h. sie arbeiten seit Jahren damit und wissen genau, wie man es richtig macht. Und sie haben es bereits 100 Mal geschrieben und allen erklÀrt, aber aus irgendeinem Grund hört niemand zu.
Aber was wĂ€re, wenn sie dieses Wissen direkt in Grafana einbringen könnten, damit andere Benutzer die Funktionen wiederverwenden könnten? Und wenn es notwendig wĂ€re, den Prozentsatz des freien Speichers zu berechnen, wĂŒrden sie einfach die Funktion anwenden. Aber was wĂ€re, wenn die Entwickler von Exporteuren zusammen mit ihrem Produkt auch eine Reihe von Funktionen bereitstellen wĂŒrden, wie sie mit ihren Metriken arbeiten, weil sie genau wissen, was diese Metriken sind und wie sie sie richtig berechnen?
Dieser existiert nicht wirklich. Hier ist, was ich selbst gemacht habe. Dies ist die BibliotheksunterstĂŒtzung in Grafana. Nehmen wir an, die Leute, die NodeExporter gemacht haben, haben getan, was ich beschrieben habe. Und auch eine Reihe von Funktionen bereitgestellt.

Das heiĂt, es sieht ungefĂ€hr so ââaus. Sie verbinden diese Bibliothek mit Grafana, beginnen mit der Bearbeitung und hier ist in JSON sehr einfach, wie mit dieser Metrik gearbeitet wird. Das heiĂt, einige Funktionen, ihre Beschreibung und was sie entfalten.

Meiner Meinung nach könnte das nĂŒtzlich sein, denn dann wĂŒrde man einfach so in Grafana schreiben. Und Grafana âsagtâ Ihnen, dass es diese und jene Funktion aus dieser und jener Bibliothek gibt â nutzen wir sie. Ich denke, das wĂ€re sehr cool.

Ein wenig ĂŒber VictoriaMetrics. Wir machen viele interessante Dinge. Lesen Sie unsere Artikel ĂŒber Komprimierung, ĂŒber unsere Konkurrenz mit anderen Zeitreihen-Datenanwendungen, unsere ErklĂ€rung zur Arbeit mit PromQL, denn darin gibt es noch viel mehr AnfĂ€nger, sowie ĂŒber vertikale Skalierbarkeit und ĂŒber die Konfrontation mit Thanos.

Fragen:
Ich beginne meine Frage mit einer einfachen Lebensgeschichte. Als ich Grafana zum ersten Mal verwendete, schrieb ich eine sehr ĂŒberzeugende 5-Zeilen-Abfrage. Das Endergebnis ist ein sehr ĂŒberzeugendes Diagramm. Diese Grafik ist fast in Produktion gegangen. Doch bei nĂ€herer Betrachtung stellte sich heraus, dass dieses Diagramm absoluten Unsinn darstellt, der nichts mit der RealitĂ€t zu tun hat, obwohl die Zahlen in dem Bereich liegen, den wir erwartet hatten. Und meine Frage. Wir haben Bibliotheken, wir haben Funktionen, aber wie schreiben wir Tests fĂŒr Grafana? Sie haben eine komplexe Anfrage geschrieben, die sich auf die GeschĂ€ftsentscheidung auswirkt â einen echten Container mit Servern zu bestellen oder nicht. Und wie wir wissen, Ă€hnelt diese Funktion, die einen Graphen zeichnet, der Wahrheit. Danke.
Danke fĂŒr die Frage. Hier gibt es zwei Teile. Erstens habe ich aufgrund meiner Erfahrung den Eindruck, dass die meisten Benutzer beim Betrachten ihrer Diagramme nicht verstehen, was sie ihnen zeigen. Irgendwie sind die Leute sehr gut darin, fĂŒr jede Anomalie, die in den Diagrammen auftritt, eine Entschuldigung zu finden, selbst wenn es sich um einen Fehler innerhalb einer Funktion handelt. Und der zweite Teil: Mir scheint, dass die Verwendung solcher Funktionen viel besser zur Lösung Ihres Problems geeignet wĂ€re, anstatt dass jeder Ihrer Entwickler seine eigene KapazitĂ€tsplanung durchfĂŒhrt und mit einiger Wahrscheinlichkeit Fehler macht.
Wie ĂŒberprĂŒft man?
Wie zu ĂŒberprĂŒfen? Wahrscheinlich nicht.
Als Test in Grafana.
Und was ist mit Grafana? Grafana ĂŒbersetzt diese Anfrage direkt in die DataSource.
Indem wir die Parameter ein wenig erweitern.
Nein, Grafana wird nichts hinzugefĂŒgt. Es können GET-Parameter vorhanden sein, z. B. âstepâ. Es wird nicht explizit angegeben, aber Sie können es ĂŒberschreiben. Sie können es nicht ĂŒberschreiben, aber es wird automatisch hinzugefĂŒgt. Hier schreibt man keine Tests. Ich denke nicht, dass man sich hier als Quelle der Wahrheit auf Grafana verlassen sollte.
Danke fĂŒr den Bericht! Danke fĂŒr die Komprimierung! Sie haben sich beim Zuordnen einer Variablen in einem Diagramm daran erinnert, dass Sie in Grafana keine Variable in einer Variablen verwenden können. Verstehst du was ich meine?
Ja.
Das bereitete mir zunĂ€chst Kopfzerbrechen, als ich in Grafana eine Warnung auslösen wollte. Und dort mĂŒssen Sie fĂŒr jeden Host separat eine Warnung durchfĂŒhren. Folgendes haben Sie getan: Funktioniert es fĂŒr Warnungen in Grafana?
Wenn Grafana nicht auf andere Weise auf Variablen zugreift, funktioniert es. Mein Rat ist jedoch, die Alarmierung in Grafana ĂŒberhaupt nicht zu verwenden, sondern lieber den Alertmanager zu verwenden.
Ja, ich benutze es, aber es schien einfacher zu sein, es in Grafana einzurichten, aber danke fĂŒr den Tipp!
Source: habr.com
