LINUX.ORG.RU
решено ФорумAdmin

Мониторинг комплексного состояния сервиса

 , ,


0

1

Добре всем!

Есть некий сервис. Сервис содержит около 2 тысяч элементов, состояние которых нужно проверять.

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

Однако, сервис имеет возможность по одному запросу выдать список всех НЕ проблемных элементов.

Возникла мысль, в контексте нагиоса:

Пусть нагиос не напрямую ломится к сервису, а обращается к внешнему скрипту (плагину), который, сделав один запрос к сервису и получив список НЕ проблемных элементов, отсекает их из полного списка известных ему из конфига или переданным в аргементах элементов и формирует из оставшихся список проблемных (diff).

Но вот беда — нагиос понимает только статусы (которых всего 4), а даже если бы понимал больше, то на описание всех комбинаций состояний «тот элемент ок, а вот те два не ок, а теперь тот не ок, а вот этот ок, а вон тот третий все еще не ок» элементов понадобится число статуса состоящее из 2 тысяч бит, ну, чтобы нагиос как-то отличил что статус поменялся. Но это всё бред.

На самом деле, достаточно ориентироваться не только на статус, но и на текст списка. Даже если статус не изменился, а вот текст списка да — отправлять оповещение. Так, даже при полном песце, куда удобнее будет видеть одно сообщение в две тысячи строк списка, чем 2 тысячи сообщений по 10 строк каждое, когда элемент это отдельный сервис.

Гугл помог вот досюда: https://support.nagios.com/forum/viewtopic.php?f=7&t=30238

И тут я понял, что нагиос сюда совсем не подходит, ибо, ну, костыли же уже велосипедные.

Да нахрен этот нагиос!

Засим вопрос:

Какой инструмент мне поможет достичь желаемого?

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

Надо все мониторить. как иначе узнать что возникла тревога? А проблемные надо мониторить для получения восстановления по этой тревоге. Тут кмк, один путь - снизить вообще кол-во метрик.

redwagon ()

Похоже, тебе нужна не push а pull модель мониторинга.

Обдумай прежде всего логику, а под неё выбери инструмент. Может быть NRPE будет достаточно, может перекатишься на Prometheus

GOMO88 ()
Последнее исправление: GOMO88 (всего исправлений: 1)

2 выхода.

1. Создать 2к сервисов в нагиосе, вполне подъёмное число, ну пару воркеров добавишь на mod_gearman

2. Делать тест по крону, сохранять статус, чекать нагиосом статус.

Bers666 ★★★★★ ()
Ответ на: комментарий от GOMO88

эм, пуш? это когда сервис сообщает о своем статусе, а пулл когда мониторинг запрашивает у сервиса? сервис не умеет в пуш.

не, так то забикс агент пушит, да, но там тоже триггеры так себе не в тему.

deep-purple ★★★★★ ()
Ответ на: комментарий от redwagon

мне нужна одна тревога вместо двух тысяч.

нет, интервал опроса увеличить нельзя (1 мин) а вот число проверяемых элементов медленно, но заметно со временем растет.

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 1)

А что мешает (теоретически), накатать скрипт, который локально все парсит, подготавливает необходимый массив данных (json или что там юзается) и дальше ожидает запроса от мониторинг-сервера, который только его и спросит, что там и как, и дальше выведет алерт?

Логика скрипта у тебя есть, по сути уже.

А вообще, заббикс + агент на таких данных схавает и не подавится, почему бы все-таки не заюзать его? Если однотипных сервисов куча - сделать темплейты, тем более что под большинство системных метрик уже идет куча шаблонов искаропки. У тебя куча специфичных? userparams в помощь и их обработка.

dgeliko ★★ ()
Ответ на: комментарий от deep-purple

Практически, пожалуйста.

Ну скрипт за тебя никто писать не будет, согласись

Пример можно?

Почитать доку по заббиксу? Он отлично задукоментирован.

dgeliko ★★ ()
Последнее исправление: dgeliko (всего исправлений: 1)
Ответ на: комментарий от dgeliko

Внешний скрипт написан еще вчера и работает. Дальше что?

Почитать доку

У тебя проблемы с интерпретацией смысла слов? Я просил пример. Не обязательно готовый. Хватит даже пинка в сторону конкретной опции или статьи, где об этом говорят.

deep-purple ★★★★★ ()
Ответ на: комментарий от dgeliko

А вообще, заббикс + агент на таких данных схавает и не подавится, почему бы все-таки не заюзать его?

Мне не нравится идея агента на 2к ключей. Заббиксоиды только-только начали оптимизировать свой код на предмет оверхэда по сети. Каждый опрос агента - это отдельный tcp-коннект с известным окном ожидания.

Я бы предложил, если не хайповый Прометеус, рассмотреть здесь заббикс-траппер.

heilnull ★★ ()
Ответ на: комментарий от heilnull

Мне не нравится идея агента на 2к ключей

Это я им еще не сказал, что у меня шесть таких сервисов по 2к элементов. Через пару недель сервисов станет девять, а через примерно пол года уже двенадцать.

Прометеус

Если он мне точно поможет в нужном кейсе — почему нет?

заббикс-траппер

Есть где почитать в стиле статей с юзкейсами и примерами?

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

Это я им еще не сказал, что у меня шесть таких сервисов по 2к элементов.

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

если есть возможность отдельным скриптом упаковать значения элементов в файл, то можно так и сделать, этот файл скормить zabbix_sender (или самописной утилите), а на сервере создать трапер и ловить значения. при этом все поидее должно забуферезироваться и улететь пачкой на сервер.

jo_b1ack ★★★★ ()
Ответ на: комментарий от jo_b1ack

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

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

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

крч я уже повторяюсь.

помогут здесь трапер и сендер?

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

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

что в твоем понимании комплексное состояние?

-работает (2000 из 2000 сервисов ок)
-вроде работает (1500 из 2000 сервисов ок)
-вроде не работает (1000 из 2000 сервисов ок)

или как...

вот выдержка из мануала забикса

zabbix_sender [-v] -z сервер [-p порт] [-I IP-адрес] [-s узел-сети] [-T] [-r] -i входящий-файл
...

-i, --input-file входящий-файл
    Загрузка данных из входного файла. Укажите дефис - как <входящий-файл> для чтения значений со стандартного ввода. Каждая строка файла должна содержать разделенные пробелами: <имяузласети> <ключ> <значение>. Каждое значение должно располагаться на своей собственной строке. Каждая строка должна содержать записи, разделенные 3 пробелами: <имяузласети> <ключ> <значение>, где "именемузласети" является имя наблюдаемого узла сети, как указано в веб-интерфейса Zabbix, "ключем" является целевой ключ элемента данных и "значение" - отправляемое значение. Укажите дефис - в <имяузласети>, чтобы использовать имя хоста из файла конфигурации или --host аргумент.

    Пример строки входящего файла:
    "Linux DB3" db.connections 43

    Тип значения должен быть корректно задан при настройке элемента данных в веб-интерфейсе Zabbix. Zabbix sender отправляет до 250 значений за одно соединение. Содержимое входящего файла должно быть в UTF-8 кодировке. Все значения из входящего файла отправляются в последовательном порядке сверху вниз.

jo_b1ack ★★★★ ()
Последнее исправление: jo_b1ack (всего исправлений: 2)
Ответ на: комментарий от jo_b1ack

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

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

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

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

нагиос не понимает, что статус варнинг не изменился, а список изменился

забикс позволяет создавать тригеры типа

obj:problem_items.last() > 0

и указать в параметре триггера множетсвенное формаированние событий ПРОБЛЕМА

это значит что при каждой отправке zabbix_sender’ом кол-ва отправленных проблемных сервисов будет выполнятся проверка и если она выполнена(в данном случае если сервисов проблемных более 0, не важно какое было предыдущее значение),то будет генерироваться ПРОБЛЕМА и отправлено уведомление.

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

jo_b1ack ★★★★ ()
Последнее исправление: jo_b1ack (всего исправлений: 2)
Ответ на: комментарий от jo_b1ack

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

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

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

мне нужен поименный список элементов чтобы по именам точно определить какие именно проблемные

грепаешь список проблемных локально, создаешь файл key-value.. шлешь их в заббикс забикс_сендером,

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

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

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

jo_b1ack ★★★★ ()
Последнее исправление: jo_b1ack (всего исправлений: 1)

По идее zabbix должен уметь такое.
Например, создаём элемент данных, который от вашего скрипта получает список проблемных сервисов, либо «OK», если проблем нет.
Вешаем на него триггер с выражением, проверяющим наличие изменения, и что текущее значение не «OK»:

{template_service:broken_services.change()}=1 and {template_service:broken_services.str(OK)}=0
Триггер будет переходить в состояние «OK» при получении значения «ОК» или когда нет изменений. Последнее нам не подходит, поэтому уточняем
Генерация ОК событий = Выражение восстановления
и задаём выражение:
{template_service:broken_services.str(OK)}=1

Теперь если не-OK и нет изменений, триггер будет оставаться в состоянии «ПРОБЛЕМА».
https://www.zabbix.com/documentation/4.0/ru/manual/config/triggers/trigger

Для отправки одного сообщения о проблеме по каждому списку сломавшихся сервисов нужно в «Действии» во вкладке «Операции» указать отправку уведомления только для шага «1». А в триггере включить
Режим генерации событий ПРОБЛЕМА = Множественный
В итоге будет уходить одно уведомление на каждую проблему + уведомление о восстановлении.

забикс сможет заслать многострочный поименный список в оповещении?

Да, может, в сообщении можно указывать макрос {ITEM.LASTVALUE} (либо засунуть его в {TRIGGER.DESCRIPTION}).
Правда в zabbix-4.0 что-то сломали/переделали по части {ITEM.LASTVALUE}, но для множественных проблем по идее должен работать.

spirit ★★★★★ ()

Также можно рассмотреть и вариант с Prometheus-ом. Он умеет получать метрики целой пачкой.
Пишется exporter - простой http сервис, который на запрос http://x.x.x.x:порт/metrics выдаёт текстовый список метрик со значениями:

service_status{service_name="name1"} 1
service_status{service_name="name2"} 1
service_status{service_name="name3"} 0
.....
Exporter будет делать опрос сервиса на предмет OK-списка, и в полном выставить =1 тем элементам, которые OK, остальным - =0. Следовательно prometheus всегда будет получать полный список со статусами.

Далее, для отправки уведомлений используется alertmanager, который умеет делать группировку по заданным меткам метрик:
- можно отключать группировку - будет одно сообщение по каждой метрике;
- можно группировать, например, по метке instance - будет группировка всех проблем для одного сервера;
- можно группировать по метке job - будет группировка всех проблем по всем серверам сразу.
Метки job и instance ко всем метрикам добавляются автоматически.
https://prometheus.io/docs/alerting/alertmanager/
https://prometheus.io/docs/alerting/configuration/#route (см. group_by)

Правда не уверен можно ли сделать так, чтоб «а надо чтобы повторял, и не повторял если список не менялся».
Повторять отсылку уведомлений можно, а вот можно ли сделать так, чтоб это происходило только при изменении списка проблем, не подскажу.
Вроде как в описании group_interval что-то такое есть.

spirit ★★★★★ ()
Ответ на: комментарий от deep-purple

эм, пуш? это когда сервис сообщает о своем статусе, а пулл когда мониторинг запрашивает у сервиса?

Верно

сервис не умеет в пуш.

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

GOMO88 ()
Последнее исправление: GOMO88 (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Я не пойму, ты траллируешь что ли?

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

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

Тебе нужно, чтобы самому ничего не делать? Найди человека, который уже решал задачу с конкретно этим «неким сервисом» на 2к элементов на интервале 1 минута и спроси его.

Тебе нужно, чтобы твой сервис мониторился? Напиши плагин, который будет возвращать OK/WARNING в exitcode, количество проблемных элементов в $SERVICEPERFDATA$, список проблемных элементов в $SERVICEOUTPUT$ в любом удобном тебе формате. Плагин потребует меньше времени и нажатий клавиш, чем ты уже потратил на этот тред.

muon ★★★★ ()
Последнее исправление: muon (всего исправлений: 2)

Однако, сервис имеет возможность по одному запросу выдать список всех НЕ проблемных элементов.

вот же решение

напиши плагин (10 мин.), в нём сравни с полным списком, в комментарии перечисли проблемные == один запрос

anonymous ()
Ответ на: комментарий от anonymous

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

  1. дёрнул один раз curl, получил список listResponceOK
  2. сравнил с двумя списками:
    • isCritical = [x for x in defCritical if x not in listResponceOK]
    • isWarning = [x for x in defWarning if x not in listResponceOK]
  3. вывел вычисленные разницы с пометками CRIT: и WARN: в комментарий, отдаваемый плагином (стандартно)
  4. вычислил итоговое состояние
    • если isCritical не пуст – exit 1 красный статус,
    • иначе смотришь на список isWarning не пуст – exit 2 жёлтый статус,
    • иначе – exit 0 т.е. зелёный статус Ok (isCritical & isWarning пусты)
  5. итого один семафор с тремя состояниями {зелёный, жёлтый, красный}, с подробностями внутри в комментарии
anonymous ()
Ответ на: комментарий от anonymous

Короче.

Остаюсь на нагиосе. Работать будет так:

Нам не важно что там за конкретный статус, отличный от ОК. Т.е. варнинг и критикал для нас — одно и то же. Вот за это и зацепимся.

Нагиос вызывает внешний скрипт (плагин). Скрипт хранит для себя в файле результаты предыдущего опроса сервиса. Скрипт всегда возвращает результат нагиосу.

В статусах возвращаются только ОК, варнинг или критикал.

1) ОК возвращается только при пустом списке.

2) При не пустом списке (есть проблемные элементы):

а) если ранее был отправлен ОК — возвращаются варнинг статус и список.

б) если ранее был не ОК и ранее полученный список не идентичен полученному сейчас — свопаем запомненный статус с варнинга на критикал или наоборот, если ранее был критикал и возвращаем статус + список. Конечно, если список пуст, то возвращаем ОК.

muon, GOMO88, spirit, jo_b1ack, heilnull

deep-purple ★★★★★ ()