AmazonChimeSDK/AmazonChimeSDK/internal/metric/DefaultClientMetricsCollector.swift (63 lines of code) (raw):
//
// DefaultClientMetricsCollector.swift
// AmazonChimeSDK
//
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//
import AmazonChimeSDKMedia
import Foundation
class DefaultClientMetricsCollector {
private var cachedObservableMetrics: [ObservableMetric: Any] = [:]
private let metricsObservers = ConcurrentMutableSet()
private var lastEmittedMetricsTime = DispatchTime.now()
private let metricsEmissionInterval = DispatchTimeInterval.seconds(1)
private func maybeEmitMetrics() {
let now = DispatchTime.now()
let expectedMetricsEmmisionTime = lastEmittedMetricsTime + metricsEmissionInterval
if now > expectedMetricsEmmisionTime {
lastEmittedMetricsTime = now
ObserverUtils.forEach(observers: metricsObservers) { (metricsObserver: MetricsObserver) in
metricsObserver.metricsDidReceive(metrics: self.cachedObservableMetrics)
}
}
}
}
extension DefaultClientMetricsCollector: ClientMetricsCollector {
public func processAudioClientMetrics(metrics: [AnyHashable: Any]) {
cachedObservableMetrics[ObservableMetric.audioSendPacketLossPercent]
= metrics[AudioClientMetric.serverPostJbMic1sPacketsLostPercent.rawValue]
cachedObservableMetrics[ObservableMetric.audioReceivePacketLossPercent]
= metrics[AudioClientMetric.clientPostJbSpk1sPacketsLostPercent.rawValue]
maybeEmitMetrics()
}
func processVideoClientMetrics(metrics: [AnyHashable: Any]) {
cachedObservableMetrics[ObservableMetric.videoAvailableSendBandwidth]
= metrics[VideoClientMetric.videoAvailableSendBandwidth.rawValue]
cachedObservableMetrics[ObservableMetric.videoAvailableReceiveBandwidth]
= metrics[VideoClientMetric.videoAvailableReceiveBandwidth.rawValue]
cachedObservableMetrics[ObservableMetric.videoSendBitrate]
= metrics[VideoClientMetric.videoSendBitrate.rawValue]
cachedObservableMetrics[ObservableMetric.videoSendPacketLossPercent]
= metrics[VideoClientMetric.videoSendPacketLossPercent.rawValue]
cachedObservableMetrics[ObservableMetric.videoSendFps]
= metrics[VideoClientMetric.videoSendFps.rawValue]
cachedObservableMetrics[ObservableMetric.videoSendRttMs]
= metrics[VideoClientMetric.videoSendRttMs.rawValue]
cachedObservableMetrics[ObservableMetric.videoReceiveBitrate]
= metrics[VideoClientMetric.videoReceiveBitrate.rawValue]
cachedObservableMetrics[ObservableMetric.videoReceivePacketLossPercent]
= metrics[VideoClientMetric.videoReceivePacketLossPercent.rawValue]
maybeEmitMetrics()
}
func processContentShareVideoClientMetrics(metrics: [AnyHashable: Any]) {
// Currently, content share is send-only
cachedObservableMetrics[ObservableMetric.contentShareVideoSendBitrate]
= metrics[VideoClientMetric.videoSendBitrate.rawValue]
cachedObservableMetrics[ObservableMetric.contentShareVideoSendPacketLossPercent]
= metrics[VideoClientMetric.videoSendPacketLossPercent.rawValue]
cachedObservableMetrics[ObservableMetric.contentShareVideoSendFps]
= metrics[VideoClientMetric.videoSendFps.rawValue]
cachedObservableMetrics[ObservableMetric.contentShareVideoSendRttMs]
= metrics[VideoClientMetric.videoSendRttMs.rawValue]
maybeEmitMetrics()
}
public func subscribeToMetrics(observer: MetricsObserver) {
metricsObservers.add(observer)
}
public func unsubscribeFromMetrics(observer: MetricsObserver) {
metricsObservers.remove(observer)
}
}