Перейти к содержанию

Настройка и управление сбором метрик

Настройка

Настройка для клиентов 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 в большинстве браузеров работает по HTTPS
  • keyStore - параметры хранилища ключей. Эти ключи используются для генерации токенов в заголовке аутентификации, используемых клиентами при отправке метрик

Объект описания метрик содержит все возможные метрики 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 включается следующей настройкой:

rtc_metrics_ingest_meta_repository=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 сервер. Настройка

rels_database=rels_db_central

устанавливает заданное имя базы данных. Эта настройка должна быть одинаковой на всех WCS серверах.

На WCS сервере, который обрабатывает запросы на анализ метрик /rest-api/stream_metrics_analyzer, имя базы данный устанавливается настройкой

sqa_database=rels_db_central

настройка логирования приема метрик

Логи приема метрик записываются в файл /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 соответственно.