Zabbix Log Monitoring: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показано 15 промежуточных версий этого же участника)
Строка 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>
  +
PHP message: PHP Fatal error
  +
PHP message: PHP Warning
  +
PHP message: PHP Notice
  +
</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 и в течении минуты сообщение о проблеме пропадет.

Текущая версия на 15: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 работает только с этим типом)
  • Тип данных - лог
  • Разрешить получение данных со всех хостов

0001 salt.vena.tv - Configuration of items 2016-06-17 13-44-36.png

Trigger

Триггер содержит простое условие - если строка содержит собщение об ошибке (ворнинг или нотис) - триггер срабатывает

{Additional_Custom_Checks:nginx_err_log_php_error.str(PHP message: PHP Fatal error)}=1

002 salt.vena.tv Configuration of triggers 2016-06-17 14-28-04.png


Action

Значение сообщения оставляем по-умолчанию, на первом шаге достаточно задать только уникальное имя.

99Act1.png

Условия срабатывания проблема с триггером PHP:

(A)	Maintenance status not in maintenance	
(B)	Trigger value = PROBLEM	
(C)	Trigger name like PHP

99Act2.png

Имеется всего один шаг, который будет выполняться "бесконечно", а фактически - один раз, так шаг не будет запускаться до того как не будет поднят флаг Ack (Event acknowledged = Ack) а после поднятия флага Ack первый же запуск потушит триггер. 99Act3.png

Код шага (с дебагом):

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 и в течении минуты сообщение о проблеме пропадет.