Настройка и управление сбором метрик¶
Настройка¶
Настройка для клиентов WCS¶
Описание метрик и параметры точки приема для клиентов находятся в JSON файле /usr/local/FlashphonerWebCallServer/conf/webrtc_metrics.json на стороне WCS. Сервер отправляет эту информацию подключившимся клиентам.
Файл настроек по умолчанию содержит конфигурацию точки приема по Websocket, то есть пачки метрик будет принимать этот же WCS сервер:
{
"collect": "off",
"sampling": 1000,
"batchSize": 30,
"compression": "none,gzip",
"types": {
...
}
}
Здесь
collectопределяет, должен ли клиент отправлять метрики (on) или нет (off). По умолчанию метрики не отправляются.sampling- минимальный период сбора метрик в миллисекундах. Обычно, сбора метрик один раз в секунду ("sampling": 1000) достаточно для полноты информации, и такая частота не влияет на производительность клиента.batchSize- минимальное количество пачек метрик для отправки на сервер. По умолчанию, клиент должен пытаться отправить каждые 30 пачек метрик. Таким образом, клиент должен отправлять данные каждые 30 секундcompression- список типов сжатия данных. По умолчанию, клиент должен пытаться упаковать данные для отправки, используя gzip, или отправлять несжатые данные.types- объект описания метрик (см ниже)
Описание приема метрик по HTTP/HTTPS требует дополнительных полей
{
"ingestPoint": "https://demo.flashphoner.com:8481",
"keyStore": {
"path": "/usr/local/FlashphonerWebCallServer/conf/jwt-hs256.p12",
"type": "PKCS12",
"password": "storepass",
"alias": "sqajwt",
"accessExpiresIn": 60
},
"collect": "on",
...
}
Здесь
ingestPoint- URL точки приема. Как правило, должен использовать HTTPS, поскольку большинство браузеров не позволяют отправлять HTTP запросы со страницы, открытой по HTTPS, а WebRTC в большинстве браузеров работает по HTTPSkeyStore- параметры хранилища ключей. Эти ключи используются для генерации токенов в заголовке аутентификации, используемых клиентами при отправке метрик
Объект описания метрик содержит все возможные метрики WebRTC статистики, собранные по группам. Клиент должен проверить, все ли метрики из описания доступны, и отправить серверу актуальный список поддерживаемых метрик. Затем клиент периодически отправляет серверу значения метрик, собранные в пачки. Сервер, в свою очередь, записывает полученные данные в базу данных Clickhouse. Если значение какой-либо числовой метрики недоступно, сервер записывает 0. Если значение какой-либо строковой метрики недоступно, сервер записывает пустую строку "".
Metrics description object
{
...,
"types": {
"codec": {
"metrics": "timestamp,payloadType,mimeType,clockRate,channels"
},
"inbound-rtp": {
"metrics": "timestamp,ssrc,kind,packetsReceived,packetsReceivedWithEct1,packetsReceivedWithCe,packetsReportedAsLost,packetsReportedAsLostButRecovered,packetsLost,jitter,trackIdentifier,mid,remoteId,framesDecoded,keyFramesDecoded,framesRendered,framesDropped,frameWidth,frameHeight,framesPerSecond,qpSum,totalDecodeTime,totalInterFrameDelay,totalSquaredInterFrameDelay,pauseCount,totalPausesDuration,freezeCount,totalFreezesDuration,lastPacketReceivedTimestamp,headerBytesReceived,packetsDiscarded,fecBytesReceived,fecPacketsReceived,fecPacketsDiscarded,bytesReceived,nackCount,firCount,pliCount,totalProcessingDelay,estimatedPlayoutTimestamp,jitterBufferDelay,jitterBufferTargetDelay,jitterBufferEmittedCount,jitterBufferMinimumDelay,totalSamplesReceived,concealedSamples,silentConcealedSamples,concealmentEvents,insertedSamplesForDeceleration,removedSamplesForAcceleration,audioLevel,totalAudioEnergy,totalSamplesDuration,framesReceived,decoderImplementation,playoutId,powerEfficientDecoder,framesAssembledFromMultiplePackets,totalAssemblyTime,retransmittedPacketsReceived,retransmittedBytesReceived,rtxSsrc,fecSsrc,totalCorruptionProbability,totalSquaredCorruptionProbability,corruptionMeasurements"
},
"outbound-rtp": {
"metrics": "timestamp,ssrc,kind,packetsSent,bytesSent,mid,mediaSourceId,remoteId,rid,encodingIndex,headerBytesSent,retransmittedPacketsSent,retransmittedBytesSent,rtxSsrc,targetBitrate,totalEncodedBytesTarget,frameWidth,frameHeight,framesPerSecond,framesSent,hugeFramesSent,framesEncoded,keyFramesEncoded,qpSum,psnrSum,psnrMeasurements,totalEncodeTime,totalPacketSendDelay,qualityLimitationReason,qualityLimitationDurations,qualityLimitationResolutionChanges,nackCount,firCount,pliCount,encoderImplementation,powerEfficientEncoder,active,scalabilityMode,packetsSentWithEct1"
},
"remote-inbound-rtp": {
"metrics": "timestamp,ssrc,kind,packetsReceived,packetsReceivedWithEct1,packetsReceivedWithCe,packetsReportedAsLost,packetsReportedAsLostButRecovered,packetsLost,jitter,localId,roundTripTime,totalRoundTripTime,fractionLost,roundTripTimeMeasurements,packetsWithBleachedEct1Marking"
},
"remote-outbound-rtp": {
"metrics": "timestamp,ssrc,kind,packetsSent,bytesSent,localId,remoteTimestamp,reportsSent,roundTripTime,totalRoundTripTime,roundTripTimeMeasurements"
},
"media-source": {
"metrics": "timestamp,trackIdentifier,kind,audioLevel,totalAudioEnergy,totalSamplesDuration,echoReturnLoss,echoReturnLossEnhancement,width,height,frames,framesPerSecond"
}
}
}
Настройка приема метрик в WCS¶
WCS может принимать метрики. Эта функция доступна в рамках централизованного сбора данных в БД ClickHouse:
rels_enabled=RTC_CODEC_EVENT,RTC_INBOUND_RTP_EVENT,RTC_OUTBOUND_RTP_EVENT,RTC_REMOTE_INBOUND_RTP_EVENT,RTC_REMOTE_OUTBOUND_RTP_EVENT,RTC_MEDIA_SOURCE_EVENT,RTC_MEDIA_PLAYOUT_EVENT,RTC_PEER_CONNECTION_EVENT,RTC_DATA_CHANNEL_EVENT,RTC_TRANSPORT_EVENT,RTC_CANDIDATE_PAIR_EVENT,RTC_LOCAL_CANDIDATE_EVENT,RTC_REMOTE_CANDIDATE_EVENT,RTC_CERTIFICATE_EVENT,SESSION_METADATA
rels_client_type=JDBC
rels_database_address=clickhouseserver:8123
rels_database_properties=user=wcs&password=wcs
Для настройки приема по HTTP/HTTPS необходимы дополнительные параметры
rtc_metrics_ingest_enabled=true
rtc_metrics_ingest_ip=0.0.0.0
rtc_metrics_ingest_http_port=8480
rtc_metrics_ingest_https_port=8481
rtc_metrics_resend_token_interval=30
rtc_metrics_resend_token_enabled=true
Интервал обновления токена аутентификации в секундах rtc_metrics_resend_token_interval должен быть меньше либо равен значению accessExpiresIn, чтобы время действия токена не истекало преждевременно.
Настройка централизованного сбора метрик с нескольких WCS узлов¶
Несколько WCS серверов могут отправлять метрики в одну и ту же базу данных на один и тот же Clickhouse сервер. Это позволяет настроить балансировку сбора HTTPS метрик, однако в этом случае метаданные, идентифицирующие клиентские сессии, также должны храниться централизованно. Для этого используется БД Redis.
Настройка подключения к Redis¶
Сохранение метаданных клиентских сессий в Redis включается следующей настройкой:
Подключение к Redis настраивается в файле /usr/local/FlashphonerWebCallServer/conf/redis-client.yaml:
# FLASHPHONER COMPANY CONFIDENTIAL
# __________________________________________
#
# [2009] - [2026] Flashphoner company
# All Rights Reserved.
#
# NOTICE: All information contained herein is, and remains
# the property of Flashphoner company and its suppliers,
# if any. The intellectual and technical concepts contained
# herein are proprietary to Flashphoner company
# and its suppliers and may be covered by U.S. and Foreign Patents,
# patents in process, and are protected by trade secret or copyright law.
# Dissemination of this information or reproduction of this material
# is strictly forbidden unless prior written permission is obtained
# from Flashphoner company.
########################################################################################################################################################
# This configuration is used to establish a connection and work with the Redis-Server, which stores the necessary metadata for processing RTC metrics.##
########################################################################################################################################################
# WARNING! if the connection fails, the server stops accepting metrics. See server logs to ensure a successful connection ##############################
########################################################################################################################################################
# WARNING! To apply the new configuration, the server must be restarted.################################################################################
########################################################################################################################################################
## Use this block to configure connection to Redis-Server
connection:
# Host of Redis-Server (required)
host: 127.0.0.1
# Port of Redis-Server (required)
port: 6379
# Password of Redis-Server
#password: admin
## Connection timeout in seconds. This value is used for:
## 1. Maximum wait time when establishing initial connection
## 2. Delay between reconnection
## The default is `30` seconds.
#timeout: 30
## Use this block to configure key behaviour
#key:
## Responsible for the key's lifetime. The lifetime is reset to its initial value after each use to receive metrics.
## If it is not specified, the lifetime is unlimited or is regulated by the Redis-Server configuration.
#ttl: 10000
## Use this block to configure SSL
#ssl:
## SSL Provider. By default, the value is `JDK` and only it is supported
#provider: JDK
## Truststore credentials
#truststore:
## The path can be specified as absolute, otherwise it is relative ./conf
## Supported formats: PKCS12 or JKS
#path: redis-certs/truststore.jks
## Truststore password
#password: admin123
## Keystore credentials
#keystore:
## The path can be specified as absolute, otherwise it is relative ./conf
## Supported formats: PKCS12
#path: redis-certs/client.p12
## Keystore password
#password: admin123
## Use this block to configure work with commands such as `set`, `expire`, `get`, `del` and other.
#commands:
## Maximum wait time in seconds when sending a command to the Redis-Server.
## By default its `30`
#timeout: 30
## Try to reconnect if the command fails to complete and complete it
## By default its `true`
#autoReconnect: true
## Cancel commands on reconnect failure
## By default its `false`
#cancelCommandsOnReconnectFailure: false
Файл настройки самого Redis /etc/redis/redis.conf выглядит следующим образом
bind 0.0.0.0
notify-keyspace-events KEA
port 6379
tls-port 6380
tls-cert-file /etc/ssl/domain/domain.crt
tls-key-file /etc/ssl/domain/priv.key
tls-ca-cert-file /etc/ssl/domain/ca.crt
tls-auth-clients yes
Настройка централизованной базы данных Clickhouse¶
По умолчанию, метрики отправляются в отдельные базы данных на Clickhouse сервере, по одной на каждый WCS сервер. Настройка
устанавливает заданное имя базы данных. Эта настройка должна быть одинаковой на всех WCS серверах.
На WCS сервере, который обрабатывает запросы на анализ метрик /rest-api/stream_metrics_analyzer, имя базы данный устанавливается настройкой
настройка логирования приема метрик¶
Логи приема метрик записываются в файл /usr/local/FlashphonerWebCallServer/logs/ingest_logs/ingest.log. Параметры логирования настраиваются в файле /usr/local/FlashphonerWebCallServer/conf/log4j.properties:
log4j.logger.io.lettuce=INFO,ingestAppender
log4j.additivity.io.lettuce=false
log4j.logger.com.flashphoner.media.webrtc.metrics=INFO,ingestAppender
log4j.additivity.com.flashphoner.media.webrtc.metrics=false
log4j.logger.com.flashphoner.server.metrics=INFO, ingestAppender
log4j.additivity.com.flashphoner.server.metrics=false
log4j.appender.ingestAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ingestAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.ingestAppender.File=${com.flashphoner.fms.AppHome}/logs/ingest_logs/ingest.log
log4j.appender.ingestAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.ingestAppender.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p %25.25c{1} - %t %m%n
Управление¶
Отправка метрик может быть включена или отключена для всех клиентов при помощи REST API запроса /rest-api/v3/stream/rtc_metrics/update_all или для определенных клиентов при помощи REST API запроса /rest-api/v3/stream/rtc_metrics/update_batch. Метрики SFU потоков управляются запросами /rest-api/v3/sfu/rtc_metrics/update_all и /rest-api/v3/sfu/rtc_metrics/update_batch соответственно.