Всем привет. Меня зовут Игорь, я 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!
Комментарии (5)
AUser0
13.07.2023 12:05-3Хммм, на первой картинке в статье (с сутулым человечком и камерами наблюдения) тень нарисована не правильно. Это современная тенденция такая?
Abyss777
Поделитесь пожалуйста, зачем вам онлайн эти данные? (может нам тоже надо)
9 метрик на каждого пользователя с частотой 5 минут пишутся в базу Zabbix. Какая от этого польза кроме красивых графиков? У вас есть какие-то триггеры?
А еще, что будет если пользователь из двух мест одновременно подключится?
Кстати 6 из этих метрик данных не изменяются во время сессии, а в шаблоне я не вижу препроцессинга по отбрасыванию не изменившихся данных. Бессмысленное забивание БД одинаковыми данными.
ownhrd Автор
Для нужд КБ и HR.
Триггеров нет, но никто не запрещает придумать логику и зажигать лампочку в нужном вам сценарии. К примеру подсвечивать пользователей из другой страны. У нас такой необходимости нет, достаточно истории в n дней с поиском в Grafana.
Его будет выкидывать из новой сессии, ну а метрики запишутся те, которые будут в логе на момент опроса скрипта.
На момент создания шаблона не думал об этом, да и по месту не страдаем. Возможно добавлю в будущем, спасибо. Вообще редко использую эту фичу.
Abyss777
Можете привести примеры?
Просто если в connection/disconnection скрипте OpenVPN записывать те же самые в БД, то это будет всего две строчки на сессию. При этом единственная информация которая потеряется, это сколько прямо сейчас накачал клиент.
На все остальные вопросы такие записи в БД смогут ответить. Сколько раз, откуда, когда подключался клиент, сколько выкачал за период (законченные сессии). У кого сейчас открыты сессии и т.д.
> Триггеров нет, но никто не запрещает придумать логику и зажигать лампочку в нужном вам сценарии.
В том и дело, что я не могу придумать никаких сценариев, как использовать такие данные в парадигме Zabbix
ownhrd Автор
Сотрудника обвиняют в том, что он поздно пришел на работу, хотя по подключениям и статистики видно, что он пришел на работу и/или подключился вовремя. КБ приходит и просит проверить откуда, во сколько и как долго был подключен человек в тот или иной день и промежуток времени. Вот пара примеров.
На вкус и цвет, как говорится)
Это какое-то обязательное условие? У нас есть интеграции, где просто записываются метрики для дальнейшего вывода их в графане с сохранением историчности и трендов. Там нет триггеров и они особо не нужны.