Skip to content

Commit c168843

Browse files
committed
feat: metrics for speed, startTime and endTime
1 parent ad7b884 commit c168843

File tree

4 files changed

+46
-2
lines changed

4 files changed

+46
-2
lines changed

android/src/main/java/com/mattermost/networkclient/Extensions.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,14 @@ fun Response.toWritableMap(metadata: RequestMetadata?): WritableMap {
5858

5959
if (metadata != null) {
6060
val compressedSize = header("X-Compressed-Size")?.toDoubleOrNull() ?: header("Content-Length")?.toDoubleOrNull() ?: 0.0
61+
val startTime = header("X-Start-Time")?.toDoubleOrNull() ?: 0.0
62+
val endTime = header("X-End-Time")?.toDoubleOrNull() ?: 0.0
63+
val mbps = header("X-Speed-Mbps")?.toDoubleOrNull() ?: 0.0
6164
metrics.putDouble("compressedSize", compressedSize)
6265
metrics.putDouble("size", buffer.size.toDouble())
66+
metrics.putDouble("startTime", startTime)
67+
metrics.putDouble("endTime", endTime)
68+
metrics.putDouble("speedInMbps", mbps)
6369
}
6470

6571
val bodyString = buffer.readUtf8()

android/src/main/java/com/mattermost/networkclient/interceptors/CompressedResponseSizeInterceptor.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,17 @@ import okhttp3.ResponseBody.Companion.toResponseBody
66

77
class CompressedResponseSizeInterceptor: Interceptor {
88
override fun intercept(chain: Interceptor.Chain): Response {
9+
// Record the start time
10+
val startTime = System.nanoTime()
11+
912
val response = chain.proceed(chain.request())
1013

14+
// Record the end time
15+
val endTime = System.nanoTime()
16+
17+
// Calculate elapsed time in seconds
18+
val elapsedTimeSeconds = (endTime - startTime) / 1_000_000_000.0
19+
1120
val modifiedResponse = response.newBuilder()
1221

1322
var compressedSize = response.header("Content-Length")?.toLongOrNull() ?: response.header("content-length")?.toLongOrNull()
@@ -17,8 +26,18 @@ class CompressedResponseSizeInterceptor: Interceptor {
1726
modifiedResponse.body((rawBytes ?: ByteArray(0)).toResponseBody(response.body?.contentType()))
1827
}
1928

29+
// Calculate speed in Mbps
30+
val speedMbps = if (elapsedTimeSeconds > 0 && compressedSize > 0) {
31+
(compressedSize * 8 / elapsedTimeSeconds) / 1_000_000.0
32+
} else {
33+
0.0
34+
}
35+
2036
return modifiedResponse
2137
.header("X-Compressed-Size", compressedSize.toString())
38+
.header("X-Start-Time", startTime.toString())
39+
.header("X-End-Time", endTime.toString())
40+
.header("X-Speed-Mbps", "%.4f".format(speedMbps)) // Format to 4 decimal places
2241
.build()
2342
}
2443
}

ios/NetworkClient.swift

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,10 @@ extension NetworkClient {
157157

158158
if let metrics = response.metrics?.transactionMetrics {
159159
let compressedSize = metrics.compactMap { transaction in
160-
(transaction.countOfResponseBodyBytesReceived)
160+
guard transaction.resourceFetchType == .networkLoad else { return nil }
161+
return transaction.countOfResponseBodyBytesReceived
161162
}.reduce(0, +)
162-
metricsData!["compressedSize"] = compressedSize
163+
metricsData!["compressedSize"] = metrics.last?.countOfResponseBodyBytesReceived ?? compressedSize
163164

164165
let totalLatency = metrics.compactMap { transaction in
165166
(transaction.responseStartDate?.timeIntervalSince(transaction.fetchStartDate ?? Date()) ?? 0) * 1000
@@ -171,6 +172,21 @@ extension NetworkClient {
171172
}.reduce(0, +)
172173
metricsData!["connectionTime"] = totalConnectionTime
173174

175+
if let fetchStart = metrics.first?.fetchStartDate,
176+
let responseEnd = metrics.last?.responseEndDate {
177+
var timeTaken = responseEnd.timeIntervalSince(fetchStart)
178+
179+
180+
// Ensure timeTaken is reasonable
181+
if timeTaken < 0.001 { // Cap minimum duration to avoid unrealistic speeds
182+
timeTaken = 0.001
183+
}
184+
185+
metricsData!["startTime"] = fetchStart.timeIntervalSince1970
186+
metricsData!["endTime"] = responseEnd.timeIntervalSince1970
187+
metricsData!["speedInMbps"] = Double(metricsData!["compressedSize"] as! Int64 * 8) / (timeTaken * 1_000_000)
188+
}
189+
174190
if let lastTransaction = metrics.last {
175191
metricsData!["httpVersion"] = lastTransaction.networkProtocolName ?? "Unknown"
176192

src/types/APIClient.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,11 @@ export type ClientResponseMetrics = {
4646
isCached: boolean;
4747
compressedSize: number;
4848
size: number;
49+
startTime: number;
50+
endTime: number;
4951
connectionTime: number;
5052
latency: number;
53+
speedInMbps: number;
5154
};
5255

5356
export type ClientResponse = {

0 commit comments

Comments
 (0)