Всем привет. Меня зовут Игорь, я Tech Lead команды DevOps-инженеров и активно развиваю направления мониторинга в компании. В продолжение статьи своего коллеги по цеху @EvgenNet хочу познакомить вас с шаблоном для Zabbix и дашбордом в Grafana для визуализации активности пользователей OpenVPN. Возьмите вкусняшек, чайку и присаживайтесь поудобнее.
Предыстория
Далеко в 2019 году появилась потребность смотреть статистику по пользователям не только в реальном времени, но и за определённый промежуток. Есть такой инструмент https://github.com/furlongm/openvpn-monitor, он позволяет в реальном времени смотреть из какой страны подключён пользователь, с какими IP-адресами и какой трафик через него проходит. Как раз в это время мы активно использовали Influx и все бизнес-метрики были именно там. Недолго думая, я решил немного переделать скрипт под вывод метрик в формате Influx для Telegraf-агента и накидать небольшой дашборд для Grafana. Кому интересен скрипт и дашборд — велком в личку.
Вывод скрипта
./openvpn-monitor.py exec,username=user1 local_ip="10.20.30.176",remote_ip="192.168.1.223",bytes_recv=297964i,bytes_sent=2788764i,connected_since="2019-02-22 11:44:38",last_seen="ERROR",total_time="0:29:04" exec,username=user2 local_ip="10.20.40.185",remote_ip="192.168.2.142",bytes_recv=311415i,bytes_sent=2181895i,connected_since="2019-02-22 11:48:09",last_seen="ERROR",total_time="0:25:33" exec,username=user3 local_ip="10.20.50.170",remote_ip="192.168.3.248",bytes_recv=651527i,bytes_sent=11307713i,connected_since="2019-02-22 11:16:13",last_seen="ERROR",total_time="0:57:29"
Конфигурация для Telegraf-агента
[[inputs.exec]] interval = "1m" commands = ["python /usr/local/bin/openvpn-monitor.py"] timeout = "20m" name_suffix = "_openvpn" data_format = "influx" [[outputs.influxdb]] urls = ["http://influx.example.com:8086"] # required database = "openvpn" # required username = "user" password = "pass" namepass = ["exec_openvpn*"] retention_policy = "" write_consistency = "any" timeout = "5s" ## Compress each HTTP request payload using GZIP. content_encoding = "gzip"
Всё это великолепие работало и радовало своих потребителей до тех пор, пока мы не начали переезжать на новую архитектуру OpenVPN и не стали отказываться от Influx. Теперь необходимо было затащить всё под Zabbix, а @EvgenNetдоблестно вызвался написать скрипт.
Предварительная настройка
Всё, от чего мы пляшем — это ограничения текстовых данных (массив, который мы будем предварительно обрабатывать и создавать метрики на основе прототипов).
Text data limits depend on the database backend. Before storing text values in the database they get truncated to match the database value type limit.
|
Database |
Type of information |
||
|
|
Character |
Log |
Text |
|
MySQL |
255 characters |
65536 bytes |
65536 bytes |
|
PostgreSQL |
255 characters |
65536 characters |
65536 characters |
|
Oracle |
255 characters |
65536 characters |
65536 characters |
Так как мы используем PostgreSQL и упираемся в 65 536 символов, то решили разделить сотрудников по их ролям/профилям:
-
Админы;
-
Бизнес;
-
Разработка;
-
Мобилки;
-
Безопасность.
Для сбора данных нам необходимо раскидать UserParameter и скрипт на серверы с OpenVPN:
userparameter_openvpn.conf
UserParameter=discovery.openvpn[*], /usr/bin/openvpn-mon.py $1
Скрипт принимает на вход один аргумент из списка:
-
admin; -
bs; -
dev; -
mobile; -
sec.
Создание шаблона в Zabbix
Приступаем к созданию самого шаблона, нам необходимо создать мастер-элементы (Items) для каждой пользовательской роли:
|
Name |
Key |
Interval |
Type of information |
Type |
|
Get openvpn admin users |
discovery.openvpn[admin] |
5m |
Text |
Zabbix agent |
|
Get openvpn business users |
discovery.openvpn[bs] |
5m |
Text |
Zabbix agent |
|
Get openvpn develop users |
discovery.openvpn[dev] |
5m |
Text |
Zabbix agent |
|
Get openvpn mobile users |
discovery.openvpn[mobile] |
5m |
Text |
Zabbix agent |
|
Get openvpn security users |
discovery.openvpn[sec] |
5m |
Text |
Zabbix agent |
Теперь необходимо создать правила обнаружения (Discovery rules) с зависимыми элементами:
|
Name |
Key |
Type |
|
Get openvpn admin users: Discovery admin stats |
get.openvpn.admin.stats |
Dependent item |
|
Get openvpn business users: Discovery business stats |
get.openvpn.business.stats |
Dependent item |
|
Get openvpn develop users: Discovery develop stats |
get.openvpn.develop.stats |
Dependent item |
|
Get openvpn mobile users: Discovery mobile stats |
get.openvpn.mobile.stats |
Dependent item |
|
Get openvpn security users: Discovery security stats |
get.openvpn.security.stats |
Dependent item |
Тут остановимся и разберём подробнее на примере Discovery admin stats:
-
Discovery rule
-
Name: Discovery admin stats.
-
Type: Dependent item.
-
Key: get.openvpn.admin.stats.
-
Master item: Get openvpn admin users — выбираем из выпадающего списка элемент, с которым будем работать.
-
Keep lost resources period: 90d.
-
-
Preprocessing — не используем.
-
LLD Macros (LLD macro : JSONPath) — вытаскиваем в макросы необходимую на в будущем информацию.
-
{#OVPN_CODE} : $..code.first() -
{#OVPN_ENV} : $..env.first() -
{#OVPN_USER} : $..user.first()
-
-
Filters — не используем.
-
Overrides — не используем.
Теперь необходимо создать прототипы элементов (Item prototypes), на их основе будут автоматически создаваться элементы (Items) под каждого нового пользователя. Разберу на примере одного из 9 элементов, а остальные сведу в таблицу:
-
Item prototype
-
Name: OpenVPN bytes received by
{#OVPN_USER}. -
Type: Dependent item.
-
Key:
bytes_r.openvpn[{#OVPN_USER},admin]. -
Type of information: Numeric (unsigned).
-
Master item: Get openvpn admin users — выбираем из выпадающего списка элемент, с которым будем работать.
-
Units: B.
-
-
Tags
-
Application: OpenVPN.
-
Country:
{#OVPN_CODE}. -
Department:
{#OVPN_ENV}. -
User:
{#OVPN_USER}.
-
-
Preprocessing
-
1: JSONPath:
$.data.[?(@.user=='{#OVPN_USER}')].bytes_r.first(). -
2: Simple change.
-
Список прототипов элементов
Для примера я взял роль/профиль админов:
|
Name |
Key |
Type of information |
Units |
Preprocessing |
|
OpenVPN bytes received by {#OVPN_USER} |
bytes_r.openvpn[{#OVPN_USER},admin] |
Numeric (unsigned) |
B |
1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].bytes_r.first() 2: Simple change |
|
OpenVPN bytes sent by {#OVPN_USER} |
bytes_s.openvpn[{#OVPN_USER},admin] |
Numeric (unsigned) |
B |
1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].bytes_s.first() 2: Simple change |
|
OpenVPN connected since by {#OVPN_USER} |
unix_time.openvpn[{#OVPN_USER},admin] |
Numeric (unsigned) |
unixtime |
1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].unix_time.first() |
|
OpenVPN connected since by {#OVPN_USER} |
con_time.openvpn[{#OVPN_USER},admin] |
Character |
|
1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].con_time.first() |
|
OpenVPN country of connection by {#OVPN_USER} |
code.openvpn[{#OVPN_USER},admin] |
Character |
|
1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].code.first() |
|
OpenVPN department of connection by {#OVPN_USER} |
env.openvpn[{#OVPN_USER},admin] |
Character |
|
1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].env.first() |
|
OpenVPN real ip gotten by {#OVPN_USER} |
real_ip.openvpn[{#OVPN_USER},admin] |
Character |
|
1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].real_ip.first() |
|
OpenVPN total online by {#OVPN_USER} |
duration.openvpn[{#OVPN_USER},admin] |
Numeric (unsigned) |
s |
1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].duration.first() |
|
OpenVPN vpn ip gotten by {#OVPN_USER} |
vpn_ip.openvpn[{#OVPN_USER},admin] |
Character |
|
1: JSONPath: $.data.[?(@.user=='{#OVPN_USER}’)].vpn_ip.first() |
И так для каждой пользовательской роли/профиля. Получается 5 правил обнаружения, и в каждом правиле по 9 прототипов элементов. Почему же две OpenVPN connected since by {#OVPN_USER}?
-
unixtimeконвертирует сам Zabbix и отображает корректную дату подключения. -
Строка с датой для Grafana, ибо она не умеет в
unixtime, а когда научится — мы её удалим.
Под спойлером сам шаблон, надеюсь, он вам пригодится.
template_app_openvpn.yaml
zabbix_export: version: '6.0' date: '2023-07-06T19:05:17Z' groups: - uuid: 7df96b18c230490a9a0a9e2307226338 name: Templates templates: - uuid: 5923ee2fbec145b18d823dfa94df7bc8 template: 'Template App OpenVPN' name: 'Template App OpenVPN' groups: - name: Templates items: - uuid: e656bbb1bf5042978a021b8540716f40 name: 'Get openvpn admin users' key: 'discovery.openvpn[admin]' delay: 5m history: 14d trends: '0' value_type: TEXT tags: - tag: Application value: 'Zabbix raws' - uuid: d22796d8741744e386b0cfd6872bd86e name: 'Get openvpn business users' key: 'discovery.openvpn[bs]' delay: 5m history: 14d trends: '0' value_type: TEXT tags: - tag: Application value: 'Zabbix raws' - uuid: f56db6ba3c0d41c9a025701e1f3cfc10 name: 'Get openvpn develop users' key: 'discovery.openvpn[dev]' delay: 5m history: 14d trends: '0' value_type: TEXT tags: - tag: Application value: 'Zabbix raws' - uuid: fd71ad243f5c41e2bc7afd8f2575cbd5 name: 'Get openvpn mobile users' key: 'discovery.openvpn[mobile]' delay: 5m history: 14d trends: '0' value_type: TEXT tags: - tag: Application value: 'Zabbix raws' - uuid: 525ca7181d234482b7310061d0fcaefa name: 'Get openvpn security users' key: 'discovery.openvpn[sec]' delay: 5m history: 14d trends: '0' value_type: TEXT tags: - tag: Application value: 'Zabbix raws' discovery_rules: - uuid: baeaac7dc625495e88cd31b0c1eb8d5e name: 'Discovery admin stats' type: DEPENDENT key: get.openvpn.admin.stats delay: '0' lifetime: 90d item_prototypes: - uuid: 0b5ab8b304624c7fa674c1a0d7c3c7fe name: 'OpenVPN bytes received by {#OVPN_USER}' type: DEPENDENT key: 'bytes_r.openvpn[{#OVPN_USER},admin]' delay: '0' history: 7d units: B preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_r.first()' - type: SIMPLE_CHANGE parameters: - '' master_item: key: 'discovery.openvpn[admin]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 81c4e81957d3445bac60b4d01f66d77b name: 'OpenVPN bytes sent by {#OVPN_USER}' type: DEPENDENT key: 'bytes_s.openvpn[{#OVPN_USER},admin]' delay: '0' history: 7d units: B preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_s.first()' - type: SIMPLE_CHANGE parameters: - '' master_item: key: 'discovery.openvpn[admin]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 9fe06c0a371142b5b0e5c02fe687d373 name: 'OpenVPN country of connection by {#OVPN_USER}' type: DEPENDENT key: 'code.openvpn[{#OVPN_USER},admin]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].code.first()' master_item: key: 'discovery.openvpn[admin]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 07499de2e96c40d4ba91ac4d4e6c2819 name: 'OpenVPN connected since by {#OVPN_USER}' type: DEPENDENT key: 'con_time.openvpn[{#OVPN_USER},admin]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].con_time.first()' master_item: key: 'discovery.openvpn[admin]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: d1a9d74555b6405e97490cec6efe5f8d name: 'OpenVPN total online by {#OVPN_USER}' type: DEPENDENT key: 'duration.openvpn[{#OVPN_USER},admin]' delay: '0' history: 7d units: s preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].duration.first()' master_item: key: 'discovery.openvpn[admin]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 9194cada5a924a5da76680d80b99c05c name: 'OpenVPN department of connection by {#OVPN_USER}' type: DEPENDENT key: 'env.openvpn[{#OVPN_USER},admin]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].env.first()' master_item: key: 'discovery.openvpn[admin]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 05c5aa9e98aa4b16a69e1ca60b7c4c04 name: 'OpenVPN real ip gotten by {#OVPN_USER}' type: DEPENDENT key: 'real_ip.openvpn[{#OVPN_USER},admin]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].real_ip.first()' master_item: key: 'discovery.openvpn[admin]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 3ef110acde6842168cbaa7c70afd5afe name: 'OpenVPN connected since by {#OVPN_USER}' type: DEPENDENT key: 'unix_time.openvpn[{#OVPN_USER},admin]' delay: '0' history: 7d units: unixtime preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].unix_time.first()' master_item: key: 'discovery.openvpn[admin]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 5aa04efb0bd74e2c865d3f4a9b9cdb4a name: 'OpenVPN vpn ip gotten by {#OVPN_USER}' type: DEPENDENT key: 'vpn_ip.openvpn[{#OVPN_USER},admin]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].vpn_ip.first()' master_item: key: 'discovery.openvpn[admin]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' master_item: key: 'discovery.openvpn[admin]' lld_macro_paths: - lld_macro: '{#OVPN_CODE}' path: $..code.first() - lld_macro: '{#OVPN_ENV}' path: $..env.first() - lld_macro: '{#OVPN_USER}' path: $..user.first() - uuid: 4ef4d0675fff4bbb829ee0c7848ff6d8 name: 'Discovery business stats' type: DEPENDENT key: get.openvpn.bussines.stats delay: '0' lifetime: 90d item_prototypes: - uuid: 0fce2e7ac92e472bbe12fb131ff53b08 name: 'OpenVPN bytes received by {#OVPN_USER}' type: DEPENDENT key: 'bytes_r.openvpn[{#OVPN_USER},busines]' delay: '0' history: 7d units: B preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_r.first()' - type: SIMPLE_CHANGE parameters: - '' master_item: key: 'discovery.openvpn[bs]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: ea4a01e3fd864e5a9f6b1b9d4f19f57e name: 'OpenVPN bytes sent by {#OVPN_USER}' type: DEPENDENT key: 'bytes_s.openvpn[{#OVPN_USER},busines]' delay: '0' history: 7d units: B preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_s.first()' - type: SIMPLE_CHANGE parameters: - '' master_item: key: 'discovery.openvpn[bs]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 1c03acadf4bf47feb2e7563eb89bf0b0 name: 'OpenVPN country of connection by {#OVPN_USER}' type: DEPENDENT key: 'code.openvpn[{#OVPN_USER},busines]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].code.first()' master_item: key: 'discovery.openvpn[bs]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 3bf56ef8c86f46c2acdb737f68d0bfc0 name: 'OpenVPN connected since by {#OVPN_USER}' type: DEPENDENT key: 'con_time.openvpn[{#OVPN_USER},busines]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].con_time.first()' master_item: key: 'discovery.openvpn[bs]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 88fff908f7fc4a18be4547915b0ec73d name: 'OpenVPN total online by {#OVPN_USER}' type: DEPENDENT key: 'duration.openvpn[{#OVPN_USER},busines]' delay: '0' history: 7d units: s preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].duration.first()' master_item: key: 'discovery.openvpn[bs]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 91754aacf7844872a734d2632b5349dc name: 'OpenVPN department of connection by {#OVPN_USER}' type: DEPENDENT key: 'env.openvpn[{#OVPN_USER},busines]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].env.first()' master_item: key: 'discovery.openvpn[bs]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 63446bb24db04889b148dfe918d2aa53 name: 'OpenVPN real ip gotten by {#OVPN_USER}' type: DEPENDENT key: 'real_ip.openvpn[{#OVPN_USER},busines]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].real_ip.first()' master_item: key: 'discovery.openvpn[bs]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 84262ed2324442278cbee1bbef57c021 name: 'OpenVPN connected since by {#OVPN_USER}' type: DEPENDENT key: 'unix_time.openvpn[{#OVPN_USER},busines]' delay: '0' history: 7d units: unixtime preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].unix_time.first()' master_item: key: 'discovery.openvpn[bs]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 4c98fffd90c64211af6ce7c005b2a02b name: 'OpenVPN vpn ip gotten by {#OVPN_USER}' type: DEPENDENT key: 'vpn_ip.openvpn[{#OVPN_USER},busines]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].vpn_ip.first()' master_item: key: 'discovery.openvpn[bs]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' master_item: key: 'discovery.openvpn[bs]' lld_macro_paths: - lld_macro: '{#OVPN_CODE}' path: $..code.first() - lld_macro: '{#OVPN_ENV}' path: $..env.first() - lld_macro: '{#OVPN_USER}' path: $..user.first() - uuid: 9264e60d816e4af998da034ee24d1a82 name: 'Discovery develop stats' type: DEPENDENT key: get.openvpn.develop.stats delay: '0' lifetime: 90d item_prototypes: - uuid: f3fca8e2b72f43069ad734746712abf6 name: 'OpenVPN bytes received by {#OVPN_USER}' type: DEPENDENT key: 'bytes_r.openvpn[{#OVPN_USER},develop]' delay: '0' history: 7d units: B preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_r.first()' - type: SIMPLE_CHANGE parameters: - '' master_item: key: 'discovery.openvpn[dev]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 84fd401d059040c4b2ec0956f20b5f1f name: 'OpenVPN bytes sent by {#OVPN_USER}' type: DEPENDENT key: 'bytes_s.openvpn[{#OVPN_USER},develop]' delay: '0' history: 7d units: B preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_s.first()' - type: SIMPLE_CHANGE parameters: - '' master_item: key: 'discovery.openvpn[dev]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 064f37842d3143dbbd7989a9d0751992 name: 'OpenVPN country of connection by {#OVPN_USER}' type: DEPENDENT key: 'code.openvpn[{#OVPN_USER},develop]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].code.first()' master_item: key: 'discovery.openvpn[dev]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 92561f23f0504c38aa3c006e2e261ceb name: 'OpenVPN connected since by {#OVPN_USER}' type: DEPENDENT key: 'con_time.openvpn[{#OVPN_USER},develop]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].con_time.first()' master_item: key: 'discovery.openvpn[dev]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 8fc80b04d1d14ddbb05fd1d1767639e0 name: 'OpenVPN total online by {#OVPN_USER}' type: DEPENDENT key: 'duration.openvpn[{#OVPN_USER},develop]' delay: '0' history: 7d units: s preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].duration.first()' master_item: key: 'discovery.openvpn[dev]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 67917b15f36141fab2e4fec270eb6348 name: 'OpenVPN department of connection by {#OVPN_USER}' type: DEPENDENT key: 'env.openvpn[{#OVPN_USER},develop]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].env.first()' master_item: key: 'discovery.openvpn[dev]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: dc83cdd12b694de1a77298972f05941d name: 'OpenVPN real ip gotten by {#OVPN_USER}' type: DEPENDENT key: 'real_ip.openvpn[{#OVPN_USER},develop]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].real_ip.first()' master_item: key: 'discovery.openvpn[dev]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: bcead3fc33ef46eabdf58fefcf725eaf name: 'OpenVPN connected since by {#OVPN_USER}' type: DEPENDENT key: 'unix_time.openvpn[{#OVPN_USER},develop]' delay: '0' history: 7d units: unixtime preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].unix_time.first()' master_item: key: 'discovery.openvpn[dev]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 8851c704aa1f4ce39b31ea01f378d412 name: 'OpenVPN vpn ip gotten by {#OVPN_USER}' type: DEPENDENT key: 'vpn_ip.openvpn[{#OVPN_USER},develop]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].vpn_ip.first()' master_item: key: 'discovery.openvpn[dev]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' master_item: key: 'discovery.openvpn[dev]' lld_macro_paths: - lld_macro: '{#OVPN_CODE}' path: $..code.first() - lld_macro: '{#OVPN_ENV}' path: $..env.first() - lld_macro: '{#OVPN_USER}' path: $..user.first() - uuid: 8a989dbd659f45789520f30278d39d91 name: 'Discovery mobile stats' type: DEPENDENT key: get.openvpn.mobile.stats delay: '0' lifetime: 90d item_prototypes: - uuid: 4bad29b577e2459c973466eacdd6dfcb name: 'OpenVPN bytes received by {#OVPN_USER}' type: DEPENDENT key: 'bytes_r.openvpn[{#OVPN_USER},mobile]' delay: '0' history: 7d units: B preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_r.first()' - type: SIMPLE_CHANGE parameters: - '' master_item: key: 'discovery.openvpn[mobile]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: be818605d9154f009313a6e9af03010b name: 'OpenVPN bytes sent by {#OVPN_USER}' type: DEPENDENT key: 'bytes_s.openvpn[{#OVPN_USER},mobile]' delay: '0' history: 7d units: B preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_s.first()' - type: SIMPLE_CHANGE parameters: - '' master_item: key: 'discovery.openvpn[mobile]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 5aee4d04aa984a03a408d59a2a3f60ae name: 'OpenVPN country of connection by {#OVPN_USER}' type: DEPENDENT key: 'code.openvpn[{#OVPN_USER},mobile]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].code.first()' master_item: key: 'discovery.openvpn[mobile]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: d2b566cae7f14cb78c1d06d2108532d2 name: 'OpenVPN connected since by {#OVPN_USER}' type: DEPENDENT key: 'con_time.openvpn[{#OVPN_USER},mobile]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].con_time.first()' master_item: key: 'discovery.openvpn[mobile]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 57a9f5127f00472dbbf26913113824a5 name: 'OpenVPN total online by {#OVPN_USER}' type: DEPENDENT key: 'duration.openvpn[{#OVPN_USER},mobile]' delay: '0' history: 7d units: s preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].duration.first()' master_item: key: 'discovery.openvpn[mobile]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 5edef6cb3f3e4d45862b313b405d1ac0 name: 'OpenVPN department of connection by {#OVPN_USER}' type: DEPENDENT key: 'env.openvpn[{#OVPN_USER},mobile]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].env.first()' master_item: key: 'discovery.openvpn[mobile]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 9f126688d6ad42918f6fa7adecbe438a name: 'OpenVPN real ip gotten by {#OVPN_USER}' type: DEPENDENT key: 'real_ip.openvpn[{#OVPN_USER},mobile]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].real_ip.first()' master_item: key: 'discovery.openvpn[mobile]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 94bea80e0ebb4c37ac7924a54c94a156 name: 'OpenVPN connected since by {#OVPN_USER}' type: DEPENDENT key: 'unix_time.openvpn[{#OVPN_USER},mobile]' delay: '0' history: 7d units: unixtime preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].unix_time.first()' master_item: key: 'discovery.openvpn[mobile]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: d4f3967738b34a979f87916fb451f882 name: 'OpenVPN vpn ip gotten by {#OVPN_USER}' type: DEPENDENT key: 'vpn_ip.openvpn[{#OVPN_USER},mobile]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].vpn_ip.first()' master_item: key: 'discovery.openvpn[mobile]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' master_item: key: 'discovery.openvpn[mobile]' lld_macro_paths: - lld_macro: '{#OVPN_CODE}' path: $..code.first() - lld_macro: '{#OVPN_ENV}' path: $..env.first() - lld_macro: '{#OVPN_USER}' path: $..user.first() - uuid: a33e27cfdc1144f3b5b5baef683de5bb name: 'Discovery security stats' type: DEPENDENT key: get.openvpn.security.stats delay: '0' lifetime: 90d item_prototypes: - uuid: f040b7a6ab1449d783eb3c22aff560ea name: 'OpenVPN bytes received by {#OVPN_USER}' type: DEPENDENT key: 'bytes_r.openvpn[{#OVPN_USER},security]' delay: '0' history: 7d units: B preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_r.first()' - type: SIMPLE_CHANGE parameters: - '' master_item: key: 'discovery.openvpn[sec]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 0e608df3acf84c3bada3bcca3a37a313 name: 'OpenVPN bytes sent by {#OVPN_USER}' type: DEPENDENT key: 'bytes_s.openvpn[{#OVPN_USER},security]' delay: '0' history: 7d units: B preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].bytes_s.first()' - type: SIMPLE_CHANGE parameters: - '' master_item: key: 'discovery.openvpn[sec]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: b860e8b0f9574fefb79813f38b394601 name: 'OpenVPN country of connection by {#OVPN_USER}' type: DEPENDENT key: 'code.openvpn[{#OVPN_USER},security]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].code.first()' master_item: key: 'discovery.openvpn[sec]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 0f5ee76db7ed4c25b0a252af516b2b8b name: 'OpenVPN connected since by {#OVPN_USER}' type: DEPENDENT key: 'con_time.openvpn[{#OVPN_USER},security]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].con_time.first()' master_item: key: 'discovery.openvpn[sec]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: ecfc8ad8eb6845b6b21441fd4bf161a8 name: 'OpenVPN total online by {#OVPN_USER}' type: DEPENDENT key: 'duration.openvpn[{#OVPN_USER},security]' delay: '0' history: 7d units: s preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].duration.first()' master_item: key: 'discovery.openvpn[sec]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 7ed85921a3384bfc85e02ed264a04769 name: 'OpenVPN department of connection by {#OVPN_USER}' type: DEPENDENT key: 'env.openvpn[{#OVPN_USER},security]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].env.first()' master_item: key: 'discovery.openvpn[sec]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 0affb5c0718145d9a8c16b586c3a47cc name: 'OpenVPN real ip gotten by {#OVPN_USER}' type: DEPENDENT key: 'real_ip.openvpn[{#OVPN_USER},security]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].real_ip.first()' master_item: key: 'discovery.openvpn[sec]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: 74e8d8808af74ef5bc78f7ee79cbc821 name: 'OpenVPN connected since by {#OVPN_USER}' type: DEPENDENT key: 'unix_time.openvpn[{#OVPN_USER},security]' delay: '0' history: 7d units: unixtime preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].unix_time.first()' master_item: key: 'discovery.openvpn[sec]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' - uuid: c7662b3f044c4305a1ddc9e580ce89dd name: 'OpenVPN vpn ip gotten by {#OVPN_USER}' type: DEPENDENT key: 'vpn_ip.openvpn[{#OVPN_USER},security]' delay: '0' history: 7d trends: '0' value_type: CHAR preprocessing: - type: JSONPATH parameters: - '$.data.[?(@.user==''{#OVPN_USER}'')].vpn_ip.first()' master_item: key: 'discovery.openvpn[sec]' tags: - tag: Application value: OpenVPN - tag: Country value: '{#OVPN_CODE}' - tag: Department value: '{#OVPN_ENV}' - tag: User value: '{#OVPN_USER}' master_item: key: 'discovery.openvpn[sec]' lld_macro_paths: - lld_macro: '{#OVPN_CODE}' path: $..code.first() - lld_macro: '{#OVPN_ENV}' path: $..env.first() - lld_macro: '{#OVPN_USER}' path: $..user.first()
Дашборд в Grafana
Что мы можем в нём увидеть:
-
Получено трафика от пользователя.
-
Отправлено трафика пользователю.
-
Статистика подключений:
-
Время проверки Zabbix’ом.
-
Регион подключения.
-
Внешний IP.
-
Внутренний IP.
-
Роль/профиль.
-
-
Длительность текущего подключения.
-
Поиск пользователей:
-
По внешнему IP.
-
По внутреннему IP.
-
По роли/профилю VPN.
-
Под спойлером JSON для экспорта в Grafana.
openvpn_user_stats.json
{ "__inputs": [ { "name": "DS_ZABBIX", "label": "Zabbix", "description": "", "type": "datasource", "pluginId": "alexanderzobnin-zabbix-datasource", "pluginName": "Zabbix" } ], "__elements": [], "__requires": [ { "type": "datasource", "id": "alexanderzobnin-zabbix-datasource", "name": "Zabbix", "version": "1.0.0" }, { "type": "grafana", "id": "grafana", "name": "Grafana", "version": "8.3.6" }, { "type": "panel", "id": "table", "name": "Table", "version": "" }, { "type": "panel", "id": "timeseries", "name": "Time series", "version": "" } ], "annotations": { "list": [ { "builtIn": 1, "datasource": "-- Grafana --", "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "target": { "limit": 100, "matchAny": false, "tags": [], "type": "dashboard" }, "type": "dashboard" } ] }, "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 0, "id": null, "iteration": 1688671488450, "links": [], "liveNow": false, "panels": [ { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 15, "panels": [], "title": "Статистика пользователя $username", "type": "row" }, { "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "description": "", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 15, "gradientMode": "opacity", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "linear", "lineStyle": { "fill": "solid" }, "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null } ] }, "unit": "decbytes" }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 1 }, "id": 34, "options": { "legend": { "calcs": [ "last", "min", "max", "sum" ], "displayMode": "table", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "application": { "filter": "" }, "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "functions": [ { "$$hashKey": "object:1405", "def": { "category": "Alias", "defaultParams": [], "name": "setAlias", "params": [ { "name": "alias", "type": "string" } ] }, "params": [ "Получено:" ], "text": "setAlias(Получено:)" } ], "group": { "filter": "openvpn" }, "host": { "filter": "$host" }, "item": { "filter": "/OpenVPN bytes received by$username/" }, "itemTag": { "filter": "Application: OpenVPN" }, "options": { "disableDataAlignment": false, "showDisabledItems": false, "skipEmptyValues": false, "useZabbixValueMapping": false }, "proxy": { "filter": "" }, "queryType": "0", "refId": "A", "resultFormat": "time_series", "table": { "skipEmptyValues": false }, "tags": { "filter": "" }, "trigger": { "filter": "" }, "triggers": { "acknowledged": 2, "count": true, "minSeverity": 3 } } ], "title": "Получено трафика от пользователя", "transparent": true, "type": "timeseries" }, { "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "description": "", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "line", "fillOpacity": 15, "gradientMode": "opacity", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "linear", "lineStyle": { "fill": "solid" }, "lineWidth": 2, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null } ] }, "unit": "decbytes" }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 1 }, "id": 35, "options": { "legend": { "calcs": [ "last", "min", "max", "sum" ], "displayMode": "table", "placement": "bottom" }, "tooltip": { "mode": "single" } }, "targets": [ { "application": { "filter": "" }, "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "functions": [ { "$$hashKey": "object:1432", "def": { "category": "Alias", "defaultParams": [], "name": "setAlias", "params": [ { "name": "alias", "type": "string" } ] }, "params": [ "Отправлено:" ], "text": "setAlias(Отправлено:)" } ], "group": { "filter": "openvpn" }, "host": { "filter": "$host" }, "item": { "filter": "/OpenVPN bytes sent by$username/" }, "itemTag": { "filter": "Application: OpenVPN" }, "options": { "disableDataAlignment": false, "showDisabledItems": false, "skipEmptyValues": false, "useZabbixValueMapping": false }, "proxy": { "filter": "" }, "queryType": "0", "refId": "A", "resultFormat": "time_series", "table": { "skipEmptyValues": false }, "tags": { "filter": "" }, "trigger": { "filter": "" }, "triggers": { "acknowledged": 2, "count": true, "minSeverity": 3 } } ], "title": "Отправлено трафика пользователю", "transparent": true, "type": "timeseries" }, { "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, "custom": { "align": "center", "displayMode": "auto", "filterable": true }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null } ] } }, "overrides": [ { "matcher": { "id": "byName", "options": "Time" }, "properties": [ { "id": "custom.width", "value": 180 }, { "id": "displayName", "value": "Время" } ] }, { "matcher": { "id": "byRegexp", "options": "^OpenVPN country of connection by.*" }, "properties": [ { "id": "displayName", "value": "Регион" }, { "id": "custom.width", "value": 120 } ] }, { "matcher": { "id": "byRegexp", "options": "OpenVPN real ip gotten by.*" }, "properties": [ { "id": "displayName", "value": "Внешний IP" }, { "id": "custom.width", "value": 180 } ] }, { "matcher": { "id": "byRegexp", "options": "OpenVPN vpn ip gotten by.*" }, "properties": [ { "id": "displayName", "value": "Внутренний IP" }, { "id": "custom.width", "value": 180 } ] }, { "matcher": { "id": "byRegexp", "options": "OpenVPN department of connection by.*" }, "properties": [ { "id": "displayName", "value": "Профиль" }, { "id": "custom.align", "value": "center" }, { "id": "custom.width", "value": 120 } ] } ] }, "gridPos": { "h": 9, "w": 12, "x": 0, "y": 9 }, "hideTimeOverride": false, "id": 32, "options": { "footer": { "fields": "", "reducer": [ "lastNotNull" ], "show": false }, "showHeader": true, "sortBy": [] }, "pluginVersion": "8.3.6", "targets": [ { "application": { "filter": "" }, "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "functions": [], "group": { "filter": "openvpn" }, "host": { "filter": "$host" }, "item": { "filter": "/OpenVPN country of connection by$username/" }, "itemTag": { "filter": "Application: OpenVPN" }, "options": { "disableDataAlignment": false, "showDisabledItems": false, "skipEmptyValues": false, "useZabbixValueMapping": false }, "proxy": { "filter": "" }, "queryType": "2", "refId": "A", "resultFormat": "time_series", "table": { "skipEmptyValues": false }, "tags": { "filter": "" }, "trigger": { "filter": "" }, "triggers": { "acknowledged": 2, "count": true, "minSeverity": 3 }, "useCaptureGroups": false }, { "application": { "filter": "" }, "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "functions": [], "group": { "filter": "openvpn" }, "hide": false, "host": { "filter": "$host" }, "item": { "filter": "/OpenVPN real ip gotten by$username/" }, "itemTag": { "filter": "Application: OpenVPN" }, "options": { "disableDataAlignment": false, "showDisabledItems": false, "skipEmptyValues": false, "useZabbixValueMapping": false }, "proxy": { "filter": "" }, "queryType": "2", "refId": "B", "resultFormat": "time_series", "table": { "skipEmptyValues": false }, "tags": { "filter": "" }, "trigger": { "filter": "" }, "triggers": { "acknowledged": 2, "count": true, "minSeverity": 3 } }, { "application": { "filter": "" }, "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "functions": [], "group": { "filter": "openvpn" }, "hide": false, "host": { "filter": "$host" }, "item": { "filter": "/OpenVPN vpn ip gotten by$username/" }, "itemTag": { "filter": "Application: OpenVPN" }, "options": { "disableDataAlignment": false, "showDisabledItems": false, "skipEmptyValues": false, "useZabbixValueMapping": false }, "proxy": { "filter": "" }, "queryType": "2", "refId": "C", "resultFormat": "time_series", "table": { "skipEmptyValues": false }, "tags": { "filter": "" }, "trigger": { "filter": "" }, "triggers": { "acknowledged": 2, "count": true, "minSeverity": 3 } }, { "application": { "filter": "" }, "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "functions": [], "group": { "filter": "openvpn" }, "hide": false, "host": { "filter": "$host" }, "item": { "filter": "/OpenVPN department of connection by$username/" }, "itemTag": { "filter": "Application: OpenVPN" }, "options": { "disableDataAlignment": false, "showDisabledItems": false, "skipEmptyValues": false, "useZabbixValueMapping": false }, "proxy": { "filter": "" }, "queryType": "2", "refId": "D", "resultFormat": "time_series", "table": { "skipEmptyValues": false }, "tags": { "filter": "" }, "trigger": { "filter": "" }, "triggers": { "acknowledged": 2, "count": true, "minSeverity": 3 } } ], "title": "Статистика подключений", "transparent": true, "type": "table" }, { "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "fieldConfig": { "defaults": { "color": { "mode": "continuous-GrYlRd" }, "custom": { "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, "drawStyle": "bars", "fillOpacity": 90, "gradientMode": "scheme", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, "scaleDistribution": { "type": "linear" }, "showPoints": "auto", "spanNulls": false, "stacking": { "group": "A", "mode": "none" }, "thresholdsStyle": { "mode": "off" } }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null } ] }, "unit": "dtdhms" }, "overrides": [ { "matcher": { "id": "byName", "options": "Длительность подключений:" }, "properties": [ { "id": "color", "value": { "fixedColor": "orange", "mode": "fixed" } } ] } ] }, "gridPos": { "h": 9, "w": 12, "x": 12, "y": 9 }, "id": 37, "links": [], "options": { "legend": { "calcs": [ "last" ], "displayMode": "table", "placement": "bottom", "sortBy": "Distinct Count", "sortDesc": true }, "tooltip": { "mode": "single" } }, "pluginVersion": "8.3.6", "targets": [ { "application": { "filter": "" }, "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "functions": [], "group": { "filter": "openvpn" }, "host": { "filter": "$host" }, "item": { "filter": "/OpenVPN total online by$username/" }, "itemTag": { "filter": "Application: OpenVPN" }, "options": { "disableDataAlignment": false, "showDisabledItems": false, "skipEmptyValues": false, "useZabbixValueMapping": false }, "proxy": { "filter": "" }, "queryType": "0", "refId": "A", "resultFormat": "time_series", "table": { "skipEmptyValues": false }, "tags": { "filter": "" }, "trigger": { "filter": "" }, "triggers": { "acknowledged": 2, "count": true, "minSeverity": 3 } } ], "title": "Длительность подключений", "transformations": [ { "id": "calculateField", "options": { "alias": "Длительность последнего подключения:", "mode": "reduceRow", "reduce": { "reducer": "sum" }, "replaceFields": true } } ], "transparent": true, "type": "timeseries" }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 18 }, "id": 39, "panels": [ { "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "description": "", "fieldConfig": { "defaults": { "custom": { "align": "auto", "displayMode": "auto", "filterable": true }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] } }, "overrides": [ { "matcher": { "id": "byName", "options": "Last value" }, "properties": [ { "id": "custom.width", "value": 200 } ] } ] }, "gridPos": { "h": 19, "w": 8, "x": 0, "y": 19 }, "id": 41, "options": { "footer": { "fields": "", "reducer": [ "sum" ], "show": false }, "showHeader": true, "sortBy": [] }, "pluginVersion": "8.3.6", "targets": [ { "application": { "filter": "" }, "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "functions": [], "group": { "filter": "openvpn" }, "host": { "filter": "$host" }, "item": { "filter": "/OpenVPN real ip gotten by.*/" }, "itemTag": { "filter": "Application: OpenVPN" }, "options": { "disableDataAlignment": false, "showDisabledItems": false, "skipEmptyValues": true, "useZabbixValueMapping": false }, "proxy": { "filter": "" }, "queryType": "2", "refId": "A", "resultFormat": "table", "slaInterval": "none", "slaProperty": { "name": "SLA", "property": "sla" }, "table": { "skipEmptyValues": false }, "tags": { "filter": "" }, "textFilter": "", "trigger": { "filter": "" }, "triggers": { "acknowledged": 2, "count": true, "minSeverity": 3 } } ], "title": "По внешнему IP", "transformations": [ { "id": "organize", "options": { "excludeByName": { "Host": true, "Key": true }, "indexByName": { "All values": 0, "Host": 1, "Item": 2, "Key": 3, "Last value": 4 }, "renameByName": { "Host": "", "Item": "Пользователь", "Last value": "Внешний IP" } } } ], "transparent": true, "type": "table" }, { "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "description": "", "fieldConfig": { "defaults": { "custom": { "align": "auto", "displayMode": "auto", "filterable": true }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] } }, "overrides": [ { "matcher": { "id": "byName", "options": "Last value" }, "properties": [ { "id": "custom.width", "value": 200 } ] } ] }, "gridPos": { "h": 19, "w": 8, "x": 8, "y": 19 }, "id": 42, "options": { "footer": { "fields": "", "reducer": [ "sum" ], "show": false }, "showHeader": true, "sortBy": [] }, "pluginVersion": "8.3.6", "targets": [ { "application": { "filter": "" }, "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "functions": [], "group": { "filter": "openvpn" }, "host": { "filter": "$host" }, "item": { "filter": "/OpenVPN vpn ip gotten by.*/" }, "itemTag": { "filter": "Application: OpenVPN" }, "options": { "disableDataAlignment": false, "showDisabledItems": false, "skipEmptyValues": true, "useZabbixValueMapping": false }, "proxy": { "filter": "" }, "queryType": "2", "refId": "A", "resultFormat": "table", "slaInterval": "none", "slaProperty": { "name": "SLA", "property": "sla" }, "table": { "skipEmptyValues": false }, "tags": { "filter": "" }, "textFilter": "", "trigger": { "filter": "" }, "triggers": { "acknowledged": 2, "count": true, "minSeverity": 3 } } ], "title": "По внутреннему IP", "transformations": [ { "id": "organize", "options": { "excludeByName": { "Host": true, "Key": true }, "indexByName": { "All values": 0, "Host": 1, "Item": 2, "Key": 3, "Last value": 4 }, "renameByName": { "Host": "", "Item": "Пользователь", "Last value": "Внутренний IP" } } } ], "transparent": true, "type": "table" }, { "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "description": "", "fieldConfig": { "defaults": { "custom": { "align": "auto", "displayMode": "auto", "filterable": true }, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "red", "value": 80 } ] } }, "overrides": [ { "matcher": { "id": "byName", "options": "Last value" }, "properties": [ { "id": "custom.width", "value": 200 } ] } ] }, "gridPos": { "h": 19, "w": 8, "x": 16, "y": 19 }, "id": 43, "options": { "footer": { "fields": "", "reducer": [ "sum" ], "show": false }, "showHeader": true, "sortBy": [] }, "pluginVersion": "8.3.6", "targets": [ { "application": { "filter": "" }, "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "functions": [], "group": { "filter": "openvpn" }, "host": { "filter": "$host" }, "item": { "filter": "/OpenVPN department of connection by .*/" }, "itemTag": { "filter": "Application: OpenVPN" }, "options": { "disableDataAlignment": false, "showDisabledItems": false, "skipEmptyValues": true, "useZabbixValueMapping": false }, "proxy": { "filter": "" }, "queryType": "2", "refId": "A", "resultFormat": "table", "slaInterval": "none", "slaProperty": { "name": "SLA", "property": "sla" }, "table": { "skipEmptyValues": false }, "tags": { "filter": "" }, "textFilter": "", "trigger": { "filter": "" }, "triggers": { "acknowledged": 2, "count": true, "minSeverity": 3 } } ], "title": "По профилю VPN", "transformations": [ { "id": "organize", "options": { "excludeByName": { "Host": true, "Key": true }, "indexByName": { "All values": 0, "Host": 1, "Item": 2, "Key": 3, "Last value": 4 }, "renameByName": { "Host": "", "Item": "Пользователь", "Last value": "Профиль VPN" } } } ], "transparent": true, "type": "table" } ], "title": "Поиск пользователя", "type": "row" } ], "refresh": "", "schemaVersion": 34, "style": "dark", "tags": [], "templating": { "list": [ { "current": {}, "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "definition": "Zabbix - host", "hide": 0, "includeAll": false, "multi": false, "name": "host", "options": [], "query": { "application": "", "group": "openvpn", "host": "/.*/", "item": "", "itemTag": "", "queryType": "host" }, "refresh": 1, "regex": "", "skipUrlSync": false, "sort": 0, "tagValuesQuery": "", "tagsQuery": "", "type": "query", "useTags": false }, { "current": {}, "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "definition": "Zabbix - itemTag", "hide": 2, "includeAll": true, "multi": false, "name": "departament", "options": [], "query": { "application": "", "group": "openvpn", "host": "$host", "item": "", "itemTag": "/Departament/", "queryType": "itemTag" }, "refresh": 1, "regex": "/^Departament:(.*)/", "skipUrlSync": false, "sort": 0, "tagValuesQuery": "", "tagsQuery": "", "type": "query", "useTags": false }, { "current": {}, "datasource": { "type": "alexanderzobnin-zabbix-datasource", "uid": "${DS_ZABBIX}" }, "definition": "Zabbix - itemTag", "hide": 0, "includeAll": false, "multi": false, "name": "username", "options": [], "query": { "application": "", "group": "openvpn", "host": "$host", "item": "", "itemTag": "/User/", "queryType": "itemTag" }, "refresh": 1, "regex": "/^User:(.*)/", "skipUrlSync": false, "sort": 0, "tagValuesQuery": "", "tagsQuery": "", "type": "query", "useTags": false } ] }, "time": { "from": "now-24h", "to": "now" }, "timepicker": { "refresh_intervals": [ "5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d" ], "time_options": [ "5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d" ] }, "timezone": "", "title": "OpenVPN User Stats", "uid": "ERpfiw9Vz", "version": 2, "weekStart": "" }
На этом у меня всё, всем спасибо за внимание, и вступайте в Zabbix Community!
ссылка на оригинал статьи https://habr.com/ru/companies/domclick/articles/744764/
Добавить комментарий