Как обнаружить аномалии с помощью Skyline на CentOS 7

Вступление

Если вы используете систему мониторинга (например, Zabbix или Nagios), то вы знаете, как работает мониторинг. В двух словах это можно описать следующим образом: система мониторинга получает различные показатели (использование ЦП / памяти, использование сети и т. Д.). Как только значение одного из показателей выходит за пределы предварительно определенных порогов, оно активирует соответствующий триггер, и система мониторинга информирует вас о том, что один из показателей выходит за нормальные пределы. Пороговые значения для каждой метрики обычно устанавливаются вручную, что не всегда удобно.

В этом руководстве вы узнаете, как установить и настроить Skyline - систему обнаружения аномалий в реальном времени. Он способен анализировать набор метрик в режиме реального времени, не устанавливая и не настраивая пороговые значения для каждого из них. Он предназначен для использования там, где существует большое количество временных рядов (сотни тысяч), которые требуют постоянного мониторинга.

Пороговые триггеры

Давайте рассмотрим пример системы мониторинга с установленными вручную пороговыми значениями. На рисунке ниже показан график загрузки процессора. Пунктирные линии обозначают пороги триггера.

изображение: https: //assets.digitalocean.com/articles/skyline_centos7/pic1.png [рисунок 1] + * рисунок 1 *

В точке 1 на рисунке 1 процесс начался, и нагрузка на процессор значительно возросла. Триггер был активирован, и администратор замечает это. Администратор решает, что он находится в пределах нормальных значений, и изменяет пороги срабатывания на значения, показанные в виде верхних пунктирных линий.

Через некоторое время триггер снова срабатывает в точке 2 на рисунке 1. Администратор обнаруживает, что вторая служба регулярно создает резервные копии и вызывает увеличение нагрузки. Тогда возникает вопрос: поднимаете ли вы порог выше или оставляете его как есть, а просто игнорируете сигналы тревоги?

Давайте посмотрим на пункт 3. В этот момент загрузка события падает, но администратор не был проинформирован, потому что порог не был превышен. Триггер не активирован.

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

Чтобы помочь решить эти проблемы, * Skyline * был создан. Он использует набор непараметрических алгоритмов для классификации аномальных метрик.

Компоненты горизонта

Skyline состоит из следующих компонентов: Horizon Agent, Analyzer Agent и Webapp.

Горизонт Агент

Агент Horizon отвечает за сбор данных. У него есть * Listeners *, которые прослушивают входящие данные.

Он принимает данные в двух форматах: pickle (TCP) и MessagePack (UDP). Он читает входящие метрики и помещает их в общую очередь, из которой * Workers * читает. Рабочие кодируют данные в Messagepack и добавляют их в базу данных Redis. Агент Horizon также регулярно обрезает и очищает старые метрики с помощью * Roombas *. Если этого не сделать, то вся свободная память скоро будет исчерпана.

Анализатор Агент

Агент Analyzer отвечает за анализ данных. Он получает список метрик от Redis, запускает несколько процессов и присваивает метрики каждому из них. Каждый процесс анализирует данные, используя несколько алгоритмов. Каждый алгоритм сообщает результат - являются ли данные ненормальными или нет. Если большинство алгоритмов сообщают, что текущая метрика имеет ненормальность, данные считаются anomalous.

Все ненормальные метрики записываются в файл. На основе этого файла создается изображение и отображается в веб-приложении.

Анализатор также может отправлять уведомления: по электронной почте, HipChat или PagerDuty. Уведомления по электронной почте настраиваются позже в этой статье.

Webapp

Skyline предоставляет небольшое веб-приложение для отображения аномальных показателей. Это простое веб-приложение, написанное на Python с фреймворком Flask. Верхняя часть показывает два графика - прошедший час и прошедший день. Под графиками приведен список всех аномальных метрик.

База данных Redis

Redis - это база данных с открытым исходным кодом для кэширования и хранения ключей.

Skyline хранит все метрики и закодированные временные ряды в базе данных Redis. Когда приходит точка данных, рабочий Horizon упаковывает точку данных со схемой + [timestamp, value] + в двоичную строку в кодировке MessagePack и добавляет эту строку в соответствующий ключ метрики.

Figure 2 показывает диаграмму взаимодействия компонентов Skyline.

изображение: https: //assets.digitalocean.com/articles/skyline_centos7/pic2.png [рисунок 2] + * рисунок 2 *

Предпосылки

Прежде чем вы сможете установить Skyline, вам необходимо выполнить следующие предварительные условия:

  • Разверните CentOS 7 Droplet.

  • Добавьте пользователя sudo, следуя учебному руководству Initial Server Setup. Все команды в этом руководстве должны выполняться от имени пользователя без полномочий root.

  • Add swap space на ваш сервер. 4 ГБ это хорошо.

  • Установите Graphite и соберите его, следуя инструкциям в https://www.digitalocean.com/community/tutorials/how-to-keep-effective-historical-logs-with-graphite-carbon-and-collectd-on-centos- 7 [Как сохранить эффективные исторические журналы с помощью графита, углерода и собранных в CentOS 7] учебное пособие.

Шаг 1 - Установка Skyline и Redis

Чтобы установить Skyline, сначала установите необходимые приложения, включая некоторые инструменты, связанные с Python, и веб-сервер Apache:

sudo yum install httpd gcc gcc-c++ git pycairo mod_wsgi python-pip python-devel blas-devel lapack-devel libffi-devel

Получите последние исходные файлы для Skyline от GitHub:

cd /opt
sudo git clone https://github.com/etsy/skyline.git

Установите некоторые необходимые пакеты Python:

cd /opt/skyline
sudo pip install -U six
sudo pip install -r requirements.txt

Установите следующие пакеты Python в указанном порядке:

sudo pip install numpy
sudo pip install scipy
sudo pip install pandas
sudo pip install patsy
sudo pip install statsmodels
sudo pip install msgpack-python

Большинство из них представляют собой библиотеки Python с открытым исходным кодом, используемые для научных и технических вычислений. Пакет + msgpack-python + необходим для чтения и записи данных MessagePack.

Скопируйте пример файла настроек Skyline в правильное местоположение:

sudo cp /opt/skyline/src/settings.py.example /opt/skyline/src/settings.py

Создайте следующие каталоги:

sudo mkdir /var/log/skyline
sudo mkdir /var/run/skyline
sudo mkdir /var/log/redis
sudo mkdir /var/dump/

Как мы упоминали выше, Skyline хранит все метрики в базе данных Redis, поэтому вам необходимо установить и ее:

sudo yum install redis

Вы можете найти больше информации о Redis из учебника How для установки и использования Redis.

Запустите сервисы Skyline и Redis:

cd /opt/skyline/bin
sudo redis-server redis.conf
sudo ./horizon.d start
sudo ./analyzer.d start
sudo ./webapp.d start

Чтобы проверить установку, запустите прилагаемый тестовый скрипт:

python /opt/skyline/utils/seed_data.py

Вы должны увидеть следующий вывод:

Loading data over UDP via Horizon...
Connecting to Redis...
Congratulations! The data made it in. The Horizon pipeline seems to be working.

Установка и базовая настройка Skyline завершены. Теперь вам нужно отправить данные в него.

Шаг 2 - Получение данных в Skyline

Как упоминалось ранее, Skyline принимает данные в двух форматах: pickle (TCP) и MessagePack (UDP). ,

Вы можете написать свой собственный скрипт или модуль для вашего любимого агента мониторинга и сделать так, чтобы он кодировал данные с помощью MessagePack для отправки в Skyline для анализа. Skyline принимает метрики в виде строк в кодировке MessagePack через UDP. MessagePack - это спецификация сериализации объектов, такая как JSON. Формат: + [<имя метрики>, [<отметка времени>, <значение>]] +. MessagePack имеет API для большинства языков программирования. Дополнительную информацию и примеры API можно найти на официальном сайте MessagePack.

Из этого туториала вы узнаете, как отправлять данные из Graphite и собирать их в Skyline.

Получение данных из графита

Графит состоит из нескольких компонентов, одним из которых является сервис * carbon-relay *. Carbon-relay перенаправляет входящие метрики в другой экземпляр Graphite для обеспечения избыточности. Таким образом, вы можете направить службу углеродного реле на хост, на котором работает Skyline.

изображение: https: //assets.digitalocean.com/articles/skyline_centos7/graphite_skyline.png [рисунок 3] + * рисунок 3 *

На рисунке 3 показана принципиальная схема потока данных. Данные от внешних агентов мониторинга (collectd, diamond, statsd и т. Д.) или системы (Nagios, Icinga, Sensu и т. д.) переносятся в Graphite. Далее, carbon-relay перенаправляет данные в Skyline. Carbon-relay, carbon-cache и Skyline могут работать либо на одном хосте, либо на разных хостах.

Вам нужно настроить Graphite, collectd и Skyline, чтобы этот поток данных работал.

Если вы ранее не копировали пример + relay-rules.conf + в правильное место для файла конфигурации carbon-relay, вы должны сделать это сейчас:

sudo cp /opt/graphite/conf/relay-rules.conf.example /opt/graphite/conf/relay-rules.conf

Давайте откроем файл конфигурации + relay-rules.conf + для редактирования:

sudo vi /opt/graphite/conf/relay-rules.conf

Добавьте хост Skyline в список пунктов назначения, где указан IP-адрес вашего хоста Skyline:

/opt/graphite/conf/relay-rules.conf

[default]
default = true
destinations = 127.0.0.1:2004, :2024

Все пункты назначения, используемые в + relay-rules.conf +, также должны быть определены в файле конфигурации + carbon.conf +.

Откройте файл конфигурации + carbon.conf +, чтобы сделать это изменение:

sudo vi /opt/graphite/conf/carbon.conf

Затем найдите раздел + [relay] + и отредактируйте строку + DESTINATIONS +:

/opt/graphite/conf/carbon.conf

[relay]
...
DESTINATIONS = 127.0.0.1:2004, :2024
...

После внесения этих изменений запустите службу углеродного реле:

sudo systemctl start carbon-relay

Предоставление Skyline доступа к Graphite-Web

В How для сохранения эффективных исторических журналов с Graphite, Carbon и коллекционированные в CentOS 7, если вы решили защитить паролем веб-интерфейс Graphite, вы * должны разрешить * доступ с локального хоста без пароля для работы Skyline.

Для этого отредактируйте файл конфигурации Graphite:

sudo vi /etc/httpd/conf.d/graphite.conf

Добавьте следующие строки красного цвета в блок + <Location> +:

/etc/httpd/conf.d/graphite.conf

<Location "/">
 AuthType Basic
 AuthName "Private Area"
 AuthUserFile /opt/graphite/secure/.passwd
 Require user sammy




</Location>

Затем перезапустите сервис Apache:

sudo systemctl restart httpd

Получение данных из Collectd

Вы также можете настроить collectd для отправки данных в Skyline. Откройте его файл конфигурации:

sudo vi /etc/collectd.conf

Измените номер порта в блоке + <Plugin write_graphite> + на + 2013 +:

/etc/collectd.conf

<Plugin write_graphite>
   . . .
   Port ""
   . . .

Затем перезапустите collectd:

sudo systemctl restart collectd.service

Чтобы избежать путаницы, на рисунке 4 показана упрощенная схема с правильными номерами портов.

изображение: https: //assets.digitalocean.com/articles/skyline_centos7/graphite_skyline_ports.png [рисунок 4] + * рисунок 4 *

Правильные номера портов:

  1. Carbon-relay прослушивает входящие данные в формате plaintext через порт 2013

  2. Carbon-relay отправляет данные в формате pickle

  3. Carbon-cache прослушивает входящие данные в формате pickle через порт 2004

  4. Агент Horizon прослушивает входящие данные в формате pickle через порт 2024

Шаг 3 - Настройка Skyline

Файл конфигурации Skyline содержит много настроек. Откройте файл для редактирования:

sudo vi /opt/skyline/src/settings.py

Каждый параметр в этом файле документируется с помощью информативных комментариев в самом файле. Как минимум, вам нужно установить следующие параметры, заменив текст красным на ваши значения:

  • + GRAPHITE_HOST = '' +

  • + HORIZON_IP = '' +

  • + WEBAPP_IP = '' +

Другие параметры можно оставить их значения по умолчанию. Они заключаются в следующем:

  • + FULL_DURATION + - эта опция указывает максимальную продолжительность времени, в течение которого данные будут храниться в Redis и анализироваться. Более длительные периоды анализа занимают больше времени, но они могут помочь уменьшить шум и обеспечить более точное обнаружение аномалий. Значением по умолчанию является + 86400 + секунд.

  • + CARBON_PORT + - эта опция указывает углеродный порт. Значение по умолчанию + 2003 +.

  • + ANALYZER_PROCESSES + - эта опция указывает количество процессов, которые будет запускать анализатор Skyline. Рекомендуется установить этот параметр на несколько меньше, чем общее количество процессоров на вашем хосте. Значением по умолчанию является + 5 +.

  • + WORKER_PROCESSES + - эта опция указывает количество рабочих процессов, которые будут использовать из очереди Horizon. Значением по умолчанию является «+ 2 +».

  • + PICKLE_PORT + - эта опция указывает порт TCP, который прослушивает маринады Graphite. Значением по умолчанию является + 2024 +.

  • + UDP_PORT + - эта опция указывает порт UDP, который прослушивает пакеты в кодировке MessagePack. Значением по умолчанию является «+ 2025 +».

  • + WEBAPP_PORT + - эта опция указывает порт для веб-приложения Skyline. Значением по умолчанию является «+ 1500 +».

После внесения этих изменений вы должны перезапустить соответствующее приложение:

sudo /opt/skyline/bin/horizon.d restart
sudo /opt/skyline/bin/analyzer.d restart
sudo /opt/skyline/bin/webapp.d restart

Затем вы можете открыть ссылку + http: //: 1500 + и увидеть веб-страницу Skyline (рисунок 5). Это покажет аномальную метрику, поскольку они найдены.

изображение: https: //assets.digitalocean.com/articles/skyline_centos7/skyline_interface.png [рисунок 5] + * рисунок 5 *

Чтобы Skyline работал на полную мощность, вам нужно подождать, пока не пройдет секунд + FULL_DURATION +. По умолчанию для + FULL_DURATION + установлено значение 1 день (+ 86400 + секунд).

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

Шаг 4 - Включение оповещений по электронной почте

По умолчанию Skyline отображает обнаруженные аномалии в своем веб-интерфейсе (+ http: //: 1500 +) по мере их обнаружения и пока они все еще происходят. Как только аномалия исчезает, соответствующая метрика исчезает с этого интерфейса. Поэтому вы должны следить за веб-страницей, чтобы увидеть эти аномалии, что не всегда удобно.

Вы можете настроить оповещения по электронной почте, чтобы не пропустить их.

Для этого откройте файл конфигурации Skyline:

sudo vi /opt/skyline/src/settings.py

Убедитесь, что оповещения включены:

/opt/syline/src/settings.py

ENABLE_ALERTS = True

Затем найдите следующий раздел ALERTS и добавьте следующую схему красным цветом:

/opt/syline/src/settings.py

ALERTS = (
   (^)("collectd", "smtp", 1800)(^),
)

Первое значение в схеме - это процесс для мониторинга. В этом случае это + collectd. + Второе значение схемы - + smtp +, которое обозначает оповещения по электронной почте. Последнее значение + 1800 + в секундах. Это означает, что предупреждения не будут срабатывать более одного раза в течение 30 минут (1800 секунд), даже если обнаружен триггер. Измените это значение, чтобы лучше соответствовать вашим потребностям.

Также найдите следующий раздел и измените его для адресов электронной почты, которые вы хотите использовать. Оповещения по электронной почте будут отправляться на (^) [email protected] (^) аккаунт с (^) [email protected] (^).

/opt/syline/src/settings.py

SMTP_OPTS = {
   "sender": "(^)[email protected](^)",
   "recipients": {
       "collectd": ["(^)[email protected](^)"],
   },
}

После внесения всех этих изменений вам нужно перезапустить демон анализатора:

sudo /opt/skyline/bin/analyzer.d restart

Шаг 5 - Тестирование Skyline

Чтобы протестировать Skyline, мы можем создать всплеск процессора с помощью команды bash:

dd if=/dev/zero of=/dev/null

Вы можете остановить команду в любое время, нажав CTRL-C. Для создания аномалии должно быть достаточно нескольких минут.

Если вы посмотрите на веб-интерфейс Skyline во время выполнения этой команды, вы увидите обнаруженные аномалии. Пример показан на рисунке 6.

изображение: https: //assets.digitalocean.com/articles/skyline_centos7/skyline_anomalies_list.png [рисунок 6] + * рисунок 6 *

Вы можете видеть, что в результате высокой загрузки процессора скорость компонентов Skyline снизилась. Все обнаруженные ненормальные показатели отображаются в виде списка внизу веб-страницы. Когда вы наводите курсор на имя одной из метрик, на верхних графиках вы можете видеть соответствующие временные ряды за последний час и день. Нажмите на название метрики, чтобы открыть более детальный график, сгенерированный Graphite (см. Пример на рисунке 7).

изображение: https: //assets.digitalocean.com/articles/skyline_centos7/detail_graph.png [рисунок 7] + * рисунок 7 *

Загрузка процессора не достигла чрезвычайно высокого значения в этом примере, и порог не был превышен. В этом случае классическая система мониторинга не смогла найти отклонение. Такой случай упоминался ранее (рисунок 1, пункт 3).

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

Шаг 6 - Настройка алгоритмов (необязательно)

Как упоминалось ранее, Skyline использует набор алгоритмов для обнаружения аномалий. В настоящее время реализованы следующие алгоритмы:

  • Среднее абсолютное отклонение

  • Тест Граббса

  • Первый час в среднем

  • Стандартное отклонение от среднего

  • Стандартное отклонение от скользящей средней

  • Наименьших квадратов

  • Контейнеры гистограммы

  • Тест Колмогорова – Смирнова

Большинство из них основаны на * контрольных диаграммах * (также известных как диаграммы Шухарта) и * правиле трех сигм *. В своих расчетах они используют библиотеки Python SciPy и NumPy.

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

sudo vi /opt/skyline/src/analyzer/algorithms.py

Каждый из алгоритмов в этом файле снабжен небольшим описанием. Например, давайте рассмотрим следующий алгоритм:

/opt/skyline/src/analyzer/algorithms.py

def median_absolute_deviation(timeseries):
   """
   A timeseries is anomalous if the deviation of its latest datapoint with
   respect to the median is X times larger than the median of deviations.
   """

   series = pandas.Series([x[1] for x in timeseries])
   median = series.median()
   demedianed = np.abs(series - median)
   median_deviation = demedianed.median()

   # The test statistic is infinite when the median is zero,
   # so it becomes super sensitive. We play it safe and skip when this happens.
   if median_deviation == 0:
       return False

   test_statistic = demedianed.iget(-1) / median_deviation

   # Completely arbitary...triggers if the median deviation is
   # 6 times bigger than the median
   if test_statistic > :
       return True

Исходя из характера ваших данных, вам может потребоваться изменить пороговое значение с «+ 6 » на другое значение - « 4 », « 5 », « 7 +» и т. Д.

Вы также можете настроить некоторые параметры в файле + settings.py +:

/opt/skyline/src/settings.py

ALGORITHMS = [
   'first_hour_average',
   'mean_subtraction_cumulation',
    'stddev_from_average',
    'stddev_from_moving_average',
    'least_squares',
    'grubbs',
    'histogram_bins',
    'median_absolute_deviation',
    'ks_test',
]

CONSENSUS = 6

Параметр + ALGORITHMS + указывает алгоритмы, которые будет запускать анализатор. Вы можете закомментировать любой из них, чтобы отключить их или добавить новые алгоритмы. Опция + CONSENSUS + указывает количество алгоритмов, которые должны возвращать + True +, прежде чем метрика будет классифицирована как аномальная. Чтобы увеличить чувствительность, вы можете уменьшить эту опцию, и наоборот.

Заключение

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

Его основные преимущества включают в себя:

  • Высокая скорость анализа больших объемов данных

  • Нет необходимости устанавливать отдельные параметры для каждой метрики

  • Возможность добавления собственных алгоритмов для обнаружения аномалий

У этого также есть некоторые недостатки:

  • Данные каждой метрики анализируются несколькими алгоритмами, которые требуют значительных ресурсов вычислительной системы.

  • Все данные хранятся в оперативной памяти, что позволяет системе работать очень быстро. С большим количеством метрик и длительным периодом анализа вам потребуется большой объем оперативной памяти.

Related