Zabbix Log Monitoring: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
(не показано 14 промежуточных версий этого же участника) | |||
Строка 2: | Строка 2: | ||
[[Категория:Linux]] |
[[Категория:Linux]] |
||
[[Категория:Monitoring]] |
[[Категория:Monitoring]] |
||
+ | [[Категория:Мониторинг]] |
||
=Zabbix Мониторинг логов= |
=Zabbix Мониторинг логов= |
||
+ | <B>Это практически первый мой опыт с заббиксом. Если есть ошибки или сделано неоптимально - просьба сообщить</B> |
||
+ | <BR> |
||
+ | |||
+ | Задача: есть приложение на PHP. Время от времени в логах - ошибки о которых нужно сообщать разработчикам. В лоб воспроизвести ошибки нельзя - они возникают по неясной мне причине. |
||
+ | <BR> |
||
+ | Кроме того хочется реализовать следующий workflow для разработчиков |
||
+ | |||
+ | * При возникновении ошибки (строка в логах) - поднять алерт (триггер) |
||
+ | * При повторном появлении строки - триггер остается поднятым |
||
+ | * При отсутствии новых ошибок триггер остается поднятым |
||
+ | * Ack подразумевает что разработчик посмотрел на ошибку в логах и начал с ней работать. При нажатии Ack триггер тухнет. |
||
+ | |||
+ | |||
+ | <BR> |
||
+ | Из-коробки в заббиксе нет ручного выключения триггерров. Отсюда несколько странная логика работы |
||
+ | |||
+ | |||
+ | * На агенте: анализируем строку и шлем через zabbix_sender данные в соответствующий item |
||
+ | * В триггере проверяем данные из item на соответствие и поднимаем триггер |
||
+ | * В триггере есть action который имеет условие Ack = True (и соответственно не работает сразу после поднятия триггера) |
||
+ | * Action содержит команду которая отправит в item данные заведомо не подходящие под условие триггера. Что соответственно вызывает его опускание. |
||
+ | |||
+ | |||
+ | Бегло прикинуть какие ошибки бывают: |
||
<PRE> |
<PRE> |
||
cat sample1 | grep --color '\[error\]' | sed 's~2016/06/1[0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] \[error\] [0-9]*#0: \*[0-9]*~~' | sed 's~client: [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*,~~' | sed 's~/adrequest.php?order_line_id.*\ HTTP~/adrequest.php~g' | sed 's~GET d=.*HTTP~GET d=.~g' | sed '~adrequest.php?publisher_id.*\HTTP~HTTP~g'| grep 'PHP' | sort | uniq |
cat sample1 | grep --color '\[error\]' | sed 's~2016/06/1[0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] \[error\] [0-9]*#0: \*[0-9]*~~' | sed 's~client: [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*,~~' | sed 's~/adrequest.php?order_line_id.*\ HTTP~/adrequest.php~g' | sed 's~GET d=.*HTTP~GET d=.~g' | sed '~adrequest.php?publisher_id.*\HTTP~HTTP~g'| grep 'PHP' | sort | uniq |
||
</PRE> |
</PRE> |
||
+ | Ошибки 3 типов (внезапно!): |
||
− | |||
<PRE> |
<PRE> |
||
PHP message: PHP Fatal error |
PHP message: PHP Fatal error |
||
Строка 15: | Строка 40: | ||
PHP message: PHP Notice |
PHP message: PHP Notice |
||
</PRE> |
</PRE> |
||
+ | |||
+ | ==Zabbix Server== |
||
+ | ===Item=== |
||
+ | Для каждой из типов ошибок (error, warning, notice) нужно создать свой item: |
||
+ | |||
+ | * Тип - Trap (zabbix_sender работает только с этим типом) |
||
+ | * Тип данных - лог |
||
+ | * Разрешить получение данных со всех хостов |
||
+ | |||
+ | [[Изображение:0001 salt.vena.tv - Configuration of items 2016-06-17 13-44-36.png|600px]] |
||
+ | ===Trigger=== |
||
+ | Триггер содержит простое условие - если строка содержит собщение об ошибке (ворнинг или нотис) - триггер срабатывает |
||
+ | |||
+ | <PRE> |
||
+ | {Additional_Custom_Checks:nginx_err_log_php_error.str(PHP message: PHP Fatal error)}=1 |
||
+ | </PRE> |
||
+ | [[Изображение:002 salt.vena.tv Configuration of triggers 2016-06-17 14-28-04.png|600px]] |
||
+ | |||
+ | |||
+ | ===Action=== |
||
+ | Значение сообщения оставляем по-умолчанию, на первом шаге достаточно задать только уникальное имя. |
||
+ | |||
+ | [[Изображение:99Act1.png|600px]] |
||
+ | |||
+ | Условия срабатывания проблема с триггером PHP: |
||
+ | <PRE> |
||
+ | (A) Maintenance status not in maintenance |
||
+ | (B) Trigger value = PROBLEM |
||
+ | (C) Trigger name like PHP |
||
+ | </PRE> |
||
+ | [[Изображение:99Act2.png|600px]] |
||
+ | |||
+ | Имеется всего один шаг, который будет выполняться "бесконечно", а фактически - один раз, так шаг не будет запускаться до того как не будет поднят флаг Ack (Event acknowledged = Ack) а после поднятия флага Ack первый же запуск потушит триггер. |
||
+ | [[Изображение:99Act3.png|600px]] |
||
+ | |||
+ | Код шага (с дебагом): <BR> |
||
+ | |||
+ | <PRE> |
||
+ | date >/tmp/ack.log |
||
+ | |||
+ | echo {ITEM.KEY1} >> /tmp/ack.log |
||
+ | echo /usr/bin/zabbix_sender -vvv -z <ТУТ_АДРЕС_ЗАББИКС_СЕРВЕРА> -s "{HOST.HOST1}" -k {ITEM.KEY1} -o '-----' >> /tmp/ack.log |
||
+ | |||
+ | /usr/bin/zabbix_sender -vvv -z <ТУТ_АДРЕС_ЗАББИКС_СЕРВЕРА> -s "{HOST.HOST1}" -k {ITEM.KEY1} -o '-----' > /tmp/sender.log 2>/tmp/sender.log |
||
+ | </PRE> |
||
+ | |||
+ | ==Настройка на стороне агента== |
||
+ | На агенте нужно настроить отправку логов через zabbix_sender.<BR> |
||
+ | Все файлы в /usr/local/zabbix_scripts |
||
+ | <BR> |
||
+ | 3 скрипта |
||
+ | <PRE> |
||
+ | #!/bin/bash -x |
||
+ | |||
+ | |||
+ | ZABBIX_SENDER="/usr/bin/zabbix_sender" |
||
+ | ZABBIX_SENDER_OPTIONS=" -vvvv " |
||
+ | ZABBIX_SERVER="<ТУТ АДРЕС СЕРВЕРА>" |
||
+ | ZABBIX_KEY="nginx_err_log_php_error" |
||
+ | |||
+ | tail -F /var/log/nginx/error.log | while read L; do echo $L | awk -v key="${ZABBIX_KEY}" '/PHP message: PHP Fatal error/ { print "- "key" "$0 }'| ${ZABBIX_SENDER} ${ZABBIX_SENDER_OPTIONS} -z ${ZABBIX_SERVER} -s "$(hostname)" -i /dev/stdin; done |
||
+ | </PRE> |
||
+ | |||
+ | Конструкция while read нужна для того что бы избежать буфферизации. В противном случае к сендеру данные будут попадать пачками и одиночная ошибка может висеть в буффере неопределенно долго |
||
+ | |||
+ | Запускать в скрине: |
||
+ | <PRE> |
||
+ | screen -dmS zbx_nginx_err /usr/local/zabbix_scripts/monitor_nginx_log_error.sh |
||
+ | screen -dmS zbx_nginx_warn /usr/local/zabbix_scripts/monitor_nginx_log_warning.sh |
||
+ | screen -dmS zbx_nginx_notice /usr/local/zabbix_scripts/monitor_nginx_log_notice.sh |
||
+ | </PRE> |
||
+ | |||
+ | <PRE> |
||
+ | screen -x |
||
+ | There are several suitable screens on: |
||
+ | 22143.zbx_nginx_warn (06/17/2016 12:05:25 PM) (Detached) |
||
+ | 22080.zbx_nginx_notice (06/17/2016 12:04:33 PM) (Detached) |
||
+ | 21435.zbx_nginx_err (06/17/2016 11:35:06 AM) (Detached) |
||
+ | </PRE> |
||
+ | |||
+ | |||
+ | Для тестирования можно сделать echo "PHP message: PHP Fatal error" >> /var/log/nginx или отправить эти же данные zabbix_sender-ом. После того как триггер сработает - нажать ack и в течении минуты сообщение о проблеме пропадет. |
Текущая версия на 14:22, 4 апреля 2020
Zabbix Мониторинг логов
Это практически первый мой опыт с заббиксом. Если есть ошибки или сделано неоптимально - просьба сообщить
Задача: есть приложение на PHP. Время от времени в логах - ошибки о которых нужно сообщать разработчикам. В лоб воспроизвести ошибки нельзя - они возникают по неясной мне причине.
Кроме того хочется реализовать следующий workflow для разработчиков
- При возникновении ошибки (строка в логах) - поднять алерт (триггер)
- При повторном появлении строки - триггер остается поднятым
- При отсутствии новых ошибок триггер остается поднятым
- Ack подразумевает что разработчик посмотрел на ошибку в логах и начал с ней работать. При нажатии Ack триггер тухнет.
Из-коробки в заббиксе нет ручного выключения триггерров. Отсюда несколько странная логика работы
- На агенте: анализируем строку и шлем через zabbix_sender данные в соответствующий item
- В триггере проверяем данные из item на соответствие и поднимаем триггер
- В триггере есть action который имеет условие Ack = True (и соответственно не работает сразу после поднятия триггера)
- Action содержит команду которая отправит в item данные заведомо не подходящие под условие триггера. Что соответственно вызывает его опускание.
Бегло прикинуть какие ошибки бывают:
cat sample1 | grep --color '\[error\]' | sed 's~2016/06/1[0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] \[error\] [0-9]*#0: \*[0-9]*~~' | sed 's~client: [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*,~~' | sed 's~/adrequest.php?order_line_id.*\ HTTP~/adrequest.php~g' | sed 's~GET d=.*HTTP~GET d=.~g' | sed '~adrequest.php?publisher_id.*\HTTP~HTTP~g'| grep 'PHP' | sort | uniq
Ошибки 3 типов (внезапно!):
PHP message: PHP Fatal error PHP message: PHP Warning PHP message: PHP Notice
Zabbix Server
Item
Для каждой из типов ошибок (error, warning, notice) нужно создать свой item:
- Тип - Trap (zabbix_sender работает только с этим типом)
- Тип данных - лог
- Разрешить получение данных со всех хостов
Trigger
Триггер содержит простое условие - если строка содержит собщение об ошибке (ворнинг или нотис) - триггер срабатывает
{Additional_Custom_Checks:nginx_err_log_php_error.str(PHP message: PHP Fatal error)}=1
Action
Значение сообщения оставляем по-умолчанию, на первом шаге достаточно задать только уникальное имя.
Условия срабатывания проблема с триггером PHP:
(A) Maintenance status not in maintenance (B) Trigger value = PROBLEM (C) Trigger name like PHP
Имеется всего один шаг, который будет выполняться "бесконечно", а фактически - один раз, так шаг не будет запускаться до того как не будет поднят флаг Ack (Event acknowledged = Ack) а после поднятия флага Ack первый же запуск потушит триггер.
Код шага (с дебагом):
date >/tmp/ack.log echo {ITEM.KEY1} >> /tmp/ack.log echo /usr/bin/zabbix_sender -vvv -z <ТУТ_АДРЕС_ЗАББИКС_СЕРВЕРА> -s "{HOST.HOST1}" -k {ITEM.KEY1} -o '-----' >> /tmp/ack.log /usr/bin/zabbix_sender -vvv -z <ТУТ_АДРЕС_ЗАББИКС_СЕРВЕРА> -s "{HOST.HOST1}" -k {ITEM.KEY1} -o '-----' > /tmp/sender.log 2>/tmp/sender.log
Настройка на стороне агента
На агенте нужно настроить отправку логов через zabbix_sender.
Все файлы в /usr/local/zabbix_scripts
3 скрипта
#!/bin/bash -x ZABBIX_SENDER="/usr/bin/zabbix_sender" ZABBIX_SENDER_OPTIONS=" -vvvv " ZABBIX_SERVER="<ТУТ АДРЕС СЕРВЕРА>" ZABBIX_KEY="nginx_err_log_php_error" tail -F /var/log/nginx/error.log | while read L; do echo $L | awk -v key="${ZABBIX_KEY}" '/PHP message: PHP Fatal error/ { print "- "key" "$0 }'| ${ZABBIX_SENDER} ${ZABBIX_SENDER_OPTIONS} -z ${ZABBIX_SERVER} -s "$(hostname)" -i /dev/stdin; done
Конструкция while read нужна для того что бы избежать буфферизации. В противном случае к сендеру данные будут попадать пачками и одиночная ошибка может висеть в буффере неопределенно долго
Запускать в скрине:
screen -dmS zbx_nginx_err /usr/local/zabbix_scripts/monitor_nginx_log_error.sh screen -dmS zbx_nginx_warn /usr/local/zabbix_scripts/monitor_nginx_log_warning.sh screen -dmS zbx_nginx_notice /usr/local/zabbix_scripts/monitor_nginx_log_notice.sh
screen -x There are several suitable screens on: 22143.zbx_nginx_warn (06/17/2016 12:05:25 PM) (Detached) 22080.zbx_nginx_notice (06/17/2016 12:04:33 PM) (Detached) 21435.zbx_nginx_err (06/17/2016 11:35:06 AM) (Detached)
Для тестирования можно сделать echo "PHP message: PHP Fatal error" >> /var/log/nginx или отправить эти же данные zabbix_sender-ом. После того как триггер сработает - нажать ack и в течении минуты сообщение о проблеме пропадет.