...
В сборке 5.2.2017 добавлен сбор данных о событиях, связанных с изменением RTP синхронизации аудио и видео в опубликованном потоке
| Поле | Тип | Описание |
|---|
| timestamp | UInt64 | Метка времени |
| mediaSessionId | String | Идентификатор медиасессии |
| componentId | String | Идентификатор составляющей (аудио или видео) |
| eventType | UInt32 | Тип события |
| payload | String | Описание события |
Данные о потерях пакетов, отправленных зрителю (таблица PlayerPacketEvent)
В сборке 5.2.2024 добавлен сбор данных о потерях пакетов, отправленных зрителю
| Поле | Тип | Описание |
|---|
| timestamp | UInt64 | Метка времени |
| mediaSessionId | String | Идентификатор медиасессии |
| mid | UInt32 | Тип пакета: 1 - аудио 2 - видео |
| type | UInt32 | Тип события: 0 - потерян 1 - принят 2 - пакет задержался 3 - изменение порядка пакетов 4 - получение пакета не подтверждено |
| seq | UInt32 | Порядковый номер пакета |
Настройка
Установка и настройка ClickHouse
...
| Тип | Описание |
|---|
| CONNECTION | События клиенсткой сессии |
| STREAM | События потока |
| CDN | События CDN |
| MEDIA_SESSION | События медиа сессии |
| HLS_SEGMENTER | Данные о нарезке HLS потоков |
| HLS_STREAM | События HLS потоков |
| HLS_CLIENT | Статистика HLS клиентов |
| MIXER | События микшера |
| AUDIO_RECOVERY | Статистика потерь и восстановления аудиопакетов |
| RTMP_IN_BUFFER | Статистика буфера входящих RTMP потоков |
| REST_HOOKS | Статистика отправленных REST хуков |
| REST_HOOKS_BODY | Статистика отправленных REST хуков, включая тело запроса и тело ответа |
| RTP_SYNCHRONIZATION | Статистика изменений RTP синхронизации аудио и видео |
| PLAYER_PACKET_EVENT | Статистика отправки пакетов зрителю |
Настройка подключения к ClickHouse до сборки WCS 5.2.1999
...
| Параметр | Описание | Пример |
|---|
| mediaSession | Объект описания сбора данных MEDIA_SESSION | "mediaSession": {"frequency":100, "ids":["12345678-0000-1111"]} |
| frequency | Частота сбора данных в миллисекундах | 100 |
| ids | Список идентификаторов медиасессий потоков, для которых собираются данные | ["12345678-0000-1111","12345678-3333-4444"] |
| hlsSegmenter | Объект описания сбора данных HLS_SEGMENTER | "hlsSegmenter": {"ids":["stream1"]} |
| hlsClient | Объект описания сбора данных HLS_CLIENT | "hlsClient": {"ids":["stream1"]} |
| mixer | Объект описания сбора данных MIXER | "mixer": {"ids":["12345678-5555-6666"]} |
| audioRecovery | Объект описания сбора данных AUDIO_RECOVERY | "audioRecovery": {"ids":["12345678-7777-8888"]} |
| rtmpInBuffer | Объект описания сбора данных RTMP_IN_BUFFER | "rtmpInBuffer": {"ids":["12345678-9999-AAAA"]} |
rtpSynchronization | Объект описания сбора данных RTP_SYNCHRONIZATION | "rtpSynchronization": {"ids":["12345678-9999-BBBB"]} |
| playerPacket | Объект описания сбора данных PLAYER_PACKET_EVENT | "playerPacket": {"ids":["12345678-9999-CCCC"]} |
Автоматический сбор данных по условиям
...
- MEDIA_SESSION
- MIXER
- HLS_SEGMENTER
...
HLS_CLIENT (начиная со сборки 5.2.2091)
- RTMP_IN_BUFFER (начиная со сборки 5.2.2091)
- RTP_SYNCHRONIZATION (начиная со сборки 5.2.2091)
Условия задаются в виде фильтров в файле /usr/local/FlashphonerWebCallServer/conf/rels_trap.json
| Code Block |
|---|
|
{
"mediaSession":
[
{
"ips": ["127.0.0.1"],
"frequency": "1000ms"
},
{
"ips": ["192.168.0.0/24", "192.168.2.0/24"],
"streamName": ".*\\-screen"
},
{
"ips": ["192.168.0.101/32"],
"streamName": "test.*",
"frequency": "100th"
}
],
"mixer":
[
{
"name "streamName": "conference\\-test.*",
"mediaType": ["publish", "play"]
}
],
"mixer":
[
{
"name": "conference\\-.*",
"streamName": "user.*",
"frequency": "1000ms"
}
],
"hlsSegmenter":
[
{
"streamId": "test.*"
}
]
} |
Здесь:
...
,
"hlsClient":[
{
"streamId": "test.*"
}
],
"rtpSynchronization":[
{
"ips":["192.168.0.0/24"],
"streamName": "test.*"
}
],
"rtmpInBuffer":[
{
"ips":["192.168.0.0/24"],
"streamName": "test.*"
}
]
} |
Здесь:
- mediaSession - блок фильтров для отправки данных MEDIA_SESSION
- ips - список IP адресов клиентов
- streamName - маска имени в виде регулярного выражения
- type - тип сессии: "
publish", "play" - frequency - частота сбора данных для потока, подпадающего под фильтр
- mixer - блок фильтров для отправки данных MIXER
- name - маска имени микшера в виде регулярного выражения
- streamName - маска имени входящего потока микшера в виде регулярного выражения
- frequency - частота сбора данных для микшера, подпадающего под фильтр
- hlsSegmenter - блок фильтров для отправки данных HLS_SEGMENTER
- streamId - маска имени HLS потока в виде регулярного выражения
- hlsClient - блок фильтров для отправки данных HLS_CLIENT
- streamId - маска имени HLS потока в виде регулярного выражения
- rtpSynchronization - блок фильтров для отправки данных RTP_SYNCHRONIZATION
- ips - список IP адресов публикующих клиентов
- streamName - маска имени публикуемого потока в виде регулярного выражения
- rtmpInBuffer - блок фильтров для отправки данных MEDIARTMP_IN_SESSIONBUFFER
- ips - список IP адресов публикующих клиентов
- streamName - маска имени публикуемого потока в виде регулярного выражения
В списке IP адресов для фильтрации публикующих клиентов
...
- name - маска имени микшера в виде регулярного выражения
- streamName - маска имени входящего потока микшера в виде регулярного выражения
- frequency - частота сбора данных для микшера, подпадающего под фильтр
...
- streamId - маска имени HLS потока в виде регулярного выражения
В списке IP адресов для фильтрации публикующих клиентов могут быть указаны как точные IP адреса, так и маски адресов в CIDR форматемогут быть указаны как точные IP адреса, так и маски адресов в CIDR формате
| Code Block |
|---|
|
{
"mediaSession":
[
{
"ips": ["127.0.0.1", "192.168.0.0/24"],
...
},
...
],
...
} |
Если в условиях фильтрации указаны и список адресов, и имя потока, то данные будут собираться только для потока, имя которого и адрес публикующего клиента подпадают под заданные условия
| Code Block |
|---|
|
{
"mediaSession":
[
...,
{
"ips": ["127192.168.02.0.1/24"],
"192.168.0.0/24"] "streamName": ".*\\-screen",
...
},
...
],
...
} |
Если в условиях фильтрации типа данных MEDIA_SESSION MIXER указаны и список адресовимя микшера, и имя публикуемого входящего потока микшера, то данные будут собираться только для сбор данных для этого микшера начнется только после добавления в него потока, имя которого и адрес публикующего клиента подпадают под заданные условиясоответствует заданному условию
| Code Block |
|---|
|
{
"mediaSession":...,
["mixer":
...,[
{
"ipsname": ["192.168.2.0/24"]conference\\-.*",
"streamName": "user.*\\-screen",
...
},"frequency": "1000ms"
...}
],
...
} |
...
Параметр frequency определяет частоту сбора данных для этого типа:
"frequency": "100ms" - данные собираются каждые 100 мс"frequency": "100th" - данные собираются каждые 100 полученных пакетов
Изменения в файле rels_trap.json не требуют перезапуска сервера, но применяются к новым публикациям, микшерам и HLS потокам.
Выборки информации из БД
Выборки информации из БД производятся при помощи SQL запросов в клиенте ClickHouse
Примеры запросов для сборок WCS до 5.2.1999
| Code Block |
|---|
|
{
...,
"mixer":
[
{
"name": "conference\\-.*",
"streamName": "user.*",
"frequency": "1000ms"
}
],
...
} |
Параметр frequency определяет частоту сбора данных для этого типа:
"frequency": "100ms" - данные собираются каждые 100 мс"frequency": "100th" - данные собираются каждые 100 полученных пакетов
Изменения в файле rels_trap.json не требуют перезапуска сервера, но применяются к новым публикациям, микшерам и HLS потокам.
Выборки иформации из БД
Выборки информации из БД производятся при помощи SQL запросов в клиенте ClickHouse
Примеры запросов для сборок WCS до 5.2.1999
| Code Block |
|---|
|
select timestamp,ip,sessionId,mediaSessionId,streamName,dictGetString('wcs.DictionaryStreamEvents','type', eventType) as eventType from wcs.StreamEvent where streamName = 'test' |
| Code Block |
|---|
|
select timestamp,ip,sessionId,dictGetString('wcs.DictionaryConnectionEvents','type', eventType) as eventType from wcs.ConnectionEvent |
| Code Block |
|---|
|
select timestamp,ip,nodeId,dictGetString('wcs.DictionaryCDNEvents','type', eventType) as eventType,eventPayload from wcs.CDNEvent |
Примеры запросов для сборок WCS 5.2.1999 и новее
| Code Block |
|---|
|
select timestamp,ip,sessionId,mediaSessionId,streamName,dictGetString('wcs.DictionaryStreamEvents','type', eventType) as eventType from test1flashphonercom_192168065_521999.StreamEvent where streamName = 'test' |
| Code Block |
|---|
|
select timestamp,ip,sessionId,dictGetString('wcs.DictionaryConnectionEvents','type', eventType) as eventType from test1flashphonercom_192168065_521999.ConnectionEvent |
| Code Block |
|---|
|
select timestamp,ip,nodeId,dictGetString('wcs.DictionaryCDNEvents','type', eventType) as eventType,eventPayload from test1flashphonercom_192168065_521999.CDNEventselect timestamp,ip,sessionId,mediaSessionId,streamName,dictGetString('wcs.DictionaryStreamEvents','type', eventType) as eventType from wcs.StreamEvent where streamName = 'test' |
| Code Block |
|---|
|
select timestamp,ip,sessionId,dictGetString('wcs.DictionaryConnectionEvents','type', eventType) as eventType from wcs.ConnectionEvent |
| Code Block |
|---|
|
select timestamp,ip,nodeId,dictGetString('wcs.DictionaryCDNEvents','type', eventType) as eventType,eventPayload from wcs.CDNEvent |
Примеры запросов для сборок WCS 5.2.1999 и новее
| Code Block |
|---|
|
select timestamp,ip,sessionId,mediaSessionId,streamName,dictGetString('wcs.DictionaryStreamEvents','type', eventType) as eventType from test1flashphonercom_192168065_521999.StreamEvent where streamName = 'test' |
| Code Block |
|---|
|
select timestamp,ip,sessionId,dictGetString('wcs.DictionaryConnectionEvents','type', eventType) as eventType from test1flashphonercom_192168065_521999.ConnectionEvent |
| Code Block |
|---|
|
select timestamp,ip,nodeId,dictGetString('wcs.DictionaryCDNEvents','type', eventType) as eventType,eventPayload from test1flashphonercom_192168065_521999.CDNEvent |
Запись данных в файлы
Не всегда имеется возможность развернуть сервер ClickHouse для мониторинга в уже работающей инфраструктуре. В связи с этим, в сборке 5.2.2058 добавлена возможность записи данных в текстовые файлы, которые затем могут быть импортированы в БД ClickHouse для дальнейшего анализа.
Запись файлов включена по умолчанию настройкой
| Code Block |
|---|
|
rels_client_type=FILE |
Данные записываются в каталог /usr/local/FlashphonerWebCallServer/logs/rels. В этом каталоге создается подкаталог с именем БД, сформированным из имени хоста, IP адреса сервера и версии WCS. В свою очередь, в этот каталог помещаются текстовые файлы для каждой таблицы данных
| Code Block |
|---|
|
/usr/local/FlashphonerWebCallServer/logs/rels/
└── testflashphonercom_192168039_522060
├── ConnectionEvent.csv
├── ConnectionEvent.json
├── StreamEvent.csv
└── StreamEvent.json |
Каждая таблица состоит из двух файлов:
- json файл содержит описание типов данных таблицы, которое требуется для импорта в ClickHouse
- csv файл содержит сами данные, колонки данных разделяются запятыми
Импорт данных из файлов в БД ClickHouse
Для импорта данных в БД ClickHouse требуется установленный WCS сервер (например, в тестовой среде). В состав сервера входит инструмент для импорта, запускаемый следующим образом
| Code Block |
|---|
|
/usr/local/FlashphonerWebCallServer/tools/rels_import.sh --dbpath=/usr/local/FlashphonerWebCallServer/logs/rels/testflashphonercom_192168039_522060 |
Здесь
- dbpath - путь до каталога с файлами таблиц, которые нужно импортировать
Инструмент создаст БД с именем, соответствующим имени каталога с файлами таблиц, в данном примере testflashphonercom_192168039_522060.
Инструмент использует настройки подключения к БД ClickHouse из файла /usr/local/FlashphonerWebCallServer/conf/flashphoner.properties, например
| Code Block |
|---|
|
rels_client_type=HTTP
rels_database_address=database.flashphoner.com:8123
rels_database_properties=user=wcs&password=wcs |
При использовании БД Clickhouse 24 и новее, для импорта будет использован механизм дедупликации данных, чтобы повторно не добавлять в таблицы полностью совпадающие строки, если инструмент импорта был дважды запущен на одних и тех же данных.