在Graphite和statsd中为每个节点创建一个图

时间:2013-06-24 03:43:50

标签: graphite statsd

我正在使用带有statsd的石墨来收集我在ec2中聚集的应用程序的各种数据。除此之外,我还有应用程序传递的消息的统计信息。因为我的应用程序的消息的消费者数量有点流动(每隔几天更改一次),我希望能够为每个消费者动态生成这两个统计数据的图表。我将消息发布到statsd / graphite,消费者ID由系统生成,作为统计信息的一部分:

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

我目前使用consumercd的通配符生成两个图表:

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

对于少数消费者来说这是好的,但我现在有> 300且它正在快速增长。我希望能够做的是传递上述目标(或类似的)并使石墨返回每个唯一ID的图形。 (我说图表,但我实际上得到了json结果)我目前正在使用个人修改版的长颈鹿仪表板,但我愿意接受其他建议。

这是甚至可能的吗? (我想我可以编写一些自定义代码来检索每个id,然后每次都为每个id生成请求。但我真的希望尽可能减少我的自定义。)

我确信我可能需要提供更多细节。请告诉我您需要了解的内容,或者我是否可能只是根据我的要求进行了调整。

更多详情:

所以,我希望的最终结果是没有一个图表,因为缺少一个更好的术语,每行代表一个节点300行。我希望每个节点都有一个图表,每个图表有两行。一个用于传递消息,另一个用于失败消息。

当我从@Matt Self尝试解决方案时,我最终得到了一个包含300行的图表。 (或者,也许我误解了这个建议?)

1 个答案:

答案 0 :(得分:1)

如果我理解正确,我相信你可以使用groupByNode做你想做的事情:

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

3用于表示存储桶的唯一ID部分(例如 stats = 0,myapp = 1,consumers = 2,uniqueid = 3等)。我在上面的示例中使用了sumSeries作为回调函数,它似乎可能对您有用,但您必须确保选择对每个唯一ID获得的任何系列数据都有意义的函数。

以这种方式使用的groupByNode(使用唯一ID的通配符)将返回具有数据点的单独目标(每个uniqueid分组)。

根据评论进行更新:

虽然上面将基于单个输入&#34; target&#34;创建一个具有许多图形/线条的渲染图形图像,但OP想要基于一个输入创建多个独立的图形图像:

我不知道从石墨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>

以上内容会为每个唯一返回的目标插入一个图像。这可能不是您正在寻找的,但可能会让您走上工作的道路。