При управлении большим количеством WCS серверов, необходим сбор статистики медиа потоков для оценки качества вещания. Если серверы объединены в CDN, сбор информации о событиях в CDN также может быть полезен для последующей отладки.
В связи с этим, в сборке 5.2.749 добавлена возможность централизованного сбора статистики медиа потоков и событий в CDN.
Функцию сервера сбора статистики можно назначить одному из WCS серверов, при этом он продолжает выполнять основные задачи (публикация и воспроизведение медиа потоков). Остальные серверы при этом передают ему данные статистики при помощи специального протокола FREP, основанного на TCP. Полученные данные сервер статистики помещает в БД MySQL.
Роль сервера статистики может быть назначена любому WCS серверу. Теоретически, каждый из WCS серверов в сети может быть сервером сбора статистики, и собирать данные непосредственно на общий MySQL сервер, но в этом случае нагрузка на сеть может сильно возрасти.
Рекомендуется назначать роль сервера статистики на Controller сервер в CDN
Данные собираются в следующие таблицы
Поле | Тип | Описание |
---|---|---|
serverIp | varchar(15) | IP адрес WCS |
start | datetime | Время установки соединения |
sessionId | varchar(300) | Идентификатор сессии |
status | varchar(30) | Статус сессии |
info | varchar(300) | Причина, для статуса FAILED |
duration | int(11) | Длительность сессии |
Данные статистики клиентских сессий высылаются в начале и в конце сессии.
Поле | Тип | Описание |
---|---|---|
serverIp | varchar(15) | IP адрес WCS |
start | datetime | Время начала медиасессии |
sessionId | varchar(300) | Идентификатор сессии |
mediaProvider | varchar(30) | Медиапровайдер |
name | varchar(300) | Имя потока |
mediaSessionId | varchar(300) | Идентификатор медиасессии |
duration | int(32) | Длительность медиасессии |
status | varchar(30) | Статус медиасессии |
info | varchar(300) | Причина, для статуса FAILED |
type | varchar(100) | Тип медиасессии (PUBLISH или SUBSCRIBE) |
subscribers | int(16) | Количество подписчиков |
audioLost | int(2) | Количество потерянных аудиопакетов |
audioRate | int(4) | Битрейт аудио |
audioCodec | varchar(13) | Аудио кодек |
videoWidth | int(2) | Ширина картинки |
videoHeight | int(2) | Высота картинки |
videoPLI | int(2) | Количество PLI запросов |
videoNack | int(2) | Количество NACK |
videoRate | int(4) | Битрейт видео |
videoFPS | int(2) | Частота кадров видео |
videoBframes | int(2) | Количество B-фреймов |
videoCodec | varchar(4) | Видео кодек |
localSdp | varbinary(1500) | SDP на стороне сервера |
remoteSdp | varbinary(1500) | SDP на стороне браузера |
Данные статистики потоков высылаются в начале публикации или воспроизведения потока и по его окончании.
Поле | Тип | Описание |
---|---|---|
serverIp | varchar(15) | IP адрес WCS |
date | datetime | Дата и время фиксации события |
ts | varchar(30) | Метка времени CDN сигналинга |
srcNode | varchar(30) | Источник CDN сигналинга |
dstNode | varchar(30) | Приемник CDN сигналинга |
event | varchar(60) | Тип события CDN |
payload | varbinary(1500) | Содержимое сообщения CDN сигналинга |
Данные событий CDN высылаются непосредственно при возникновении события. В связи с этим, по умолчанию сбор статистки CDN отключен, и не рекомендуется его длительное использование в промышленной эксплуатации, только для целей отладки.
Приведем пример установки MySQL на Centos 7
1. Скачайте необходимый репозиторий
wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm |
2. Установите репозиторий
sudo rpm -ivh mysql57-community-release-el7-9.noarch.rpm |
3. Установите MySQL
sudo yum install mysql-server |
4. Запустите MySQL
sudo systemctl start mysqld |
1. Создайте базу данных и пользователя для записи статистики
CREATE DATABASE wcs; CREATE USER 'wcs'@'localhost' IDENTIFIED BY 'wcs'; GRANT ALL PRIVILEGES ON wcs.* TO 'wcs'@'localhost'; FLUSH PRIVILEGES; |
2. Импортируйте схему базы данных
mysql -u wcs -p wcs < wcs.sql |
-- MySQL dump 10.13 Distrib 8.0.20, for Linux (x86_64) -- -- Host: 172.17.0.2 Database: wcs -- ------------------------------------------------------ -- Server version 5.7.31 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!50503 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `cdn` -- DROP TABLE IF EXISTS `cdn`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `cdn` ( `serverIp` varchar(15) NOT NULL, `date` datetime NOT NULL, `ts` varchar(30) NOT NULL, `srcNode` varchar(30) NOT NULL, `dstNode` varchar(30) NOT NULL, `event` varchar(60) NOT NULL, `payload` varbinary(1500) NOT NULL, PRIMARY KEY (`ts`,`srcNode`,`event`,`dstNode`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `conndr` -- DROP TABLE IF EXISTS `conndr`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `conndr` ( `serverIp` varchar(15) NOT NULL, `start` datetime NOT NULL, `sessionId` varchar(300) NOT NULL, `status` varchar(30) NOT NULL, `info` varchar(300) DEFAULT NULL, `duration` int(11) DEFAULT NULL, PRIMARY KEY (`sessionId`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `sdr` -- DROP TABLE IF EXISTS `sdr`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `sdr` ( `serverIp` varchar(15) NOT NULL, `start` datetime NOT NULL, `sessionId` varchar(300) NOT NULL, `mediaProvider` varchar(30) NOT NULL, `name` varchar(300) NOT NULL, `mediaSessionId` varchar(300) NOT NULL, `duration` int(32) DEFAULT NULL, `status` varchar(30) NOT NULL, `info` varchar(300) DEFAULT NULL, `type` varchar(100) DEFAULT NULL, `subscribers` int(16) DEFAULT NULL, `audioLost` int(2) DEFAULT NULL, `audioRate` int(4) DEFAULT NULL, `audioCodec` varchar(13) DEFAULT NULL, `videoWidth` int(2) DEFAULT NULL, `videoHeight` int(2) DEFAULT NULL, `videoPLI` int(2) DEFAULT NULL, `videoNack` int(2) DEFAULT NULL, `videoRate` int(4) DEFAULT NULL, `videoFPS` int(2) DEFAULT NULL, `videoBframes` int(2) DEFAULT NULL, `videoCodec` varchar(4) DEFAULT NULL, `localSdp` varbinary(1500) DEFAULT NULL, `remoteSdp` varbinary(1500) DEFAULT NULL, PRIMARY KEY (`sessionId`,`mediaSessionId`,`name`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2020-08-26 11:30:24 |
Поддержка сбора статистики включается настройкой
frep_enabled=true |
Роль (клиент или сервер) задается настройкой (по умолчанию CLIENT)
frep_role=CLIENT |
Адрес сервера статистики задается настройкой
frep_controller_ip=192.168.1.64 |
Эта настройка должна быть указана на клиенте.
URI базы данных задается настройкой
frep_database_address=jdbc:mysql://localhost/wcs?user=wcs&password=wcs |
Эта настройка должна быть указана на сервере статистики.
Порт для передачи статистики задается настройкой (по умолчанию 8085)
frep_port=8085 |
Ключ авторизации на сервере статистики задается настройкой
frep_secret_key=dsjfoiewqhriywqtrfewfiuewqiufh |
Эта настройка должна быть указана одинаково на клиентах и сервере.
Все настройки могут быть применены без перезапуска сервера с использованием команды интерфейса командной строки
reload node-settings |
В этом случае, рекомендуется изменять эти настройки следующим образом:
1. Отключите сбор статистики на данном сервере
frep_enabled=false |
2. Перезагрузите настройки
reload node-settings |
3. Установите необходимые значения настроек и включите сбор статистики
frep_enabled=true |
4. Перезагрузите настройки
reload node-settings |
Высылаемые данные могут быть отфильтрованы при помощи настройки
frep_filter_events=CONNECT,CONNECTION_STATUS_EVENT,STREAM,STREAM_STATUS_EVENT |
Возможные значения фильтров
Значение | Описание |
---|---|
CONNECT | Данные об установке соединений |
CONNECTION_STATUS_EVENT | Данные статуса сессии |
STREAM | Данные о захвате/воспроизведении потока |
STREAM_STATUS_EVENT | Данные статуса потока |
В целях отладки, можно включить отправку всех событий CDN
frep_filter_events=CONNECT,CONNECTION_STATUS_EVENT,STREAM,STREAM_STATUS_EVENT,CDN_EVENT |
либо отфильтровать события
Значение | Описание |
---|---|
ROLE_REFRESH | Роль узла CDN |
NODE_REFRESH | Информация об узле CDN |
ROUTE_REFRESH | Информация о маршрутах воспроизведения потоков |
ROUTE_UPDATE | Обновление маршрутов воспроизведения потоков |
EXTENDED_ROUTE_UPDATE | Расширенная информация об обновлении маршрутов |
EXTENDED_ROUTE_REFRESH | Расширенная информация о маршрутах |
VERSION_REFRESH | Информация о версии CDN |
STATE_REFRESH | Информация о статусе узла CDN |
GROUP_REFRESH | Информация о группе CDN |
PROFILE_UPDATE | Обновление профилей транскодирования |
STREAM_ACCESS_LIST_REFRESH | Обновление списка ключей доступа к потоку |
STREAM_ACCESS_LIST_NODE_ID_UPDATE | Обновление идентификатора узла для сопоставления ключей доступа к потоку |
Выборки данных из таблиц MySQL производятся при помощи SQL запросов
SELECT serverIP, start, name, status, audioCodec, videoCodec FROM wcs.sdr WHERE name = 'test'; +---------------+---------------------+-------------+------------+------------+------------+ | serverIP | start | name | status | audioCodec | videoCodec | +---------------+---------------------+-------------+------------+------------+------------+ | 95.191.131.64 | 2020-08-10 13:44:00 | test | PUBLISHING | opus | H264 | | 95.191.131.64 | 2020-08-10 13:44:10 | test | PLAYING | opus | H264 | +---------------+---------------------+-------------+------------+------------+------------+ 2 rows in set (0.00 sec) |
Из-за большого объема текста, SDP хранятся в БД в сжатом виде. Для того, чтобы распаковать данные при выборке, используются утилиты xxd и zlib-flate
mysql -u wcs -p -B --disable-column-names -e 'select hex(localSdp) from wcs.sdr where name = "test"' | xxd -r -p | zlib-flate -uncompress |