Описание


Сервис предназначен для управления учетными записями Hotspot-пользователей (используется сервисами eltex-portal и eltex-apb). Межсервисный обмен реализован на базе gRPC API.

Конфигурация


/etc/eltex-mercury/application.conf

Основной конфигурационный файл.

database {
  host = localhost
  port = 3306
  name = radius
  user = javauser
  password = javapassword

  readOnly = false

  pool {
    maxPoolSize = 20
    minimumIdle = 1
    connectionTimeout = 5000
  }

}

jdbc {
  properties {
    useSSL = false
  }
}

sorm3Enabled = false

logging {
  host = localhost
  port = 9099
}
database {
  host = localhost
  port = 3306
  name = radius
  user = javauser
  password = javapassword
readOnly = false
maxPoolSize = 20
maxPoolSize = 20
connectionTimeout = 5000
sorm3Enabled = false
logging	{ 
	host = localhost 
	port = 9099 
}


/etc/default/eltex-mercury

Cодержит параметры, необходимые для инициализации сервиса.

# Eltex-Mercury daemon parameters

# Initial size of Java heap
JAVA_INIT_HEAP=16m
# Maximum size of Java heap
JAVA_MAX_HEAP=256m

# Additional arguments to pass to java
JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/eltex-mercury"


ПараметрыОписание
JAVA_INIT_HEAP
Количество памяти, выделяемое на работу сервиса при старте. Рекомендуется выставлять равное JAVA_MAX_HEAP.
JAVA_MAX_HEAP
Максимальное количество памяти, которое может зарезервировать сервис
JAVA_OPTS
Дополнительные опции для запуска jvm


/etc/eltex-mercury/log4j2.xml

Файл настройки логирования сервиса.

<?xml version="1.0" encoding="UTF-8"?>

<Configuration monitorInterval="600">
    <Properties>
        <Property name="rootLevel">${env:LOG_LEVEL:-ERROR}</Property>

        <Property name="baseDir">/var/log/eltex-mercury</Property>
        <Property name="maxFileSize">20 MB</Property>
        <Property name="accumulatedFileSize">10 GB</Property>
        <Property name="lastModified">4d</Property>
        <Property name="maxCount">20</Property>
        <Property name="logPattern">%d{ISO8601} [%t] %-5p %logger{12} %C{1}.%M(line:%L). %m%n</Property>

        <Property name="gelfLevel">${env:GELF_LEVEL:-OFF}</Property>
        <Property name="gelfHost">${env:GELF_HOST:-udp:lab3-test.eltex.loc}</Property>
        <Property name="gelfPort">${env:GELF_PORT:-12201}</Property>
    </Properties>
    <Appenders>

        <RollingFile name="RollingFile"
                     fileName="${baseDir}/mercury.log"
                     filePattern="${baseDir}/log/mercury-%i.log.gz">
            <PatternLayout pattern="${logPattern}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="${maxFileSize}"/>
            </Policies>
            <DefaultRolloverStrategy max="${maxCount}">
                <Delete basePath="${baseDir}" maxDepth="3">
                    <IfFileName glob="*/mercury-*.log.gz">
                        <IfLastModified age="${lastModified}"/>
                        <IfAny>
                            <IfAccumulatedFileSize exceeds="${accumulatedFileSize}"/>
                            <IfAccumulatedFileCount exceeds="${maxCount}"/>
                        </IfAny>
                    </IfFileName>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <Gelf name="Gelf" host="${gelfHost}" port="${gelfPort}" version="1.1" facility="eltex-mercury"
              extractStackTrace="true" originHost="%host{fqdn}" maximumMessageSize="8192">
            <Field name="thread" pattern="%t"/>
            <Field name="level" pattern="%level"/>
            <Field name="severity" pattern="%-5level"/>
            <Field name="logger" pattern="%logger{12}"/>
            <Field name="location" pattern="%C{1}.%M(line:%L)"/>
        </Gelf>
    </Appenders>

    <Loggers>
        <Root level="${rootLevel}">
            <AppenderRef ref="RollingFile"/>
            <AppenderRef ref="Gelf" level="${gelfLevel}"/>
        </Root>

        <Logger name="org.hibernate"        level="ERROR"/>
        <Logger name="org.springframework"  level="ERROR"/>

        <Logger name="com.zaxxer.hikari"    level="WARN"/>
        <Logger name="io.grpc"              level="WARN"/>

        <Logger name="io.netty" level="INFO"/>
    </Loggers>

</Configuration>


<Configuration monitorInterval="600">
<Property name="rootLevel">${env:LOG_LEVEL:-ERROR}</Property>
<Property name="baseDir">/var/log/eltex-mercury</Property>
<Property name="maxFileSize">20 MB</Property>
<Property name="accumulatedFileSize">10 GB</Property>
<Property name="lastModified">4d</Property>
<Property name="maxCount">20</Property>
<Property name="gelfLevel">${env:GELF_LEVEL:-OFF}</Property>
<Property name="gelfHost">${env:GELF_HOST:-udp:lab3-test.eltex.loc}</Property>
<Property name="gelfPort">${env:GELF_PORT:-12201}</Property>



Настройка


Настройка взаимодействия с eltex-portal

Настройка производится в конструкторе порталов - "Системные настройки - "Доступ к Mercury":


Настройка взаимодействия eltex-apb

Настройка производится в конфигурационном файле apb - /etc/eltex-apb/apb.properties:

...
mercury.host=localhost
mercury.port=6565
mercury.pool.size=100
...


Настройка таймзоны

При получении в логах ошибки:

java.sql.SQLException: The server time zone value 'MSK' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

Нужно  прописать корректную таймзону для подключения к БД в файле /etc/eltex-mercury/application.conf:

database {
  ...
  jdbc {
    properties {
      serverTimezone = Europe/Moscow
    }
  }
}


Мониторинг


Для мониторинга сервиса APB поддержаны совместимые с Prometheus метрики. Для просмотра списка метрик надо открыть:

http://<адрес сервера Eltex-Mercury>:6564/mercury/prometheus

Для запуска мониторинга со стороны Prometheus нужно добавить в его конфигурации:

  - job_name: 'mercury'
    scrape_interval: 5s
    metrics_path: /mercury/prometheus


    static_configs:
#      Change this to the actual mercury address
      - targets: ['адрес сервера Eltex-Mercury:6564']

Grafana и Prometheus можно запустить в docker используя docker-compose.yml и .env:
docker-compose.yml

version: '3'

services:
  prometheus:
    image: prom/prometheus:v2.25.0
    volumes:
      - ./prometheus/:/etc/prometheus/
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
    ports:
      - ${PROMETHEUS_PORT}:9090

  grafana:
    image: grafana/grafana:7.4.2
    volumes:
      - ./grafana/:/etc/grafana/
    ports:
      - 3000:3000
    depends_on:
      - prometheus
    environment:
      - PROMETHEUS_HOST=${PROMETHEUS_HOST}
      - PROMETHEUS_PORT=${PROMETHEUS_PORT}

.env

# Change this to the actual address
PROMETHEUS_HOST=127.0.0.1
PROMETHEUS_PORT=9090

Шаблоны для Grafana, Prometheus  и docker-compose.yml можно  взять из  архива: monitoring_mercury.zip. Для запуска нужно  извлечь данные из архива, перейти в директорию  и  запустить:

docker-compose up

Докеризация сервиса


Сервис может быть запущен в docker-контейнере. Для этого необходимо подготовить файл с переменными окружения .env и docker-compose.yml

version: "3"
services:
  eltex-mercury:
    container_name: eltex-mercury
    image: hub.eltex-co.ru/softwlc/eltex-mercury:1.20-<tag>
    ports:
      - 6565:${MERCURY_PORT}
    environment:
      - grpc.port=${MERCURY_PORT}
      - database.host=${MERCURY_DB_HOST}
      - database.port=${MERCURY_DB_PORT}
      - database.name=${MERCURY_DB_NAME}
      - database.user=${MERCURY_DB_USER}
      - database.password=${MERCURY_DB_PASSWORD}
      - database.readOnly=${MERCURY_DB_READ_ONLY}
      - database.pool.maxPoolSize=${MERCURY_DB_POOL_SIZE}
      - database.pool.minimumIdle=${MERCURY_DB_POOL_MIN_IDLE}
      - database.pool.connectionTimeout=${MERCURY_DB_POOL_TIMEOUT}
      - sorm3Enabled=${MERCURY_SORM}
      - logging.host=${MERCURY_LOGGING_HOST}
      - logging.port=${MERCURY_LOGGING_PORT}
      - LOG_LEVEL=DEBUG
    volumes:
      - /var/log/eltex-mercury:/var/log/eltex-mercury


Вместо <tag> необходимо указать актуальную версию, которую можно посмотреть по ссылке.


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

MERCURY_PORT=6565

MERCURY_DB_HOST=<IP-address>
MERCURY_DB_PORT=3306
MERCURY_DB_NAME=radius
MERCURY_DB_USER=javauser
MERCURY_DB_PASSWORD=javapassword

MERCURY_DB_READ_ONLY=false

MERCURY_DB_POOL_SIZE=20
MERCURY_DB_POOL_MIN_IDLE=1
MERCURY_DB_POOL_TIMEOUT=5000

MERCURY_SORM=false

MERCURY_LOGGING_HOST=<IP-address>
MERCURY_LOGGING_PORT=9099

LOG_LEVEL=DEBUG


Описание переменных окружения

Запуск сервиса

Настройки взаимодействия с БД

Настройка SORM3

Взаимодействие с Logging Service