Статьи

Хранение месяцев исторических метрик от Hystrix в графите

Одной из главных особенностей Hystrix является красивая латентная панель с интенсивным использованием данных и высокой задержкой:

Hystrix-панель

Хотя это всего лишь побочный эффект от того, что на самом деле делает Hystrix (автоматические выключатели, пулы потоков, тайм-ауты и т. Д.), Это, как правило, самая впечатляющая функция. Чтобы заставить его работать, вы должны включить зависимость hystrix-metrics-event-stream :

1
2
3
4
5
<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-metrics-event-stream</artifactId>
    <version>1.4.0-RC6</version>
</dependency>

и зарегистрируйте встроенный сервлет, например, во встроенном Jetty:

01
02
03
04
05
06
07
08
09
10
11
12
13
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
  
//...
  
Server server = new Server(8090);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
server.setHandler(context);
final HystrixMetricsStreamServlet servlet = new HystrixMetricsStreamServlet();
final ServletHolder holder = new ServletHolder(servlet);
context.addServlet(holder, "/hystrix.stream");
server.start();

Конечно, если у вас уже есть веб-приложение, это намного проще. Вот пример в Spring Boot:

1
2
3
4
@Bean
public ServletRegistrationBean servletRegistrationBean() {
    return new ServletRegistrationBean(new HystrixMetricsStreamServlet(), "/hystrix.stream");
}

Отныне ваше приложение будет транслировать метрики в реальном времени в формате JSON, которые можно легко использовать с помощью инструментальной панели с открытым исходным кодом, почти полностью написанной на JavaScript:

1
2
3
$ git clone git@github.com:Netflix/Hystrix.git
$ cd Hystrix
$ ./gradlew :hystrix-dashboard:jettyRun

Через несколько секунд вы можете перейти к localhost:7979 и указать свой сервлет /hystrix.stream . Предполагая, что ваше приложение кластеризовано, скорее всего, вы добавите Turbine на вечеринку.

Если вы используете Hystrix, вы уже знаете обо всем этом. Но один из вопросов, которые мне задают чаще всего, таков: почему эти показатели такие краткосрочные ? Действительно, если вы посмотрите на панель инструментов выше, показатели агрегируются со скользящим окном в диапазоне от 10 секунд до 1 минуты. Если вы получили автоматическое уведомление по электронной почте о каком-либо происшествии на производстве, испытали кратковременную медлительность или услышали о проблемах с производительностью от клиента, соответствующая статистика об этом инциденте уже может быть утеряна или может быть скрыта из-за общей нестабильности, возникшей впоследствии.

Это на самом деле разработано — вы не можете иметь как статистику с низкой задержкой, так и статистику, близкую к реальному времени, которая также надежна и может просматриваться дни, если не месяцы назад. Но вам не нужны две системы мониторинга для краткосрочных метрик и долгосрочных трендов. Вместо этого вы можете напрямую использовать Graphite с помощью метрик Hystrix. Почти без кода, только немного клея здесь и там.

Публикация метрик в метриках Dropwizard

Оказывается, все строительные блоки доступны и готовы, вам просто нужно их подключить. Метрики Hystrix не ограничиваются сервлетом публикации, вы также можете подключить других потребителей, например, метрики Dropwizard :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-codahale-metrics-publisher</artifactId>
    <version>1.4.0-RC6</version>
    <exclusions>
        <exclusion>
            <groupId>com.codahale.metrics</groupId>
            <artifactId>metrics-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>io.dropwizard.metrics</groupId>
    <artifactId>metrics-core</artifactId>
    <version>3.1.0</version>
</dependency>

Вы должны явно соединить эти две библиотеки, я использую Spring Boot для оркестровки, обратите внимание, что MetricRegistry автоматически создается Boot :

1
2
3
4
5
6
@Bean
HystrixMetricsPublisher hystrixMetricsPublisher(MetricRegistry metricRegistry) {
    HystrixCodaHaleMetricsPublisher publisher = new HystrixCodaHaleMetricsPublisher(metricRegistry);
    HystrixPlugins.getInstance().registerMetricsPublisher(publisher);
    return publisher;
}

В тот момент, когда Hystrix публикует метрики Dropwizard, мы можем перенаправить эти метрики в SLF4J, JMX или … Graphite!

Графит и Графана

Нам нужна еще одна зависимость:

1
2
3
4
5
<dependency>
    <groupId>io.dropwizard.metrics</groupId>
    <artifactId>metrics-graphite</artifactId>
    <version>3.1.0</version>
</dependency>

Это позволяет библиотеке metrics публиковать данные прямо в Graphite, снова немного склеивая:

01
02
03
04
05
06
07
08
09
10
11
12
13
@Bean
public GraphiteReporter graphiteReporter(MetricRegistry metricRegistry) {
    final GraphiteReporter reporter = GraphiteReporter
            .forRegistry(metricRegistry)
            .build(graphite());
    reporter.start(1, TimeUnit.SECONDS);
    return reporter;
}
  
@Bean
GraphiteSender graphite() {
    return new Graphite(new InetSocketAddress("localhost", 2003));
}

Очевидно, вы хотели бы настроить адрес графита. Настройка Graphite и Grafana довольно громоздка, к счастью, для этого есть образ Docker :

1
2
3
4
$ docker run -d \
    -p 8070:80 -p 2003:2003 -p 8125:8125/udp -p 8126:8126 \
    --name grafana-dashboard \
    choopooly/grafana_graphite

Если все настроено правильно, отправляйтесь прямо к localhost:8070 и localhost:8070 с инструментальными панелями. Вот мой:

Hystrix-графана

Новые возможности

Встроенная панель управления Hystrix очень отзывчива и полезна. Однако наличие статистики дней, недель или даже месяцев открывает много возможностей. Выбор функций, недоступных с помощью встроенной панели инструментов, которую вы можете легко настроить с помощью Graphite / Grafana:

  • Месяцы статистики (очевидно), по сравнению с секундами
  • Метрики, игнорируемые в стандартной панели инструментов, такие как нижние процентили, общие счетчики и т. Д.
  • Полная история некоторых показателей, а не мгновенное значение (например, использование пула потоков)
  • Возможность сравнивать кажущиеся несвязанными метрики на одном графике, например, задержку нескольких разных команд с размером очереди пула потоков — все с полной историей
  • Разверните — посмотрите на недели или увеличьте до минут

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

* В издателе метрик Hystrix есть небольшая ошибка , которая будет исправлена ​​в 1.4.0-RC7
** Функции, описанные выше, доступны «из коробки» в нашем проекте с открытым исходным кодом микро-пружины