Введение

Исходными данными послужила страница, где был найден следующий исходный код файла docker-compose.yml.

На основе этого файла в Synology создается виртуальная сеть, и запускаются 3 контейнера, относящиеся к ней. К каждому контейнеру монтируется Volume на файловой системе, где хранится его конфигурация. Итак, приступим!

Файл docker-compose.yml
version: '2.1'

networks:
  monitor-net:
    driver: bridge

volumes:
    prometheus_data: {}
    grafana_data: {}

services:

  prometheus:
    image: prom/prometheus:v2.1.0
    container_name: prometheus
    volumes:
      - ./prometheus/:/etc/prometheus/
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--storage.tsdb.retention=200h'
      - '--web.enable-lifecycle'
    # restart: unless-stopped
    expose:
      - 9090
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitoring"
  
  alertmanager:
    image: prom/alertmanager:v0.13.0
    container_name: alertmanager
    volumes: 
      - ./alertmanager/:/etc/alertmanager/
    command:
      - '--config.file=/etc/alertmanager/config.yml'
      - '--storage.path=/alertmanager'
    restart: unless-stopped
    expose:
      - 9093
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitoring"

  pushgateway:
    image: prom/pushgateway
    container_name: pushgateway
    restart: unless-stopped
    expose:
      - 9091
    ports:
      - "9091:9091"
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitoring"
  
  grafana:
    image: grafana/grafana:4.6.3
    container_name: grafana
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/datasources:/etc/grafana/datasources
      - ./grafana/dashboards:/etc/grafana/dashboards
      - ./grafana/setup.sh:/setup.sh
    entrypoint: /setup.sh
    environment:
      - GF_SECURITY_ADMIN_USER=${ADMIN_USER:-admin}
      - GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin}
      - GF_USERS_ALLOW_SIGN_UP=false
    restart: unless-stopped
    expose:
      - 3000
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitoring"

Загрузка образов из репозитория DockerHub

Будут использоваться следующие образы из репозитория:

  • prom/prometheus:latest
  • prom/alertmanager:latest
  • prom/pushgateway:latest
  • grafana/grafana:latest

В интерфейсе Synology откройте Docker и перейдите в раздел "Реестр".

В окне поиска введите название образа "prometheus" и нажмите на кнопку "Поиск".

В результатах поиска вернутся все образы, в названии которых есть "prometheus".

Выделите строку с названием образа "prom/prometheus" и нажмите на кнопку "Загрузить".

Откроется окно выбора тега "Выберите тег".

В окне "Выберите тег" оставьте значение "latest" и нажмите на кнопку "Выбрать".

В разделе "Образ" интерфейса отобразится счетчик, что означает добавление нового образа. Начнется скачивание нового образа.

Когда образ загрузится, в верхнем правом углу интерфейса Synology DSM появится всплывающее окно, что образ был загружен.

Перейдите в раздел "Образ" и проверьте , что новый образ добавлен.

Повторите шаги для загрузки остальных образов. После окончания загрузки, в разделе "Образ" у вас должны появиться следующие образы.

Создание виртуальной сети noise-monitor-net

В docker-compose.yml приводится название виртуальной сети monitor-net, у нас будет настроена сеть с названием noise-monitor-net. Это необходимо для обеспечения взаимодействия контейнеров по сети друг с другом.

В интерфейсе Docker перейдите в раздел "Сеть" и нажмите на кнопку "Добавить".

Откроется окно "Создать сеть".

В окне "Создать сеть" введите название сети noise-monitor-net, и нажмите на кнопку "Добавить".

Создание контейнеров и запуск приложений

Создание контейнера PushGateWay

Перейдите в Docker в раздел "Образ", выберите название образа "prom/pushgateway:latest" и нажмите на кнопку "Запустить".

Откроется окно "Общие настройки".

В окне "Общие настройки" нажмите на кнопку "Дополнительные настройки".

В окне "Дополнительные настройки" перейдите на закладку "Сеть", и выберите сеть с названием noise-monitor-net .

Перейдите на вкладку "Настройки портов", и для порта контейнера 9091 в поле "Локальный порт" укажите значение 9091.

Нажмите на кнопку "Применить", чтобы закрыть окно "Дополнительные настройки".

Окно "Дополнительные настройки" закроется.

В окне создания контейнера нажмите на кнопку "Далее".

Отобразится окно "Резюме" для завершения создания контейнера.

В окне "Резюме" проверьте еще раз указанные значения, и нажмите на кнопку "Применить".

В разделе "Контейнер" появляется еще один запущенный контейнер.

Создание контейнера Prometheus

Внимание! Создавать директории, которые будут использоваться контейнером, надо через интерфейс Docker при создании контейнера. Поэтому необходимые файлы будут размещены в конце, а контейнер при создании запускаться не будет.

В интерфейсе Docker в разделе "Образ" выделите образ с названием "prom/prometheus:latest" и нажмите на кнопку "Запустить".

Откроется окно "Создать контейнер".

В окне "Создать контейнер" нажмите на кнопку "Дополнительные настройки".

В окне "Дополнительные настройки" перейдите на закладку "Том", и через кнопку "Добавить папку" создайте два тома:

Несуществующие директории (иерархию директорий) необходимо создать через кнопку "Создать папку" в окне "Добавить".

Файл/папкаПуть для подключенияКомментарий
docker/Noise/etc/prometheus/etc/prometheusДиректория хранения конфигурации Prometheus
docker/Noise/data/prometheus/data/prometheusДиректория хранения данных Prometheus

После добавления на вкладке "Том" будут отображаться следующие записи.

На вкладке "Сеть" укажите название сети "noise-monitor-net".

На вкладке "Настройки портов" укажите "Локальный порт" также значение 9090.

На вкладке "Защита" в поле "Команда" добавьте следующие параметры для запуска Prometheus. Обратите внимание, что каждый параметр берется в апострофы, а последний из них задает время хранения данных - 15 лет.

'--config.file=/etc/prometheus/prometheus.yml' '--storage.tsdb.path=/data/prometheus' '--web.console.libraries=/etc/prometheus/console_libraries' '--web.console.templates=/etc/prometheus/consoles' '--storage.tsdb.retention.time=15y' '--web.enable-admin-api'

Нажмите на кнопку "Применить", чтобы закрыть окно "Дополнительные настройки" и вернуться к основному окну "Создать контейнер".

В окне "Создать контейнер" нажмите на кнопку "Далее".

Откроется окно "Резюме" со списком всех параметров, определенных в дополнительных настройках.

В окне "Резюме" проверьте еще раз все выбранные настройки, СНИМИТЕ МЕТКУ "Запустить этот контейнер" и нажмите на кнопку "Применить".

В структуре директорий, которые были созданы при добавлении томов, разместите следующие файлы.

Создайте файл \\synologynas\docker\Noise\etc\prometheus\prometheus.yml следующего содержимого, или возьмите файл примера - https://github.com/prometheus/prometheus/blob/main/documentation/examples/prometheus.yml .

prometheus.yml
# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'
    scrape_interval: 2s
    static_configs:
    - targets: ['prom-prometheus1:9090']
#  - job_name: 'node_exporter'
#    static_configs:
#    - targets: ['192.168.1.187:9100']
  - job_name: 'pushgateway'
    scrape_interval: 2s
    static_configs:
    - targets: ['prom-pushgateway1:9091']

В директорию \\synologynas\docker\Noise\etc\prometheus\ также скачайте и разместите директории console_libraries и consoles из репозитория https://github.com/prometheus/prometheus . Или распакуйте прикрепленные к странице архивы console_libraries.zip и consoles.zip.

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


В окне Docker в разделе "Контейнер" выполните запуск контейнера с именем prom-prometheus1.

Создание контейнера AlertManager

Создайте файл alertmanager.yml в директории \\synologynas\docker\Noise\etc\alertmanager следующего содержания.

alertmanager.yml
global:
  # The smarthost and SMTP sender used for mail notifications.
  smtp_smarthost: 'localhost:25'
  smtp_from: 'alertmanager@example.org'
  smtp_auth_username: 'alertmanager'
  smtp_auth_password: 'password'

# The directory from which notification templates are read.
templates:
- '/etc/alertmanager/template/*.tmpl'

# The root route on which each incoming alert enters.
route:
  # The labels by which incoming alerts are grouped together. For example,
  # multiple alerts coming in for cluster=A and alertname=LatencyHigh would
  # be batched into a single group.
  #
  # To aggregate by all possible labels use '...' as the sole label name.
  # This effectively disables aggregation entirely, passing through all
  # alerts as-is. This is unlikely to be what you want, unless you have
  # a very low alert volume or your upstream notification system performs
  # its own grouping. Example: group_by: [...]
  group_by: ['alertname', 'cluster', 'service']

  # When a new group of alerts is created by an incoming alert, wait at
  # least 'group_wait' to send the initial notification.
  # This way ensures that you get multiple alerts for the same group that start
  # firing shortly after another are batched together on the first
  # notification.
  group_wait: 30s

  # When the first notification was sent, wait 'group_interval' to send a batch
  # of new alerts that started firing for that group.
  group_interval: 5m

  # If an alert has successfully been sent, wait 'repeat_interval' to
  # resend them.
  repeat_interval: 3h

  # A default receiver
  receiver: team-X-mails

  # All the above attributes are inherited by all child routes and can
  # overwritten on each.

  # The child route trees.
  routes:
  # This routes performs a regular expression match on alert labels to
  # catch alerts that are related to a list of services.
  - match_re:
      service: ^(foo1|foo2|baz)$
    receiver: team-X-mails
    # The service has a sub-route for critical alerts, any alerts
    # that do not match, i.e. severity != critical, fall-back to the
    # parent node and are sent to 'team-X-mails'
    routes:
    - match:
        severity: critical
      receiver: team-X-pager
  - match:
      service: files
    receiver: team-Y-mails

    routes:
    - match:
        severity: critical
      receiver: team-Y-pager

  # This route handles all alerts coming from a database service. If there's
  # no team to handle it, it defaults to the DB team.
  - match:
      service: database
    receiver: team-DB-pager
    # Also group alerts by affected database.
    group_by: [alertname, cluster, database]
    routes:
    - match:
        owner: team-X
      receiver: team-X-pager
      continue: true
    - match:
        owner: team-Y
      receiver: team-Y-pager


# Inhibition rules allow to mute a set of alerts given that another alert is
# firing.
# We use this to mute any warning-level notifications if the same alert is
# already critical.
inhibit_rules:
- source_match:
    severity: 'critical'
  target_match:
    severity: 'warning'
  # Apply inhibition if the alertname is the same.
  # CAUTION:
  #   If all label names listed in `equal` are missing
  #   from both the source and target alerts,
  #   the inhibition rule will apply!
  equal: ['alertname', 'cluster', 'service']


receivers:
- name: 'team-X-mails'
  email_configs:
  - to: 'team-X+alerts@example.org'

- name: 'team-X-pager'
  email_configs:
  - to: 'team-X+alerts-critical@example.org'
  pagerduty_configs:
  - service_key: <team-X-key>

- name: 'team-Y-mails'
  email_configs:
  - to: 'team-Y+alerts@example.org'

- name: 'team-Y-pager'
  pagerduty_configs:
  - service_key: <team-Y-key>

- name: 'team-DB-pager'
  pagerduty_configs:
  - service_key: <team-DB-key>


В разделе "Образ" выберите название контейнера "prom/alertmanager:latest", и нажмите на кнопку "Создать".

Откроется окно создания контейнера.

Нажмите на кнопку "Дополнительные настройки".

На вкладке "Том" создайте две записи к директориям.

Файл/папкаПуть для подключенияКомментарий
docker/Noise/etc/alertmanager/etc/alertmanagerДиректория хранения конфигурации AlertManager
docker/Noise/data/alertmanager/data/alertmanagerДиректория хранения данных AlertManager

На вкладке "Сеть" выберите название сети "noise-monitor-net".

На вкладке "Настройки портов" опубликуйте приложение на порту 9093 (укажите его в поле "Локальный порт").

На вкладке "Защита" в поле "Команда" пропишите следующие значения и нажмите на кнопку "Применить".

'--config.file=/etc/alertmanager/alertmanager.yml' '--storage.path=/data/alertmanager'

В окне "Создать контейнер" нажмите на кнопку "Далее".

Откроется окно "Резюме" с суммарной информацией о конфигурации контейнера.

Проверьте еще раз указанные параметры и нажмите на кнопку "Применить", чтобы запустить контейнер.

Создание контейнера Grafana

Создайте директории, которые понадобятся для конфигурации контейнера.

\\synologynas\docker\Noise\etc\grafana\

\\synologynas\docker\Noise\var\lib\grafana\

\\synologynas\docker\Noise\var\lib\grafana\plugins

\\synologynas\docker\Noise\var\log\grafana\

Создайте текстовый файл grafana.ini в директории \\synologynas\docker\Noise\etc\grafana\, который прикреплен к странице grafana.ini.

Также разархивируйте в эту директорию содержимое архива provisioning.zip.


В окне Docker в разделе "Образ" выделите название образа "grafana/grafana:latest" и нажмите на кнопку "Запустить".

В открывшемся окне "Создать контейнер" нажмите на кнопку "Дополнительные настройки".

На вкладке "Том" укажите следующие директории.

Файл/папкаПуть для подключенияКомментарий
docker/Noise/etc/grafana/etc/grafanaДиректория хранения конфигурации Grafana
docker/Noise/var/lib/grafana/var/lib/grafanaДиректория хранения данных Grafana
docker/Noise/var/log/grafana/var/log/grafanaДиректория хранения логов работы Grafana

Вкладка "Том" примет следующий вид.

На вкладке "Сеть" выберите название сети "noise-monitor-net".

На вкладке "Настройки портов" в поле "Локальный порт" укажите номер порта 3000.

На вкладке "Защита" вы можете увидеть, что для большинства перечисленных переменных у нас используются пути, которые мы подключили в разделе "Том". Нажмите на кнопку "Применить".

Окно "Дополнительные настройки" закроется, управление вернется в окно создания контейнера.

В окне "Создать контейнер" нажмите на кнопку "Далее".

Откроется окно "Резюме".

В окне "Резюме" проверьте еще раз введенные настройки и нажмите на кнопку "Применить".

Запустится контейнер с Grafana с названием grafana-grafana1.

Публикация для доступа через интернет

Для доступа через интернет будут опубликованы адреса контейнеров с Pushgateway и Grafana. Публикация Pushgateway предназначена для приема метрик от внешнего приложения OctavaPusher, а в интерфейсе Grafana осуществляется просмотр всех данных в графическом представлении. Настройка публикаций осуществляется через интерфейс "Обратный прокси" в интерфейсе DSM Панель управления - Портал приложений.

Создание публикации Pushgateway

При создании контейнера PushGateWay был задействован порт 9091, который будет опубликован для приема метрик через OctavaPusher.

Откройте Панель управления в интерфейсе Synology DSM и перейдите в раздел "Портал приложений".

В разделе "Портал приложений" перейдите на вкладку "Обратный прокси", и нажмите на кнопку "Создать".

Откроется окно "Правила обратного прокси".

В окне "Правила обратного прокси" заполните поля в соответствии с таблицей ниже, и нажмите на кнопку "ОК".

Название поляЗначение
ОписаниеPushGateway
Источник - ПротоколHTTP
Источник - Имя хостаpushnoise.alpol.su
Источник - Порт80
Место назначения - ПротоколHTTP
Место назначения - Имя хостаlocalhost
Место назначения - Порт9091

В списке "Обратный прокси" появится новая запись для PushGateway.

В браузере перейдите по адресу http://pushnoise.alpol.su, и убедитесь, что открывается страница Prometheus Pushgateway. На этом настройка публикации завершена.

Создание публикации Grafana

Контейнер Grafana был опубликован на порту 3000, соответственно при публикация обратного прокси будет указан этот порт. Но сам адрес извне будет доступен по HTTPS-протоколу на стандартном порту 443.

Чтобы Grafana была доступна по обоим протоколам, будут созданы два правила - для протоколов HTTPS и HTTP.

Перейдите в Панель управления - Портал приложений - вкладка Обратный прокси и нажмите на кнопку "Создать".

Откроется окно "Правила обратного прокси".

В окне "Правила обратного прокси" заполните поля в соответствии с таблицей ниже, и нажмите на кнопку "ОК".

Название поляЗначение
ОписаниеNoise
Источник - ПротоколHTTPS
Источник - Имя хостаnoise.alpol.su
Источник - Порт443
Источник - Включить HSTSДА
Источник - Включить HTTP/2ДА
Место назначения - ПротоколHTTP
Место назначения - Имя хостаlocalhost
Место назначения- Порт3000

В списке "Обратный прокси" появится новая запись.

Создайте еще одну запись обратного прокси и заполните поля согласно таблицы ниже.

Название поля

Значение

Описание

Noise_http

Источник - Протокол

HTTP

Источник - Имя хоста

noise.alpol.su

Источник - Порт

80

Место назначения - Протокол

HTTPS

Место назначения - Имя хоста

noise.alpol.su

Место назначения - Порт

443

В списке "Обратный прокси" появится новая запись.

В браузере перейдите по адресу http://noise.alpol.su или https://noise.alpol.su - у вас отобразится страница входа в Grafana.

Настройка Grafana

Смена пароля пользователя admin

При первом запуске Grafana вход осуществляется пользователем/паролем admin/admin. Выполните первый вход в интерфейс Grafana, и смените пароль пользователя admin.

Для смены пароля можно воспользоваться пунктом меню "Change Password" под иконкой пользователя.

Настройка источника данных Prometheus

В интерфейсе Grafana перейдите в раздел конфигурации (значок шестеренки), пункт "Data Sources".

В окне Configuration на закладке "Data Sources" нажмите на кнопку "Add data source".

Откроется окно "Add data source".

В окне "Add data source" выберите "Prometheus", и нажмите на кнопку "Select".

В окне добавления источника данных укажите параметры подключения к контейнеру Prometheus согласно таблицы ниже, и нажмите на кнопку "Save & Test". При успешном подключении появится надпись на зеленом фоне.

Название поляЗначениеКомментарий
NamePrometheusНазвание источника данных, которое будет использоваться в дальнейшем при подготовке Dashboard при указании источника данных.
Default?ДАОзначает, что источник данных будет использоваться по умолчанию при создании новых Dashboard.
HTTP - URLhttp://prom-prometheus1:9090

В данном поле указывается название контейнера и опубликованный порт в контейнере.

Auth - Skip TLS VerifyДАЭто значение по умолчанию. Указывать его не обязательно, поскольку подключение идет не по защищенному протоколу.
HTTP MethodPOSTМетод POST рекомендован для получения больших объемов данных.

В результате в разделе Data Sources появится новый источник данных.

Импорт Dashboard для отображения метрик OctavaPusher

Для отображения метрик по шуму были подготовлены три Dashboard, которые необходимо импортировать в интерфейс Grafana. Следующие файлы Dashboard необходимо загрузить для выполнения загрузки в Grafana.

  • Показания шумомера ШУМ v.3.json - Отображение метрик для выбранного размещения сбора показаний в слышимом диапазоне частот от 20 до 16 кГц согласно стандартному набору проверяемых октав. С возможностью просмотра истории.
  • Показания Шумомера Инфра v.3.json - Отображение метрик для выбранного размещения в диапазоне частот инфразвука, от 2 до 16 Гц. С возможностью просмотра истории.
  • Показания Шумомера Третьоктавы v.3.json - Отображение текущих значений частоты в третьоктавном диапазоне частот.

В интерфейсе Grafana перейдите в раздел Dashboards - Manage, и нажмите на кнопку "Import".

В окне "Import" нажмите на кнопку "Upload JSON file", и выберите один из скачанных файлов.

Отобразится информация с названием Dashboard, уникальный идентификатор Dashboard и источник данных.

В окне источника данных выберите созданный ранее источник данных Prometheus, и нажмите на кнопку "Import".

В списке Dashboard появится Dashboard с названием "Показания шумомера ШУМ".

Повторите действия для всех JSON-файлов всех Dashboard.

В результате у вас появится три Dashboard для отображения данных, которые передает OctavaPusher.

Описание Dashboard представлено на страницах Описание Dashboard Показания Шумомера ШУМ и Описание Dashboard Показания Шумомера Инфра. Dashboard "Показания Шумомера Третьоктавы" содержит уровни звука в третьоктавном режиме, отображаемую в реальном режиме времени.

  • No labels