diff --git a/CHANGELOG.md b/CHANGELOG.md index c774f3da7b..07b3ec102d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ - Use thread context classloader when available ([#4320](https://github.com/getsentry/sentry-java/pull/4320)) - This ensures correct resource loading in environments like Spring Boot where the thread context classloader is used for resource loading. +### Internal + +- Read build tool info from `sentry-debug-meta.properties` and attach it to events ([#4314](https://github.com/getsentry/sentry-java/pull/4314)) + ## 8.7.0 ### Features diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index 067fa327ed..717ab9b129 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -6364,7 +6364,10 @@ public abstract interface class io/sentry/util/CollectionUtils$Predicate { public final class io/sentry/util/DebugMetaPropertiesApplier { public static field DEBUG_META_PROPERTIES_FILENAME Ljava/lang/String; public fun <init> ()V + public static fun apply (Lio/sentry/SentryOptions;Ljava/util/List;)V public static fun applyToOptions (Lio/sentry/SentryOptions;Ljava/util/List;)V + public static fun getBuildTool (Ljava/util/Properties;)Ljava/lang/String; + public static fun getBuildToolVersion (Ljava/util/Properties;)Ljava/lang/String; public static fun getProguardUuid (Ljava/util/Properties;)Ljava/lang/String; } diff --git a/sentry/src/main/java/io/sentry/util/DebugMetaPropertiesApplier.java b/sentry/src/main/java/io/sentry/util/DebugMetaPropertiesApplier.java index 8627845967..236e962682 100644 --- a/sentry/src/main/java/io/sentry/util/DebugMetaPropertiesApplier.java +++ b/sentry/src/main/java/io/sentry/util/DebugMetaPropertiesApplier.java @@ -1,5 +1,6 @@ package io.sentry.util; +import io.sentry.SentryIntegrationPackageStorage; import io.sentry.SentryLevel; import io.sentry.SentryOptions; import java.util.List; @@ -11,6 +12,14 @@ public final class DebugMetaPropertiesApplier { public static @NotNull String DEBUG_META_PROPERTIES_FILENAME = "sentry-debug-meta.properties"; + public static void apply( + final @NotNull SentryOptions options, final @Nullable List<Properties> debugMetaProperties) { + if (debugMetaProperties != null) { + applyToOptions(options, debugMetaProperties); + applyBuildTool(options, debugMetaProperties); + } + } + public static void applyToOptions( final @NotNull SentryOptions options, final @Nullable List<Properties> debugMetaProperties) { if (debugMetaProperties != null) { @@ -49,7 +58,35 @@ private static void applyProguardUuid( } } + private static void applyBuildTool( + final @NotNull SentryOptions options, @NotNull List<Properties> debugMetaProperties) { + for (Properties properties : debugMetaProperties) { + final @Nullable String buildTool = getBuildTool(properties); + if (buildTool != null) { + @Nullable String buildToolVersion = getBuildToolVersion(properties); + if (buildToolVersion == null) { + buildToolVersion = "unknown"; + } + options + .getLogger() + .log( + SentryLevel.DEBUG, "Build tool found: %s, version %s", buildTool, buildToolVersion); + SentryIntegrationPackageStorage.getInstance().addPackage(buildTool, buildToolVersion); + break; + } + } + } + public static @Nullable String getProguardUuid(final @NotNull Properties debugMetaProperties) { return debugMetaProperties.getProperty("io.sentry.ProguardUuids"); } + + public static @Nullable String getBuildTool(final @NotNull Properties debugMetaProperties) { + return debugMetaProperties.getProperty("io.sentry.build-tool"); + } + + public static @Nullable String getBuildToolVersion( + final @NotNull Properties debugMetaProperties) { + return debugMetaProperties.getProperty("io.sentry.build-tool-version"); + } } diff --git a/sentry/src/test/java/io/sentry/internal/debugmeta/ResourcesDebugMetaLoaderTest.kt b/sentry/src/test/java/io/sentry/internal/debugmeta/ResourcesDebugMetaLoaderTest.kt index d9a22224b5..970e9bb214 100644 --- a/sentry/src/test/java/io/sentry/internal/debugmeta/ResourcesDebugMetaLoaderTest.kt +++ b/sentry/src/test/java/io/sentry/internal/debugmeta/ResourcesDebugMetaLoaderTest.kt @@ -1,7 +1,9 @@ package io.sentry.internal.debugmeta import io.sentry.ILogger +import io.sentry.SentryIntegrationPackageStorage import io.sentry.SentryOptions +import io.sentry.protocol.SentryPackage import io.sentry.util.DebugMetaPropertiesApplier import org.mockito.kotlin.mock import org.mockito.kotlin.whenever @@ -9,7 +11,9 @@ import java.net.URL import java.nio.charset.Charset import java.util.Collections import kotlin.test.Test +import kotlin.test.assertContains import kotlin.test.assertEquals +import kotlin.test.assertFalse import kotlin.test.assertNotNull import kotlin.test.assertNull @@ -132,4 +136,72 @@ class ResourcesDebugMetaLoaderTest { assertNull(sut.loadDebugMeta()) } + + @Test + fun `reads build-tool and build-version and adds them to packages`() { + val sut = fixture.getSut( + content = listOf( + """ + #Generated by sentry-maven-plugin + #Wed May 17 15:33:34 CEST 2023 + io.sentry.ProguardUuids=34077988-a0e5-4839-9618-7400e1616d1b + io.sentry.bundle-ids=88ba82db-cd26-4c09-8b31-21461d286b68 + io.sentry.build-tool=maven + io.sentry.build-tool-version=1.0 + """.trimIndent() + ) + ) + + val options = SentryOptions() + assertNotNull(sut.loadDebugMeta()) { + DebugMetaPropertiesApplier.apply(options, it) + } + + val expected = SentryPackage("maven", "1.0") + assertContains(SentryIntegrationPackageStorage.getInstance().packages, expected) + } + + @Test + fun `reads build-tool and adds it to packages with unknown version if build-tool-version is absent`() { + val sut = fixture.getSut( + content = listOf( + """ + #Generated by sentry-maven-plugin + #Wed May 17 15:33:34 CEST 2023 + io.sentry.ProguardUuids=34077988-a0e5-4839-9618-7400e1616d1b + io.sentry.bundle-ids=88ba82db-cd26-4c09-8b31-21461d286b68 + io.sentry.build-tool=maven + """.trimIndent() + ) + ) + + val options = SentryOptions() + assertNotNull(sut.loadDebugMeta()) { + DebugMetaPropertiesApplier.apply(options, it) + } + + val expected = SentryPackage("maven", "unknown") + assertContains(SentryIntegrationPackageStorage.getInstance().packages, expected) + } + + @Test + fun `does not add build-tool to packages if absent`() { + val sut = fixture.getSut( + content = listOf( + """ + #Generated manually + #Wed May 17 15:33:34 CEST 2023 + io.sentry.ProguardUuids=34077988-a0e5-4839-9618-7400e1616d1b + io.sentry.bundle-ids=88ba82db-cd26-4c09-8b31-21461d286b68 + """.trimIndent() + ) + ) + + val options = SentryOptions() + assertNotNull(sut.loadDebugMeta()) { + DebugMetaPropertiesApplier.apply(options, it) + } + + assertFalse { SentryIntegrationPackageStorage.getInstance().packages.any { it.name.equals("io.sentry.build-tool") } } + } }