Наша компания занимается обслуживанием серверов. Мониторинг для нас — сверхкритическая система, его отказ может привести к большим финансовым потерям. Отслеживать физическую доступность мониторинга может другая система мониторинга, а вот логические ошибки…

Расскажу историю одной ошибки, какие выводы мы сделали, и как изменили подход к системе мониторинга. Строчек кода не будет, речь пойдет про идеологию. Кому интересно, добро пожаловать подкат.


Вводные данные: есть несколько сотен клиентов. Есть система мониторинга zabbix. Для каждого клиента заведена отдельная группа, в которой располагаются все сервера клиента. Новые хосты добавляются автоматически. Клиент имеет доступ к метрикам по хостам в своей группе. Есть один специальный хост, который проверяет доступность сайтов всех клиентов. Все срабатывания приводят к созданию задачи в redmine. Так выглядел наш мониторинг пару лет назад.

Все началось с простого запроса от клиента о предоставления доступа к мониторингу доступности сайта. Как вы помните, у нас он один для всех клиентов и дать доступ мы не смогли. И заверте…

Часть первая: эпик фейл, мы нашли тебя


Мы сели, поразмыслили и решили, что давно пора сделать каждому клиенту такой спец-хост и дать доступ к метрикам. Админы — народ ленивый, руками копировать не хотелось. Написали скрипт, который разберет все проекты, создаст и перенесет все нужные метрики и триггеры. Скрипт, протестированный «на кошках», работал как швейцарские часы.

Запускаем скрипт в продакшн, и к нашему изумлению он вываливает мешок и маленькую тележку ошибок. Беглый анализ показывает, что метрики собираются, а триггеров-то для них и нет! Проблемных проверок набралось порядка 10%. Вроде не так и много, но сама ситуация крайне печальная. Позвонит клиент: «У нас сайт упал!» И что мы ответим? «Спасибо, что сообщили, сами мы не в курсе...»? А если сайт пролежал 10 часов? Нам повезло, мы нашли проблему до того, как она выстрелила.

Часть вторая: кто виноват и что делать


Виноватые были найдены. Причина оказалась банальной: добавляя новые проверки, ленились и клонировали существующие. Иногда забывали нажать clone и меняли настройки у текущего триггера. Да, да, это стыд и позор. Но если можно совершить ошибку, рано или поздно человек ее совершит. Первый вывод: человеческий фактор всегда срабатывает.

Что делать? Конечно же, написать еще один скрипт, который создаст триггеры там, где их не хватает. Можно было бы добавить этот скрипт на крон и закрыть эту ситуацию. Но так мы устраняли последствия, а не проблему. Напомню, проблема: человеческий фактор всегда срабатывает.

Мы провели анализ и выделили задачи, которые можно полностью или частично автоматизировать.

Мы автоматизировали все работы, связанные с добавлением шаблонов. Написали скрипты, которые создают проверки, админу остается только задать входные данные.Надо добавить проверку доступности сайта? Просто запусти script --url site.com. Надо добавить хост в maintenance? Запусти скрипт… Ну вы поняли. Мы даже добавили функционал проверки на наличие обновления в git, чтобы все гарантированно пользовались последней версией скриптов. Еще мы написали скрипт, который делает все возможные проверки на наличие ошибок, отключенные хосты, хосты, оставленные в maintenance, и т.д. и т.п. И жить нам стало радостно и весело. Happy end.

Часть третья: новая волна проблем


Казалось бы, наступило счастье. Но рано мы обрадовались. В один прекрасный пятничный вечер, как обычно и бывает, коллега написал: «У меня на десяток хостов не подцепились шаблоны». Напомню, процесс автоматизирован, скрипт смотрит роли в системе конфигурирования и цепляет нужные шаблоны. В пятницу вечером браться за такое дело никто не хочет. Просим коллегу подождать полчасика, вдруг само наладится. Прошел час, второй, третий… Шаблоны так и не подцепились. Деваться некуда, полезли смотреть. Оказалось, после очередного обновления часть скриптов перестала работать. При этом, внося изменения, мы сделали выборочное тестирование, но именно сбойные скрипты не попали в выборку.

Поскольку мониторингом занимается один человек, виновник был очевиден. Наказывать не стали, но спросили: «Что делать, чтобы такого не повторилось?».

Что делать? Конечно же, писать автотесты. Теперь у нас все скрипты до деплоя на сервере проходят автотесты.

Эпилог


Прочитав эту статью, кто-то скажет: «Позор, как так можно работать?» Но разве вы сами никогда не удаляли прод базу данных?? Даже в Gitlab такое случалось… Мы не боимся ошибок, каждый фейл дает нам возможность сделать компанию лучше. Главное — найти и устранить причины, а не заниматься лечением симптомов.

А вы уверены что ваша система мониторинга здорова на 100%?

PS: Работая над статьей, я поймал себя на мысли, что в devops работа ops все больше походит на dev. Значит, не надо изобретать велосипед, будем брать практики и инструменты из dev и применять в ops.

PSS: Мы не показываем примеры кода, потому что код заточен под наши нужды и нашу архитектуру. Но если вам интересно, напишите в комментариях, и мы зальем код на github.

Комментарии (12)


  1. KorP
    01.11.2017 10:26
    -3

    О чём статья? Вы нашли косяки и исправили? А сюда зачем писать? Похвалиться? Напомнить? Вы бы хоть рассказали как при помощи скриптов искали ошибки, устраняли их и тд, иначе полезность данной статьи — 0


    1. Magvai69
      01.11.2017 11:31
      +1

      В начале статьи же написано, что примеров нет и что статья про подход… Вы прочитали и удивляетесь, что нет примеров. Но вас же предупреждали.


      1. KorP
        01.11.2017 13:07

        про подход

        Подход к чему? Проверять что всё работает корректно? Или пишут просто ради того, что бы написать хоть что то?


        1. muon
          02.11.2017 09:21

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


          1. KorP
            02.11.2017 09:26

            Так лучше уж рассказать, про то, как с болью бороться :)


  1. NikiN
    01.11.2017 10:59

    Вот про автотесты скриптов интересно, а можно подробнее?


    1. bravosierrasierra
      01.11.2017 11:42

      Поддерживаю, тема организации действительно работоспособных проверок и dry-run-режимов очень интересна


    1. sfw Автор
      01.11.2017 11:45

      Тут все достаточно просто, нам известен конечный результат выполнения скрипта. В git сделан простой pipeline. К примеру, возьмём скрипт который создаёт веб проверку. Запускается pipeline, в котором запускается скрипт с набором тестовых данных и создается веб проверка, а потом запускается скрипт, который проверяет наличие верного item и trriger. Если все на месте и с нужными данными, то тестовая проверка удаляется. И тест считается пройденным. Для тестов на zabbix сервер установлен gitlab-runner. Если интересен код, пишите, выложим.


      1. NikiN
        01.11.2017 12:07

        Интересен


        1. danielvansid
          01.11.2017 15:01

          +1


          1. sfw Автор
            01.11.2017 15:41

            Код выложим в ближайшее время.
            Дополнение: если делать автотест для шаблонов, то наливается хост, проверяем через API что данные пошли, далее меняем состояние того, что хотим проверить. Скажем, если это доступность SSH, то отключаем ее или просто блокируем на уровне Firewall и проверяем через API что изменения попали в Zabbix и триггер сработал. Идея в том, что нам известно состояние в котором находится система и то, в котором она должна оказаться и эти изменения должны попасть в систему мониторинга. В случае Zabbix, все изменения можно отслеживать через API.


  1. evg_krsk
    02.11.2017 21:16

    Круто конечно, но то ли задача описана неполно, то ли вы слишком усложняете.


    Поднимать CI/CD и виртуалки ради отдельных триггеров мониторинга? Оверкилл, на мой взгляд. Я бы шел по пути использования заббикса, а не против него.


    Из текста создаётся впечатление, что вы веб-чеки сайтов руками добавляли/удаляли два года назад (без шаблонов). И заббикс в своей БД вёл аудит, кто что и когда поменял. А сейчас вы то же самое делаете as a code с автотестами в CI/CD, через апи и история ведётся уже в git-е. По мне так шило на мыло сменили, стало сложнее делать простые вещи.


    Разве нельзя например написать один-два гибко настраиваемых шаблона веб-проверок и вешать их на хосты клиентов, хоть через авторегистрацию, хоть руками, хоть через апи? И у клиентов был бы доступ к этим данным, автоматически.


    Ждём кода.