Grafana: テンプレート変数を使用したプレイリストのサポート

作成日 2014年09月08日  ·  132コメント  ·  ソース: grafana/grafana

簡単な例を挙げましょう。
$ HOST変数が構成されたダッシュボードがあります。
aws。$ HOST.request.countを使用するグラフがあります
ダッシュボードを見ると、Host1、Host2などを選択して、適切なメトリックを表示できます。
さて、これをプレイリストに変えて、毎分grafanaが各ホストのメトリックを表示するようにすると便利です。

フィルタが2つ以上あると、状況は少し複雑になります。 たくさんの組み合わせがあり、そのうちのいくつかはダッシュボードウォッチャーには興味がないかもしれません。
このため、ユーザーにとって興味深いフィルター/変数の組み合わせのリストを選択する方法があると便利です。 次に、プレイリストはこれらの組み合わせを循環し、適切なメトリックを含むダッシュボードを表示します。
また、プレイリストでも時間範囲のさまざまな組み合わせを選択できるようにすると便利です(たとえば、過去6時間、過去24時間など)。

aredashboard prioritnice-to-have typfeature-request

最も参考になるコメント

:cake:この号の5周年記念。

アップデートを入手できますか?

全てのコメント132件

@costimuraru非常に良い提案!

:+1:プレイリスト機能が非常に便利になります

:+1:この機能が必要なのは、すべてのグラフをそこに配置するための巨大な画面がないためです。

:+1:確かに、この機能は、単一の画面に圧縮できるダッシュボードが多数あるようなプロジェクトに最適です。

これは確かに非常に便利に聞こえますが、プレイリストの開始ビューで変数と時間の設定を公開する(そしてダッシュボードのロード/サイクルでこれらの設定とセットアップ変数などを処理するロジックを実装する)にはかなり複雑で時間がかかります。 したがって、これは間違いなく将来的に優先される機能ですが、v1.8で絞り込める機能ではありません。

@torkeloに感謝し、良い仕事を続けてください!

:+1:この機能があれば素晴らしいと思います

これが開発キューにある間、URLでテンプレート変数を指定する方法はありますか? 今のところ、少なくともブラウザ拡張機能を使用して、一連のURLをローテーションすることができます。

@rishidはい、 ?var-<variable_name>=value

+1、私もこの機能リクエストに非常に興味があります

+1

+1

+1テンプレートを使用する場合、これは必須です。

PRはもうすぐ...

@costimuraru 1つの変数のプレイリストを実装し、現在は複数の変数の組み合わせに取り組んでいます。 実装は迅速でなければなりません。 異なる時間範囲を選択することは、これに加えてアップグレード機能である可能性があります。 この反復では、テンプレート変数の組み合わせのプレイリストを実行しています。

それはすごい、 @ utkarshcmu

これがPR-#2841といくつかのスクリーンショットです:

「テンプレート」に移動すると、新しい「プレイリスト」タブが表示されるはずです。
screen shot 2015-09-29 at 3 14 13 am

[プレイリスト]タブをクリックすると、すべての変数が一覧表示された次の画面が表示されます。
screen shot 2015-09-29 at 3 14 16 am

3つの変数から2つを選択し、[開始]をクリックしました。 (2を選択した理由は、3番目の変数を固定したままこ​​れら2つの変数のすべての組み合わせを再生したいためです。注意:固定変数はデフォルトの保存値を取得します)。
screen shot 2015-09-29 at 3 14 22 am

これで、最初の変数を一定に保ち、プレイリストが2番目と3番目の変数のすべての可能な組み合わせで開始されることがわかります。
screen shot 2015-09-29 at 3 14 36 am

必要に応じてフィードバックと変更を提供してください。

素晴らしい@utkarshcmu

よくやった! テンプレート設定のタブとしてプレイリスト機能があるかどうかわからない。 すでにプレイリストビューがあります。テンプレート化されたダッシュボードのプレイリストを作成することは、そのビューの一部である必要があります。

@torkeloに同意し、これをプレイリストビューの一部にします。 それはもっと理にかなっています。 :)

テンプレート変数に基づくプレイリストは、プレイリストビューからトリガーできるようになりました。 プレイリストを開始するには、次の手順に従う必要があります。

プレイリストをクリックします。
screen shot 2015-09-30 at 10 59 44 am

次のプレイリストビューが表示され、プレイリストタイプを選択するオプションが追加されています。
screen shot 2015-09-30 at 10 59 50 am
ダッシュボードに基づくプレイリストでも、すべて同じように機能します。

テンプレート変数に基づくプレイリストの場合、ドロップダウンメニューから「変数」を選択する必要があります。
screen shot 2015-09-30 at 11 07 37 am

次に、テンプレート変数に基づいてプレイリストを実行する必要があるダッシュボードを検索し、それを選択します。
screen shot 2015-09-30 at 11 00 13 am

ダッシュボードを選択すると、テンプレート変数のリストが自動的に表示されます。
screen shot 2015-09-30 at 11 00 16 am

次のステップは、プレイリストを実行するテンプレート変数を選択し、[開始]をクリックすることです。
screen shot 2015-09-30 at 11 00 44 am

そして、ここでは、テンプレート変数に基づいたプレイリストを使用します。
screen shot 2015-09-30 at 11 00 51 am
screen shot 2015-09-30 at 11 00 58 am

プレイリストビューでのこの変更についてどう思いますか。

いいね

+1

+ 1、この機能に関するニュース@utkarshcmu

@ evandro-portugal grafanaのプレイリスト機能を実装しましたが、以前はマージされていませんでした。 コードが大幅に変更されたため、作業をやり直す必要があると思います。

@utkarshcmuそうですね、これの最後のコードはどこで入手できますか? 私は見て、私のために何かをしようと思っています。私の場合、それは優先度が高く、すべてのサイクルの終わりに変数の位置を変更する必要があります。そうすれば、ブランチを取得するまで何かを行うことができます。マージされました

@ evandro-ポルトガル
古いコードは次のとおりです。
Grafanaの私のフォークにアクセスしてください-https
そして、「variable-playlist」ブランチからGrafanaを構築してみてください

@utkarshcmu 、ありがとう、コードを調べます。コードを作り直す予定はありますか? それ以外の場合は、現在使用しているgrafanaの実際のマスターブランチ用に修正すれば、自分の作業を共有できます。 私は今、いくつかの休日を過ごし(ここではカーニバル)、それで遊ぶことを計画しています

@ evandro-portugalはい、必要に応じてやり直してください。 ここで少なくとも1週間は作業する予定はありません。 カーニバルをお楽しみください。 :)

@torkeloこの機能を

また、 @ bergquist / @torkeloがこの機能のマージに同意した場合は、以前のPRのコードを修正して、最新のGrafanaコードと互換性を持たせることができます。

@digrichマージとはどういう意味ですか? これはPRではありません:)

@utkarshcmuの古いPR(#2841)を参照しようとしていましたが、彼が最後のコメントで述べたように、彼はやり直して新しいPRを提出する必要があります。

+1

こんにちは@torkelo 。 この便利な機能を待っている間、回避策を探したいと思います。

スクリプト化されたダッシュボードに基づいてプレイリストのようなものを構築することは可能でしょうか?

このスクリプト化されたダッシュボードは、他のテンプレート化されたダッシュボードをロードし、何らかの方法で変数を渡すことができるはずです。おそらくURLからですか?

+1

半年経ちましたが、これについて何かニュースはありますか?

ニュースはありません :(

この機能のリクエストには少し時間がかかるようです。

+1

+1

+1

+1

URLを介して変数を渡すことができるので、私の一時的な解決策は、この単純なiframeカルーセル/ローテーターhtmlページです。これをGrafanaダッシュボードカルーセルと呼びます。

BASE_URLdashboards_list配列を指定する必要があります。この配列には、表示するダッシュボードが含まれています。

これは少し無関係な質問ですが、ダッシュボードに「次へ」/「前へ」のホスト(または実際にテンプレート化された変数)ボタンを表示する方法はありますか?
ドロップダウンを使用してホストのセット全体を手動でスクロールしたい場合、非常に面倒になります。

ここで何かアクションはありますか? すべてのダッシュボードはテンプレート化されているため、テンプレート機能がない/変数を渡す可能性がないため、プレイリスト機能はほとんど使用できません。

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+ 1、 @ utkarshcmuまだこれに取り組んでいますか? そうでなければ、私はそれを突き刺しますが、私はgrafana開発にかなり慣れていません

@ thattolleyguy-相棒を先に進めてください、私は今のところこれにもう取り組んでいません。

+1
ダッシュボードが長いので、自動スクロールも可能ですか? それ以外の場合、ほとんどのパネルはプレイリスト(テレビ)で非表示のままになります

+1

+1

+1

この機能に関するニュースはありますか?

そのような仕事がゴミ箱に送られたことは非常に驚くべきことです。

私はこれに取り組む時間がありませんでした。 また、私はgrafanaコードにあまり詳しくないので、他の誰かが興味を持っている場合は、遠慮なくそれを使用してください。 そうでなければ、時間があるときにそれを突き刺します。

+1

+1

+1

@torkeloこれを次のリリースに入れるチャンスはありますか? チームが操作するすべてのアプリを順番に使用できるようになると、非常に便利です。

@davidkarlsenこの機能のプルリクエストはありません。ベータ版であるため、ほとんどありません。 機能リクエストは、誰かがそれらに取り組んでいない限り、実装されません。また、誰かがこれに取り組んでいることに気づいていません。

ああ-私は少し速かった-https://github.com/grafana/grafana/pull/2841は遠い道のりを進んだようだが、その後放棄された;-(

+1

+1

+1

+1

+1

プレイリストでダッシュボードとクエリ文字列を使用するのはどうですか?
これにより、すべての変数と時間範囲が「自動的に」追加されます。

私の例では、これは
?orgId=1&var-DATACENTER=dc1&var-FQDN=All&from=now-2d&to=now

何が起こったのか...それはほぼ4年かかり、機能はマスターコードを追加しません.....それはとてもばかげています

それは持っている必要があります!

+1

そのような機能がまだリリースされていない理由がわかりません。

+1

+1

この機能の進歩はありますか? これは必需品です。 これがなければ、少なくとも私の場合、プレイリストは役に立たないのとほぼ同じくらい良いです。

この機能も見たいです-現在、このためにダッシュボードを複製する必要があります

上記と同じように、プレイリストを使用できるようにするためだけに、複数の画面を複製する必要がありました。 この機能は素晴らしいでしょう。

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

この機能がどれほど関心を持っているかを見ると、進展がないのは残念です。
@costimuraru @utkarshcmu 、このリクエストのステータスを知っていますか? この機能を待つことを検討する必要がありますか、それとも代替手段を探す必要がありますか?

この機能もマージしてほしいと言って、チャイムを鳴らしてください。

今月もまたやってみます!

paramsを使用して複数のダッシュボードを表示する必要がある場合の回避策は、ダッシュボードをiframeに表示するhtmlファイルを作成し、単純なJSスクリプトでそれらを回転させることです。 これは、raspiでgrafanaダッシュボードを回転させるために使用するものです。

<!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>

iframeのsrc属性で特定のダッシュボードURLを設定できます。

    <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>

回転間隔はconst interval = 10000ミリ単位で設定されます。
もちろん、iframeを追加することもできます。

WIP: https

5年が経過しましたが、このコードがリリースされる予定はありますか?

正直に言うと、これを6で見たいと思っていました。:)

別の+1、これに関する更新はありますか?

:cake:この号の5周年記念。

アップデートを入手できますか?

こんにちは、それは非常に重要な機能です、これに関する更新はありますか?

私はこれが決して起こらないとかなり確信しています😔

grafanaを使用して、1つのdahboardテンプレートを使用して約30台のサーバーを監視したいと思います。
これがないと、テンプレートの更新が必要なときに30個のテンプレートを変更する必要があります。

このオプションは非常に便利です

:)マイクロサービスの世界では、サービスごとにダッシュボードを作成するのは非常に困難です。このオプションは、プレイリストに表示できるようにするためだけに数十のダッシュボードを用意する代わりに、非常に便利で簡単にサービスを監視できます。

本当に便利な機能になります。

+1

+ 1-便利な機能になります

+1

+1

+1; これのステータスは何ですか?

+1

+1

+1

+1

+1

+1
これは確かに非常に便利です..悲しいことに、このリクエストにはすでに5年があります

+1

このために+1。

また、Prometheusサービス検出にフックして、プレイリストに$ instanceを自動的に入力し、展開できるようにするとよいでしょう。 そうすれば、インスタンスがオン/オフラインになると、プレイリストに自動的に追加/削除されます。

これは、キオスクモードでも非常に便利な機能です。

+1

この機能が追加されたかどうか誰かに教えてもらえますか?

このページは役に立ちましたか?
0 / 5 - 0 評価