[Из песочницы] Мониторинг PostgreSQL + php-fpm + nginx + диска с помощью Zabbix
Много информации в сети по Zabbix, много и шаблонов самописных, хочу представить на суд аудитории свои модификации.Zabbix — очень удобный и гибкий инструмент мониторинга. Хочешь — сотню мониторь, хочешь — тысячу станций, а не хочешь — следи за одним сервером, снимай сливки во всех разрезах. Буду не против отдать на github, если кто коллекционирует схожие.
Так случилось, что решили мы выложить на хостинг базу данных с оберткой из php-fpm+nginx. В качестве БД — postgres. Мысли собирать данные о работе машины были еще до покупки хостинга — это нужно, это полезно! Волшебным пенделем к внедрению системы послужили тормоза жесткого диска на нашей VDS станции — в начале скриптом каждую минуту кладем время и замерянную скорость в файл, а потом в экселе строим графики, сравниваем как было/стало, снимаем количественную статистику. И это всего один параметр! А вдруг виноват не VDS, а наши приложения, которые на нем работают. Вобщем, мониторить надо много, мониторить надо удобно! Не буду останавливаться на том, как установить сервер, много вариантов и документации по этому поводу полно. Я пользовался официальной: https://www.zabbix.com/documentation/ru/2.2/manual/installation/install_from_packagesВ качестве операционной системы — CentOS 6.5Файлы, которые вам понадобятся — в архиве habr-zabbix-mons.7z
На станцию агента помимо самого zabbix-agent обязательно ставим zabbix-sender:
rpm -Uvh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-2.2.4–1.el6.x86_64.rpm rpm -Uvh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-agent-2.2.4–1.el6.x86_64.rpm rpm -Uvh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-sender-2.2.4–1.el6.x86_64.rpm [root@fliber ~]# vi /etc/zabbix/zabbix_agentd.conf LogFileSize=1 Server=123.45.67.89 ServerActive=123.45.67.89 Вместо 123.45.67.89 — IP машины, где вы установили zabbix-server chkconfig zabbix-agent --level 345 on service zabbix-agent start Мониторим скорость жесткого диска Я пользуюсь программой hdparm. Вы можете использовать другую, если имеете предпочтения: yum install hdparm Выбираем раздел, который будем мониторить: [root@fliber ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda1 219608668 114505872 104106808 78% / tmpfs 11489640 0 11489640 0% /dev/shm Добавляем в /etc/zabbix/zabbix_agentd.d/user.conf UserParameter=hdparm.rspeed, sudo /sbin/hdparm -t /dev/vda1 | awk 'BEGIN{s=0} /MB\/sec/ {s=$11} /kB\/sec/ {s=$11/1024} END{print s}' Разрешаем запуск sudo без консоли (отключаем requiretty) и добавляем команду, которую мы запускаем от имени пользователя zabbix: [root@fliber ~]# visudo #Defaults requiretty zabbix ALL=(ALL) NOPASSWD: /sbin/hdparm -t /dev/vda1 Увеличиваем время на запрос параметра в конфиге агента, т.к. hdparm затрачивает 3–10 и более секунд на замер, в зависимости от скачков по скорости, видимо. [root@fliber ~]# vi /etc/zabbix/zabbix_agentd.conf Timeout=30 service zabbix-agent restart Также и на сервере надо исправить время ожидания ответа агента [root@pentagon ~]# vi /usr/local/etc/zabbix_server.conf Timeout=30 Заходим в Веб-Админку Zabbix и добавляем в конфигурации хосту (Configuration→Hosts→Ваш_сервер_агент→Items) или к какому-нибудь шаблону, например OS Linux (Configuration→Templates→Template OS Linux→Items) новый параметр — жмем «Create Item»: Name: Hdparm: HDD speed Key: hdparm.rspeed Type of information: Numeric (float) Units: MB/s Update interval (in sec): 601 Applications: Filesystems Переходим в «Graphs» → «Ceate graph» Name: Hdparm: HDD read speed Y axis MIN value: Fixed 0.0000 Items: Add: «Hdparm: HDD speed» Готово! У нас есть параметр, и есть граф по нему. Если вы добавляли в шаблон, прикрепите шаблон к хосту. Любуемся!
В нашем случае то, что было до 31.07 — это плохо, хоть и средняя скорость была высокой, но очень часто она спускалась ниже 1МБ/с. Сейчас (после перевода нас на очередную другую ноду) она стабильная и редко опускается, пока был минимум 5–6МБ/с. Думаю, что на прежней ноде она падала совсем не из-за диска, а из-за занятости каких-то других более важных ресурсов, но главное, что мы видим провалы! Хороший параметр, но не снимайте его слишком часто, ведь в эти 3–10 секунд замера диск будет очень занят, рекомендую раз в 10–60 минут, или вообще отключить, если статистика вам понравилась и не будете мучить хостера.
Мониторим логи nginx Казалось бы, зачем мониторить логи? Подключил метрику, да аналитику, и наблюдай все там. Но эти ребята не покажут нам ботов, которые не запускают js на странице, также как и человеков, если у них отключен js. Предлагаемое решение покажет частоту обхода роботами ваших страниц, и поможет предупредить высокую нагрузку на ваш сервер от поисковых ботов. Ну и любую статистику, если поковыряете loghttp.shДобавляем в /etc/zabbix/zabbix_agentd.d/user.conf
UserParameter=log.http.all,/etc/zabbix/scripts/loghttp.sh Кладем loghttp.sh в /etc/zabbix/scripts, в той же папке выполняем chmod o+x loghttp.sh yum install curl chown zabbix: zabbix /etc/zabbix/scripts service zabbix-agent restart Посмотрите имя/IP вашего хоста с агентом в zabbix: Configuration→Hosts→Ваш_сервер_агент. Host name — это будет Ваш_агент_addr [root@fliber ~]# vi loghttp.sh HOST=Ваш_агент_addr SERVER=Ваш_сервер_addr LOG=Путь_к_логу_nginx Импортируем loghttp.xml в шаблоны zabbix: Configuration → Templates, в строке заголовка «CONFIGURATION OF TEMPLATES» ищем справа кнопку «Import», выбираем файл, импортируем.Подключаем шаблон к хосту: Configuration→Hosts→Ваш_сервер_агент, вкладка «Templates», в поле «Link new templates» начинаем писать «Logs», появится выпадающий список — выбираем наш шаблон. «Add», «Save».В шаблоне сказано мониторить лог раз в 10 минут, поэтому не торопитесь смотреть графики, а вот логи проверить можно. На стороне клиента »/var/log/zabbix/zabbix_agentd.log» и на стороне сервера »/tmp/zabbix_server.log» или »/var/log/zabbix/zabbix_server.log».Если все хорошо, то вскоре вы сможете наблюдать подобную картинку:
Google молодец — сканит с одной скоростью, Иногда приходит Mail, редко Bing, а Yahoo и не видать. Yandex с переменным успехом индексирует, но много — еще бы в выдаче показал, было бы замечательно :)На графике Гугл и Яндекс на левой шкале, остальные — на правой. Значение на шкале — количество посещений от замера до замера, тоесть за 10 минут. Можно поставить 1 час, но тогда рискуем пропустить много посещений в момент ротации лога. Бывают неприятные всплески на графике, когда агент почему-то не запускает sh. Лечится прописыванием sh в крон с отключением ping в zabbix.
Мониторим nginx Зачем мониторить nginx — пока не знаю, ни разу проблем с ним не было. Но пусть будет, для статистики. Пробовал использовать набор шаблонов ZTC, но очень уж не нравятся мне мигающие процессы питона в памяти, по 10МБ каждый. Хочу нативно, хочу bash! И главное — за один запрос собрать все параметры. Именно этого я хотел добиться, когда мониторил все службы — минимум нагрузки на сервер и максимум параметров.Подобных скриптов можно найти много, но раз уж я подошел комплексно к мониторингу Веб-сервера, выкладываю свою версию.Научим nginx отдавать статусную страницу, добавим конфигурацию для localhost
server { listen localhost; server_name status.localhost; keepalive_timeout 0; allow 127.0.0.1; deny all; location /server-status { stub_status on; } access_log off; } Не забудьте применить изменения: service nginx reload Добавляем в /etc/zabbix/zabbix_agentd.d/user.conf UserParameter=nginx.ping,/etc/zabbix/scripts/nginx.sh Кладем nginx.sh в /etc/zabbix/scripts, в той же папке выполняем chmod o+x nginx.sh service zabbix-agent restart Если не ставили curl на предыдущем шаге, надо установить: yum install curl [root@fliber ~]# vi nginx.sh HOST=Ваш_агент_addr SERVER=Ваш_сервер_addr Проверьте, на всякий случай, что в переменных SENDER и CURL верные пути.Импортируем loghttp.xml в шаблоны zabbix, подключаем шаблон к хосту.Ну и, наслаждаемся картинками!
Данный монитор умеет информировать о том, что nginx не работает, либо что он начал отвечать слишком медленно. По-умолчанию порог такой: если за последние 10 замеров скорость реакции nginx не опускалась ниже 10 мс, создаем Warning. Монитор сообщит, если сервер вернет некорректный статус (nginx в памяти, а отвечает белибердой).
Мониторим php-fpm Полезно осуществлять, если у вас используется динамический набор процессов (pm = dynamic в /etc/php-fpm.d/www.conf) по умолчанию или осознанно. Монитор умеет предупреждать о недоступности службы, или ее замедлении.Я пытался сделать опрос службы без nginx, но у меня не получилось найти такую установленную программу, которая бы помогла во взаимодействии с php-fpm. Подскажите варианты, если кто знает.Учим nginx отдавать статусную страницу php-fpm, в конфигурации для localhost из примера выше
server {… location ~ ^/(status|ping)$ { include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME status; } …} service nginx reload Возможно, php-fpm не отдает статус, проверим [root@fliber ~]# vi /etc/php-fpm.d/www.conf pm.status_path = /status Если что-то поменяли, применяем: service php-fpm reload Добавляем в /etc/zabbix/zabbix_agentd.d/user.conf UserParameter=php.fpm.ping,/etc/zabbix/scripts/php-fpm.sh Кладем php-fpm.sh в /etc/zabbix/scripts, в той же папке выполняем chmod o+x php-fpm.sh service zabbix-agent restart Если не ставили curl на предыдущих шагах, надо установить: yum install curl [root@fliber ~]# vi nginx.sh HOST=Ваш_агент_addr SERVER=Ваш_сервер_addr Импортируем php-fpm.xml в шаблоны zabbix, подключаем шаблон к хосту.
Мониторим PostgreSQL Это основное блюдо! Его повар готовил дольше всех :)В качестве прототипа был выбран pg_monz — open_source, поддерживается, много параметров, работает с последней версией postgres. Недостаток глобальный — я собираю все параметры по службе, т.к. не знаю, какой из них и когда «выпрыгнет».Когда разобрался с pg_monz и включил сбор всех параметров — по базам и таблицам, всего около 700 штук, нагрузка на сервер увеличилась в 10 раз! (скорее-всего с pgbouncer будет не так заметно) Хотя параметры собирались раз в 300 секунд. Оно и понятно — для каждого параметра запускается psql и выполняет запрос, часто к одним и тем же таблицам, просто к разным полям. В общем — от pg_monz остались только названия полей и таблиц. Ну, пробуем! Добавляем в /etc/zabbix/zabbix_agentd.d/user.conf
UserParameter=psql.ping[*],/etc/zabbix/scripts/psql.sh $1 $2 $3 $4 $5 UserParameter=psql.db.ping[*],/etc/zabbix/scripts/psql_db_stats.sh $1 $2 $3 $4 »$5» UserParameter=psql.db.discovery[*], psql -h $1 -p $2 -U $3 -d $4 -t -c «select '{\«data\»:['||string_agg ('{\»{#DBNAME}\»:\»'||datname||'\»}',',')||' ]}' from pg_database where not datistemplate and datname~'$5'» UserParameter=psql.t.discovery[*],/etc/zabbix/scripts/psql_table_list.sh $1 $2 $3 $4 »$5» »$6» Кладем psql*.sh в /etc/zabbix/scripts, в той же папке выполняем chmod o+x psql*.sh service zabbix-agent restart [root@fliber ~]# vi psql.sh HOST=Ваш_агент_addr SERVER=Ваш_сервер_addr Проверьте, что в переменной PSQLC верный путь до psql.То же сделать с psql_db_stats.shИмпортируем psql.xml в шаблоны zabbix. Если не планируете собирать данные по базам и таблицам, то сразу отключите на вкладке «Discovery» шаблона «PSQL DB list» и «PSQL table list». А если планируете, то для начала задайте макрос на вкладке «Macros» агента {$PGTBL_REGEXP} — имя таблицы, которую будете мониторить подробно. Хотя, скорее всего, в начале вы захотите посмотреть все таблицы :)
Подключаем шаблон к хосту, смотрим как собираются данные…
Все параметры шаблона (унаследованы от pg_monz) и значения их по умолчанию можно посмотреть на вкладке «Macros» шаблона. Попробую сделать описание этих параметров:
Macro По умолчанию Описание {$PGDATABASE} postgres Имя базы данных для подключения {$PGHOST} 127.0.0.1 Хост PostgreSQL (относительно Zabbix агента, если там же: 127.0.0.1) {$PGLOGDIR} /var/lib/pgsql/9.3/data/pg_log Каталог с логами PostgreSQL {$PGPORT} 5432 Номер порта PostgreSQL {$PGROLE} postgres Имя пользователя для подключения к PostgreSQL {$PGDB_REGEXP} .(все базы) Название базы для сбора подробных сведений* {$PGTBL_REGEXP} .(все таблицы) Название таблицы для сбора подробных сведений* {$PGCHECKPOINTS_THRESHOLD} 10 Если количество checkpoint«ов превысит данный порог, сработает триггер {$PGCONNECTIONS_THRESHOLD} 2 Если среднее количество сессий за последние 10 минут превысит установленный порог, сработает триггер {$PGDBSIZE_THRESHOLD} 1073741824 Если размер базы превысит оговоренный лимит в байтах, сработает триггер {$PGTEMPBYTES_THRESHOLD} 1048576 Если скорость записи во временные файлы за последние 10 минут превысит PGTEMPBYTES_THRESHOLD в байтах, сработает триггер {$PGCACHEHIT_THRESHOLD} 90 Если за последние 10 минут среднее попадание в кэш будет ниже порога, сработает триггер на базу {$PGDEADLOCK_THRESHOLD} 0 Как только количество мертвых блокировок превысит установленный предел, сработает триггер {$PGSLOWQUERY_SEC} 1 Если запрос выполняется дольше PGSLOWQUERY_SEC секунд, то считать его медленным {$PGSLOWQUERY_THRESHOLD} 1 Если среднее количество медленных запросов за последние 10 минут превысит порог, то сработает триггер * в качестве параметра используется регулярное выражение, напримерorg — все таблицы и схемы, в которых содержится подстрока org\.(organization|resource|okved)$ — таблицы с именами organization, resource, okved в любой схеме^msn\. — все таблицы в схеме msnПолучается, что параметры {$PGDB_REGEXP} и {$PGTBL_REGEXP} — это не просто названия, это подстрока, которая будет искаться в названиях всех баз данных и схем.таблиц.Только вот регулярки будут работать не все, а только те, в которых не содержатся символы \, ',», `, *, ?, [, ], {, }, ~, $, !, &, ;, (,), <, >, |, #, @, 0×0a. Если вы хотите снять это ограничение, отредактируйте /etc/zabbix/zabbix_agentd.conf
UnsafeUserParameters=1 После этого останется только использовать двойную кавычку » чтобы поставить одинарную. Почитать про регулярки в PostgreSQL можно тут: www.postgresql.org/docs/9.3/static/functions-matching.html#FUNCTIONS-POSIX-REGEXPЕсли у вас не появляется параметр «PSQL error log», то скорее всего не верно задан путь {$PGLOGDIR} — поищите на агенте файлик «postgresql-Sun.log» — где он лежит, эту папку и записывайте в макрос.
Мониторим php-opcache Как принято в лучших домах — десерт! В данной статье просматривается вся цепочка — от запроса пользователя до данных, кроме одного узла — самого php. Чтобы чуть чуть приоткрыть этот ящик, попробуем собрать статистику встроенного в php5 ускорителя opcache функцией opcache_get_status.Учим nginx возвращать статусную страницу, в конфигурации для localhost из примера выше
server {… location /opc-status { include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /etc/zabbix/scripts/php-opc.php; } …} service nginx reloadДобавляем в /etc/zabbix/zabbix_agentd.d/user.conf
UserParameter=php.opc.ping,/etc/zabbix/scripts/php-opc.sh UserParameter=php.opc.discovery,/etc/zabbix/scripts/php-opc.sh discover Кладем php-opc.* в /etc/zabbix/scripts, в той же папке выполняем chmod o+r php-opc.php chmod o+x php-opc.sh service zabbix-agent restart Если не ставили curl на предыдущих шагах, надо установить: yum install curl [root@fliber ~]# vi php-opc.sh HOST=Ваш_агент_addr SERVER=Ваш_сервер_addr Чтобы отключить discovery (с разгрузкой сети) — отредактируйте php-opc.php $DISCOVERY=false Импортируем php-opc.xml в шаблоны zabbix, подключаем шаблон к хосту.
Пока создавал триггеры, уменьшил размеры памяти на кэш для своего opcache в 2 раза. Так-что полезно видеть и эту статистику. Если бы проект на этом сервере не пополнялся новыми модулями, то уменьшил бы в 4 раза легко.
Заключение Пока не знаю, какие еще параметры можно промониторить. Это основные сервисы, которые работают на нашей VDS-машине. Как наберется — поделюсь, конечно.Подход можно обсуждать — конфиг можно общий сделать, передавать параметры через PostgreSQL, как сделано в pg_monz. У меня получились отдельные примочки для каждой службы, и это тоже неплохо — взял конфиг, настроил, прописал, залил шаблон — готово. Не надо сразу разбираться с макросами, параметрами и всей глубиной zabbix.Но если собирать эти мониторы в один пакет, то, конечно, надо вводить стандарты на такие вещи. Если кто займется, готов адаптировать свои мониторы под один стандарт. Мне кажется, идея с конфигурацией через макросы — достаточно неплохая.Версии CentOS release 6.5 (Final)ZabbixServer 2.2.4ZabbixAgent 2.2.4hdparm 9.43nginx 1.6.1php-fpm 5.3.3PostgreSQL 9.3.4php-opcache 5.5.15Все скриншоты сняты со статистики сервера http://www.fliber.net, регистрация — только для юридических лиц.Шаблоны и скрипты тут: http://www.fliber.net/assets/for_articles/2014–08-habr-zabbix-mons.7z