Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ object HttpModule {
@Singleton
internal fun provideOkHttpClient(
context: Context,
interceptors: @JvmSuppressWildcards Set<Interceptor>
interceptors: @JvmSuppressWildcards Set<Interceptor>,
httpTrackingInterceptor: HttpTrackingInterceptor
): OkHttpClient {
val builder = OkHttpClient.Builder()

Expand All @@ -54,6 +55,8 @@ object HttpModule {
builder.addNetworkInterceptor(loggingInterceptor)
}

builder.addNetworkInterceptor(httpTrackingInterceptor)

builder.addInterceptor(ClientThrottlingInterceptor())

val cacheDir = File(context.cacheDir, "network")
Expand Down
Original file line number Diff line number Diff line change
@@ -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,
)
}
}
Original file line number Diff line number Diff line change
@@ -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
)
Original file line number Diff line number Diff line change
@@ -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())
}
}