Мониторинг UWSGI-службы при помощи Zabbix


Написать эту документацию я решил после того как понял, что документация по этому вопросу невероятно скудная и выглядит собственно вот так:

zabbix

    Type: raw
    Plugin: zabbix
    Syntax: --stats-push zabbix:address[,prefix]

Push metrics to a zabbix server.

The plugin exposes a --zabbix-template option that will generate a zabbix template (on stdout or in the specified file) containing all of the exposed metrics as trapper items.

Note
On some Zabbix versions you will need to authorize the IP addresses allowed to push items.

Казалось бы, ок и сейчас за две секунды все решим, но все так просто и если вы запустите процесс uwsgi указанными в документации параметрами:

# uwsgi --plugin zabbix --zabbix-template
*** Starting uWSGI 2.0.12-debian (64bit) on [Wed Mar  6 13:43:44 2019] ***
compiled with version: 5.4.0 20160609 on 28 September 2018 15:49:44
....
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
The -s/--socket option is missing and stdin is not a socket.

То теоретически, я должен был бы получить шаблон для заббикс, а не сообщение о ошибке. Как оказалось, все совершенно не так как написано в инструкции. Итак поехали как обычно на практическом примере.

У меня есть uwsgi-файл для запуска разрабатываемого на данный момент web-приложения (с корого меня сильно интересует статистика):

[uwsgi]
http-socket = 127.0.0.1:8000
plugins = python3
virtualenv = /var/www/vhosts/itjob4me/venv/
chdir = /var/www/vhosts/itjob4me/itjob4me/
env = DJANGO_SETTINGS_MODULE=itjob4me.settings
uid = www-data
gid = www-data
processes = 5
threads = 5
master = true
module = itjob4me.wsgi:application

Как вы наверное понимаете, в секцию плагинов нам надо добавить zabbix:

plugins = python3, zabbix

И теперь нам надо запустить этот ini-файл как uwsgi-процесс, но дополнительно передать ему параметр --zabbix-template, но запускать мы его будем от имени пользователя www-data который является системным и shell для него заблокирован. Но это совершенно не проблема и если вы root, то вам в принципе можно все чего только пожелаете:

# su www-data -s /bin/bash
$ uwsgi --ini ./itjob4me.gita-dev.ru.ini --zabbix-template

И вот теперь, то в консольном выводе данных мы и увидим искомый zabbix-шаблон:

<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
<version>2.0</version><groups><group><name>uWSGI</name></group></groups>
        <templates><template><template>uWSGI metrics</template><name>uWSGI metrics</name>
        <groups><group><name>uWSGI</name></group></groups>
        <items>
                <item>
                        <name>core.routed_signals</name>
                        <type>2</type>
                        <key>core.routed_signals</key>
                        .....
                        <value_type>3</value_type>
                </item>
                <item>
                        <name>vsz_size</name>
                        <type>2</type>
                        <key>vsz_size</key>
                        <value_type>3</value_type>
                </item>
        </items></template></templates>
</zabbix_export>

Разумнее конечно просто перенаправить вывод данных в файл и сохранить готовый шаблон:

$ uwsgi --ini ./itjob4me.gita-dev.ru.ini --zabbix-template > /tmp/uwsgi_zabbix.template

Созданный шаблон мы загружаем в Zabbix и получаем следующую ошибку:

Invalid tag "/zabbix_export/templates/template(1)/items/item(1)": the tag "snmp_community" is missing.

Шаблон поготовлен для zabbix аж второй версии и требует некоторых правок, а точнее вам необходимо к каждому элементу <item> добавить следующую конструкцию:

                    <allowed_hosts/>
                    <units/>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <params/>
                    <ipmi_sensor/>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>UWSGI</name>
                        </application>
                    </applications>
                    <valuemap/>
                    <logtimefmt/>
                    <preprocessing/>
                    <jmx_endpoint/>
                    <timeout>3s</timeout>
                    <url/>
                    <query_fields/>
                    <posts/>
                    <status_codes>200</status_codes>
                    <follow_redirects>1</follow_redirects>
                    <post_type>0</post_type>
                    <http_proxy/>
                    <headers/>
                    <retrieve_mode>0</retrieve_mode>
                    <request_method>0</request_method>
                    <output_format>0</output_format>
                    <allow_traps>0</allow_traps>
                    <ssl_cert_file/>
                    <ssl_key_file/>
                    <ssl_key_password/>
                    <verify_peer>0</verify_peer>
                    <verify_host>0</verify_host>
                    <master_item/>

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

Подробный мониторинг UWSGI-сервера при помощи Zabbix

Возвращаемся в консоль сервера и изменяем конфигурацию запуска uwsgi-приложения добавляя опцию отправки статистики zabbix-серверу:

[uwsgi]
http-socket = 127.0.0.1:8000
plugins = python3, zabbix
virtualenv = /var/www/vhosts/itjob4me/venv/
chdir = /var/www/vhosts/itjob4me/itjob4me/
env = DJANGO_SETTINGS_MODULE=itjob4me.settings
uid = www-data
gid = www-data
processes = 5
threads = 5
master = true
module = itjob4me.wsgi:application
stats-push = zabbix:10.212.0.7:10051

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

Если у вас возникли проблемы c метриками, то вы можете использовать tcpdump для отлова передаваемых значений:

# tcpdump -n -vvv -A -i tap-master-1 port 10051

И первое на что стоит обратить внимание, это параметр host, он естественно должен совпадать с назначенным хосту в web-интерфейсе zabbix:

{"host":"micro-sites","key":"uwsgi.worker.4.core.4.write_errors","value":"0"}