Skip to content

Commit 83dabdb

Browse files
chore(core): stop sending legacy raw stats in SendStats (#1861)
Syncs signal.proto with GetStream/protocol#2116, which removed the deprecated SendStatsRequest fields. Android only populated publisher_stats and subscriber_stats; sendCallStats() no longer takes a CallStatsReport and the collectStats() calls that only existed to fill it are gone. Co-authored-by: Pratim Mallick <34009202+PratimMallick@users.noreply.github.com>
1 parent e2dbef8 commit 83dabdb

10 files changed

Lines changed: 23 additions & 46 deletions

File tree

‎stream-video-android-core/api/stream-video-android-core.api‎

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19019,28 +19019,22 @@ public final class stream/video/sfu/signal/SendStatsRequest : com/squareup/wire/
1901919019
public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter;
1902019020
public static final field Companion Lstream/video/sfu/signal/SendStatsRequest$Companion;
1902119021
public fun <init> ()V
19022-
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/InputDevices;Lstream/video/sfu/models/InputDevices;Lstream/video/sfu/models/AndroidState;Lstream/video/sfu/models/AppleState;Lstream/video/sfu/signal/Telemetry;Lstream/video/sfu/models/RTMPIngress;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lokio/ByteString;)V
19023-
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/InputDevices;Lstream/video/sfu/models/InputDevices;Lstream/video/sfu/models/AndroidState;Lstream/video/sfu/models/AppleState;Lstream/video/sfu/signal/Telemetry;Lstream/video/sfu/models/RTMPIngress;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
19024-
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/InputDevices;Lstream/video/sfu/models/InputDevices;Lstream/video/sfu/models/AndroidState;Lstream/video/sfu/models/AppleState;Lstream/video/sfu/signal/Telemetry;Lstream/video/sfu/models/RTMPIngress;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lokio/ByteString;)Lstream/video/sfu/signal/SendStatsRequest;
19025-
public static synthetic fun copy$default (Lstream/video/sfu/signal/SendStatsRequest;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/InputDevices;Lstream/video/sfu/models/InputDevices;Lstream/video/sfu/models/AndroidState;Lstream/video/sfu/models/AppleState;Lstream/video/sfu/signal/Telemetry;Lstream/video/sfu/models/RTMPIngress;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/signal/SendStatsRequest;
19022+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/AndroidState;Lstream/video/sfu/models/AppleState;Lstream/video/sfu/signal/Telemetry;Lstream/video/sfu/models/RTMPIngress;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lokio/ByteString;)V
19023+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/AndroidState;Lstream/video/sfu/models/AppleState;Lstream/video/sfu/signal/Telemetry;Lstream/video/sfu/models/RTMPIngress;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
19024+
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/AndroidState;Lstream/video/sfu/models/AppleState;Lstream/video/sfu/signal/Telemetry;Lstream/video/sfu/models/RTMPIngress;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lokio/ByteString;)Lstream/video/sfu/signal/SendStatsRequest;
19025+
public static synthetic fun copy$default (Lstream/video/sfu/signal/SendStatsRequest;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/AndroidState;Lstream/video/sfu/models/AppleState;Lstream/video/sfu/signal/Telemetry;Lstream/video/sfu/models/RTMPIngress;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/signal/SendStatsRequest;
1902619026
public fun equals (Ljava/lang/Object;)Z
1902719027
public final fun getAndroid ()Lstream/video/sfu/models/AndroidState;
1902819028
public final fun getApple ()Lstream/video/sfu/models/AppleState;
19029-
public final fun getAudio_devices ()Lstream/video/sfu/models/InputDevices;
1903019029
public final fun getDecode_stats ()Ljava/util/List;
1903119030
public final fun getEncode_stats ()Ljava/util/List;
19032-
public final fun getPublisher_rtc_stats ()Ljava/lang/String;
19033-
public final fun getPublisher_stats ()Ljava/lang/String;
1903419031
public final fun getRtc_stats ()Ljava/lang/String;
1903519032
public final fun getRtmp ()Lstream/video/sfu/models/RTMPIngress;
1903619033
public final fun getSdk ()Ljava/lang/String;
1903719034
public final fun getSdk_version ()Ljava/lang/String;
1903819035
public final fun getSession_id ()Ljava/lang/String;
19039-
public final fun getSubscriber_rtc_stats ()Ljava/lang/String;
19040-
public final fun getSubscriber_stats ()Ljava/lang/String;
1904119036
public final fun getTelemetry ()Lstream/video/sfu/signal/Telemetry;
1904219037
public final fun getUnified_session_id ()Ljava/lang/String;
19043-
public final fun getVideo_devices ()Lstream/video/sfu/models/InputDevices;
1904419038
public final fun getWebrtc_version ()Ljava/lang/String;
1904519039
public fun hashCode ()I
1904619040
public synthetic fun newBuilder ()Lcom/squareup/wire/Message$Builder;

‎stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,6 @@ public class Call(
423423
apiClient = apiClient,
424424
state = state,
425425
callAnalytics = callAnalytics,
426-
statsReporter = statsReporter,
427426
sessionMonitor = { sessionMonitor },
428427
type = type,
429428
id = id,
@@ -734,8 +733,6 @@ public class Call(
734733

735734
// endregion
736735

737-
internal suspend fun collectStats(): CallStatsReport = statsReporter.collectStats()
738-
739736
// region Reconnection — unified loop
740737

741738
/**

‎stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallStatsReport.kt‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ data class CallStatsReport(
3333
val stateStats: CallStats,
3434
)
3535

36+
@Deprecated(
37+
"The raw per-peer stats this serializes are no longer part of the SendStats payload. " +
38+
"Nothing in the SDK calls it; it will be removed in the next major version.",
39+
)
3640
fun CallStatsReport.toJson(peerType: StreamPeerType): String {
3741
val stats: Map<String, RTCStats>? = if (peerType == StreamPeerType.PUBLISHER) {
3842
publisher?.origin?.statsMap

‎stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/RtcSession.kt‎

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import io.getstream.result.Result.Failure
4040
import io.getstream.result.Result.Success
4141
import io.getstream.video.android.core.BuildConfig
4242
import io.getstream.video.android.core.Call
43-
import io.getstream.video.android.core.CallStatsReport
4443
import io.getstream.video.android.core.DeviceStatus
4544
import io.getstream.video.android.core.MediaManagerImpl
4645
import io.getstream.video.android.core.RealtimeConnection
@@ -1179,12 +1178,10 @@ public class RtcSession internal constructor(
11791178
private suspend fun sendConnectionTimeStats(reconnectStrategy: WebsocketReconnectStrategy? = null) {
11801179
if (reconnectStrategy == null) {
11811180
sendCallStats(
1182-
report = call.collectStats(),
11831181
connectionTimeSeconds = sessionManager.connectionTimeSeconds(),
11841182
)
11851183
} else {
11861184
sendCallStats(
1187-
report = call.collectStats(),
11881185
reconnectionTimeSeconds = Pair(
11891186
sessionManager.reconnectionTimeSeconds(),
11901187
reconnectStrategy,
@@ -2000,7 +1997,6 @@ public class RtcSession internal constructor(
20001997
}
20011998

20021999
internal suspend fun sendCallStats(
2003-
report: CallStatsReport? = null,
20042000
connectionTimeSeconds: Float? = null,
20052001
reconnectionTimeSeconds: Pair<Float, WebsocketReconnectStrategy>? = null,
20062002
) {
@@ -2051,8 +2047,6 @@ public class RtcSession internal constructor(
20512047
unified_session_id = sessionManager.unifiedSessionId,
20522048
sdk_version = BuildConfig.STREAM_VIDEO_VERSION,
20532049
webrtc_version = BuildConfig.STREAM_WEBRTC_VERSION,
2054-
publisher_stats = report?.toJson(StreamPeerType.PUBLISHER) ?: "",
2055-
subscriber_stats = report?.toJson(StreamPeerType.SUBSCRIBER) ?: "",
20562050
rtc_stats = rtcStats,
20572051

20582052
encode_stats = publisherRtcStats?.performanceStats ?: emptyList(),
@@ -2266,8 +2260,7 @@ public class RtcSession internal constructor(
22662260
}
22672261

22682262
internal suspend fun prepareRejoin(reason: String) {
2269-
val stats = call.collectStats()
2270-
sendCallStats(stats)
2263+
sendCallStats()
22712264

22722265
// Mark disconnected immediately — late ICE candidates will be routed
22732266
// to iceTricklePendingEvents instead of being sent to the now-defunct SFU.

‎stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/components/CallLifecycleManager.kt‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,7 @@ internal class CallLifecycleManager(
114114
callAnalytics.onCallLeave(sessionManager.session, reason)
115115
safeCall {
116116
sessionManager.session.value?.sfuTracer?.trace("leave-call", leaveReason)
117-
val stats = statsReporter.collectStats()
118-
sessionManager.session.value?.sendCallStats(stats)
117+
sessionManager.session.value?.sendCallStats()
119118
}
120119
// Must complete before cleanup() cancels the session's supervisor job.
121120
safeCall { sessionManager.session.value?.sendLeaveEvent(leaveReason) }

‎stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/components/CallReconnector.kt‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ internal class CallReconnector(
7575
private val apiClient: CallApiClient,
7676
private val state: CallState,
7777
private val callAnalytics: CallAnalytics,
78-
private val statsReporter: CallStatsReporter,
7978
// Lazy provider: the session monitor is built from the connectivity monitor, which takes
8079
// this component, so it can only be resolved after construction.
8180
private val sessionMonitor: () -> SessionMonitor,
@@ -331,8 +330,7 @@ internal class CallReconnector(
331330
val currentSession = sessionManager.session.value
332331
?: return ReconnectOutcome.PreconditionNotMet("No active session for fast reconnect")
333332

334-
val stats = statsReporter.collectStats()
335-
currentSession.sendCallStats(stats)
333+
currentSession.sendCallStats()
336334

337335
currentSession.prepareReconnect()
338336
state._connection.value = RealtimeConnection.Reconnecting
@@ -466,8 +464,7 @@ internal class CallReconnector(
466464
reconnect_attempt = sessionManager.nonFastReconnectAttempts,
467465
)
468466

469-
val stats = statsReporter.collectStats()
470-
oldSession.sendCallStats(stats)
467+
oldSession.sendCallStats()
471468
oldSession.enterMigration()
472469

473470
val newSession = sessionFactory.create(

‎stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/components/CallStatsReporter.kt‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,10 @@ internal class CallStatsReporter(
5555

5656
while (isActive) {
5757
delay(reportingIntervalMs)
58-
sessionManager.session.value?.sendCallStats(
59-
report = collectStats(),
60-
)
58+
// Still collected on every tick: it refreshes [statsReport],
59+
// [statLatencyHistory] and [state.stats] for local observers.
60+
collectStats()
61+
sessionManager.session.value?.sendCallStats()
6162
}
6263
}
6364
}

‎stream-video-android-core/src/main/proto/video/sfu/signal_rpc/signal.proto‎

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,23 +79,18 @@ message SendMetricsResponse {
7979

8080
message SendStatsRequest {
8181
string session_id = 1;
82-
string subscriber_stats = 2;
83-
string publisher_stats = 3;
82+
reserved 2, 3, 7, 8, 13, 14;
8483
string webrtc_version = 4;
8584
string sdk = 5;
8685
string sdk_version = 6;
8786

88-
models.InputDevices audio_devices = 7;
89-
models.InputDevices video_devices = 8;
9087
oneof device_state {
9188
models.AndroidState android = 9;
9289
models.AppleState apple = 10;
9390
}
9491

9592
Telemetry telemetry = 11;
9693
models.RTMPIngress rtmp = 12;
97-
string subscriber_rtc_stats = 13 [deprecated = true];
98-
string publisher_rtc_stats = 14 [deprecated = true];
9994
string rtc_stats = 15;
10095
// Encode stats for the publisher
10196
repeated models.PerformanceStats encode_stats = 16;

‎stream-video-android-core/src/test/kotlin/io/getstream/video/android/core/call/components/CallReconnectorTest.kt‎

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ class CallReconnectorTest {
5555
private lateinit var sessionManager: CallSessionManager
5656
private lateinit var sessionMonitor: SessionMonitor
5757
private lateinit var lifecycle: CallLifecycleManager
58-
private lateinit var statsReporter: CallStatsReporter
5958
private lateinit var apiClient: CallApiClient
6059
private lateinit var callAnalytics: CallAnalytics
6160
private lateinit var sessionFactory: RtcSessionFactory
@@ -67,7 +66,6 @@ class CallReconnectorTest {
6766
connectionFlow = MutableStateFlow(RealtimeConnection.Reconnecting)
6867
sessionMonitor = mockk(relaxed = true)
6968
lifecycle = mockk(relaxed = true)
70-
statsReporter = mockk(relaxed = true)
7169
apiClient = mockk(relaxed = true)
7270
callAnalytics = mockk(relaxed = true)
7371
sessionFactory = mockk(relaxed = true)
@@ -94,7 +92,6 @@ class CallReconnectorTest {
9492
apiClient = apiClient,
9593
state = state,
9694
callAnalytics = callAnalytics,
97-
statsReporter = statsReporter,
9895
sessionMonitor = { sessionMonitor },
9996
type = "default",
10097
id = "call-id",

‎stream-video-android-core/src/test/kotlin/io/getstream/video/android/core/rtc/RtcSessionTest2.kt‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ class RtcSessionTest2 {
248248
sfuAnalytics = SfuAnalytics.getFakeSfuAnalytics(),
249249
),
250250
)
251-
coJustRun { rtcSession.sendCallStats(any(), any(), any()) }
251+
coJustRun { rtcSession.sendCallStats(any(), any()) }
252252

253253
// When
254254
rtcSession.connect()
@@ -308,7 +308,7 @@ class RtcSessionTest2 {
308308
sfuAnalytics = SfuAnalytics.getFakeSfuAnalytics(),
309309
),
310310
)
311-
coJustRun { rtcSession.sendCallStats(any(), any(), any()) }
311+
coJustRun { rtcSession.sendCallStats(any(), any()) }
312312

313313
val result = rtcSession.connectInternal()
314314

@@ -368,7 +368,7 @@ class RtcSessionTest2 {
368368
sfuAnalytics = SfuAnalytics.getFakeSfuAnalytics(),
369369
),
370370
)
371-
coJustRun { rtcSession.sendCallStats(any(), any(), any()) }
371+
coJustRun { rtcSession.sendCallStats(any(), any()) }
372372

373373
val resultDeferred = async { rtcSession.connectInternal() }
374374
// Socket state observation timeout = 2 * 50ms + 1000ms grace
@@ -440,7 +440,7 @@ class RtcSessionTest2 {
440440
sfuAnalytics = SfuAnalytics.getFakeSfuAnalytics(),
441441
),
442442
)
443-
coJustRun { rtcSession.sendCallStats(any(), any(), any()) }
443+
coJustRun { rtcSession.sendCallStats(any(), any()) }
444444

445445
val result = rtcSession.connectInternal()
446446

@@ -499,7 +499,7 @@ class RtcSessionTest2 {
499499
sfuAnalytics = SfuAnalytics.getFakeSfuAnalytics(),
500500
),
501501
)
502-
coJustRun { rtcSession.sendCallStats(any(), any(), any()) }
502+
coJustRun { rtcSession.sendCallStats(any(), any()) }
503503

504504
val result = rtcSession.connectInternal()
505505

@@ -548,7 +548,7 @@ class RtcSessionTest2 {
548548
sfuAnalytics = SfuAnalytics.getFakeSfuAnalytics(),
549549
),
550550
)
551-
coJustRun { rtcSession.sendCallStats(any(), any(), any()) }
551+
coJustRun { rtcSession.sendCallStats(any(), any()) }
552552

553553
val reconnectDetails = ReconnectDetails(
554554
strategy = WebsocketReconnectStrategy.WEBSOCKET_RECONNECT_STRATEGY_REJOIN,

0 commit comments

Comments
 (0)