0

私は statsd でグラファイトを使用して、ec2 でクラスター化したアプリケーションからさまざまなデータを収集しています。とりわけ、アプリケーションによって配信されたメッセージと配信に失敗したメッセージの統計があります。私のアプリケーションのメッセージのコンシューマの数はいくぶん流動的 (数日ごとに変化) であるため、コンシューマごとにこれら 2 つの統計のグラフを動的に生成できるようにしたいと考えています。統計の一部としてシステムによって生成されたコンシューマー ID を使用して、メッセージを statsd/graphite に投稿します。

  • stats.myapp.consumers.<consumerId>.messagesDelivered
  • stats.myapp.consumers.<consumerId>.messagesFailed

現在、consumerId にワイルドカードを使用して 2 つのグラフを生成しています。

  • stats.myapp.consumers.*.messagesDelivered
  • stats.myapp.consumers.*.messagesFailed

これは少数の消費者にとっては問題ありませんが、私は現在 300 を超えており、急速に成長しています。私ができるようにしたいのは、上記のターゲット (または同様のもの) を渡し、グラファイトに一意の ID ごとにグラフを返させることです。(私はグラフと言っていますが、実際には json の結果を取得しています) 私は現在、キリン ダッシュボードの個人的に変更されたバージョンを使用していますが、他の提案も受け付けています。

これは可能なことですか?(カスタム コードを記述して、各 ID を取得し、毎回それぞれの要求を生成できると思います。しかし、可能であれば、カスタマイズを最小限に抑えたいと思っています。)

詳細を提供する必要がある可能性が高いと確信しています。あなたが知る必要があること、または私が私の要求に基づいていない可能性があるかどうかを教えてください.

詳細:

したがって、私が望んでいることの最終結果は、より適切な用語がないため、それぞれがノードを表す 300 行の 1 つのグラフを持たないことです。ノードごとに 1 つのグラフがあり、それぞれに 2 本の線があるとします。1 つは配信されたメッセージ用で、もう 1 つは失敗したメッセージ用です。

@Matt Self からの解決策を試みたとき、300 行の 1 つのグラフになりました。(または、提案を誤解したのでしょうか?)

4

1 に答える 1

1

私があなたを正しく理解していれば、groupByNodeを使用して必要なことを実行できると思います。

groupByNode(stats.myapp.consumers.*.messagesDelivered,3,"sumSeries")

3 は、バケットの一意の ID 部分を示すために使用されます (例: stats=0,myapp=1,consumers=2,uniqueid=3,etc )。そして、上記の例では sumSeries をコールバック関数として使用しましたが、これはうまくいくように見えますが、一意の ID ごとに取得するシリーズ データに対して意味のある関数を選択する必要があります。

このように (一意の ID にワイルドカードを使用して) 使用される groupByNode は、(グループ化された) 各 uniqueid のデータポイントを含む個別のターゲットを返します。

コメントに基づく更新:

上記は、単一の入力「ターゲット」に基づいて多くのグラフ/線を含む1つのレンダリングされたグラフ画像を作成しますが、OPは1つの入力に基づいて複数の独立したグラフ画像を作成したいと考えています:

グラファイト URL API から複数のグラフをレンダリングする方法を知りません (グラファイトのみを使用)。おそらく、それを達成する何かがダッシュボードにあるでしょう。

とは言っても、単純な html + javascript でこれを行うことができます。このようなものがうまくいくかもしれません(ただし、微調整する必要があるかもしれません):

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Multi-graph</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>

    <script type="text/javascript">
        var graphite_render_url = "http://some.graphite.host.blah.com/render/";
        var mainTarget = "stats.myapp.consumers.*.messagesDelivered";
        var mainFunc = "sumSeries";
        var url = graphite_render_url + "?target=groupByNode(" + mainTarget + ",3,\"" + mainFunc + "\")";
        url = url + "&format=json&jsonp=?";

        $.getJSON(url, function(data){
        for (var i = data.length - 1; i >= 0; i--) {
            console.log(data[i]);
            var imgSrc = graphite_render_url + "?target=";
            var imgActual = mainTarget.replace('*',data[i].target);
            $('#imagesList').append('<img src="' + imgSrc + imgActual + '" />');
        };
    });
    </script>

</head>
<body>
<div id="imagesList"></div>
</body>
</html>

上記は、返された一意のターゲットごとに画像を挿入します。これはまさにあなたが探しているものではないかもしれませんが、実用的な道を歩むことができるかもしれません.

于 2013-06-26T14:32:16.557 に答える