我正在使用带有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行的图表。 (或者,也许我误解了这个建议?)
答案 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>
以上内容会为每个唯一返回的目标插入一个图像。这可能不是您正在寻找的,但可能会让您走上工作的道路。