Grafana: Benutzerdefinierte Zuordnung des Werts der Vorlagenvariablen zulassen -> Text anzeigen

Erstellt am 7. Nov. 2014  ·  145Kommentare  ·  Quelle: grafana/grafana

Anwendungsfall: Sie können Metriken basierend auf einer „ID“-Eigenschaft speichern, möchten aber, dass die Benutzeroberfläche für die Auswahl von Vorlagenvariablen eine benutzerfreundlichere Bezeichnung verwendet. Beispiel: Sie verfolgen Metriken nach Domäne mit einer internen Domänen-ID, möchten aber die URL der Domäne in der Benutzeroberfläche der Vorlagenvariablenauswahl verwenden.

@torkelo Ich kann die Implementierung einschränken, was denkst du über die Implementierung? Für meinen speziellen Anwendungsfall möchte ich in der Lage sein, eine beliebige JS-Funktion bereitzustellen, um die Konvertierung von Wert -> Text durchzuführen, da ich für die Suche auf einen externen Dienst zugreifen muss. Ich dachte, eine erste Implementierung könnte einen Konfigurationswert im Dashboard-JSON hinzufügen, der die Zuordnungsfunktion definiert. Die UI-Unterstützung könnte später hinzugefügt werden, um trivialere Zuordnungen mit vorgefertigten Zuordnungsfunktionen (z. B. Regex-Ersetzungen) zu handhaben.

Damit verbunden wäre auch die Möglichkeit, das vollständige Dashboard-JSON über die Benutzeroberfläche zu bearbeiten, obwohl Export -> Bearbeiten -> Importieren als Problemumgehung funktionieren würde, wenn sich dies als schwierig erweist.

aredashboard aredashboartemplating typfeature-request

Hilfreichster Kommentar

Die richtige Implementierung der Problemumgehung von @thinrope wäre meiner Meinung nach eine wirklich elegante Lösung.
Wenn wir JSON in einer benutzerdefinierten Variablen verwenden könnten oder einen Variablentyp „JSON“ hätten, könnten wir dies ohne Hacks lösen, und ich sehe keine Nachteile.

Alle 145 Kommentare

Sie könnten dies mit geskripteten Dashboards tun. Sie können jedoch gerne versuchen, es in reguläre/gespeicherte JSON-Dashboards zu implementieren.

+1

Auch ich könnte zumindest eine einfachere Version davon verwenden. So etwas wie ein konfiguriertes Mapping von A -> B

In meinem Szenario möchte ich einen Entitätsnamen in der Variablen-Dropdown-Liste (CustomerName1, CustomerName2 usw.) auswählen, aber intern eine numerische ID verwenden, wenn es um den Metriknamen geht.
app.requests.$customer1_ID.count

+1

Verschmelzung von #3138

ZB beim Erstellen einer benutzerdefinierten Vorlagenvariablen mit den Werten fooBar und baz_quuxInternal , damit die Benutzeroberfläche die Kontrollkästchen als "Foo bar" und "Baz" anzeigen kann.

Dies ist besonders üblich, wenn wiederholte Zeilen und eine benutzerdefinierte Variable verwendet werden, um Duplikate zu reduzieren, aber die Metriken der obersten Ebene sind möglicherweise nicht benutzerfreundlich.

Man könnte dies möglicherweise auch für abgefragte Vorlagenwerte (z. B. Graphiteigenschaften) unterstützen, indem man eine Regex verwendet (wenn die Ersetzung generisch ist). Regex-Unterstützung existiert bereits, aber sie gilt sowohl für den verwendeten Wert als auch für das Label. Es wäre wertvoll, es nur für den Wert zu verwenden.

Wenn beispielsweise eine Graphitabfrage kafka.messagesByTopic.myservice_* zur Verwendung in Vorlagen erweitert, kann es wünschenswert sein, dass die Benutzeroberfläche das Präfix entfernt. Aber wenn es in den eigentlichen Panels verwendet wird, sollte das Präfix enthalten sein. Dies kann jetzt (in Grafana 2.x und höher) umgangen werden, da Vorlagenvariablen in eine Metrik-Eigenschaft eingebettet werden können, sodass man das Präfix in allen Metriken in allen Bedienfeldern und Zeilen fest codieren könnte, aber das ist besser zu vermeiden.

Sobald diese "Label"-Werte vorhanden sind, wäre es nützlich, auch innerhalb der Panels auf sie zugreifen zu können. Beispielsweise beim Einbetten einer Variablen in einen Zeilen- und/oder Panel-Titel. Entweder können wir das Label standardmäßig verwenden (wenn es in ein Titelfeld eingebettet ist) oder vielleicht mit einer alternativen Syntax (z. B. $$Variable oder was auch immer).

http://play.grafana.org/dashboard/db/test?editview=templating zeigt „Variable Label“ als Option. Kann das geschlossen werden?

EDIT: Ich habe den Fehler falsch verstanden, sorry! :) Fortfahren.

das ist nur eine Option, um einen benutzerfreundlichen Namen für die Variable zu haben, nicht die Variablenwerte

+1

+1

+1

+1

+1

+1

Wie ist der Stand davon?
Ist das möglich?

Ist dies für das 3.0 Finale möglich?
Es sieht aus wie eine Funktion, auf die viele Leute warten. Mich eingeschlossen :-)

+1
Normalerweise verwende ich einen Teil regulärer Ausdrücke, was für Benutzer schrecklich aussieht.

+1

+1

+1
Ohne dies sind Regex-Ausdrücke in Template-Variablen unbrauchbar.

+1

+1

+1

+1

+1

+1

@mbell697 @torkelo

Ich habe dies für einen internen Dienst implementiert, der Grafana verwendet. Da wir UUIDs für Hosts verwenden (damit eine Änderung des Hostnamens den Metrikverlauf und eine Reihe anderer Dinge nicht verliert), war es nicht akzeptabel, diese UUIDs dem Benutzer anzuzeigen. Ich habe einen speziellen Patch für unseren Anwendungsfall erstellt, bei dem wir uuid-Werte erkennen und sie mithilfe eines HTTP-Endpunkts unserer Anwendung übersetzen. Das funktioniert gut für uns, aber ich würde es vorziehen, etwas zu tun, das generisch ist und vom Upstream akzeptiert wird.

Wäre es akzeptabel, eine Option „variable_translation_url“ hinzuzufügen, die auf eine URL verweist, die die Zuordnung durchführen kann? (bei Bedarf mit einem optionalen Autorisierungs-Token) oder ein variable_translation_script, das auf Javascript-Quellen verweist, die heruntergeladen und an den Stellen, an denen eine Übersetzung erforderlich ist, in templateValuesSrv.js eingehängt werden können (falls diese Option festgelegt ist)?

Können Sie Ihren TemplateValuesSrv.js-Code teilen? Ich möchte es versuchen.

@ZhuWanShan Das ist es im Grunde:

https://github.com/sangoma/grafana/commit/fa109c23bc92c3121173579afbd87a04d7e2f523

Beachten Sie, dass Sie dort 2 Ansätze sehen. Die erste sollte allgemeiner sein und einen neuen Template-Variablentyp „http“ mit einer „query“-Eigenschaft einführen, die auf eine HTTP-URL verweist, um die Zuordnung durchzuführen (siehe _getHttpVariableOptions). Später habe ich eine zweite Methode implementiert, die erkennt, ob ein Optionstext (Anzeigewert) mit einem UUID-Regex übereinstimmt, und die Zuordnung einer beliebigen Variablen erzwingt, indem ein hartcodierter HTTP-Aufruf an /api/v1/nodes/grafana-hosts/ zurückgegeben wird die Zuordnung aller Optionen. Das hat bisher gut funktioniert, es muss nur eine Anleitung gegeben werden, wie dies in eine generische Methode umgewandelt werden kann.

+1

+1

Für alle Interessierten, ich konnte meinen speziellen Anwendungsfall mithilfe des Simple JSON Datasource- Plugins lösen.

Allerdings unterstützt das Plugin derzeit keine Template-Variablen-Abfragen, aber meine Pull-Anforderung , die das Problem behebt, wurde in Master zusammengeführt. Eine aktualisierte Grafana.net-Version des Plugins sollte irgendwann folgen.

Damit können Sie benutzerdefinierte HTTP-Endpunkte als Datenquellen in Grafana verwenden. Sie müssen nur 4 Methoden implementieren . Bei Verwendung mit abfragebasierten Vorlagenvariablen empfängt der HTTP-Endpunkt eine /search API-Anforderung und der Textkörper ist ein JSON-Objekt in der Form: { "target": "{template query content here}" } . Sie können den Abfrageinhalt beliebig parsen.

Durch die Rückgabe eines Arrays von Werten von Ihrem Endpunkt wird eine zugrunde liegende Liste von Vorlagenvariablenwerten ["custom value 1", "custom value 2"] in folgender Form erstellt: [{ "text": "custom value 1", value: 0 }] wobei die Eigenschaft text der zurückgegebene Wert pro Array-Element ist und die Eigenschaft value ist der Index der Variablen im Rückgabearray.

Alternativ können Sie ein Array von Text-/Wertobjekten [{ "text": "label", "value": 123 }] zurückgeben, und Grafana verwendet die Eigenschaft text als Bezeichnung der Vorlagenvariablen und die Eigenschaft value als Rohwert von die Vorlagenvariable.

Es ist möglich, andere Template-Variablen in Regex-Form dynamisch in die Abfrage einzufügen und sie dynamisch zur Verarbeitung an den Endpunkt zu senden.

Dies löst nicht alle Aliasing-Szenarien, aber eine beliebige HTTP-Datenquelle zu haben, die für Template-Variablen verwendet werden kann, einschließlich des dynamischen Einfügens anderer Template-Variablen in die Template-Abfrage, ist ein nettes Tool.

Ich bin Menschlich.

+1

+1

+1

+1

+1

+1

+1000

+1

+2

Wäre ungemein nützlich, dies zu haben. Tatsächlich habe ich eine Reihe von Objekten, die sowohl einen Namen als auch eine UUID haben. Ich möchte den Namen anzeigen, aber die uuid in der Variablen speichern.

Es wäre toll, wenn wir so etwas machen könnten:

Abfrage (vorhanden): SHOW TAG VALUES FROM "vcd_vm" WITH KEY = "uuid" where "OrgVdc" =~ /^$vDC$/)

Label (neu): SHOW TAG VALUES FROM "vcd_vm" WITH KEY = "name" where "uuid" =~ /^$tag$/)

+1

+1

+1

+1

+1

+1

+1

Wäre großartig, wenn die Vorlagenvariable „Custom“ sowohl eine Liste von „Werten“ als auch eine Liste von „Labels“ (im Wesentlichen ein benutzerdefinierter Hash/Diktat) als Eingabe hätte.

+1

+1

Dies wäre nützlich für AWS CloudFront-Daten, wie sie vom offiziellen Cloudwatch-Exporteur exportiert werden. Daten für CloudFront werden durch IDs angezeigt, die kein Mensch verwendet. Für Menschen, die Diagramme betrachten, ist es viel einfacher, "foo.example.com; bar.example.com" anstelle von "EAUUWLGUQEPFWV; EVWWU9PGWIB" zu sehen ...

+1

Zunächst einmal vielen Dank, dass Sie ein großartiges Produkt entwickelt und es mit der Welt geteilt haben!

Gibt es Hinweise darauf, wie wahrscheinlich es ist, dass dies in den kommenden Monaten umgesetzt wird? Ich versuche nur abzuwägen, inwieweit es sinnvoll ist, den von @meverett vorgeschlagenen Workaround zu implementieren oder darauf zu warten.

Die Implementierung über einen HTTP-Endpunkt ist eine nette Lösung für eine stark verallgemeinerte Version dieses Problems, scheint aber für viele der hier beschriebenen Anwendungsfälle (einschließlich meiner) zu viel des Guten zu sein, wo alles, was benötigt wird, eine grundlegende statische Zuordnung auf einer bescheidenen Anzahl von "freundlichen Anzeigename" -> "nicht freundlicher Datenbankname" paart.

@svet-b fwiw, wir sind dazu übergegangen, den Vorschlag von @meverett zu verwenden, und es war schmerzlos und sauber. Nur ein paar Stunden, um das Datenquellen-Plugin zu erstellen.

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

Die Problemumgehung von @meverett funktioniert ziemlich gut, greift jedoch zu kurz, wenn sie mit mehrwertigen Variablen verwendet wird, da die Serie nur mit Tags von (in meinem Fall) influxdb gekennzeichnet werden kann. Irgendwelche Vorschläge für Problemumgehungen dort? :)

+1

+1

+1

+1

+1

Hallo zusammen, da dieses Problem ziemlich regelmäßig gestoßen wird, habe ich beschlossen, eine Node.js-Beispiel-Webanwendung zusammenzustellen, die meine obige Lösung verwendet .

Es ist ziemlich einfach, aber es implementiert das Muster, das ich in meinem ursprünglichen Kommentar erwähnt habe, vollständig. Und wenn Sie damit auskommen, Ihre Nachschlagedaten in eine einzige JSON-Datei zu packen, die nicht sehr oft aktualisiert wird, funktioniert es möglicherweise sofort für Sie.

Andernfalls können Sie es als Ausgangspunkt verwenden und erweitern, um auf Ihre Aliasing-Daten aus einer beliebigen Quelle zuzugreifen (natürlich von Ihnen programmiert) und sie über die App so bereitzustellen, dass das SimpleJson-Datenquellen-Plug-in sie verwenden kann und es kann verwendet werden, um das Aliasing/Mapping von Template-Variablen zu steuern.

Das Repository für die Beispiel-Web-App befindet sich hier .

Ich hoffe es hilft. Ich habe von Zeit zu Zeit einige Anfragen erhalten, in denen ich um weitere Hilfe/Erklärung beim Einrichten der Lösung gebeten habe.

Beifall

+1

+1

Danke für deine provisorische Lösung, @meverett . Ich habe mit Dockerfile ein Repository erstellt, um einen Docker-Container zum Ausführen Ihrer Lösung zu erstellen. Es ist so eingerichtet, dass es beim Build ein benutzerdefiniertes data.json neben der Dockerfile nimmt. Hoffe es hilft den Leuten:

https://github.com/shirakaba/GrafanaSimpleJsonValueMapper-docker

+1

+1

+1

Wenn Sie dem +1 geben möchten, denken Sie bitte daran, dass Sie die 74 Personen verärgern werden, die diese Ausgabe derzeit abonniert haben und auf jemanden hoffen, der vortritt und eine Lösung implementiert.
GitHub hat aus einem bestimmten Grund Reaktionen hinzugefügt ...

+1

+1

+1

das wäre toll! a hat eine Liste mit langen numerischen Werten, aber es sollte viel besser sein, für jeden eine benutzerfreundliche Bezeichnung zu zeigen als den Wert selbst
Variable: myListOfLongs {Name: Toyota-Wert: 122321312332, Name: Renault-Wert: 6666666}

+1!

+1

+1
Alle Updates zu #11534 (Dynamische Titel zulassen, wenn wiederholte Panels/Zeilen verwendet werden)

+1

+111111

+1

+1

+1, brauche diese Funktion sehr.

+1

+1

+1

+1

+1

Dies funktioniert für MySQL und PostgreSQL:

Eine weitere Option ist eine Abfrage, die eine Schlüssel/Wert-Variable erstellen kann. Die Abfrage sollte zwei Spalten mit den Namen __text und __value zurückgeben. Der Wert der __text-Spalte sollte eindeutig sein (wenn er nicht eindeutig ist, wird der erste Wert verwendet). Die Optionen in der Dropdown-Liste haben einen Text und einen Wert, mit denen Sie einen Anzeigenamen als Text und eine ID als Wert haben können. Eine Beispielabfrage mit Hostname als Text und ID als Wert:

SELECT hostname AS __text, id AS __value FROM my_host

http://docs.grafana.org/features/datasources/mysql/#query -variable

Ich würde folgende benutzerdefinierte Variable vorschlagen:

[{
        "__text": "Server 1",
        "__value": 1
    },
    {
        "__text": "Server 2",
        "__value": 2
    }
]

Vielleicht neuer Typ namens JSON?

Danke @johnymachine! Das hat wunderbar mit der PostgreSQL-Datenquelle funktioniert.

Gibt es als Erweiterung davon eine Möglichkeit, den __text -Abschnitt der Variablen abzurufen? Dies wäre wirklich nützlich für sich wiederholende Diagramme.

Hey @MGinshe , das funktioniert gut (zeigt Text an verwendet Wert) für mich:

image

BEARBEITEN: den ursprünglichen Kontext dieses Fehlers missverstanden, ignorieren Sie den Kommentar unten, er war eher für #9292 gedacht

@torkelo @nmaniwa

https://github.com/grafana/grafana/pull/12609 scheint zu implementieren, wonach die meisten Leute hier fragen, gibt es einen Grund, warum das geschlossen ist und nie zusammengeführt wurde?

Nein, bei diesem Problem geht es um etwas ganz anderes, oder hast du auf ein falsches Problem verlinkt?

Noch keine Neuigkeiten dazu? Komm schon, wir sind im Jahr 2018 !! Danke!

@dmayan es wurde von @johnymachine beantwortet. Sie können dies verwenden.

Dies funktioniert für MySQL und PostgreSQL:

Eine weitere Option ist eine Abfrage, die eine Schlüssel/Wert-Variable erstellen kann. Die Abfrage sollte zwei Spalten mit den Namen __text und __value zurückgeben. Der Wert der __text-Spalte sollte eindeutig sein (wenn er nicht eindeutig ist, wird der erste Wert verwendet). Die Optionen in der Dropdown-Liste haben einen Text und einen Wert, mit denen Sie einen Anzeigenamen als Text und eine ID als Wert haben können. Eine Beispielabfrage mit Hostname als Text und ID als Wert:

SELECT hostname AS __text, id AS __value FROM my_host

http://docs.grafana.org/features/datasources/mysql/#query -variable

Ich würde folgende benutzerdefinierte Variable vorschlagen:

[{
      "__text": "Server 1",
      "__value": 1
  },
  {
      "__text": "Server 2",
      "__value": 2
  }
]

Vielleicht neuer Typ namens JSON?

Ich verwende weder MySQL noch PostgreSQL. Dies sollte eine Grafana-Funktion sein. Nicht
eine Art Hack.

Danke!

El jue., 27 de sep. de 2018 05:52, Muhammad Hendri [email protected]
Beschreibung:

@dmayan https://github.com/dmayan es wurde beantwortet. Sie können dies verwenden.

Dies funktioniert für MySQL und PostgreSQL:

Eine weitere Option ist eine Abfrage, die eine Schlüssel/Wert-Variable erstellen kann. Die Abfrage
sollte zwei Spalten mit den Namen __text und __value zurückgeben. Der Text
Spaltenwert sollte eindeutig sein (wenn er nicht eindeutig ist, dann ist es der erste Wert
Gebraucht). Die Optionen in der Dropdown-Liste haben einen Text und einen Wert, der dies zulässt
Sie müssen einen Anzeigenamen als Text und eine ID als Wert haben. Ein Beispiel
Abfrage mit Hostname als Text und ID als Wert:

WÄHLEN Sie Hostname AS __text, ID AS __value FROM my_host

http://docs.grafana.org/features/datasources/mysql/#query -variable

Ich würde folgende benutzerdefinierte Variable vorschlagen:

[{
"__text": "Server 1",
"__Wert": 1
},
{
"__text": "Server 2",
"__Wert": 2
}
]

Vielleicht neuer Typ namens JSON?


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/grafana/grafana/issues/1032#issuecomment-425011676 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AWcYqEwxjXiXE07uM0ZG-A284TghEIR2ks5ufJG4gaJpZM4C4cjS
.

ziemlich nützliche Funktion. Wenn diese Funktion da draußen ist, könnte sie uns hier sehr helfen. Denn Graphit kann keine chinesischen Schriftzeichen speichern. Wir müssen also Englisch in Graphite verwenden, aber wir würden wirklich gerne Chinesisch im Grafana-Dashboard anzeigen, damit die Benutzererfahrung viel besser wäre.

Hoffe, dass diese Funktion in Kürze wahr wird.

Ich habe es geschafft, die Zuordnung von ID zu Name mithilfe von zwei Variablen durchzuführen. Die erste Variable listet alle möglichen IDs (Wert) auf, während die zweite Variable den zur ID passenden Namen (Anzeigetext) auflistet. Es ist nicht ideal oder hübsch, aber es macht den Trick.

Ich schätze, es heißt verschachtelte Variablen . Und dann können Sie einen der Variablenselektoren ausblenden.

+1

+1

@FdeFabricio Sie haben InfluxDB verwendet? Wird ein Wert automatisch aktualisiert, wenn der andere geändert wird? Wenn ja, wie machst du das?

@ Bassie1995

Sie haben InfluxDB verwendet?

ja

Wird ein Wert automatisch aktualisiert, wenn der andere geändert wird?

ja

Wenn ja, wie machst du das?

Sie erstellen eine Variable vom Typ Abfrage, die das Element auswählt, das mit dem bereits ausgewählten Wert übereinstimmt (z. B. SELECT "name" FROM playlists WHERE ("id" =~ /^$playlist_id$/) . Sie haben also jetzt zwei Variablen: eine mit der ID und eine mit dem Namen.

@bassie1995 @FdeFabricio Du könntest das auch umgekehrt machen:

  • Eine sichtbare Variable, mit der Sie den Namen der Wiedergabeliste auswählen können (z. B. Girl Power)
  • Eine versteckte Variable, die die Playlist-ID aus dem Namen findet (so etwas wie SELECT "id" FROM playlists WHERE ("name" =~ /^$playlist_name$/) )

Auf diese Weise sehen Ihre Benutzer eine Option, um die Playlist anhand ihres Namens auszuwählen, aber die Playlist-ID ist ausgeblendet. Sie können weiterhin programmatisch auf die Playlist-ID zugreifen, um nach Playlist-Elementen usw. zu suchen.

Die __name - und __value -Syntax aus der PostgreSQL/MySQL-Datenquelle ist jedoch immer noch ideal, da sie Mehrdeutigkeiten zwischen ID und Name verhindert und die Anzahl der erforderlichen Datenbankabfragen reduziert. Es sollte meiner Meinung nach ein Basisfeature sein.

Ich habe eine andere Problemumgehung gefunden, die auf dem obigen Kommentar von @johnymachine basiert. Einige Datenquellen unterstützen dies. Wenn dies in Ihrer Datenquelle nicht unterstützt wird, können Sie eine MySQL-Datenbank erstellen, die Daten dort hinzufügen und eine Abfrage schreiben, um __value und __text zurückzugeben. Dies funktioniert, wenn die Daten statisch sind, in meinem Fall Staat (geografischer Zustand). Für jeden, der diese Funktion für als benutzerdefiniert definierte Variablen haben möchte, denke ich, dass dies eine gute Problemumgehung und möglicherweise sowieso eine bessere Lösung ist. Es ermöglicht, dass alle Variablenlisten an einem Ort gespeichert und einfacher geändert werden können. Der einzige Nachteil ist, dass MySQL installiert werden muss.

WÄHLEN Sie SingleChar AS __value, ShortName AS __text AUS TSDB. State

Ich sollte hinzufügen, dass diese Lösung für wiederholte Diagramme, wiederholte Zeilen und auch dann funktioniert, wenn die Variable eine Mehrfachauswahl hat. Das obige Beispiel mit 2 Variablen zum Anzeigen von "Girl Power" funktioniert in diesen Situationen nicht.

Ich habe gerade mit diesem Problem herumgespielt und eine etwas hackinsh-Workaround gefunden ...
Ich brauchte einen Hash, der in Perl-Notation geschrieben wird als:
Perl %units = ( 'μSv/h' => 1.0, 'mrem/h' => 0.1 );
Ich habe eine Dashboard-Variable Type : Custom , Values separated by comma : mrem/h, μSv/h erstellt und dann die JSON Model wie folgt bearbeitet:
JSON { "allValue": null, "current": { "tags": [], "text": "mrem/h", "value": "0.1" }, "hide": 0, "includeAll": false, "label": null, "multi": false, "name": "units", "options": [ { "selected": true, "text": "mrem/h", "value": "0.1" }, { "selected": false, "text": "μSv/h", "value": "1.0" } ], "query": "mrem/h, μSv/h", "skipUrlSync": false, "type": "custom" }

Während dies (für einige Zeit) funktioniert, ändert das Bearbeiten des Dashboards über die GUI es wieder in den nicht funktionierenden Zustand :-|

Eine weitere Möglichkeit, dies zu umgehen, wenn Sie ein anderes System haben, das die Daten bereitstellen kann:

Verwenden Sie ein JSON-Datenquellen-Plugin, ich verwende: https://grafana.com/plugins/simpod-json-datasource

Implementieren Sie nur den / Health-Check-Endpunkt und den /search -Endpunkt in einem System, das über die erforderlichen Daten verfügt. Der Endpunkt /search sollte JSON zurückgeben, das wie folgt aussieht: [{ "text": "A Human Name", "value": "123456" }, ...] . Die Eigenschaft text wird in der Dropdown-Liste für die Variablenauswahl angezeigt, und die Eigenschaft value wird in der Metrikabfrage verwendet.

Richten Sie dann Ihre Dashboard-Variable so ein, dass sie diese neue Datenquelle abfragt. Es ist ein bisschen hacky, aber Sie können das Feld target für die Datenquelle verwenden, um dem Backend mitzuteilen, was es zurückgeben soll, wenn Sie mehrere Datensätze haben, mit denen Sie diese verwenden möchten.

+1 dazu. Ich hätte wirklich gerne eine Möglichkeit, dies zu tun, aber eine, die nicht vom Backend abhängig ist (wir verwenden Graphit).

+1 eine funktionierende Lösung?

@BlackRider97 Bitte sehen Sie sich die obigen Kommentare an - es gibt mehrere funktionierende Lösungen für PostgreSQL (und wahrscheinlich MySQL, MSSQL usw.).

Lösung 1: https://github.com/grafana/grafana/issues/1032#issuecomment -409124505

Lösung 2: https://github.com/grafana/grafana/issues/1032#issuecomment -453242766

Die richtige Implementierung der Problemumgehung von @thinrope wäre meiner Meinung nach eine wirklich elegante Lösung.
Wenn wir JSON in einer benutzerdefinierten Variablen verwenden könnten oder einen Variablentyp „JSON“ hätten, könnten wir dies ohne Hacks lösen, und ich sehe keine Nachteile.

+1 irgendein Update dazu?

+1

+1

Dies ist definitiv ein Must-Have-Feature.
Ich verwende Variablen, um einige Hosts mit Regex auf Hostnamen zu filtern. Da meine Server Muster im Hostnamen enthalten, kann ich eine Regex haben, um die Liste aller Server einer bestimmten Gruppe zu erhalten. Anstatt einen hässlichen regulären Ausdruck anzuzeigen, möchte ich einen hübschen Namen wie "Server der Gruppe A" als Beschriftung des Dropdown-Menüs anzeigen.

Die Art, dies in einen benutzerdefinierten Wert einzugeben, könnte so einfach sein wie:
label1:value1, value2, label3:value3, label5:value5

Das Etikett wäre optional. Wenn ein : im String vorhanden ist, dann ist alles vor : das Label und alles danach ist der Wert.
Wir sollten eine Möglichkeit haben, : zu maskieren, wenn wir es im Label-Namen oder -Wert benötigen, wie wir es für das Zeichen , tun können.

Eine weitere Möglichkeit, dies zu umgehen, wenn Sie ein anderes System haben, das die Daten bereitstellen kann:

Verwenden Sie ein JSON-Datenquellen-Plugin, ich verwende: https://grafana.com/plugins/simpod-json-datasource

Implementieren Sie nur den / Health-Check-Endpunkt und den /search -Endpunkt in einem System, das über die erforderlichen Daten verfügt. Der Endpunkt /search sollte JSON zurückgeben, das wie folgt aussieht: [{ "text": "A Human Name", "value": "123456" }, ...] . Die Eigenschaft text wird in der Dropdown-Liste für die Variablenauswahl angezeigt, und die Eigenschaft value wird in der Metrikabfrage verwendet.

Richten Sie dann Ihre Dashboard-Variable so ein, dass sie diese neue Datenquelle abfragt. Es ist ein bisschen hacky, aber Sie können das Feld target für die Datenquelle verwenden, um dem Backend mitzuteilen, was es zurückgeben soll, wenn Sie mehrere Datensätze haben, mit denen Sie diese verwenden möchten.

Ich habe diese Implementierung durchgeführt und sie funktioniert für mich, aber ich stecke bei der Kennzeichnung des Trends (Legende) fest ... Ich bekomme entweder eine ID (Nummer) oder nicht definiert oder einen anderen Unsinn.
Kannst du beraten?

m

+1

Ich verwende jetzt auch den beschriebenen JSON-Hack von @mbell697 in Grafana meiner Firma. Aber es scheint IMHO ein seltsames Regex-Problem zu geben.

Ich habe eine kleine Python-Flaschen-App eingerichtet, die mir die benötigten Gruppen für Graphite-Abfragen liefert, wie meine Suchdaten aussehen

@app.route('/search', methods=['POST'])
def search():
    data = [
        {"text": "fs-servers", "value": "{FS-server-1,FS-server-2,FS-server-3}"},
        {"text": "db-a-servers", "value": "{db-server-1,}"},
        {"text": "db-b-servers", "value": "{db-server-2,db-server-3}"}
    ]
    return jsonify(data)

Also habe ich im Dashboard eine Abfragevariable namens "group" mit der JSON-Quelle erstellt und dann versucht, mit dem Regex-Feld nach der Gruppe "fs-servers" zu filtern, indem ich /fs-.*/ verwendet habe - aber das funktioniert nicht wie erwartet - nach herumfummeln habe ich festgestellt, dass die regex irgendwie auf das "value"- und nicht auf das "text"-feld angewendet wird. Hat jemand vielleicht einen Workaround oder eine Idee?

+1

+1

Meine Meinung zu den Voraussetzungen dafür:

In unserem Fall fallen mir zwei Varianten ein und derselben Sache ein. Was wir wollen, sind im Wesentlichen Aliase. In beiden Fällen möchte der Dashboard-Eigentümer dem Benutzer eine Vorlagenvariablenliste zur Verfügung stellen, die für den Endbenutzer leicht verständlich ist. Der in der Abfrage verwendete Wert ist jedoch der zugrunde liegende Wert.

Beispiel 1 – einfache Eins-zu-Eins-Namenskonvertierung. In diesem Fall haben wir also numerische Ländercodes als metrische Werte veröffentlicht. Aber man merkt sich die Zahlencodes. Wir möchten also "US" oder "Canada" anzeigen.

{ "USA" == "01" }
{ "Kanada" == "02" }

Wenn "Kanada" ausgewählt ist, ist der an jede Abfrage übergebene Vorlagenvariablenwert "02".

Beispiel 2 – ist eine Eins-zu-viele-Zuordnung. Intern haben wir Stufen für die Bereitstellung, zB s0, s1, s2, s3, s4. Endbenutzer können dies jedoch als "dev, beta, prod" verwenden.
Sie wollen sie also abbilden als:

{ "dev" == ["s1"] }
{ "beta" == ["s2", "s3"] }
{ "prod" == ["s4", "s5", "s6"] } oder noch besser "prod" == s[456]

Wenn also "prod" ausgewählt ist, wird "s4,s5,s6" an die Abfrage übergeben

Aus einer Abfrageperspektive (in Beispiel 2), wo der Variablenname stageVar ist
und der Name des Metrik-Tags lautet stage:

Wir sehen nicht so sehr die Notwendigkeit für aliasBy() ähnliche Aufrufe, sondern mehr Dinge wie:
stage=~${stageVar. Wert:Regex }
alias($stageVar.label)

Um Ergebnisse nach den ausgewählten Vorlagenvariablenwerten zu filtern. Es ist sicherlich möglich, dass jemand versucht, es in so etwas wie einer aliasBy()-Funktion zu verwenden, aber wenn es sich um einen Syntaxfehler handelt, ist das in Ordnung. Ich würde nicht erwarten, dass Sie eine Konvertierung eines Arrays, das an eine Funktion übergeben wird, die einen einzelnen Wert erwartet, auf magische Weise reparieren.

Was die Zuordnungen betrifft, denke ich, dass es ausreicht, wenn der Benutzer diese statisch definiert.
Idealerweise hätten Sie eine Abfrage an MT, um die Liste der Werte zu erhalten, die zugeordnet werden müssen, z. B. "01", "02", "03", und dann hätten Sie ein einfaches Hinzufügen der Zuordnungen / Aliase. Nicht zugeordnete Werte würden in einen „Standard“-Bucket gehen.

+1

+1

Ich bin sehr überrascht, dass dies nicht aufgenommen wurde - ich verbrachte ziemlich viel Zeit damit, herauszufinden, wie dieses "offensichtliche" Ding funktioniert, und fand schließlich meinen Weg hierher, um festzustellen, dass es nicht existiert.

Die Fähigkeit, dynamisch neu zu schreiben, wie von einigen oben beschrieben, wäre fantastisch. Ich wäre jedoch sogar mit einem kurzfristigen Hack (oder einem dauerhaften "einfachen" Modell) zufrieden, das eine erweiterte Version des "Benutzerdefiniert"-Felds ist, das Auswahlmöglichkeiten statisch Einzel- oder Mehrfachauswahlergebnissen zuordnet.

Unser Beispiel sind Ländercodes. Wir möchten häufig Cluster von Systemen basierend auf geografischen Regionen, aber nicht nach Ländern anzeigen. Aber wir speichern nur Ländercodes als Schlüssel in unserem Prometheus-Server. Wenn ich also jetzt alle Systeme in Nordamerika anzeigen möchte, muss ich US, CA, MX manuell aus einer abfragebasierten Liste von Optionen aus fast 100 Ländern auswählen. Ich kann Ihnen gar nicht sagen, wie viel Zeit ich damit verbringe, jedes Land in Europa, Asien oder Afrika für die Analyse auszuwählen. Es lohnt sich fast, für jede Region völlig unterschiedliche Dashboards einzurichten, was absurd ist, aber die einzige Möglichkeit ist, das Problem ohne fest codierte Grafiken zu lösen. Eine völlig neue Datenbank mit Zuordnungen zu erstellen und dann versteckte Abfragen durchzuführen, scheint ebenfalls sehr, sehr weit vom Ideal entfernt zu sein.

Mein Fiebertraum:
Es scheint, dass dies eine "Benutzerdefinierte Liste"-Option als möglicher neuer Variablentyp wäre. Die benutzerdefinierte Liste würde leer beginnen, wenn sie ausgewählt wäre, aber sehr ähnlich aussehen, wie das "benutzerdefinierte" Modell heute aussieht. Eine Schaltfläche "Hinzufügen" wird angezeigt. Durch Klicken auf „Hinzufügen“ würde ein Eingabearray mit zwei Feldern mit „Anzeigewert:“ und „Suchwert:“ erstellt, wo jeder ausgefüllt werden könnte. Der „Anzeigewert“ wäre das, was der Benutzer in der Auswahlliste anzeigen möchte – in unserem Fall "Nordamerika". Dann wäre der „Suchwert“ das, was in der Abfrage angezeigt würde – in diesem Beispiel für Nordamerika wäre es wiederum „us,ca,mx“. Ein "Löschen"-Icon (Mülleimer?) würde jederzeit einzelne Zeilen entfernen. Durch erneutes Klicken auf die Schaltfläche "Hinzufügen" würde eine neue Kopplung erstellt, bis der Benutzer seine Liste mit Optionen vervollständigt hat. Die Optionen „Multi-Value“ und „Select all“ würden ähnlich wie beim bestehenden Custom-Modell beibehalten.

Ich bin sehr überrascht, dass dies nicht aufgenommen wurde - ich verbrachte ziemlich viel Zeit damit, herauszufinden, wie dieses "offensichtliche" Ding funktioniert, und fand schließlich meinen Weg hierher, um festzustellen, dass es nicht existiert.

Ich habe dies gelöst, indem ich eine MySQL-Datenbank erstellt habe. Ich erstelle eine Tabelle mit den gewünschten Elementen in der Dropdown-Liste, z. B. Europa, Nordamerika usw. In einem zweiten Feld habe ich eine Regex, die mit den Einträgen übereinstimmt, die ich abgleichen möchte. Fügen Sie dann MySQL als Datenquelle hinzu und verwenden Sie sie, um die Variablen zu erstellen. Es ist ein Hack, aber eigentlich funktioniert es ganz gut. Ich benutze es für ziemlich genau das, was Sie versuchen zu tun.

Ich schätze den cleveren Hack, aber für uns ist es keine wirkliche Lösung. Das Einrichten einer völlig neuen Datenbank (wir verwenden MySQL überhaupt nicht, was bedeutet, dass dies betrieblich unmöglich ist), um eine einfache Schlüssel/Wert-Ersetzung durchzuführen, die ziemlich statisch ist, scheint eine Menge Hürden zu sein, durch die man springen muss.

Ich habe ein bisschen mehr darüber nachgedacht, und es gibt eine noch elegantere Art, diese Funktionalität bereitzustellen, als die, die ich oben beschrieben habe. Ich würde es ein "Variablenmakro" nennen. Dies sieht wieder wie eine benutzerdefinierte Liste aus, außer dass der Administrator angeben kann, dass bei Auswahl eines (oder mehrerer) dieser Makros die benannten Variablen festgelegt und die angegebenen Werte an den vorhandenen Wertesatz angehängt werden. Dies wäre vollständig ein UI-gesteuertes Modell und würde das eigentliche Variablenkonzept überhaupt nicht ändern – es würde nur eine Zuckerschicht für die automatische Vervollständigung über den vorhandenen Variablen erstellen. Dadurch ist es abwärtskompatibel, ohne dass zusätzliche Variablen für die Erstellung oder Integration in Abfragen benötigt werden.

Ein Makro, das die Variablen festlegt, würde es dem Benutzer ermöglichen, die Werte zu sehen, während sie ausgewählt werden, und würde es dem Benutzer dann ermöglichen, jede Variable zu öffnen und die Auswahlen oder Daten zu sehen/manipulieren, anstatt eine separate Variable zu erstellen, wie meine vorherigen Kommentare implizieren. Das wäre viel intuitiver.

Beispiel:

Ein Variablenmakro namens „North America – Primary Cluster“ würde also meine „Country“-Variablen auf „us,ca,mx“ und meine „Cluster:“-Variable auf „primary“ setzen. Diese Einstellungen wären sichtbar, wenn ich jede benannte Variable herunterziehen würde (oder nicht, wenn sie ausgeblendet ist), damit ich Länder zur Country:-Liste hinzufügen oder entfernen könnte, solange ich nicht erneut das Makro-Variablen-Pulldown-Menü berühre.

Möglicherweise gibt es einen booleschen Wert von „Namensvariablen vor dem Setzen löschen“, sodass bei einer Änderung in der Auswahlliste für dieses Makro alle anderen Einstellungen der angegebenen Variablen gelöscht würden. Dies kann für Listen nützlich sein, bei denen es nicht offensichtlich ist, dass Sie etwas enthalten, das zuvor festgelegt wurde. Ich nehme an, dass, wenn mehr als eine Variable-Makro-Option ausgewählt wurde, die letzte in der zu untersuchenden Liste "gewinnt", wenn es konkurrierende Einstellungen mit einem bestimmten Wert gibt; kein Weg um dieses Problem herum. (Es ist fraglich, ob diese Löschaktion Variable für Variable angegeben werden sollte, aber das scheint ein wenig überladen zu klingen ... aber ist es das?)

Hier ist noch einmal mein hypothetisches Beispiel, in dem ich bereits vorhandene Variablen „Land“ und „Cluster“ habe.

Variabler Makroname: Region

Name1: Nordamerika – Primärer Cluster
Benannte Variablen vor der Einstellung löschen: Y
Variable1: Land
Wert1: us,ca,mx
Variable2: Cluster
Wert2: primär

Name2: Skandinavien – Sekundarcluster
Benannte Variablen vor der Einstellung löschen: Y
Variable1: Land
Wert1: se,fi,nein,dk,ist
Variable2: Cluster
Wert2: sekundär

Ich schätze den cleveren Hack, aber für uns ist es keine wirkliche Lösung. Das Einrichten einer völlig neuen Datenbank (wir verwenden MySQL überhaupt nicht, was bedeutet, dass dies betrieblich unmöglich ist), um eine einfache Schlüssel/Wert-Ersetzung durchzuführen, die ziemlich statisch ist, scheint eine Menge Hürden zu sein, durch die man springen muss.

Ich hatte erwartet, dass Sie so etwas sagen würden. Die Realität ist, dass Sie nach einem Hack gefragt haben und dieser Hack das Problem löst, er ist nicht schwer einzurichten und in Zukunft nicht schwer rückgängig zu machen. Ich finde es eigentlich ziemlich praktisch, MySQL dort zu haben, da wir ständig neue Datensätze hinzufügen, es ist ein bequemer Ort, um den Überblick zu behalten und sie zu aktualisieren. Wenn Sie darüber nachdenken, wenn Sie diese Datensätze in mehreren Dashboards verwenden und zentral pflegen möchten, müssen sie irgendwo gespeichert werden. Wenn Ihre Zeitreihendatenbank sie nicht speichern kann, müssen Sie etwas einrichten, um sie zu speichern. Es macht also durchaus Sinn, MySQL zu haben. Der zusätzliche Bonus ist, dass es auch sehr einfach ist, die Befüllung von MySQL zu automatisieren.

Wenn Sie PostgreSQL haben, müssen Sie keine tatsächliche Tabelle für die Zuordnung erstellen, Sie können Folgendes tun:

SELECT *
FROM
(
    VALUES
        ('London server 1', 'london_srv_1'),
        ('London server 2', 'london_srv_2'),
        ('New York server 1', 'ny_srv_1'),
        ('New York server 2', 'ny_srv_2')
) AS t (__text, __value)

Aber es funktioniert nicht mit numerischen Werten:

SELECT * FROM ( VALUES ( 'OK', '0'), ( 'ERROR', '1') ) AS t (__text, __value)

Beim Laden des Dashboards:

imagen

Und bei der Auswahl eines anderen Parameters

imagen

Bei Auswahl: OK + ERROR

imagen

Wenn Sie numerische Werte wünschen, müssen Sie die einfachen Anführungszeichen entfernen, da dies sonst als Text interpretiert wird, dh

SELECT * FROM ( VALUES ( 'OK', 0), ( 'ERROR', 1) ) AS t (__text, __value)

Danke @GlennMatthys Glenn für die Antwort, aber ich habe bereits gefunden, wo das Problem auftritt.

SELECT * FROM ( VALUES ( 'OK', 0), ( 'Warnung', 1), ('Kritisch', 2) ) AS t (__text, __value)

Konfigurieren von mehreren Werten für:

imagen

Es passiert
imagen

Auswahl von 3 Staaten
imagen

Und Mehrwert aus:

imagen

GlennMatthys - Ihre Lösung ist perfekt, vielen Dank

Für MySQL ist es:
SELECT * FROM ( VALUES row('a', 1), row('b', 2) ) AS t (__text, __value)

Was ist mit Mariadb? Bei mir funktioniert es nicht (mariaDB-Version: 10.5.5)

SELECT * FROM ( VALUES row('a', 1), row('b', 2) ) AS t (__text, __value);
ERROR 1064 (42000)..............

Oder das davor:

SELECT * FROM ( VALUES ( 'OK', 0), ( 'Warning', 1), ('Critical', 2) ) AS t (__text, __value);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your 
MariaDB server version for the right syntax to use near '(__text, __value)' at line 1

Anscheinend ist die Values-Anweisung nicht mehr verfügbar...

Oder mache ich noch etwas falsch?

@radoeka Für ältere MariaDB/MySQL

SELECT * FROM
(
    SELECT 'London server 1' AS '__text', 'london_srv_1' AS '__value'
    UNION ALL SELECT 'London server 2', 'london_srv_2'
    UNION ALL SELECT 'New York server 1', 'ny_srv_1'
    UNION ALL SELECT 'New York server 2', 'ny_srv_2'
) AS t;

@GlennMatthys wow wow wow, was für eine schnelle Antwort! Und das funktioniert.
Ich dachte, dass ich eine ziemlich neue Version von Mariadb verwende, aber das ist nicht der Fall (unter Verwendung einer Linux-Distribution, die nur 2 Monate alt ist).
Danke.

Dies scheint für Prometheus nicht unterstützt zu werden.

Das erneute Öffnen dieses Problems als #27829 löst dies nur für statische Daten.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Minims picture Minims  ·  3Kommentare

SATHVIKRAJU picture SATHVIKRAJU  ·  3Kommentare

ahmetkakici picture ahmetkakici  ·  3Kommentare

tuxinaut picture tuxinaut  ·  3Kommentare

sslupsky picture sslupsky  ·  3Kommentare