Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных

Описание


Сервис eltex-ted необходим для интеграции с универсальным шлюзом (далее УШ).

Задачи, решаемые eltex-ted:

  • обработка запросов от Систем управления гостиницей для создания пользователей Wi-Fi;
  • выполнение запросов к Системе управления гостиницей для проведения начислений.

SoftWLC одновременно может работать только с одним УШ.

При интеграции используется Guest Based концепция, формат логина УЗ Wi-Fi: Фамилия (транслит)_ HotelID_ Номер комнаты (число)


Установка


Сервис устанавливается с помощью пакетного менеджера командой

apt install eltex-ted

Настройка


Конфигурационный файл для настройки доступен по пути /etc/eltex-ted/config/application.yml

spring:
  cache:
    caffeine:
      spec:
        # See CaffeineSpec for more settings
        expireAfterWrite=10m
  jpa:
    hibernate:
      naming:
        # Use strict case sensitive table names
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/eltex_ems?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC
    username: javauser
    password: javapassword
    hikari:
      poolName: Hikari
      auto-commit: false
      data-source-properties:
        cachePrepStmts: true
        prepStmtCacheSize: 250
        prepStmtCacheSqlLimit: 2048
        useServerPrepStmts: true
server:
  port: 8009

management:
  trace:
    http:
      enabled: true
  endpoints:
    web:
      exposure:
        # Actuator info
        # Useful for inspecting deployed beans, watching metrics, watching caches info
        # Also we can use it to create heapdump, threaddump, shutdown application and etc.
        include: health, beans, info, caches, prometheus, env, threaddump, heapdump, configprops, httptrace

ugw:
  baseUrl: http://localhost:8000/pmsconnect
  connectionTimeoutMs: 1000
  totalConnections: 1

mercury:
  host: localhost
  port: 6565

pcrf:
  baseUrl: http://localhost:7070

attributes:
  creator:
    firstname: 'Operator-Creator-Name'
    lastname: 'Operator-Creator-Family'
  posId: 12344321

В файле  application.yml нужно обратить внимание на параметры:

  • "baseUrl" в разделе "ugw" (ugw - адрес  универсального шлюза)
  • "baseUrl" в разделе "pcrf"
  • "url" в разделе "datasource"

Пояснения к конфигурации

БлокПояснениеВ Docker

spring.cache.caffeine.spec

Параметры кэша Caffeine.

В Ted кэшируются две выборки:

  • hotel id по имени домена;
  • домен по hotel id.

Время жизни кэша по умолчанию 10 минут.

SPRING_CACHE_CAFFEINE_SPEC

spring.jpa.hibernate.namingПараметры JPA Hibernate.

SPRING_JPA_HIBERNATE_NAMING_PHYSICALSTRATEGY

spring.datasource

Доступ до БД MySQL eltex_ems.

Сервис eltex-ted сам получает необходимые параметры Доменов из БД.

SPRING_DATASOURCE_...

server

Блок параметров сервера Ted.

port - порт, на котором сервис eltex-ted слушает входящие запросы.


SERVER_PORT

management.endpoints.web.exposureИнформация о работе сервера, предоставляемые компонентом Spring Actuator.

MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE

ugw

Блок параметров взаимодействия с УШ (Универсальным шлюзом).

baseUrl - URL УШ. Обязательно содержит /pmsconnect.


UGW_BASEURL

mercuryСервис eltex-ted создает пользователей Wi-Fi через SoftWLC eltex-mercury.

MERCURY_...

pcrfСервис eltex-ted работает с сессиями пользователей Wi-Fi через SoftWLC eltex-pcrf.

PCRF_BASEURL

attributes.creator

Имя ответственного за УЗ Wi-Fi:

creator:

firstname: 'Ivan'

lastname: 'Ivanov'

При создании УЗ нужно указывать имя и фамилию оператора. Обычно, это оператор ЛК. При работе Ted'а работает только бэкэнд, потому и оператора нужно указать отдельно.

ATTRIBUTES_CREATOR_FIRSTNAME

ATTRIBUTES_CREATOR_LASTNAME

attributes.posId

Зафиксированный PoS (Point of Sales) идентификатор.

Используется при обработке начислений, передается в запросах типа /charge в сторону УШ.

ATTRIBUTES_POSID

Настройка SoftWLC

Сервис Ted тесно взаимодействует с порталом.

Для его работы нужно правильно настроить окружение:

  1. Создать домен гостиницы, указать Hotel ID (в нумерации УШ, не FIAS). В этом домене находятся и ТД гостиницы, SSID, портал, УЗ Wi-Fi. Это один из самых важный моментов всей настройки. Через него происходит поиск соответствия сущностей SoftWLC (доменов) и УШ (гостиниц).
  2. В Личном кабинете создать Тарифный план для пользователей гостиницы (вход по данным Постояльца) и обычный бесплатный (вход по номеру телефона).
  3. Включить интеграцию Конструктора порталов с Ted: "Системные настройки" - "Доступ к Ted".
    Формат URI : http://<ip>:<port> данные для которой необходимо взять из конфигурационных файлов сервиса.
  4. Создаем новый портал в Конструкторе порталов, в домене гостиницы.
  5. Включить в портале "Общие настройки" - "Режим работы" - "Авторизация через УШ".
  6. В портале добавить созданные тарифы. Платным тарифам ставим условие "hotel".
  7. Создать SSID в домене гостиницы, это обязательное условие. SSID настраиваем на портальную авторизацию, в качестве портала  указываем ранее созданный портал.

  8. Создать привязку SSID к домену гостиницы.
  9. Указать в параметрах Ted адреса всех связных компонентов (указаны в таблице выше).
  10. Присвоить Ted PoS (Point of Sales), который нужно согласовать с командой УШ. PoS используется при обработке начислений.
  11. Указать в параметрах Ted Имя ответственного за УЗ Wi-Fi, которое используется при выгрузке данных СОРМ.

Методы взаимодействия с сервисом Ted

Все методы API Ted, кроме getversion - служебные.

Обращаться к ним необходимости нет. Все обращения к ним будут идти от Captive Portal и УШ.

Информация приводится для понимания логики работы.

Проверка работоспособности, getversion

Для проверки работоспособности API-интерфейса Ted после установки сервиса можно использовать метод getversion.

GetVersion
curl http://<IP>:<port>/getversion


Результат:

Должна вернуться версия сервиса Eltex-Ted

1.21-3101 (09.12.21 19:18:53)

Параметры: 

Отсутствуют.

Заселение, checkin (для УШ)

От УШ приходит нотификация при заселении постояльца в номер гостиницы.

В SoftWLC создается учетная запись Wi-Fi

CheckIn
curl --header "Content-Type: application/json" \
   --request POST \
   --data '{
    "hotelId":"54",
    "roomNumber":"1408",
    "guestName":"Энслин",
    "guestFirstName":"Майк",
    "pmsRegNum":"666"
}' \
http://<IP>:<port>/checkin

Результат:

В случае успешного запроса вы получите

HTTP 200 OK
{"code":0,"messages":["Success"]}

Если учетная запись с таким пользователем была когда-то заведена и заблокирована , то при таком запросе вы увидите следующий ответ : 
{"code":0,"messages":["User with same login and different regNum removed. New user created."]}

При ошибке

HTTP 200 OK
{"code":9}


Параметры:

Название параметраTypeLenghtПоле обязательно
для 
заполнения?
Описание
hotelIdstring20даУникальный идентификатор гостиницы для обработки в рамках определенного домена.

Задается в параметрах домена.
roomNumberstring10даНомер комнаты гостя.
guestNamestring40даФамилия гостя.

На вход ожидаются данные формата "Фамилия" или "Фамилия,Имя".
guestFirstNamestring40даИмя гостя.
guestTitlestring10

pmsRegNumstring20даУникальный номер гостя.
arrivalDatestring19нетДата заселения гостя. Часовой пояс SoftWLC. 
По умолчанию - Дата и время вызова метода.

"YYYY-MM-DD HH:MM:SS"
departureDatestring19нет

Дата выселения гостя. Часовой пояс SoftWLC. 

"YYYY-MM-DD HH:MM:SS"

arrivalDateTSstring19нет

Дата заселения гостя. Часовой пояс УШ.
По умолчанию - Дата и время вызова метода.

"YYYY-MM-DD HH:MM:SS"

departureDateTSstring19нетДата выселения гостя. Часовой пояс УШ.

"YYYY-MM-DD HH:MM:SS"
dateTimestring19нет

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

"YYYY-MM-DD HH:MM:SS"

guestLanguagestring2нетЯзык интерфейса.
ТВ Формат ISO 639-1, по умолчанию en.
guestVipStatusstring20нетСтатус VIP постояльца
roomSharestring1нетПризнак количества постояльцев в гостинице.
N – один постоялец в комнате, Y – более одного постояльца в комнате
swapFlagstring1нетПризнак, что данная запись направлена в рамках процесса синхронизации базы данных с УШ.
Y – запись синхронизационная в рамках процесса синхронизации БД (Database Resync) N (или отсутствует значение) – Запись онлайн FIAS SF
noPostint
нет1, если запрещены начисления
profileNumstring10нетНомер профиля

Переселение, guestchange (для УШ)

От УШ приходит нотификация при переселении постояльца (возможно изменение атрибутов без переселения).

В SoftWLC происходит обновление учетной записи Wi-Fi.

GuestChange
curl --header "Content-Type: application/json" \
   --request POST \
   --data '{
    "hotelId":"54",
    "roomNumber":"1409",
    "oldRoom":"1408",
    "guestName":"Энслин",
    "guestFirstName":"Майк",
    "pmsRegNum":"666"
}' \
http://<IP>:<port>/guestchange

Результаты: 
В случае успешного запроса вы получите

HTTP 200 OK
{"code":0}


При ошибке 

HTTP 200 OK
{"code":9}


Параметры:

Используются те же параметры, что и при методе CheckIn, за исключением "swapFlag". Так же добавляются новые

Название параметраTypeLenghtПоле обязательно
для 
заполнения?
Описание
oldRoomstring10даПредыдущий номер комнаты гостя.
oldRoomSharestring1нетПризнак количества постояльцев в предыдущей комнате.
N – один постоялец в комнате, Y – более одного постояльца в комнате

Выбор тарифа, charge (для Captive Portal)

От SoftWLC Captive Portal к Ted на /charge приходит нотификация о выборе профиля.

От Ted к УШ уходит запрос на УШ /charge для Обработка начислений.


Результаты: 
В случае успешного запроса вы получите

HTTP 200 OK
{"code":0}


При ошибке 

HTTP 200 OK
{"code":9}


Параметры:

Название параметраTypeLenghtПоле обязательно
для 
заполнения?
Описание
roomNumberstring10даНомер комнаты гостя.
guestNamestring40даФамилия гостя.

На вход ожидаются данные формата "Фамилия" или "Фамилия,Имя".
domainstring235даДомен гостя
tariffCodestring64даУникальный код тарифа в SoftWLC
tariffPriceint
да

Цена тарифа в SoftWLC Передается из SoftWLC, чтобы Ted не нужно было работать со структурой тарифа.

Цена тарифа передается в копейках.

dateTimestring19да

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

"YYYY-MM-DD HH:MM:SS"

Отчет о покупке, saledone (для УШ)

От УШ приходит уведомление на запрос /charge. Содержит информацию о проведенной покупке.

HTTP 200 OK
curl --header "Content-Type: application/json" \
   --request POST \
   --data '{
    "hotelId":"54",
    "roomNumber":"1409",
    "status":"0",
    "pmsRegNum":"666",
    "posId":"23134141",
    "dateTime":"2021-12-14 14:39:39",
    "dateTimeTS":"2021-12-14 14:39:39"
}' \
http://<IP>:<port>/saledone


Результаты: 
В случае успешного запроса вы получите

HTTP 200 OK
{"code":0}


При ошибке 

HTTP 200 OK
{"code":9}


Параметры:

Название параметраTypeLenghtПоле обязательно
для 
заполнения?
Описание
hotelIdstring20даУникальный идентификатор гостиницы для обработки в рамках определенного домена.

Задается в параметрах домена.
roomNumberstring10даНомер комнаты гостя.
statusint
даСтатус продажи:
  • 0 - успех
  • 1 - покупка отклонена, т.к. превышен кредитный лимит
  • 2 - ошибка. Общая сумма покупки не совпадает с суммами деталей покупки
  • 3 - покупка отклонена для постояльца (установлен флаг NoPost ля постояльца)
  • 4 - повторная покупка
  • 9 - Ошибка
pmsRegNumstring20даУникальный номер гостя.
posIdstring16даИдентификатор точки продажи
dateTimestring19да

Дата, переданная в запросе от FIAS.
Используется для поиска соответствий между запросами в разных информационных системах. Часовой пояс SoftWLC.

"YYYY-MM-DD HH:MM:SS"

dateTimeTSstring19даДата, переданная в запросе от FIAS Используется для поиска соответствий между запросами в разных информационных системах. Часовой пояс УШ.

"YYYY-MM-DD HH:MM:SS"
checkNumint10нетНомер чека
textstring255нет

Текст ответа покупки

userIDstring16нетИдентификатор пользователя
salesOutletint5нетНомер торговой точки
postingSequenceNumint8нетУникальный идентификатор покупки в УШ


Выселение, checkout (для УШ)

От УШ приходит нотификация при выселении постояльца из номера гостиницы.

В SoftWLC происходит блокировка УЗ Wi-Fi.

HTTP 200 OK
curl --header "Content-Type: application/json" \
   --request POST \
   --data '{
    "hotelId":"54",
    "roomNumber":"1409",
    "pmsRegNum":"667"
}' \
http://<IP>:<port>/checkout


Результаты: 
В случае успешного запроса вы получите

HTTP 200 OK
{"code":0}


При ошибке 

HTTP 200 OK
{"code":9}


Параметры:

Название параметраTypeLenghtПоле обязательно
для 
заполнения?
Описание
hotelIdstring20даУникальный идентификатор гостиницы для обработки в рамках определенного домена.

Задается в параметрах домена.
roomNumberstring10даНомер комнаты гостя.
pmsRegNumstring20даУникальный номер гостя.
roomSharestring1нетПризнак количества постояльцев в гостинице.
N – один постоялец в комнате, Y – более одного постояльца в комнате
swapFlagstring1нетПризнак, что данная запись направлена в рамках процесса синхронизации базы данных с УШ.
Y – запись синхронизационная в рамках процесса синхронизации БД (Database Resync) N (или отсутствует значение) – Запись онлайн FIAS SF
dateTimestring19нет

Дата, переданная в запросе от FIAS.
Используется для поиска соответствий между запросами в разных информационных системах. Часовой пояс SoftWLC.

"YYYY-MM-DD HH:MM:SS"

Поиск пользователя Wi-Fi, search (для Captive Portal)

От SoftWLC приходят данные, по которым надо найти пользователя (вернуть логин в БД)


Результаты: 
В случае успешного запроса вы получите

HTTP 200 OK
{"code":0}


При ошибке 

HTTP 200 OK
{"code":9}


Параметры:

Название параметраTypeLenghtПоле обязательно
для 
заполнения?
Описание
roomNumberstring10даНомер комнаты гостя.
guestNamestring40даФамилия гостя.

На вход ожидаются данные формата "Фамилия" или "Фамилия,Имя".
domainstring235даДомен гостя
dateTimestring19да

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

"YYYY-MM-DD HH:MM:SS"

Шаблон Postman для проверки API Ted

Описание

Для удобства проверки ответов сервиса Eltex-Ted на запросы была создана коллекция запросов в формате json, которая может быть импортирована в Postman для дальнейшего использования.

Настройка

Импорт коллекции запросов в формате json в приложение Postman


Для того, чтобы импортировать коллекцию запросов в приложение Postman необходимо
в основном окне приложения нажать кнопку Import:



Файл для импортирования можно найти прикрепленным в конце раздела "Импорт коллекции запросов в формате json в приложение Postman"


В открывшемся окне выбрать вкладку Files, нажать Upload Files и указать файл коллекции 'Ted_requests.postman_collection.json':


После загрузки файла, должно отобразиться следующее окно:


Здесь можно увидеть название импортируемой коллекции и версию файла.
При дальнейшем нажатии кнопки Import, данная коллекция будет добавлена в Workspace:

Каждый запрос можно настраивать отдельно.

Ted_requests.postman_collection.json

Параметризация запросов


Для каждого запроса было добавлено тело, с использованием параметризации, для того, чтобы изменять
передаваемые параметры не изменяя сам запрос.
Список параметров запроса можно увидеть в самом запросе на вкладке Body.
Список редактируемых параметров можно увидеть при нажатии на название коллекции и перейдя на вкладку
Variables:

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


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

docker-compose.yml
version: "3"
services:
  eltex-ted:
    container_name: eltex-ted
    image: hub.eltex-co.ru/softwlc/eltex-ted:1.21-<tag>
    ports:
      # Основной порт сервиса
      - "${TED_SERVER_PORT}:${TED_SERVER_PORT}"
      # volumes:
      # Логи gc пишутся внутри контейнера, если требуется оперативно их
      # вытащить можно определить директорию для выгрузки логов
      # Также можно вытащить логи через команду docker cp
      # "./export:${TED_LOG_DIR}
    environment:
      # Можно также переопределить параметры запуска сервиса
      # Но это нужно делать, только если есть необходимость, пока в закомментированном виде
      #- DEBUG_PORT=${TED_DEBUG_PORT}
      #- JAVA_INIT_HEAP=${TED_JAVA_INIT_HEAP}
      #- JAVA_MAX_HEAP=${TED_JAVA_MAX_HEAP}
      #- HEAP_DUMP_PATH=${TED_HEAP_DUMP_PATH}
      #- LOG_DIR=${TED_LOG_DIR}
      #- CONFIG_DIR=${TED_CONFIG_DIR}
      #- LOGGING_CONFIG=${TED_LOGGING_CONFIG}
      #
      # Настройка логгирования
      - LOG_LEVEL=${TED_LOG_LEVEL}
      - CONSOLE_LEVEL=${TED_CONSOLE_LEVEL}
      # Настройка перенаправления логов в Graylog
      - GELF_HOST=${GELF_HOST}
      - GELF_PORT=${GELF_PORT}
      - GELF_LEVEL=${GELF_LEVEL}
      # Конфигурация сервиса
      - SPRING_CACHE_CAFFEINE_SPEC=${TED_SPRING_CACHE_CAFFEINE_SPEC}
      - SPRING_JPA_HIBERNATE_NAMING_PHYSICALSTRATEGY=${TED_SPRING_JPA_HIBERNATE_NAMING_PHYSICALSTRATEGY}
      - SPRING_DATASOURCE_TYPE=${TED_SPRING_DATASOURCE_TYPE}
      - SPRING_DATASOURCE_DRIVERCLASSNAME=${TED_SPRING_DATASOURCE_DRIVERCLASSNAME}
      - SPRING_DATASOURCE_URL=${TED_SPRING_DATASOURCE_URL}
      - SPRING_DATASOURCE_USERNAME=${TED_SPRING_DATASOURCE_USERNAME}
      - SPRING_DATASOURCE_PASSWORD=${TED_SPRING_DATASOURCE_PASSWORD}
      - SPRING_DATASOURCE_HIKARI_POOLNAME=${TED_SPRING_DATASOURCE_HIKARI_POOLNAME}
      - SPRING_DATASOURCE_HIKARI_AUTOCOMMIT=${TED_SPRING_DATASOURCE_HIKARI_AUTOCOMMIT}
      - SPRING_DATASOURCE_HIKARI_DATASOURCEPROPERTIES_CACHEPREPSTMTS=${TED_SPRING_DATASOURCE_HIKARI_DATASOURCEPROPERTIES_CACHEPREPSTMTS}
      - SPRING_DATASOURCE_HIKARI_DATASOURCEPROPERTIES_PREPSTMTCACHESIZE=${TED_SPRING_DATASOURCE_HIKARI_DATASOURCEPROPERTIES_PREPSTMTCACHESIZE}
      - SPRING_DATASOURCE_HIKARI_DATASOURCEPROPERTIES_PREPSTMTCACHESQLLIMIT=${TED_SPRING_DATASOURCE_HIKARI_DATASOURCEPROPERTIES_PREPSTMTCACHESQLLIMIT}
      - SPRING_DATASOURCE_HIKARI_DATASOURCEPROPERTIES_USESERVERPREPSTMTS=${TED_SPRING_DATASOURCE_HIKARI_DATASOURCEPROPERTIES_USESERVERPREPSTMTS}
      - SERVER_PORT=${TED_SERVER_PORT}
      - MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE=${TED_MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE}
      - MANAGEMENT_TRACE_HTTP_ENABLED=${TED_MANAGEMENT_TRACE_HTTP_ENABLED}
      - UGW_BASEURL=${TED_UGW_BASEURL}
      - UGW_CONNECTIONTIMEOUTMS=${TED_UGW_CONNECTIONTIMEOUTMS}
      - UGW_TOTALCONNECTIONS=${TED_UGW_TOTALCONNECTIONS}
      - MERCURY_HOST=${TED_MERCURY_HOST}
      - MERCURY_PORT=${TED_MERCURY_PORT}
      - ATTRIBUTES_CREATOR_FIRSTNAME=${TED_ATTRIBUTES_CREATOR_FIRSTNAME}
      - ATTRIBUTES_CREATOR_LASTNAME=${TED_ATTRIBUTES_CREATOR_LASTNAME}
      - ATTRIBUTES_POSID=${TED_ATTRIBUTES_POSID}
      - PCRF_BASEURL=${TED_PCRF_BASEURL}
      - TZ=${TZ}
.env
# Можно также переопределить параметры запуска сервиса
# Но это нужно делать, только если есть необходимость, пока в закомментированном виде
TED_DEBUG_PORT=0
TED_JAVA_INIT_HEAP=256m
TED_JAVA_MAX_HEAP=512m
TED_HEAP_DUMP_PATH=/var/log/eltex-ted
TED_LOG_DIR=/var/log/eltex-ted
TED_CONFIG_DIR=/etc/eltex-ted
# CONFIG_DIR это не ошибка. резолвится на уровне сервиса.
TED_LOGGING_CONFIG="-Dlog4j2.configurationFile=${CONFIG_DIR}/log4j2-docker.xml -Dfile.encoding=UTF-8"

# Настройка логгирования
TED_LOG_LEVEL=INFO
TED_CONSOLE_LEVEL=INFO

# Настройка перенаправления логов в Graylog
GELF_HOST=udp:lab3-test.eltex.loc
GELF_PORT=12201
GELF_LEVEL=INFO

# Конфигурация сервиса
TED_SPRING_CACHE_CAFFEINE_SPEC=expireAfterWrite=10m
TED_SPRING_JPA_HIBERNATE_NAMING_PHYSICALSTRATEGY=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
TED_SPRING_DATASOURCE_TYPE=com.zaxxer.hikari.HikariDataSource
TED_SPRING_DATASOURCE_DRIVERCLASSNAME=com.mysql.jdbc.Driver
TED_SPRING_DATASOURCE_URL=jdbc:mysql://softwlc.eltex.loc:3306/eltex_ems?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC
TED_SPRING_DATASOURCE_USERNAME=javauser
TED_SPRING_DATASOURCE_PASSWORD=javapassword
TED_SPRING_DATASOURCE_HIKARI_POOLNAME=Hikari
TED_SPRING_DATASOURCE_HIKARI_AUTOCOMMIT=false
TED_SPRING_DATASOURCE_HIKARI_DATASOURCEPROPERTIES_CACHEPREPSTMTS=true
TED_SPRING_DATASOURCE_HIKARI_DATASOURCEPROPERTIES_PREPSTMTCACHESIZE=250
TED_SPRING_DATASOURCE_HIKARI_DATASOURCEPROPERTIES_PREPSTMTCACHESQLLIMIT=2048
TED_SPRING_DATASOURCE_HIKARI_DATASOURCEPROPERTIES_USESERVERPREPSTMTS=true
# Порт на котором поднимается сервис Ted
TED_SERVER_PORT=8009
TED_MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE=health,beans,info,caches,metrics,env,threaddump,heapdump,configprops,httptrace
TED_MANAGEMENT_TRACE_HTTP_ENABLED=true

# Адрес УШ
TED_UGW_BASEURL=http://localhost:8000/pmsconnect
TED_UGW_CONNECTIONTIMEOUTMS=1000
TED_UGW_TOTALCONNECTIONS=1

# Адрес Mercury
TED_MERCURY_HOST=localhost
TED_MERCURY_PORT=6565

# Адрес PCRF
TED_PCRF_BASEURL=http://localhost:7070

# Имя и фамилия ответственного за учётные записи PMS (СОРМ)
TED_ATTRIBUTES_CREATOR_FIRSTNAME=Operator-Creator-Name
TED_ATTRIBUTES_CREATOR_LASTNAME=Operator-Creator-Family

# Зафиксированный PoS (Point of Sales) идентификатор. Для запросов типа /charge в сторону УШ.
TED_ATTRIBUTES_POSID=12344321

#Настройка часового пояса
TZ=Asia/Novosibirsk


В файле  .env нужно  указать адреса:

  • TED_SPRING_DATASOURCE_URL -  необходимо указать адрес  mysql;
  • TED_UGW_BASEUR -  необходимо указать адрес  универсального шлюза.
  • TED_PCRF_BASEURL - необходимо указать адрес pcrf.

Мониторинг

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

Работа услуги

Перечислены признаки работы услуги Интеграция с гостиничными сетями:

  1. Проходят запросы УШ → Ted /checkin - От PMS приходит нотификация при заселении постояльца в номер гостиницы;
  2. При обработке заселения в БД MySQL radius создается УЗ Wi-Fi с логином - Фамилия (транслит)_ HotelID_ Номер комнаты (число);

  3. Данных пользователей можно найти в ЛК на вкладке Пользователи Wi-Fi - Гостиницы;
  4. Проходят запросы УШ → Ted /checkout - От PMS приходит нотификация при выселении постояльца из номера гостиницы;
  5. При обработке выселения в БД MySQL radius блокируются УЗ Wi-Fi;
  6. Проходят запросы УШ → Ted /guestchange - От PMS приходит нотификация при переселении постояльца;
  7. Проходят запросы Captive Portal → Ted /charge - Captive Portal передает начисления Ted'у (нотификация о выборе профиля);
  8. Проходят запросы Ted → УШ /charge - Ted передает начисления УШ;
  9. Проходят запросы УШ → Ted /saledone - УШ передает отчет об обработке начисления. Ted никак не использует эту информацию, только логирует;
  10. Проходят запросы Captive Portal → Ted /search - Captive Portal с помощью Ted производит поиск УЗ Wi-Fi по параметрам.

Счетчики по запросам можно найти в Метриках Ted (см. ниже). Если какая-то из метрик не меняется, значит что-то идёт не так, как задумано.

Пользователи в БД

В БД MySQL radstat для УЗ заведенным через "Интеграцию с гостиничными сетями" будут следующие свойства:

  1. radstat category 'pms';
  2. radstat auth_type '8' (pms);
  3. дополнительные атрибуты radcommon Eltex-Hotel-Id - Идентификатор отеля, Hotel ID
  4. radcommon Eltex-Room-Number - Номер комнаты
  5. radcommon Eltex-Registration-Number - Номер брони

Аналитика  данных по услуге с помощью скрипта

Для сбора и последующего анализа основной информации было создано два скрипта.

Инструкция по их использованию находится в файле README.md

universal_gateway_health_checker.zip

Метрики Ted

Для мониторинга работы eltex-ted доступны Prometheus метрики по пути http:<IP>:8009/actuator/prometheus

Среди них отметим следующие:

  • hikaricp_ предоставляют данные о работе Hikari connection pool (взаимодействие с БД MySQL eltex_ems);
  • http_server_requests_ показывают число обращений и коды ответов Ted API;
  • jvm_ предоставляет метрики Java машины (расход памяти, потоков);


 Пример метрик Prometheus для Ted

# HELP jvm_threads_peak_threads The peak live thread count since the Java virtual machine started or peak was reset
# TYPE jvm_threads_peak_threads gauge
jvm_threads_peak_threads 18.0
# HELP hikaricp_connections_active Active connections
# TYPE hikaricp_connections_active gauge
hikaricp_connections_active{pool="Hikari",} 0.0
# HELP jdbc_connections_idle Number of established but idle connections.
# TYPE jdbc_connections_idle gauge
jdbc_connections_idle{name="dataSource",} 10.0
# HELP jvm_gc_memory_allocated_bytes_total Incremented for an increase in the size of the (young) heap memory pool after one GC to before the next
# TYPE jvm_gc_memory_allocated_bytes_total counter
jvm_gc_memory_allocated_bytes_total 1.513095168E9
# HELP jetty_threads_current The total number of threads in the pool
# TYPE jetty_threads_current gauge
jetty_threads_current 8.0
# HELP system_cpu_usage The "recent cpu usage" for the whole system
# TYPE system_cpu_usage gauge
system_cpu_usage 0.4416206261510129
# HELP http_server_requests_seconds
# TYPE http_server_requests_seconds summary
http_server_requests_seconds_count{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 6.0
http_server_requests_seconds_sum{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 0.220476838
http_server_requests_seconds_count{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/favicon.ico",} 4.0
http_server_requests_seconds_sum{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/favicon.ico",} 0.085581041
http_server_requests_seconds_count{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/getversion",} 7695.0
http_server_requests_seconds_sum{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/getversion",} 68.467534433
http_server_requests_seconds_count{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator",} 1.0
http_server_requests_seconds_sum{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator",} 0.181165389
# HELP http_server_requests_seconds_max
# TYPE http_server_requests_seconds_max gauge
http_server_requests_seconds_max{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator/prometheus",} 0.021447602
http_server_requests_seconds_max{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/favicon.ico",} 0.002343475
http_server_requests_seconds_max{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/getversion",} 0.03070291
http_server_requests_seconds_max{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/actuator",} 0.0
# HELP jvm_threads_live_threads The current number of live threads including both daemon and non-daemon threads
# TYPE jvm_threads_live_threads gauge
jvm_threads_live_threads 16.0
# HELP process_start_time_seconds Start time of the process since unix epoch.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1.64276153174E9
# HELP hikaricp_connections Total connections
# TYPE hikaricp_connections gauge
hikaricp_connections{pool="Hikari",} 10.0
# HELP jetty_threads_idle The number of idle threads in the pool
# TYPE jetty_threads_idle gauge
jetty_threads_idle 3.0
# HELP jetty_threads_config_max The maximum number of threads in the pool
# TYPE jetty_threads_config_max gauge
jetty_threads_config_max 200.0
# HELP hikaricp_connections_acquire_seconds Connection acquire time
# TYPE hikaricp_connections_acquire_seconds summary
hikaricp_connections_acquire_seconds_count{pool="Hikari",} 0.0
hikaricp_connections_acquire_seconds_sum{pool="Hikari",} 0.0
# HELP hikaricp_connections_acquire_seconds_max Connection acquire time
# TYPE hikaricp_connections_acquire_seconds_max gauge
hikaricp_connections_acquire_seconds_max{pool="Hikari",} 0.0
# HELP process_files_open_files The open file descriptor count
# TYPE process_files_open_files gauge
process_files_open_files 252.0
# HELP process_files_max_files The maximum file descriptor count
# TYPE process_files_max_files gauge
process_files_max_files 1048576.0
# HELP hikaricp_connections_usage_seconds Connection usage time
# TYPE hikaricp_connections_usage_seconds summary
hikaricp_connections_usage_seconds_count{pool="Hikari",} 0.0
hikaricp_connections_usage_seconds_sum{pool="Hikari",} 0.0
# HELP hikaricp_connections_usage_seconds_max Connection usage time
# TYPE hikaricp_connections_usage_seconds_max gauge
hikaricp_connections_usage_seconds_max{pool="Hikari",} 0.0
# HELP process_cpu_usage The "recent cpu usage" for the Java Virtual Machine process
# TYPE process_cpu_usage gauge
process_cpu_usage 0.001841959845275373
# HELP jvm_memory_used_bytes The amount of used memory
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytes{area="heap",id="G1 Survivor Space",} 1.2582912E7
jvm_memory_used_bytes{area="heap",id="G1 Old Gen",} 3.8446E7
jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 7.6093528E7
jvm_memory_used_bytes{area="heap",id="G1 Eden Space",} 1.16391936E8
jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 2.8069376E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 9781624.0
# HELP system_load_average_1m The sum of the number of runnable entities queued to available processors and the number of runnable entities running on the available processors averaged over a period of time
# TYPE system_load_average_1m gauge
system_load_average_1m 1.49609375
# HELP jvm_buffer_total_capacity_bytes An estimate of the total capacity of the buffers in this pool
# TYPE jvm_buffer_total_capacity_bytes gauge
jvm_buffer_total_capacity_bytes{id="direct",} 291019.0
jvm_buffer_total_capacity_bytes{id="mapped",} 0.0
# HELP hikaricp_connections_max Max connections
# TYPE hikaricp_connections_max gauge
hikaricp_connections_max{pool="Hikari",} 10.0
# HELP jvm_threads_states_threads The current number of threads having NEW state
# TYPE jvm_threads_states_threads gauge
jvm_threads_states_threads{state="runnable",} 6.0
jvm_threads_states_threads{state="blocked",} 0.0
jvm_threads_states_threads{state="waiting",} 2.0
jvm_threads_states_threads{state="timed-waiting",} 8.0
jvm_threads_states_threads{state="new",} 0.0
jvm_threads_states_threads{state="terminated",} 0.0
# HELP jvm_classes_unloaded_classes_total The total number of classes unloaded since the Java virtual machine has started execution
# TYPE jvm_classes_unloaded_classes_total counter
jvm_classes_unloaded_classes_total 0.0
# HELP jvm_buffer_memory_used_bytes An estimate of the memory that the Java virtual machine is using for this buffer pool
# TYPE jvm_buffer_memory_used_bytes gauge
jvm_buffer_memory_used_bytes{id="direct",} 291019.0
jvm_buffer_memory_used_bytes{id="mapped",} 0.0
# HELP process_uptime_seconds The uptime of the Java virtual machine
# TYPE process_uptime_seconds gauge
process_uptime_seconds 231485.937
# HELP hikaricp_connections_pending Pending threads
# TYPE hikaricp_connections_pending gauge
hikaricp_connections_pending{pool="Hikari",} 0.0
# HELP jetty_threads_busy The number of busy threads in the pool
# TYPE jetty_threads_busy gauge
jetty_threads_busy 4.0
# HELP log4j2_events_total Number of fatal level log events
# TYPE log4j2_events_total counter
log4j2_events_total{level="warn",} 1.0
log4j2_events_total{level="debug",} 0.0
log4j2_events_total{level="error",} 0.0
log4j2_events_total{level="trace",} 0.0
log4j2_events_total{level="fatal",} 0.0
log4j2_events_total{level="info",} 21.0
# HELP jdbc_connections_min Minimum number of idle connections in the pool.
# TYPE jdbc_connections_min gauge
jdbc_connections_min{name="dataSource",} 10.0
# HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use
# TYPE jvm_memory_committed_bytes gauge
jvm_memory_committed_bytes{area="heap",id="G1 Survivor Space",} 1.2582912E7
jvm_memory_committed_bytes{area="heap",id="G1 Old Gen",} 9.961472E7
jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 8.0297984E7
jvm_memory_committed_bytes{area="heap",id="G1 Eden Space",} 1.56237824E8
jvm_memory_committed_bytes{area="nonheap",id="Code Cache",} 2.8704768E7
jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 1.0612736E7
# HELP jvm_gc_pause_seconds Time spent in GC pause
# TYPE jvm_gc_pause_seconds summary
jvm_gc_pause_seconds_count{action="end of minor GC",cause="Metadata GC Threshold",} 1.0
jvm_gc_pause_seconds_sum{action="end of minor GC",cause="Metadata GC Threshold",} 0.069
jvm_gc_pause_seconds_count{action="end of minor GC",cause="G1 Evacuation Pause",} 10.0
jvm_gc_pause_seconds_sum{action="end of minor GC",cause="G1 Evacuation Pause",} 1.163
# HELP jvm_gc_pause_seconds_max Time spent in GC pause
# TYPE jvm_gc_pause_seconds_max gauge
jvm_gc_pause_seconds_max{action="end of minor GC",cause="Metadata GC Threshold",} 0.0
jvm_gc_pause_seconds_max{action="end of minor GC",cause="G1 Evacuation Pause",} 0.0
# HELP hikaricp_connections_timeout_total Connection timeout total count
# TYPE hikaricp_connections_timeout_total counter
hikaricp_connections_timeout_total{pool="Hikari",} 0.0
# HELP hikaricp_connections_min Min connections
# TYPE hikaricp_connections_min gauge
hikaricp_connections_min{pool="Hikari",} 10.0
# HELP jetty_threads_config_min The minimum number of threads in the pool
# TYPE jetty_threads_config_min gauge
jetty_threads_config_min 8.0
# HELP jetty_threads_jobs Number of jobs queued waiting for a thread
# TYPE jetty_threads_jobs gauge
jetty_threads_jobs 0.0
# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool
# TYPE jvm_buffer_count_buffers gauge
jvm_buffer_count_buffers{id="direct",} 20.0
jvm_buffer_count_buffers{id="mapped",} 0.0
# HELP jvm_gc_live_data_size_bytes Size of long-lived heap memory pool after reclamation
# TYPE jvm_gc_live_data_size_bytes gauge
jvm_gc_live_data_size_bytes 3.792172E7
# HELP jvm_classes_loaded_classes The number of classes that are currently loaded in the Java virtual machine
# TYPE jvm_classes_loaded_classes gauge
jvm_classes_loaded_classes 14333.0
# HELP jdbc_connections_active Current number of active connections that have been allocated from the data source.
# TYPE jdbc_connections_active gauge
jdbc_connections_active{name="dataSource",} 0.0
# HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management
# TYPE jvm_memory_max_bytes gauge
jvm_memory_max_bytes{area="heap",id="G1 Survivor Space",} -1.0
jvm_memory_max_bytes{area="heap",id="G1 Old Gen",} 5.36870912E8
jvm_memory_max_bytes{area="nonheap",id="Metaspace",} -1.0
jvm_memory_max_bytes{area="heap",id="G1 Eden Space",} -1.0
jvm_memory_max_bytes{area="nonheap",id="Code Cache",} 2.5165824E8
jvm_memory_max_bytes{area="nonheap",id="Compressed Class Space",} 1.073741824E9
# HELP jvm_gc_memory_promoted_bytes_total Count of positive increases in the size of the old generation memory pool before GC to after GC
# TYPE jvm_gc_memory_promoted_bytes_total counter
jvm_gc_memory_promoted_bytes_total 4.3491816E7
# HELP jvm_threads_daemon_threads The current number of live daemon threads
# TYPE jvm_threads_daemon_threads gauge
jvm_threads_daemon_threads 5.0
# HELP system_cpu_count The number of processors available to the Java virtual machine
# TYPE system_cpu_count gauge
system_cpu_count 4.0
# HELP jvm_gc_max_data_size_bytes Max size of long-lived heap memory pool
# TYPE jvm_gc_max_data_size_bytes gauge
jvm_gc_max_data_size_bytes 5.36870912E8
# HELP hikaricp_connections_idle Idle connections
# TYPE hikaricp_connections_idle gauge
hikaricp_connections_idle{pool="Hikari",} 10.0
# HELP hikaricp_connections_creation_seconds_max Connection creation time
# TYPE hikaricp_connections_creation_seconds_max gauge
hikaricp_connections_creation_seconds_max{pool="Hikari",} 0.0
# HELP hikaricp_connections_creation_seconds Connection creation time
# TYPE hikaricp_connections_creation_seconds summary
hikaricp_connections_creation_seconds_count{pool="Hikari",} 1300.0
hikaricp_connections_creation_seconds_sum{pool="Hikari",} 14.309
# HELP jdbc_connections_max Maximum number of active connections that can be allocated at the same time.
# TYPE jdbc_connections_max gauge
jdbc_connections_max{name="dataSource",} 10.0

  • Нет меток