Перейти к основному содержимому

Руководство по Netflix Spectator

· 5 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

1. Обзор

Spectator — это библиотека для инструментирования кода и сбора данных для серверных систем многомерных временных рядов. Spectator был создан в Netflix для сбора различных метрик, и соответствующая серверная система, используемая с ним, в основном представляет собой Atlas .

В этом руководстве мы узнаем, что предоставляет Spectator и как мы можем использовать его для сбора метрик.

2. Зависимости Maven

Прежде чем мы углубимся в реальную реализацию, давайте добавим зависимость Spectator к файлу pom.xml :

<dependency>
<groupId>com.netflix.spectator</groupId>
<artifactId>spectator-api</artifactId>
<version>1.0.11</version>
</dependency>

spectator - api — это основная библиотека наблюдателя.

3. Основы реестра , счетчика и метрик

Прежде чем мы начнем углубляться в эту библиотеку, мы должны сначала понять основы Registry, Meter и Metrics .

  • Реестр — это место, где мы храним набор счетчиков
  • Meter используется для сбора набора измерений о нашем приложении, например, Counter, Timer, Gauge и т.
  • Метрики — это отдельные измерения, которые мы отображаем на измерителе, например, количество, продолжительность, максимальное, среднее и т. д.

Давайте рассмотрим их подробнее и поймем, как они используются в библиотеке Spectator.

4. Реестр

Библиотека Spectator поставляется с Registry в качестве интерфейса с некоторыми встроенными реализациями, например, DefaultRegistry и NoopRegistry . Мы также можем создавать собственные реализации реестра в соответствии с нашими требованиями.

Реализация реестра может использоваться, как показано ниже:

Registry registry = new DefaultRegistry();

5. Метр

Счетчик в основном бывает двух типов, т. е. активный и пассивный.

5.1. Активные счетчики

Эти счетчики используются для измерения возникновения некоторого события. У нас есть три типа таких счетчиков:

5.2. Пассивные счетчики

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

Далее давайте подробно рассмотрим эти различные типы счетчиков.

6. Счетчик

Эти счетчики измеряют скорость, с которой происходит событие. Например, предположим, что мы хотим измерить скорость, с которой элементы вставляются или удаляются из списка.

Давайте сначала зарегистрируем счетчик для объекта Registry при инициализации:

insertCounter = registry.counter("list.insert.count");
removeCounter = registry.counter("list.remove.count");

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

Теперь мы можем увеличивать или уменьшать счетчик счетчика для добавления в список или удаления из списка соответственно:

requestList.add(element);
insertCounter.increment();

requestList.remove(0);
removeCounter.increment();

Таким образом, мы можем сгенерировать два метра, а затем передать эти показатели в Atlas для визуализации.

7. Таймеры

Эти счетчики измеряют время, затраченное на какое-то событие. Spectator поддерживает два типа таймеров:

7.1. Таймер

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

Во-первых, нам нужно зарегистрировать этот счетчик в реестре :

requestLatency = registry.timer("app.request.latency");

Затем мы можем вызвать метод Record() класса Timer для измерения времени, затраченного на обработку запроса:

requestLatency.record(() -> handleRequest(input));

7.2. LongTaskTimer

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

Опять же, в качестве первого шага нам нужно зарегистрировать этот счетчик:

refreshDuration = LongTaskTimer.get(registry, registry.createId("metadata.refreshDuration"));

Затем мы можем использовать LongTaskTimer для запуска и остановки измерений длительной задачи:

long taskId = refreshDuration.start();
try {
Thread.sleep(input);
return "Done";
} catch (InterruptedException e) {
e.printStackTrace();
throw e;
} finally {
refreshDuration.stop(taskId);
}

8. Датчики

Как мы обсуждали ранее, датчики — это пассивные счетчики. Следовательно, они дают значение, которое выбирается в любой момент времени для выполняющейся задачи. Так, например, мы бы использовали его, если бы хотели узнать количество запущенных потоков в JVM или использование памяти кучи в любой момент времени.

У нас есть два типа манометров:

  • Датчики опроса
  • Активные датчики

8.1. Датчики опроса

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

Теперь давайте посмотрим, как использовать этот датчик для отслеживания размера List :

PolledMeter.using(registry)
.withName("list.size")
.monitorValue(listSize);

Здесь PolledMeter — это класс, который позволяет выполнять фоновый опрос listSize с помощью метода monitorValue() . Кроме того, listSize — это переменная, которая отслеживает размер нашего выборочного списка.

8.2. Активные датчики

Датчик этого типа требует регулярных ручных обновлений значения относительно обновлений в задачах мониторинга. Вот пример использования активных датчиков :

gauge = registry.gauge("list.size");

Сначала мы регистрируем этот датчик в реестре . Затем мы вручную обновляем его при добавлении или удалении элементов из списка:

list.add(element);
gauge.set(listSize);
list.remove(0);
gauge.set(listSize);

9. РаспространениеСводка

Теперь мы рассмотрим другой счетчик, известный как DistributionSummary. Он отслеживает распределение событий. Этот измеритель может измерять размер полезной нагрузки запроса. Например, мы будем использовать DistributionSummary для измерения размера запроса.

Сначала как всегда регистрируем этот счетчик в Registry :

distributionSummary = registry.distributionSummary("app.request.size");

Теперь мы можем использовать этот счетчик, аналогичный таймеру , для записи размера запроса:

distributionSummary.record((long) input.length());
handleRequest();

10. Зритель против сервопривода против микрометра

Servo также является библиотекой для измерения различных метрик кода. Spectator — преемник Servo, созданный Netflix. Изначально Spectator был запущен для Java 8, и с точки зрения будущей поддержки это лучший вариант.

Эти библиотеки Netflix являются одним из различных вариантов, доступных на рынке, для измерения различных показателей. Мы всегда можем использовать их по отдельности или использовать фасад, такой как Micrometer . Micrometer позволяет пользователям легко переключаться между различными библиотеками измерения метрик. Следовательно, он также позволяет выбирать различные системы мониторинга серверной части.

11. Заключение

В этой статье мы представили Spectator, библиотеку от Netflix для измерения метрик. Кроме того, мы рассмотрели использование его различных активных и пассивных счетчиков. Мы можем отправить инструментированные данные и опубликовать их в базе данных временных рядов Atlas .

Как всегда, полный код реализации этой статьи можно найти на GitHub .