From 1f24fb1edee64794c5f13e838328e49041b9868b Mon Sep 17 00:00:00 2001 From: Josef Raska <6277721+jraska@users.noreply.github.com> Date: Sun, 7 May 2023 13:23:36 +0200 Subject: [PATCH] Add debug network tracking --- .../jraska/github/client/http/HttpModule.kt | 5 +- .../client/http/HttpTrackingInterceptor.kt | 47 +++++++++++++++++++ .../github/client/http/NetworkResource.kt | 14 ++++++ .../client/http/NetworkResourceReporter.kt | 13 +++++ 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/com/jraska/github/client/http/HttpTrackingInterceptor.kt create mode 100644 core/src/main/java/com/jraska/github/client/http/NetworkResource.kt create mode 100644 core/src/main/java/com/jraska/github/client/http/NetworkResourceReporter.kt diff --git a/core/src/main/java/com/jraska/github/client/http/HttpModule.kt b/core/src/main/java/com/jraska/github/client/http/HttpModule.kt index 2375028b..a269a7a8 100644 --- a/core/src/main/java/com/jraska/github/client/http/HttpModule.kt +++ b/core/src/main/java/com/jraska/github/client/http/HttpModule.kt @@ -41,7 +41,8 @@ object HttpModule { @Singleton internal fun provideOkHttpClient( context: Context, - interceptors: @JvmSuppressWildcards Set + interceptors: @JvmSuppressWildcards Set, + httpTrackingInterceptor: HttpTrackingInterceptor ): OkHttpClient { val builder = OkHttpClient.Builder() @@ -54,6 +55,8 @@ object HttpModule { builder.addNetworkInterceptor(loggingInterceptor) } + builder.addNetworkInterceptor(httpTrackingInterceptor) + builder.addInterceptor(ClientThrottlingInterceptor()) val cacheDir = File(context.cacheDir, "network") diff --git a/core/src/main/java/com/jraska/github/client/http/HttpTrackingInterceptor.kt b/core/src/main/java/com/jraska/github/client/http/HttpTrackingInterceptor.kt new file mode 100644 index 00000000..ed0bc008 --- /dev/null +++ b/core/src/main/java/com/jraska/github/client/http/HttpTrackingInterceptor.kt @@ -0,0 +1,47 @@ +package com.jraska.github.client.http + +import com.jraska.github.client.time.TimeProvider +import okhttp3.Interceptor +import okhttp3.Response +import javax.inject.Inject + +class HttpTrackingInterceptor @Inject constructor( + private val reporter: NetworkResourceReporter, + private val timeProvider: TimeProvider +) : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val start = timeProvider.elapsed() + val response = chain.proceed(chain.request()) + val duration = timeProvider.elapsed() - start + + val resource = toResource(response, duration) + reporter.report(resource) + + return response + } + + private fun toResource(response: Response, duration: Long): NetworkResource { + val request = response.request + val requestId = + request.header("Request-Id")!! // we prefer crash as this would indicate error in setup + + val requestContentLength = request.headers["Content-Length"]?.toLongOrNull() + ?: request.body?.contentLength() + ?: 0 + + val responseContentLength = response.headers["Content-Length"]?.toLongOrNull() + ?: response.body?.contentLength() + ?: 0 + + return NetworkResource( + url = request.url, + method = request.method, + durationMs = duration, + requestId = requestId, + responseCode = response.code, + responseContentLength = responseContentLength, + message = response.message, + requestContentLength = requestContentLength, + ) + } +} diff --git a/core/src/main/java/com/jraska/github/client/http/NetworkResource.kt b/core/src/main/java/com/jraska/github/client/http/NetworkResource.kt new file mode 100644 index 00000000..b6642a69 --- /dev/null +++ b/core/src/main/java/com/jraska/github/client/http/NetworkResource.kt @@ -0,0 +1,14 @@ +package com.jraska.github.client.http + +import okhttp3.HttpUrl + +data class NetworkResource( + val url: HttpUrl, + val responseCode: Int, + val method: String, + val durationMs: Long, + val requestId: String, + val responseContentLength: Long, + val message: String, + val requestContentLength: Long +) diff --git a/core/src/main/java/com/jraska/github/client/http/NetworkResourceReporter.kt b/core/src/main/java/com/jraska/github/client/http/NetworkResourceReporter.kt new file mode 100644 index 00000000..7a621ee5 --- /dev/null +++ b/core/src/main/java/com/jraska/github/client/http/NetworkResourceReporter.kt @@ -0,0 +1,13 @@ +package com.jraska.github.client.http + +import com.jraska.github.client.analytics.EventAnalytics +import timber.log.Timber +import javax.inject.Inject + +class NetworkResourceReporter @Inject constructor( + private val eventAnalytics: EventAnalytics +) { + fun report(resource: NetworkResource) { + Timber.d(resource.toString()) + } +}