0

我正在使用带有 statsd 的石墨从我聚集在 ec2 中的应用程序中收集各种数据。除其他事项外,我还有应用程序传递的消息和传递失败的消息的统计信息。因为我的应用程序的消息消费者数量有些不稳定(每隔几天变化一次),我希望能够为每个消费者动态生成这两个统计数据的图表。我使用系统生成的消费者 ID 将消息发布到 statsd/graphite 作为统计信息的一部分:

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

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

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

这对少数消费者来说是可以的,但我目前有超过 300 个并且正在迅速增长。我想做的是通过上述目标(或类似目标)并让石墨为每个唯一 ID 返回一个图表。(我说的是图表,但实际上我得到的是 json 结果)我目前正在使用个人修改版的长颈鹿仪表板,但对其他建议持开放态度。

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

我确信我可能需要提供更多细节。请让我知道您需要知道什么,或者我是否可能只是对我的要求不满意。

更多细节:

所以,我希望的最终结果是没有一个图表,因为没有更好的术语,300 条线每条代表一个节点。我想为每个节点制作一个图表,每个节点有两条线。一个用于传递的消息,一个用于失败的消息。

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

4

1 回答 1

1

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

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

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

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

根据评论更新:

虽然上面将基于单个输入“目标”创建一个具有许多图形/线条的渲染图形图像,但 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>

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

于 2013-06-26T14:32:16.557 回答