Upload
badoo-development
View
10.798
Download
3
Embed Size (px)
Citation preview
От Low Level к Super Discovery
Илья Аблеев
в
или как переложить мониторинг на девелопера
Инфраструктура: ~3K Linux хостов; ~4 датацентра: Европа, Америка, Азия, Россия; 2 девел-площадки: Москва, Лондон
Отдел мониторинга: реакция на проблемы введение нового и поддержание старого добра; автоматизация.
Badoo
Всё
!
– доступность серверов / сетевых железок
!
– “хардварную” статистику: память, CPU, load average, RAID
!
– сервисы: MySQL, Nginx, PHP-FPM, самописные
!
– статистику сервисов: количество запросов / время ответа
Что мониторим Zabbix’ом?
А ещё…
!
– логику приложений: очереди, актуальность / консистентность данных
!
– бизнес-метрики (активность пользователей): онлайн, регистрации, загрузка фото
Что мониторим Zabbix’ом?
!
Когда:
• подумали заранее, при создании сервиса
• что-то сломалось, нужно предотвратить повторение
!
Как:
• оформляем задачу, описываем требования
• реализовываем логику (скрипты)
• прикручиваем триггеры, уведомления
!
!
Как решаем, что нужно мониторить?
!
!
Но долго, если у нас очень много мелких задач.
!
!
Больше задач –> больше времени тратится на повторение уже существующих приёмов.
Замониторить – просто
Коллеги, нам бы мониторить количество записей в таблице и если превысит 100 – слать sms’ку. Можете? !mysql -uzabbix -SNe “SELECT COUNT(*) FROM MyDb1.MyTable1”
!
Вроде просто.
!
Добавили в zabbix, подписали на SMS.
Пример
Коллеги, слушайте, тут аналогичная база есть. Можете добавить? !mysql -uzabbix -SNe “SELECT COUNT(*) FROM MyDb2.MyTable1”
!
Опять просто.
!
Добавили в zabbix, подписали на SMS.
Пример
Мы тут подумали… У нас есть десяток таких таблиц. Сможете? И по каждой нужно выставить свой лимит… !mysql -uzabbix -SNe “SELECT COUNT(*) FROM MyDb1.MyTable1” mysql -uzabbix -SNe “SELECT COUNT(*) FROM MyDb2.MyTable1” mysql -uzabbix -SNe “SELECT COUNT(*) FROM MyDb2.MyTable2” mysql -uzabbix -SNe “SELECT COUNT(*) FROM MyDb2.MyTable3” mysql -uzabbix -SNe “SELECT COUNT(*) FROM MyDb2.MyTable4”
… mysql -uzabbix -SNe “SELECT COUNT(*) FROM MyDb2.MyTable10”
Пример
А у нас тут база переехала…
А давайте нечётные не проверять!
А можете новый номер для SMS добавить?
Давайте на пятую таблицу недельку
позабиваем?
А таблицы из первой базы вообще не используются уже давно, чо вы их до сих пор
мониторите-то???
ЧО ТАК ДОЛГО-ТО?
ДЕВЕЛОПЕР(ы)
ХОЧУ БОЛЬШЕ!
ОТПИШИТЕ МЕНЯ ОТ СМС…
МОНИТОРИНГ
mysql> DROP DATABASE zabbix;
Шаблоны • массово раскатываем на кучу хостов • меняем всё и сразу
• нет возможности менять триггеры для одного хоста !
API • сложно ввести в курс дела тех, кто не видел заббикс
Нужно делать быстрее и больше
Низкоуровневое обнаружение !
Не слышали? Быстро изучать: https://www.zabbix.com/documentation/2.0/manual/discovery/low_level_discovery
В двух словах: что-то среднее между API и шаблонами. !
Новые объекты доставляются в JSON массиве.
Low Level Discovery
Low Level Discovery
Low Level Discovery
Просто обнаружить и повесить лампочки – скучно. !
Макросы можно подставлять в разные объекты: айтемы: {названия, ключи}, триггеры: {текст, формула, лимит} !
Нельзя подставить макрос в функцию 😟
https://support.zabbix.com/browse/ZBXNEXT-1667 (ровно через два дня – тикету исполнится три!!! года)
Low Level Discovery
Привет, Zabbix 3.0 https://www.zabbix.com/documentation/3.0/manual/config/macros/usermacros !
Общий смысл: позволит использовать разные значения для разных LLD макросов, которые были обнаружены. !
Если не найдёт – будет использовать дефолтное. !
* Контекстные макросы
!
Даже с контекстными макросами приходится совершать два действия: – дискаверить новые метрики – задавать лимиты (через API или руками) !
Оставили в старом варианте: значение задаётся прямо во время дискавери, в одном действии.
А как у нас?
Расширяем JSON массивдефолтные лимиты
кастомные лимиты
Создаём ОДИН раз айтемы:
И триггеры:
Лёгким движением руки…
У разработчиков – много однотипных сервисов. У этих однотипных сервисов – ещё больше айтемов. !
Чем отличаются: – названием – критичностью – ответственными !
Всё это “укладывается” в LLD.
Дискаверим на более “высоком” уровне
Дискаверим сервисы. Как? Доклад прошлого года :) https://youtu.be/ZfZL39By0cw?t=10m15s !
В заббиксе нет понятия “сервис”, поэтому для удобства каждый сервис добавляем как хост. !
Список сервисов предоставляет девелопер. !
Например: online_users, registration, push_send, push_click, email_send, email_open, …
Шаг первый
Создаём “универсальный” шаблон дискавери. !
Универсальный – значит применим для всех сервисов. !
Все айтемы с типом “траппер”: !
status[{#ID}] состояние метрики count[{#ID}] текущее значение limit_disaster[{#ID}] порог для самого критичного limit_high[{#ID}] для менее критичного limit_high[{#ID}] для наименее критичного
Шаг второй
Макросы: !
{#ID} уникальный id метрики {#TRIGGER} название триггера {#EMAIL} список адресов для уведомлений {#SMS} список телефонов !
Название для триггера – чтобы назвали так, как будет удобно.
Шаг второй
Шаг второй
Все айтемы – трапперы. !
Девелоперы сами будут отправлять нам данные через zabbix_sender: из крона, из “облаков”, и тд. !
Логику, когда нужно зажечь триггер – пишут они же. !
Список адресов и телефонов – заботятся снова они, заранее. !
Заббикс зажигает лампочки и отправляет уведомления.
Шаг третий
А у нас тут база переехала…
А давайте нечётные не проверять!
А можете новый номер для SMS добавить?
Давайте на пятую таблицу недельку
позабиваем?
А таблицы из первой базы вообще не используются уже давно, чо вы их до сих пор
мониторите-то???
Сейчас сам всё поправлю
Итоги