Архитектура


Сервис предназначен для мониторинга состояния модулей проекта SoftWLC, проверки связности между компонентами системы и доступности баз данных, оповещениях о нештатных ситуациях.

Состоит из нескольких компонентов:

  • сервер Prometheus, служит для сбора  и хранения метрик.
  • Grafana - визуализирует полученные метрики и представляет удобный дашборд для метрик.
  • Alertmanager - менеджер уведомлений, служит  для отправки алертов.
  • Core-checker - сервис для сбора метрик, предоставляет API c метриками состояния модулей SoftWLC.


Модуль Eltex-core-checker устанавливается непосредственно на сервер, где установлены модули SoftWLC. Если архитектура SoftWLC подразумевает многохостовую систему, то пакет core-checker должен быть установлен на каждом сервере.

Интерфейс Grafana с настроенными дашбордами  доступен по адресу:

<<ip_address>>:3000/


Интерфейс Prometheus доступен  по адресу:

<<ip_address>>:9090/

API core-checker:

<<ip_address>>:8000/metrics





Внешний вид





На главном дашборде сервиса мониторинга отображается состояние каждого  модуля проекта SoftWLC.  При нормальной работе, панели состояний отображаются зеленым цветом, как только сервис становится недоступен, панель окрашивается красным цветом.

По нажатию на панель, подсвеченная красным цветом, можно перейти на страницу модуля.

В правом верхнем углу доступны ярлыки с названием модулей. По клику на ярлык, можно перейти в дашборд, где доступна различная информация отслеживаемого модуля: Uptime модуля, максимальное и текущее   количество файловых дескрипторов pid, время ответа сервиса, время ответа бд, количество выделенной виртуальной памяти, количество зарезервированной памяти. Для компонента radius так же доступна информация о количестве успешной и неуспешной авторизации enterprise пользователей.(Показывает значение с момента запуска core-checker)






Описание  проверки

Результат выполнения проверки с различными типами метрик, доступен в API, пример метрики gauge(значение может как увеличиваться, так и уменьшаться):

# HELP monitor_apb_mercury_request request_duration_seconds
# TYPE monitor_apb_mercury_request gauge
monitor_apb_mercury_request 0.007621049880981445

Пример метрики counter(увеличивается только в положительную сторону):

# HELP counter_positive_auth_radius_total positive counter authorization on radius
# TYPE counter_positive_auth_radius_total counter
counter_positive_auth_radius_total 7.0

Пример метрики, где всего два состояния(true и false):

# HELP apb_state service status
# TYPE apb_state gauge
apb_state{apb_state="true"} 1.0
apb_state{apb_state="false"} 0.0


Пример вывода:


Настройка

Конфигурационный файл сервиса core-checker находится по пути /etc/eltex-core-checker/application.conf

1) Для проверки работы сервиса eltex-radius необходимо создать enterprise пользователя с логином "tester", паролем "tester " и выбрать домен root в личном кабинете в разделе пользователи WI-FI.

2) Для работы скрипта проверки авторизации личного кабинета и конструктора портала(AUTH_SERVICE, Portal-Constructor, WIFI_CAB) в личном кабинете нужно создать системного пользователя "tester" и паролем "tester" в разделе настройки > "Системные пользователи".



[MONITORING]
wait = 5                                           время опроса сервиса, в секундах
exclude_checkers = disconnect, apb                 список сервисов, которые не нужно мониторить. Перечислить через запятую
log = error                                        уровень логирования

[APB]
apb_dir = /etc/eltex-apb/apb.properties            конфигурационный файл 
apb_address = 127.0.0.1                            ip адрес
apb_port = 8090	                                   порт 

[EMS]
ems_address = 127.0.0.1
ems_port = 8080
ems_dir = /usr/lib/eltex-ems/conf/config.txt

[PORTAL]
portal_address = 127.0.0.1
portal_dir = /etc/eltex-portal/application.conf
portal_ssid = SSID_name                               Название SSID
portal_ap_domain = root                               домен ТД
portal_cp_domain = root                               домен портала
portal_cp_name = default                              Название Портала
portal_mac_client = aa:bb:cc:00:11:22

[PCRF]
pcrf_address = 127.0.0.1
pcrf_dir = /etc/eltex-pcrf/eltex-pcrf.json
pcrf_user = javauser
pcrf_password = javapassword
mysql_port = 3306

[MERCURY]
mercury_address = 127.0.0.1
mercury_port = 6565
mercury_dir = /etc/eltex-mercury/application.conf

[RADIUS]
radius_address = 127.0.0.1
radius_secret = testing123                              secret
radius_user = tester                                    логин, для проверки enterprise авторизации
radius_password = tester                                пароль, для проверки enterprise авторизации
radius_domain = root
radius_pattern_pos = Login OK                           шаблон, по которому определяется успешная авторизация
radius_pattern_neg = Login incorrect                    шаблон, по которому определяется неуспешная авторизация
radius_pattern_exclude = Login OK: [tester/tester]      

[AUTH_SERVICE]
auth_service_address = 127.0.0.1
auth_service_port = 21812
auth_service_secret = eltex
auth_service_user = tester
auth_service_password = tester

[BOB]
bob_address = 127.0.0.1
bob_port = 9190
bob_dir = /etc/eltex-bob/application.properties

[Portal-Constructor]
cp_dir = /etc/eltex-portal-constructor/application.conf
cp_user = tester
cp_password = tester
cp_secret = eltex
cp_auth_port = 21812

[NGW]
ngw_dir = /etc/eltex-ngw/notification.properties
ngw_smpp = /etc/eltex-ngw/smpp_gate.conf

[NBI]
nbi_addr = localhost
nbi_dir = /etc/eltex-radius-nbi/radius_nbi_config.txt
nbi_username = softwlc_service
nbi_password = softwlc

[MAC_CHECKER]
mc_addr = localhost
mc_dir = /etc/eltex-ott-mac-checker/application.conf

[WIFI_CAB]
lk_dir = /etc/eltex-wifi-cab/system.xml
lk_secret = eltex
lk_user = tester
lk_password = tester

[DOORS]
doors_address = localhost
doors_dir = /etc/eltex-doors/application.properties

[DISCONNECT]
disconnect_address = localhost
disconnect_address_doors = localhost
disconnect_user = user
disconnect_password = password
disconnect_dir = /etc/eltex-disconnect-service/application.conf

Оригинал
https://www.shellhacks.com/ru/prometheus-node-exporter-install-config-ubuntu-centos/

Настройка уведомлений по электронной почте осуществляется в конфигурационном файле alert_config.yml менеджера уведомлений

global:                                                   блок настройки доступа к электронной почте
  smtp_smarthost: 'smtp.yandex.ru:25'             
  smtp_from: 'user@yandex.ru'                             учетная запись отправителя
  smtp_auth_username: 'user@yandex.ru'                    учетная запись отправителя
  smtp_auth_password: 'password'                          пароль от уз
  resolve_timeout: 10s

route:                                                    
   receiver: 'abon'
   group_interval: 10s

receivers:                                               блок настройки отвечающий кому будет приходить уведомления
  - name: 'abon'
    email_configs:
    - send_resolved: True
      to: 'user_all@yandex.ru'                           адрес электронной почты





Установка

Пример установки:

root@ubuntu:/srv/docker/monitoring# dpkg -i eltex-core-checker.deb


На сервере создать два каталога, один непосредственно для проекта мониторинга, второй для конфигурационных файлов.

root@ubuntu:/srv# mkdir -p docker/monitoring/conf
version: "3"

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./conf:/etc/prometheus
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=5d'
    ports:
      - "9090:9090"

  grafana:
    image: hub.eltex-co.ru/softwlc/eltex-core-checker:latest
    container_name: grafana
    depends_on:
      - prometheus
    ports:
      - 3000:3000
    links:
      - alertmanager:alertmanager
    volumes:
      - grafana_data:/var/lib/grafana

  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    volumes:
      - ./conf:/etc/alertmanager/
    ports:
      - 9093:9093
    command:
      - '--config.file=/etc/alertmanager/alert_config.yml'
      - '--storage.path=/alertmanager'
    depends_on:
      - prometheus

  node-exporter:
    hostname: monitoring-server
    image: prom/node-exporter:v1.3.1
    volumes:
        - /proc:/host/proc:ro
        - /sys:/host/sys:ro
        - /:/rootfs:ro
    command:
        - --path.procfs=/host/proc
        - --path.sysfs=/host/sys
        - --collector.filesystem.ignored-mount-points
        - ^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)
    ports:
        - 9101:9100

volumes:
  grafana_data:
  prometheus_data:


Далее в каталог conf следует разместить преднастроенные конфигурационные файлы prometheus, а также alertmanager:

 scrape_configs:

  - job_name: 'core-monitoring'
    scrape_interval: 5s
    metrics_path: '/metrics'
    static_configs:
      - targets: ['172.17.0.1:8000']

  - job_name: 'monitoring-server'
    scrape_interval: 5s
    metrics_path: 'metrics'
    static_configs:
      - targets: ['172.17.0.1:9100']

  - job_name: 'alertmanager'
    scrape_interval: 5s
    metrics_path: '/metrics'
    static_configs:
     - targets: ['172.17.0.1:9093']

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

 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
 rule_files:
   - 'alert.rules'


global:
  smtp_smarthost: 'smtp.yandex.ru:25'
  smtp_from: 'user@yandex.ru'
  smtp_auth_username: 'user@yandex.ru'
  smtp_auth_password: 'password'
  resolve_timeout: 10s

route:
   receiver: 'abon'
   group_interval: 10s

receivers:
  - name: 'abon'
    email_configs:
    - send_resolved: True
      to: 'user_all@yandex.ru'
#    webhook_configs:
#    - send_resolved: True
#      http_config:
#        proxy_url: http://172.17.0.1:8118
#      url: 'http://172.17.0.1/alert/-000000000'


groups:
- name: abon
  rules:
        
  - alert: ems_state_pcrf
    expr: ems_state_pcrf{ems_state_pcrf="false"} > 0
    for: 10s
    annotations:
      summary: "ems_state_pcrf down"
       
  - alert: nbi_state_pcrf
    expr: nbi_state_pcrf{nbi_state_pcrf="false"} > 0
    for: 10s
    annotations:
      summary: "nbi_state_pcrf down"
       
  - alert: apb_state_mercury
    expr: apb_state_mercury{apb_state_mercury="false"} > 0
    for: 10s
    annotations:
      summary: "apb_state_mercury down"
       
  - alert: ngw_state_mongo
    expr: ngw_state_mongo{ngw_state_mongo="false"} > 0
    for: 10s
    annotations:
      summary: "ngw_state_mongo down"
       
  - alert: nbi_state
    expr: nbi_state{nbi_state="false"} > 0
    for: 10s
    annotations:
      summary: "nbi_state down"
       
  - alert: nbi_state_ems
    expr: nbi_state_ems{nbi_state_ems="false"} > 0
    for: 10s
    annotations:
      summary: "nbi_state_ems down"
       
  - alert: doors_state_mysql
    expr: doors_state_mysql{doors_state_mysql="false"} > 0
    for: 10s
    annotations:
      summary: "doors_state_mysql down"
       
  - alert: nbi_state_mysql
    expr: nbi_state_mysql{nbi_state_mysql="false"} > 0
    for: 10s
    annotations:
      summary: "nbi_state_mysql down"
       
  - alert: portal_state_mercury
    expr: portal_state_mercury{portal_state_mercury="false"} > 0
    for: 10s
    annotations:
      summary: "portal_state_mercury down"
       
  - alert: nbi_state_auth_service
    expr: nbi_state_auth_service{nbi_state_auth_service="false"} > 0
    for: 10s
    annotations:
      summary: "nbi_state_auth_service down"
       
  - alert: mac_checker_state
    expr: mac_checker_state{mac_checker_state="false"} > 0
    for: 10s
    annotations:
      summary: "mac_checker_state down"
       
  - alert: portal_state
    expr: portal_state{portal_state="false"} > 0
    for: 10s
    annotations:
      summary: "portal_state down"
       
  - alert: pcrf_state
    expr: pcrf_state{pcrf_state="false"} > 0
    for: 10s
    annotations:
      summary: "pcrf_state down"
       
  - alert: prcf_state_nbi
    expr: prcf_state_nbi{prcf_state_nbi="false"} > 0
    for: 10s
    annotations:
      summary: "prcf_state_nbi down"
       
  - alert: nbi_state_mongo
    expr: nbi_state_mongo{nbi_state_mongo="false"} > 0
    for: 10s
    annotations:
      summary: "nbi_state_mongo down"
       
  - alert: lk_state_nbi
    expr: lk_state_nbi{lk_state_nbi="false"} > 0
    for: 10s
    annotations:
      summary: "lk_state_nbi down"
       
  - alert: lk_state_auth_service
    expr: lk_state_auth_service{lk_state_auth_service="false"} > 0
    for: 10s
    annotations:
      summary: "lk_state_auth_service down"
       
  - alert: pcrf_state_mysql
    expr: pcrf_state_mysql{pcrf_state_mysql="false"} > 0
    for: 10s
    annotations:
      summary: "pcrf_state_mysql down"
       
  - alert: mercury_state
    expr: mercury_state{mercury_state="false"} > 0
    for: 10s
    annotations:
      summary: "mercury_state down"
       
  - alert: portal_state_mysql
    expr: portal_state_mysql{portal_state_mysql="false"} > 0
    for: 10s
    annotations:
      summary: "portal_state_mysql down"
       
  - alert: mercury_state_mysql
    expr: mercury_state_mysql{mercury_state_mysql="false"} > 0
    for: 10s
    annotations:
      summary: "mercury_state_mysql down"
 
  - alert: apb_state
    expr: apb_state{apb_state="false"} > 0
    for: 10s
    annotations:
      summary: "apb down"
       
  - alert: doors_state
    expr: doors_state{doors_state="false"} > 0
    for: 10s
    annotations:
      summary: "doors_state down"
       
  - alert: pcrf_state_mongo
    expr: pcrf_state_mongo{pcrf_state_mongo="false"} > 0
    for: 10s
    annotations:
      summary: "pcrf_state_mongo down"
       
  - alert: radius_state
    expr: radius_state{radius_state="false"} > 0
    for: 10s
    annotations:
      summary: "radius_state down"
       
  - alert: auth_service_state
    expr: auth_service_state{auth_service_state="false"} > 0
    for: 10s
    annotations:
      summary: "auth_service_state down"
       
  - alert: disconnect_state
    expr: disconnect_state{disconnect_state="false"} > 0
    for: 10s
    annotations:
      summary: "disconnect_state down"
       
  - alert: lk_state_mongo
    expr: lk_state_mongo{lk_state_mongo="false"} > 0
    for: 10s
    annotations:
      summary: "lk_state_mongo down"
       
  - alert: bob_state
    expr: bob_state{bob_state="false"} > 0
    for: 10s
    annotations:
      summary: "bob_state down"
       
  - alert: disconnect_state_pcrf
    expr: disconnect_state_pcrf{disconnect_state_pcrf="false"} > 0
    for: 10s
    annotations:
      summary: "disconnect_state_pcrf down"
 
  - alert: bob_state_mysql
    expr: bob_state_mysql{bob_state_mysql="false"} > 0
    for: 10s
    annotations:
      summary: "bob_state_mysql down"
       
  - alert: cp_state_auth_service
    expr: cp_state_auth_service{cp_state_auth_service="false"} > 0
    for: 10s
    annotations:
      summary: "cp_state_auth_service down"
       
  - alert: cp_state_mysql
    expr: cp_state_mysql{cp_state_mysql="false"} > 0
    for: 10s
    annotations:
      summary: "cp_state_mysql down"
       
  - alert: mac_checker_state_ems
    expr: mac_checker_state_ems{mac_checker_state_ems="false"} > 0
    for: 10s
    annotations:
      summary: "mac_checker_state_ems down"
       
  - alert: ngw_state_smpp
    expr: ngw_state_smpp{ngw_state_smpp="false"} > 0
    for: 10s
    annotations:
      summary: "ngw_state_smpp down"
       
  - alert: ngw_state_mail
    expr: ngw_state_mail{ngw_state_mail="false"} > 0
    for: 10s
    annotations:
      summary: "ngw_state_mail down"
       
  - alert: ems_state
    expr: ems_state{ems_state="false"} > 0
    for: 10s
    annotations:
      summary: "ems_state down"
       
  - alert: ems_state_mysql
    expr: ems_state_mysql{ems_state_mysql="false"} > 0
    for: 10s
    annotations:
      summary: "ems_state_mysql down"


Следующий этап, запуск контейнеров, в корневом каталоге проекта выполнить команду:

root@ubuntu:/srv/docker/monitoring# docker-compose up -d

Далее убедиться в работоспособности сервиса, выполнив:

root@ubuntu:/srv/docker/monitoring# docker-compose ps
           Name                         Command               State           Ports
--------------------------------------------------------------------------------------------
alertmanager                 /bin/alertmanager --config ...   Up      0.0.0.0:9093->9093/tcp
grafana                      /run.sh                          Up      0.0.0.0:3000->3000/tcp
monitoring_node-exporter_1   /bin/node_exporter --path. ...   Up      0.0.0.0:9100->9100/tcp
prometheus                   /bin/prometheus --config.f ...   Up      0.0.0.0:9090->9090/tcp

Настройка docker-compose на автостарт при загрузке системы

Создайте файл systemd-сервиса

sudo nano /etc/systemd/system/docker-compose-eltex-softwlc-monitoring.service

[Unit]
Description=Docker Compose Eltex SoftWLC Monitoring
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/docker/monitoring
ExecStart=/usr/bin/docker-compose up -d
ExecStop=/usr/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target


Перезапустите systemd и настройте docker-compose-eltex-softwlc-monitoring на автостарт при загрузке системы

$ sudo systemctl daemon-reload
$ sudo systemctl enable docker-compose-eltex-softwlc-monitoring

Установка node_exporter на остальные сервера (для могохостовой системы)

Node Exporter - prometheus client от google, который умеет отдавать метрики произвольного линукс хоста (на котором установлен).

Создайте непривилегированного пользователя node_exporter

$ sudo useradd node_exporter -s /sbin/nologin

Скачать бинарник https://prometheus.io/download/#node_exporter

wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
tar xvfz node_exporter-*.*-amd64.tar.gz
sudo cp node_exporter-*.*-amd64/node_exporter /usr/sbin/

Создайте файл systemd-сервиса

sudo nano /etc/systemd/system/node_exporter.service

[Unit]
Description=Node Exporter

[Service]
User=node_exporter
EnvironmentFile=/etc/sysconfig/node_exporter
ExecStart=/usr/sbin/node_exporter $OPTIONS

[Install]
WantedBy=multi-user.target

Создайте sysconfig файл
Используйте этот файл, чтобы прописать опции передаваемые сервису, например

sudo mkdir -p /etc/sysconfig 
sudo touch /etc/sysconfig/node_exporter
sudo vim /etc/sysconfig/node_exporter

OPTIONS="--collector.textfile.directory /var/lib/node_exporter/textfile_collector"

Перезапустите systemd и настройте node_exporter на автостарт при загрузке системы

$ sudo systemctl daemon-reload
$ sudo systemctl enable node_exporter


Запустите сервис node_exporter

$ sudo systemctl start node_exporter


После установки Node Exporter, проверьте что метрики экспортируются:

$ curl http://localhost:9100/metrics


Добавляем новый сервер для мониторинга в конфиг prometheus.yml

Адреса получения метрик прописываются в поле targets

  - job_name: 'monitoring-server'
    scrape_interval: 5s
    metrics_path: 'metrics'
    static_configs:
      - targets: ['172.17.0.1:9100', '100.110.0.184:9100', '100.110.0.185:9100']

В Grafana ищите раздел OS