Создание одного графика на узел в Graphite и statsd

Я использую graphite со statsd для сбора различных данных из приложения, которое я сгруппировал в ec2. Среди прочего у меня есть статистика по сообщениям, доставленным приложением, и тем, которые не удалось доставить. Поскольку количество потребителей сообщений моего приложения несколько изменчиво (меняется каждые несколько дней), я хотел бы иметь возможность динамически генерировать графики для этих двух статистических данных для каждого потребителя. Я отправляю сообщения в statsd/graphite с идентификатором потребителя, который генерируется системой как часть статистики:

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

В настоящее время я генерирую два графика, используя подстановочный знак для ConsumerId:

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

Это нормально для нескольких потребителей, но в настоящее время у меня более 300, и их число быстро растет. Я хотел бы иметь возможность передать вышеуказанные цели (или аналогичные) и заставить графит возвращать график для каждого уникального идентификатора. (Я говорю график, но на самом деле я получаю результаты json) В настоящее время я использую лично модифицированную версию панели управления жирафа, но открыт для других предложений.

Возможно ли это? (Я полагаю, что мог бы написать некоторый собственный код для получения каждого идентификатора, а затем каждый раз генерировать запросы для каждого из них. Но я бы действительно хотел, чтобы мои настройки были минимальными, если это возможно.)

Я уверен, что, вероятно, мне нужно будет предоставить более подробную информацию. Пожалуйста, дайте мне знать, что вам нужно знать, или, возможно, я просто ошибаюсь в своем запросе.

Подробнее:

Итак, конечным результатом того, на что я надеюсь, будет не один график с, за неимением лучшего термина, 300 линиями, каждая из которых представляет узел. Я хотел бы иметь один график для каждого узла, каждый с двумя линиями. Один для доставленных сообщений и один для ошибочных сообщений.

Когда я попытался найти решение от @Matt Self, я получил один график с 300 линиями. (Или, может быть, я неправильно истолковал предложение?)


person RockyMountainHigh    schedule 24.06.2013    source источник


Ответы (1)


Если я вас правильно понял, я считаю, что вы можете использовать groupByNode, чтобы делать то, что вы хотите:

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

Число 3 используется для обозначения части уникального идентификатора корзины (например, stats=0,myapp=1,consumers=2,uniqueid=3 и т. д.). И я использовал sumSeries в качестве функции обратного вызова в приведенном выше примере, который, похоже, может сработать для вас, но вам нужно убедиться, что вы выбрали функцию, которая имеет смысл для любых данных серии, которые вы получаете по уникальному идентификатору.

groupByNode, используемый таким образом (с подстановочным знаком для уникального идентификатора), будет возвращать отдельные цели с точками данных для (сгруппированных) каждого уникального идентификатора.

Обновление на основе комментариев:

В то время как приведенное выше будет создавать одно визуализированное изображение графика со многими графиками/линиями на основе одной входной «цели», 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>

Приведенное выше будет вставлять изображение для каждой уникальной возвращаемой цели. Это может быть не совсем то, что вы ищете, но может направить вас по рабочему пути.

person Matt Self    schedule 26.06.2013
comment
Спасибо @Мэтт. Однако это не совсем то, что мне было нужно. Однако из моего вопроса я вижу, как это может быть трудно расшифровать. Я постараюсь добавить деталей. - person RockyMountainHigh; 03.07.2013