Grafana: Prise en charge de la liste de lecture avec des variables de modèle

Créé le 8 sept. 2014  ·  132Commentaires  ·  Source: grafana/grafana

Laissez-moi vous donner un exemple simple :
Nous avons un tableau de bord qui a la variable $HOST configurée.
Nous avons un graphique qui utilise aws.$HOST.request.count
En regardant le tableau de bord, nous pouvons sélectionner Host1, Host2, etc., en affichant les métriques appropriées.
Maintenant, ce serait bien de transformer cela en une liste de lecture afin que chaque minute, grafana affiche les métriques pour chaque hôte.

Les choses se compliquent un peu lorsque nous avons deux filtres ou plus. Il existe un tas de combinaisons, dont certaines peuvent ne pas intéresser l'observateur du tableau de bord.
Pour cette raison, il serait bien d'avoir un moyen de sélectionner une liste de combinaisons filtre/variable qui sont intéressantes pour l'utilisateur. La liste de lecture parcourrait ensuite ces combinaisons et afficherait le tableau de bord avec les métriques appropriées.
Ce serait également bien de permettre de sélectionner différentes combinaisons pour la plage de temps également dans une liste de lecture (par exemple, les 6 dernières heures, les dernières 24 heures, etc.).

aredashboard prioritnice-to-have typfeature-request

Commentaire le plus utile

:cake: pour les 5 ans de ce numéro.

Pouvons-nous obtenir une mise à jour ?

Tous les 132 commentaires

@costimuraru très bonnes suggestions !

:+1: rendra la fonction playlist tellement plus utile

:+1: Cette fonctionnalité est nécessaire car vous n'avez pas cet écran géant pour y mettre tous vos graphiques.

:+1: En effet, cette fonctionnalité serait géniale pour des projets comme le nôtre où nous avons de nombreux tableaux de bord qui peuvent être compactés sur un seul écran.

Cela semble en effet très utile, mais aussi assez complexe et long pour exposer les paramètres de variable et d'heure dans la vue de démarrage de la liste de lecture (et implémenter la logique pour gérer ces paramètres et variables de configuration, etc. lors du chargement/cycle du tableau de bord). Ce sera donc certainement une fonctionnalité trop prioritaire à l'avenir, mais pas quelque chose qui peut être compressé pour la v1.8

Merci @torkelo et continuez votre bon travail !

:+1: Ce serait bien d'avoir cette fonctionnalité

Tant que cela se trouve dans la file d'attente des développeurs, est-il possible de spécifier la variable de modèle dans l'URL ? Je pourrais au moins utiliser une extension de navigateur pour parcourir un tas d'URL pour le moment.

@rishid oui, en utilisant ?var-<variable_name>=value

+1, je suis également très intéressé par cette demande de fonctionnalité

+1

+1

+1 Avec les modèles, c'est un must.

RP à venir très bientôt...

@costimuraru J'ai implémenté une liste de lecture pour une variable, travaillant maintenant sur des combinaisons multi-variables. La mise en œuvre doit être rapide. La sélection d'une plage de temps différente peut être une fonctionnalité de mise à niveau en plus de cela. Pour cette itération, je fais juste une liste de lecture de combinaisons de variables de modèle.

C'est génial, @utkarshcmu !

Voici le PR - #2841 et quelques captures d'écran :

Allez dans « Modélisation » et vous devriez maintenant pouvoir voir le tout nouvel onglet « Liste de lecture » :
screen shot 2015-09-29 at 3 14 13 am

Cliquez sur l'onglet Playlist et vous devriez voir l'écran suivant avec toutes les variables répertoriées.
screen shot 2015-09-29 at 3 14 16 am

J'ai sélectionné 2 des variables sur 3 et cliqué sur "Démarrer". (La raison pour laquelle j'en ai sélectionné 2 est que je veux jouer toutes les combinaisons de ces 2 variables en gardant la 3ème fixe. Veuillez noter : les variables fixes obtiendront leurs valeurs enregistrées par défaut).
screen shot 2015-09-29 at 3 14 22 am

Maintenant, vous pouvez voir que j'ai gardé la première variable constante et une liste de lecture commencera avec toutes les combinaisons possibles de 2ème et 3ème variables.
screen shot 2015-09-29 at 3 14 36 am

Veuillez fournir des commentaires et des modifications si nécessaire.

Génial @utkarshcmu

Bon travail! pas sûr d'avoir la fonction de liste de lecture comme onglet dans les paramètres de modèle. Il existe déjà une vue de liste de lecture. La création d'une liste de lecture pour un tableau de bord modélisé doit faire partie de cette vue.

D'accord avec @torkelo , je vais en faire une partie de la vue playlist. Cela a plus de sens. :)

La liste de lecture basée sur des variables de modèle peut maintenant être déclenchée à partir de la vue de la liste de lecture. Les étapes suivantes doivent être suivies pour démarrer la liste de lecture :

Cliquez sur Liste de lecture :
screen shot 2015-09-30 at 10 59 44 am

Vous verrez la vue Playlist suivante avec une option supplémentaire de choix du type de playlist :
screen shot 2015-09-30 at 10 59 50 am
Tout fonctionne de la même manière pour les playlists basées sur des tableaux de bord.

Maintenant, pour la liste de lecture basée sur des variables de modèle, vous devez sélectionner « variables » dans le menu déroulant :
screen shot 2015-09-30 at 11 07 37 am

Ensuite, vous rechercherez le tableau de bord pour lequel vous devez exécuter la liste de lecture en fonction de ses variables de modèle et le sélectionnerez :
screen shot 2015-09-30 at 11 00 13 am

Une fois que vous avez sélectionné le tableau de bord, la liste des variables du modèle s'affichera automatiquement :
screen shot 2015-09-30 at 11 00 16 am

Maintenant, l'étape suivante consiste à sélectionner les variables de modèle avec lesquelles vous souhaitez exécuter la liste de lecture et à cliquer sur Démarrer :
screen shot 2015-09-30 at 11 00 44 am

Et voilà avec la playlist basée sur des variables de modèle :
screen shot 2015-09-30 at 11 00 51 am
screen shot 2015-09-30 at 11 00 58 am

Dites-moi ce que vous pensez de ce changement dans la vue de la liste de lecture.

Cela semble bon

+1

+1, des nouvelles de cette fonctionnalité @utkarshcmu ?

@evandro-portugal J'ai implémenté la fonctionnalité de liste de lecture pour grafana mais elle n'a pas été fusionnée plus tôt. Je pense que maintenant je dois refaire un peu de travail car le code a beaucoup changé.

@utkarshcmu d' accord, où puis-je obtenir vos derniers codes pour cela ? J'aimerais jeter un œil et essayer de faire quelque chose pour moi, dans mon cas c'est une priorité élevée et j'ai juste besoin de faire changer la position des variables à la fin de chaque cycle, alors je pourrais faire quelque chose jusqu'à ce que nous obtenions votre branche fusionné

@evandro-portugal
Voici l'ancien code :
Veuillez aller à ma fourchette de Grafana - https://github.com/justforkit/grafana
Et essayez de créer Grafana à partir de la branche "liste de lecture variable"

@utkarshcmu , merci, je vais jeter un œil au code, prévoyez-vous de retravailler le code ? Sinon, je pourrais partager mon travail si je le corrige pour la branche principale de grafana, que j'utilise en ce moment. Je vais avoir quelques vacances maintenant (carnaval ici) et j'ai l'intention de jouer avec ça

@evandro-portugal Bien sûr, allez-y et retravaillez si vous le souhaitez. Je ne prévois pas de travailler dessus au moins pendant une semaine ici. Profitez du carnaval. :)

@torkelo Cette fonctionnalité peut-elle être fusionnée dans core grafana ? Cela semble être une amélioration très utile pour jouer au même tableau de bord avec différentes variables de modèle.

De plus, si @bergquist / @torkelo sont d'accord pour fusionner cette fonctionnalité, je peux retravailler le code de mon précédent PR pour le rendre compatible avec le dernier code Grafana.

@digrich qu'est-ce que tu veux dire par fusionné ? Ceci n'est pas un RP :)

J'essayais de faire référence à l'ancien PR de

+1

Salut @torkelo . En attendant cette fonctionnalité utile, j'aimerais rechercher une solution de contournement.

Serait-il possible de créer quelque chose comme une playlist basée sur un tableau de bord scripté ?

Ce tableau de bord scripté devrait pouvoir charger d'autres tableaux de bord modélisés et transmettre des variables d'une manière ou d'une autre, à partir d'une URL peut-être ?

+1

Y a-t-il des nouvelles à ce sujet étant donné que cela fait six mois?

Pas de nouvelles :(

On dirait que je dois prendre un peu de temps pour cette demande de fonctionnalité !

+1

+1

+1

+1

Étant donné que vous pouvez transmettre des variables via une URL, ma solution temporaire est cette simple page html carrousel/rotateur iframe , que je l'appelle le carrousel Grafana Dashboards.

Il vous suffit de spécifier le tableau BASE_URL et dashboards_list , qui contient les tableaux de bord que vous souhaitez afficher.

C'est une question légèrement indépendante, mais existe-t-il un moyen d'avoir simplement un bouton hôte "suivant"/"précédent" (ou une variable vraiment modélisée) sur un tableau de bord ?
Lorsque je veux faire défiler manuellement tout un ensemble d'hôtes, l'utilisation de la liste déroulante devient très lourde.

Des actions ici ? Tous nos tableaux de bord sont modélisés - donc sans fonctionnalités de modèle / possibilités de passer des variables, la fonctionnalité de liste de lecture nous est largement inutilisable.

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1, @utkarshcmu Travaillez -vous toujours là-dessus ? Je vais tenter le coup sinon mais je suis assez nouveau dans le développement de grafana

@thattolleyguy - Vas-y mon pote, je ne travaille plus dessus pour le moment.

+1
Une suggestion car les tableaux de bord sont plus longs, pouvons-nous également avoir un défilement automatique. Sinon la plupart des panneaux restent cachés sur la liste de lecture (à la télévision)

+1

+1

+1

Des nouvelles de cette fonctionnalité ?

C'est assez étonnant qu'une telle œuvre soit allée à la poubelle.

Je n'ai pas eu le temps de travailler là-dessus. Je ne suis pas non plus très familiarisé avec le code grafana, donc si quelqu'un d'autre est intéressé, n'hésitez pas à le prendre. Sinon, je m'y essaierai quand j'aurai le temps.

+1

+1

+1

@torkelo Une chance d'

@davidkarlsen, il n'y a pas de pull request pour cette fonctionnalité et nous sommes en version bêta, c'est donc très improbable. Les demandes de fonctionnalités ne sont pas implémentées à moins que quelqu'un ne travaille dessus et que personne ne travaille dessus.

Ah - j'étais un peu rapide - il semble que https://github.com/grafana/grafana/pull/2841 a

+1

+1

+1

+1

+1

qu'en est-il de l'utilisation de la chaîne de requête du tableau de bord PLUS dans la liste de lecture ?
Cela ajouterait "automatiquement" toutes les variables ET la plage de temps.

Dans mon exemple, ce serait
?orgId=1&var-DATACENTER=dc1&var-FQDN=All&from=now-2d&to=now

que s'est-il passé... cela a pris presque 4 ans et la fonctionnalité n'ajoute pas de code maître... c'est tellement ridicule

C'est un MUST HAVE !

+1

Je ne comprends pas pourquoi une telle fonctionnalité n'a toujours pas été publiée...

+1

+1

Des progrès sur cette fonctionnalité ? C'est quelque chose qu'on se doit d'avoir. Sans cela, les listes de lecture sont presque aussi bonnes qu'inutiles, du moins dans mon cas.

J'aimerais également voir cette fonctionnalité - actuellement, je dois dupliquer des tableaux de bord pour cela

Comme ci-dessus, j'ai dû dupliquer plusieurs écrans juste pour rendre la liste de lecture utilisable. Cette fonctionnalité serait géniale.

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

Vu l'intérêt de cette fonctionnalité, c'est dommage qu'il n'y ait pas de progrès.
@costimuraru @utkarshcmu , Connaissez-vous le statut de cette demande ? Devrions-nous envisager d'attendre cette fonctionnalité ou devrions-nous chercher des alternatives ?

Juste pour dire que nous aimerions vraiment que cette fonctionnalité fusionne également !

Je vais réessayer ce mois-ci !

Une solution de contournement si vous devez afficher plusieurs tableaux de bord avec des paramètres consiste à créer un fichier html affichant les tableaux de bord dans des iframes et à les faire pivoter avec un simple script JS. C'est ce que j'utilise pour faire tourner les tableaux de bord grafana sur mon raspi.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Grafana dashboard rotator</title>

    <style>
        #title {
            position: fixed;
            right: 20px;
            top: 10px;
            color: rgba(255, 0, 0, 0.5);
            background-color: rgba(0, 0, 0, 0.7);
            padding: 10px;
            font-weight: bold;
            font-size: 6em;
            font-family: sans-serif;
            margin: 0;
        }

        body,
        html {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
            position: relative;
        }

        iframe {
            width: 100%;
            height: 100%;
            border: 0;
        }

        #timer {
            position: fixed;
            bottom: 10px;
            right: 20px;
            color: rgba(255, 0, 0, 0.5);
            background-color: rgba(0, 0, 0, 0.7);
            padding: 10px;
            font-weight: bold;
            font-size: 2em;
            font-family: sans-serif;
            margin: 0;
        }
    </style>
</head>

<body>

    <h1 id="title"></h1>
    <iframe x-name="SLA PROD EU" src="https://mygrafana.example.com/services-availability?orgId=1&var-ds=Graphite-EU&var-env=prod-eu&var-package=cds-red-bull-high-touch&var-service=All&refresh=30s&from=now-1h&to=now"></iframe>
    <iframe x-name="SLA PROD US" src="https://mygrafana.example.com/services-availability?services-availability?from=now-1h&orgId=1&refresh=30s&to=now&var-ds=Graphite&var-env=prod&var-package=cds-cds&var-service=All"></iframe>
    <iframe x-name="REQUESTS EU" src="https://mygrafana.example.com/services-details?orgId=1&from=now-24h&to=now&var-ds=Graphite-EU&var-env=prod-eu&var-service=All&refresh=30s"></iframe>

    <small id="timer"></small>
    <!-- ROUND ROBIN SCRIPT -->
    <script>

        ; (function (globals) {

            //UMD
            if (typeof define !== 'undefined' && define.amd) { //require.js / AMD
                define([], function () {
                    return rr
                })
            } else if (typeof module !== 'undefined' && module.exports) { //CommonJS
                module.exports = rr
            } else { //script / browser
                globals.rr = rr
            }

            function rr(arr, lastIndex) {
                if (!Array.isArray(arr)) throw new Error("Input is not an array.")
                if (arr.length === 0) return null

                if (arr._rr == null) {
                    arr._rr = 0
                    return arr[0]
                }

                if (arr.length === 1)
                    return arr[0]

                if (typeof lastIndex == 'number')
                    arr._rr = lastIndex

                //is outside of range?
                if (arr._rr >= arr.length - 1 || arr._rr < 0) {
                    arr._rr = 0
                    return arr[0]
                } else {
                    arr._rr += 1
                    return arr[arr._rr]
                }
            }

            rr.splice = function (arr, idx, len) {
                if (!Array.isArray(arr)) throw new Error("Input is not an array.")
                if (arr.length === 0) return

                arr.splice(idx, len);

                if (arr._rr == null) {
                    arr._rr = 0
                    return;
                }

                if (arr._rr >= idx)
                    arr._rr -= 1
            }

            rr.spliceCurrent = function (arr, len) {
                rr.splice(arr, arr._rr, len)
            }

        })(this);
    </script>


    <!-- ROTATOR -->
    <script>
        const interval = 10000; //dashboard switch interval
        const initializingTime = 60000; //initializing time
        const iframes = document.getElementsByTagName('iframe')
        const arr = [...iframes];
        let last = null;

        let count = initializingTime / 1000;
        document.getElementById('title').innerText = `Initializing... (${count}s)`

        const initializingTimer = setInterval(() => {
            count = count > 0 ? count -= 1 : 0;
            document.getElementById('title').innerText = `Initializing... (${count}s)`
        }, 1000)


        let switcherTimer;
        const switcher = () => {
            if (switcherTimer) {
                clearInterval(switcherTimer);
            }

            let count = interval / 1000;
            switcherTimer = setInterval(() => {
                count = count > 0 ? count -= 1 : 0;
                document.getElementById('timer').innerText = `(${count}s)`
            }, 1000)

            const curr = rr(arr)
            curr.scrollIntoView();
            document.getElementById('title').innerText = `${curr.attributes['x-name'].value} (${arr._rr + 1}/${arr.length})`
        }

        setTimeout(() => {
            clearInterval(initializingTimer);

            document.getElementById('title').innerText = `${arr[0].attributes['x-name'].value} (1/${arr.length}) `

            switcher();
            setInterval(switcher, interval)

        }, initializingTime /*give dashboards some time to load*/)

    </script>


    <script>
        //Interval to refresh whole page once per 2 hours. To prevent memory leaks.
        setInterval(() => {
            window.location.reload()
        }, 7200000)
    </script>

</body>

</html>

Vous pouvez définir une URL de tableau de bord spécifique dans l'attribut src d'iframe.

    <iframe x-name="SLA PROD EU" src="https://mygrafana.example.com/services-availability?orgId=1&var-ds=Graphite-EU&var-env=prod-eu&var-package=cds-red-bull-high-touch&var-service=All&refresh=30s&from=now-1h&to=now"></iframe>

L'intervalle de rotation est défini en milis dans const interval = 10000 .
Bien sûr, vous pouvez également ajouter d'autres iframes.

5 ans d'ouverture, ce code va-t-il un jour sortir ?

J'espérais voir ça dans 6, pour être honnête.. :)

Un autre +1, une mise à jour à ce sujet ?

:cake: pour les 5 ans de ce numéro.

Pouvons-nous obtenir une mise à jour ?

Salut, c'est une fonctionnalité très importante, y a-t-il des mises à jour à ce sujet ?

Je suis presque sûr que cela n'arrivera jamais

Je souhaite utiliser grafana pour surveiller environ 30 serveurs à l'aide d'un modèle de tableau de bord.
Sans cela, je dois changer 30 modèles à chaque fois que je veux une mise à jour pour mon modèle.

Cette option serait très utile

:) Dans le monde des microservices, il sera tellement difficile d'avoir un tableau de bord par service .. cette option sera très pratique et facile pour surveiller nos services au lieu d'avoir des dizaines de tableaux de bord juste pour pouvoir les afficher dans la playlist .

Serait une fonctionnalité vraiment utile.

+1

+1 - Serait une fonctionnalité utile

+1

+1

+1 ; quel est le statut à ce sujet ?

+1

+1

+1

+1

+1

+1
Ce serait très utile en effet.. triste cette demande a déjà 5 ans

+1

+1 pour cela.

Ce serait également bien si vous pouviez vous connecter à la découverte de services Prometheus afin qu'une instance $ puisse être remplie et étendue automatiquement dans la liste de lecture. De cette façon, lorsque les instances sont activées / hors ligne, elles sont automatiquement ajoutées / supprimées de la liste de lecture.

Ce serait une fonctionnalité très pratique également pour le mode Kiosque.

+1

Quelqu'un peut-il me dire si cette fonctionnalité a été ajoutée ?

Cette page vous a été utile?
0 / 5 - 0 notes