Browse Source

Add extra params to bug reports (#2490)

* Add extra params to bug reports

- `local_time`: the time in the device's timezone.
- `utc_time`: the time in UTC.
- `sdk_sha`: the commit SHA that was used to build the Rust SDK
pull/2493/head
Jorge Martin Espinosa 7 months ago committed by GitHub
parent
commit
1d892b4bc8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      changelog.d/+add-time-and-sdk-sha-params-to-bugreports.misc
  2. 1
      features/rageshake/impl/build.gradle.kts
  3. 9
      features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt
  4. 6
      features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt
  5. 21
      libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/SdkMetadata.kt
  6. 29
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustSdkMetadata.kt
  7. 21
      libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeSdkMetadata.kt

1
changelog.d/+add-time-and-sdk-sha-params-to-bugreports.misc

@ -0,0 +1 @@
Add `local_time`, `utc_time` and `sdk_sha` params to bug reports so they're easier to investigate.

1
features/rageshake/impl/build.gradle.kts

@ -46,6 +46,7 @@ dependencies {
implementation(projects.libraries.designsystem) implementation(projects.libraries.designsystem)
implementation(projects.libraries.uiStrings) implementation(projects.libraries.uiStrings)
implementation(projects.libraries.sessionStorage.api) implementation(projects.libraries.sessionStorage.api)
implementation(projects.libraries.matrix.api)
api(libs.squareup.seismic) api(libs.squareup.seismic)
api(projects.features.rageshake.api) api(projects.features.rageshake.api)
implementation(libs.androidx.datastore.preferences) implementation(libs.androidx.datastore.preferences)

9
features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporter.kt

@ -36,6 +36,7 @@ import io.element.android.libraries.core.mimetype.MimeTypes
import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.ApplicationContext
import io.element.android.libraries.di.SingleIn import io.element.android.libraries.di.SingleIn
import io.element.android.libraries.matrix.api.SdkMetadata
import io.element.android.libraries.network.useragent.UserAgentProvider import io.element.android.libraries.network.useragent.UserAgentProvider
import io.element.android.libraries.sessionstorage.api.SessionStore import io.element.android.libraries.sessionstorage.api.SessionStore
import io.element.android.services.toolbox.api.systemclock.SystemClock import io.element.android.services.toolbox.api.systemclock.SystemClock
@ -57,6 +58,10 @@ import java.io.File
import java.io.IOException import java.io.IOException
import java.io.OutputStreamWriter import java.io.OutputStreamWriter
import java.net.HttpURLConnection import java.net.HttpURLConnection
import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneOffset
import java.time.format.DateTimeFormatter
import java.util.Locale import java.util.Locale
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Provider import javax.inject.Provider
@ -78,6 +83,7 @@ class DefaultBugReporter @Inject constructor(
private val sessionStore: SessionStore, private val sessionStore: SessionStore,
private val buildMeta: BuildMeta, private val buildMeta: BuildMeta,
private val bugReporterUrlProvider: BugReporterUrlProvider, private val bugReporterUrlProvider: BugReporterUrlProvider,
private val sdkMetadata: SdkMetadata,
) : BugReporter { ) : BugReporter {
companion object { companion object {
// filenames // filenames
@ -158,6 +164,9 @@ class DefaultBugReporter @Inject constructor(
.addFormDataPart("device_id", deviceId) .addFormDataPart("device_id", deviceId)
.addFormDataPart("device", Build.MODEL.trim()) .addFormDataPart("device", Build.MODEL.trim())
.addFormDataPart("locale", Locale.getDefault().toString()) .addFormDataPart("locale", Locale.getDefault().toString())
.addFormDataPart("sdk_sha", sdkMetadata.sdkGitSha)
.addFormDataPart("local_time", LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME))
.addFormDataPart("utc_time", LocalDateTime.ofInstant(Instant.now(), ZoneOffset.UTC).format(DateTimeFormatter.ISO_DATE_TIME))
currentTracingFilter?.let { currentTracingFilter?.let {
builder.addFormDataPart("tracing_filter", it) builder.addFormDataPart("tracing_filter", it)
} }

6
features/rageshake/impl/src/test/kotlin/io/element/android/features/rageshake/impl/reporter/DefaultBugReporterTest.kt

@ -20,6 +20,7 @@ import com.google.common.truth.Truth.assertThat
import io.element.android.features.rageshake.api.reporter.BugReporterListener import io.element.android.features.rageshake.api.reporter.BugReporterListener
import io.element.android.features.rageshake.test.crash.FakeCrashDataStore import io.element.android.features.rageshake.test.crash.FakeCrashDataStore
import io.element.android.features.rageshake.test.screenshot.FakeScreenshotHolder import io.element.android.features.rageshake.test.screenshot.FakeScreenshotHolder
import io.element.android.libraries.matrix.test.FakeSdkMetadata
import io.element.android.libraries.matrix.test.core.aBuildMeta import io.element.android.libraries.matrix.test.core.aBuildMeta
import io.element.android.libraries.network.useragent.DefaultUserAgentProvider import io.element.android.libraries.network.useragent.DefaultUserAgentProvider
import io.element.android.libraries.sessionstorage.impl.memory.InMemorySessionStore import io.element.android.libraries.sessionstorage.impl.memory.InMemorySessionStore
@ -150,11 +151,12 @@ class DefaultBugReporterTest {
userAgentProvider = DefaultUserAgentProvider(buildMeta), userAgentProvider = DefaultUserAgentProvider(buildMeta),
sessionStore = InMemorySessionStore(), sessionStore = InMemorySessionStore(),
buildMeta = buildMeta, buildMeta = buildMeta,
bugReporterUrlProvider = { server.url("/") } bugReporterUrlProvider = { server.url("/") },
sdkMetadata = FakeSdkMetadata("123456789"),
) )
} }
companion object { companion object {
private const val EXPECTED_NUMBER_OF_PROGRESS_VALUE = 12 private const val EXPECTED_NUMBER_OF_PROGRESS_VALUE = 15
} }
} }

21
libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/SdkMetadata.kt

@ -0,0 +1,21 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.libraries.matrix.api
interface SdkMetadata {
val sdkGitSha: String
}

29
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustSdkMetadata.kt

@ -0,0 +1,29 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.libraries.matrix.impl
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.matrix.api.SdkMetadata
import org.matrix.rustcomponents.sdk.sdkGitSha
import javax.inject.Inject
@ContributesBinding(AppScope::class)
class RustSdkMetadata @Inject constructor() : SdkMetadata {
override val sdkGitSha: String
get() = sdkGitSha()
}

21
libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeSdkMetadata.kt

@ -0,0 +1,21 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.libraries.matrix.test
import io.element.android.libraries.matrix.api.SdkMetadata
class FakeSdkMetadata(override val sdkGitSha: String) : SdkMetadata
Loading…
Cancel
Save