Ты под колпаком.
Ты под колпаком.

Всем привет. Меня зовут Игорь, я 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

Items.
Items.

Теперь необходимо создать правила обнаружения (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 rules.
Discovery rules.

Тут остановимся и разберём подробнее на примере 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.

Item prototype.
Item prototype.

Список прототипов элементов

Для примера я взял роль/профиль админов:

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()

Item prototypes
Item prototypes

И так для каждой пользовательской роли/профиля. Получается 5 правил обнаружения, и в каждом правиле по 9 прототипов элементов. Почему же две OpenVPN connected since by {#OVPN_USER}?

  1. unixtime конвертирует сам Zabbix и отображает корректную дату подключения.

  2. Строка с датой для 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.

OpenVPN User Stats.
OpenVPN User Stats.

Под спойлером 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)


  1. Abyss777
    13.07.2023 12:05
    +1

    Поделитесь пожалуйста, зачем вам онлайн эти данные? (может нам тоже надо)

    9 метрик на каждого пользователя с частотой 5 минут пишутся в базу Zabbix. Какая от этого польза кроме красивых графиков? У вас есть какие-то триггеры?

    А еще, что будет если пользователь из двух мест одновременно подключится?

    Кстати 6 из этих метрик данных не изменяются во время сессии, а в шаблоне я не вижу препроцессинга по отбрасыванию не изменившихся данных. Бессмысленное забивание БД одинаковыми данными.


    1. ownhrd Автор
      13.07.2023 12:05

      Для нужд КБ и HR.

      Триггеров нет, но никто не запрещает придумать логику и зажигать лампочку в нужном вам сценарии. К примеру подсвечивать пользователей из другой страны. У нас такой необходимости нет, достаточно истории в n дней с поиском в Grafana.

      Его будет выкидывать из новой сессии, ну а метрики запишутся те, которые будут в логе на момент опроса скрипта.

      На момент создания шаблона не думал об этом, да и по месту не страдаем. Возможно добавлю в будущем, спасибо. Вообще редко использую эту фичу.


      1. Abyss777
        13.07.2023 12:05
        +1

        Для нужд КБ и HR.

        Можете привести примеры?

        Просто если в connection/disconnection скрипте OpenVPN записывать те же самые в БД, то это будет всего две строчки на сессию. При этом единственная информация которая потеряется, это сколько прямо сейчас накачал клиент.

        На все остальные вопросы такие записи в БД смогут ответить. Сколько раз, откуда, когда подключался клиент, сколько выкачал за период (законченные сессии). У кого сейчас открыты сессии и т.д.

        > Триггеров нет, но никто не запрещает придумать логику и зажигать лампочку в нужном вам сценарии.

        В том и дело, что я не могу придумать никаких сценариев, как использовать такие данные в парадигме Zabbix


        1. ownhrd Автор
          13.07.2023 12:05

          Можете привести примеры?

          Сотрудника обвиняют в том, что он поздно пришел на работу, хотя по подключениям и статистики видно, что он пришел на работу и/или подключился вовремя. КБ приходит и просит проверить откуда, во сколько и как долго был подключен человек в тот или иной день и промежуток времени. Вот пара примеров.

          Просто если в connection/disconnection скрипте OpenVPN записывать те же самые в БД, то это будет всего две строчки на сессию. При этом единственная информация которая потеряется, это сколько прямо сейчас накачал клиент.

          На все остальные вопросы такие записи в БД смогут ответить. Сколько раз, откуда, когда подключался клиент, сколько выкачал за период (законченные сессии). У кого сейчас открыты сессии и т.д.

          На вкус и цвет, как говорится)

          В том и дело, что я не могу придумать никаких сценариев, как использовать такие данные в парадигме Zabbix

          Это какое-то обязательное условие? У нас есть интеграции, где просто записываются метрики для дальнейшего вывода их в графане с сохранением историчности и трендов. Там нет триггеров и они особо не нужны.


  1. AUser0
    13.07.2023 12:05
    -3

    Хммм, на первой картинке в статье (с сутулым человечком и камерами наблюдения) тень нарисована не правильно. Это современная тенденция такая?