From 34a8bfdf99427f23be4f8b7a8af71509e515762b Mon Sep 17 00:00:00 2001 From: Stefano Date: Fri, 2 Dec 2022 02:12:37 +0100 Subject: [PATCH] Update profiling release field (#2371) * updated profile schema: - replaced versionCode with an empty string on new envelopes - replaced versionName with release string * added test --- .../core/AndroidTransactionProfiler.java | 12 +--- .../core/AndroidTransactionProfilerTest.kt | 14 ++++ sentry/api/sentry.api | 10 ++- .../java/io/sentry/ProfilingTraceData.java | 72 ++++++++----------- .../test/java/io/sentry/JsonSerializerTest.kt | 14 ++-- 5 files changed, 56 insertions(+), 66 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidTransactionProfiler.java b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidTransactionProfiler.java index ced0d976e9..42897816f1 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/AndroidTransactionProfiler.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/AndroidTransactionProfiler.java @@ -6,7 +6,6 @@ import android.annotation.SuppressLint; import android.app.ActivityManager; import android.content.Context; -import android.content.pm.PackageInfo; import android.os.Build; import android.os.Debug; import android.os.Process; @@ -61,7 +60,6 @@ final class AndroidTransactionProfiler implements ITransactionProfiler { private final @NotNull SentryAndroidOptions options; private final @NotNull IHub hub; private final @NotNull BuildInfoProvider buildInfoProvider; - private final @Nullable PackageInfo packageInfo; private long transactionStartNanos = 0; private long profileStartCpuMillis = 0; private boolean isInitialized = false; @@ -103,7 +101,6 @@ public AndroidTransactionProfiler( Objects.requireNonNull(frameMetricsCollector, "SentryFrameMetricsCollector is required"); this.buildInfoProvider = Objects.requireNonNull(buildInfoProvider, "The BuildInfoProvider is required."); - this.packageInfo = ContextUtils.getPackageInfo(context, options.getLogger(), buildInfoProvider); } private void init() { @@ -316,14 +313,8 @@ private void onLastTransactionFinished(final ITransaction transaction, final boo return; } - String versionName = ""; - String versionCode = ""; String totalMem = "0"; ActivityManager.MemoryInfo memInfo = getMemInfo(); - if (packageInfo != null) { - versionName = ContextUtils.getVersionName(packageInfo); - versionCode = ContextUtils.getVersionCode(packageInfo, buildInfoProvider); - } if (memInfo != null) { totalMem = Long.toString(memInfo.totalMem); } @@ -373,8 +364,7 @@ private void onLastTransactionFinished(final ITransaction transaction, final boo buildInfoProvider.isEmulator(), totalMem, options.getProguardUuid(), - versionName, - versionCode, + options.getRelease(), options.getEnvironment(), isTimeout ? ProfilingTraceData.TRUNCATION_REASON_TIMEOUT diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidTransactionProfilerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidTransactionProfilerTest.kt index f3a32f30e6..1a3eec8588 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidTransactionProfilerTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidTransactionProfilerTest.kt @@ -368,6 +368,20 @@ class AndroidTransactionProfilerTest { } @Test + fun `profiling trace data contains release field`() { + val profiler = fixture.getSut(context) + profiler.onTransactionStart(fixture.transaction1) + profiler.onTransactionFinish(fixture.transaction1) + verify(fixture.hub).captureEnvelope( + check { + assertEnvelopeItem(it.items.toList()) { _, item -> + assertEquals(fixture.options.release, item.release) + assertNotNull(item.release) + } + } + ) + } + fun `profiler starts collecting frame metrics when the first transaction starts`() { val profiler = fixture.getSut(context) profiler.onTransactionStart(fixture.transaction1) diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index e33162b1ea..6993f1f6b2 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -836,7 +836,7 @@ public final class io/sentry/ProfilingTraceData : io/sentry/JsonSerializable, io public static final field TRUNCATION_REASON_NORMAL Ljava/lang/String; public static final field TRUNCATION_REASON_TIMEOUT Ljava/lang/String; public fun (Ljava/io/File;Lio/sentry/ITransaction;)V - public fun (Ljava/io/File;Ljava/util/List;Lio/sentry/ITransaction;Ljava/lang/String;ILjava/lang/String;Ljava/util/concurrent/Callable;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V + public fun (Ljava/io/File;Ljava/util/List;Lio/sentry/ITransaction;Ljava/lang/String;ILjava/lang/String;Ljava/util/concurrent/Callable;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V public fun getAndroidApiLevel ()I public fun getBuildId ()Ljava/lang/String; public fun getCpuArchitecture ()Ljava/lang/String; @@ -853,6 +853,7 @@ public final class io/sentry/ProfilingTraceData : io/sentry/JsonSerializable, io public fun getMeasurementsMap ()Ljava/util/Map; public fun getPlatform ()Ljava/lang/String; public fun getProfileId ()Ljava/lang/String; + public fun getRelease ()Ljava/lang/String; public fun getSampledProfile ()Ljava/lang/String; public fun getTraceFile ()Ljava/io/File; public fun getTraceId ()Ljava/lang/String; @@ -861,8 +862,6 @@ public final class io/sentry/ProfilingTraceData : io/sentry/JsonSerializable, io public fun getTransactions ()Ljava/util/List; public fun getTruncationReason ()Ljava/lang/String; public fun getUnknown ()Ljava/util/Map; - public fun getVersionCode ()Ljava/lang/String; - public fun getVersionName ()Ljava/lang/String; public fun isDeviceIsEmulator ()Z public fun readDeviceCpuFrequencies ()V public fun serialize (Lio/sentry/JsonObjectWriter;Lio/sentry/ILogger;)V @@ -880,6 +879,7 @@ public final class io/sentry/ProfilingTraceData : io/sentry/JsonSerializable, io public fun setDurationNs (Ljava/lang/String;)V public fun setEnvironment (Ljava/lang/String;)V public fun setProfileId (Ljava/lang/String;)V + public fun setRelease (Ljava/lang/String;)V public fun setSampledProfile (Ljava/lang/String;)V public fun setTraceId (Ljava/lang/String;)V public fun setTransactionId (Ljava/lang/String;)V @@ -887,8 +887,6 @@ public final class io/sentry/ProfilingTraceData : io/sentry/JsonSerializable, io public fun setTransactions (Ljava/util/List;)V public fun setTruncationReason (Ljava/lang/String;)V public fun setUnknown (Ljava/util/Map;)V - public fun setVersionCode (Ljava/lang/String;)V - public fun setVersionName (Ljava/lang/String;)V } public final class io/sentry/ProfilingTraceData$Deserializer : io/sentry/JsonDeserializer { @@ -915,6 +913,7 @@ public final class io/sentry/ProfilingTraceData$JsonKeys { public static final field MEASUREMENTS Ljava/lang/String; public static final field PLATFORM Ljava/lang/String; public static final field PROFILE_ID Ljava/lang/String; + public static final field RELEASE Ljava/lang/String; public static final field SAMPLED_PROFILE Ljava/lang/String; public static final field TRACE_ID Ljava/lang/String; public static final field TRANSACTION_ID Ljava/lang/String; @@ -922,7 +921,6 @@ public final class io/sentry/ProfilingTraceData$JsonKeys { public static final field TRANSACTION_NAME Ljava/lang/String; public static final field TRUNCATION_REASON Ljava/lang/String; public static final field VERSION_CODE Ljava/lang/String; - public static final field VERSION_NAME Ljava/lang/String; public fun ()V } diff --git a/sentry/src/main/java/io/sentry/ProfilingTraceData.java b/sentry/src/main/java/io/sentry/ProfilingTraceData.java index c26fc32719..09582a6f4f 100644 --- a/sentry/src/main/java/io/sentry/ProfilingTraceData.java +++ b/sentry/src/main/java/io/sentry/ProfilingTraceData.java @@ -55,8 +55,8 @@ public final class ProfilingTraceData implements JsonUnknown, JsonSerializable { private @NotNull String durationNs; // App info - private @NotNull String versionName; private @NotNull String versionCode; + private @NotNull String release; // Stacktrace context private @NotNull String transactionId; @@ -93,29 +93,27 @@ public ProfilingTraceData( null, null, null, - null, TRUNCATION_REASON_NORMAL, new HashMap<>()); } public ProfilingTraceData( - final @NotNull File traceFile, - final @NotNull List transactions, - final @NotNull ITransaction transaction, - final @NotNull String durationNanos, - final int sdkInt, - final @NotNull String cpuArchitecture, - final @NotNull Callable> deviceCpuFrequenciesReader, - final @Nullable String deviceManufacturer, - final @Nullable String deviceModel, - final @Nullable String deviceOsVersion, - final @Nullable Boolean deviceIsEmulator, - final @Nullable String devicePhysicalMemoryBytes, - final @Nullable String buildId, - final @Nullable String versionName, - final @Nullable String versionCode, - final @Nullable String environment, - final @NotNull String truncationReason, + @NotNull File traceFile, + @NotNull List transactions, + @NotNull ITransaction transaction, + @NotNull String durationNanos, + int sdkInt, + @NotNull String cpuArchitecture, + @NotNull Callable> deviceCpuFrequenciesReader, + @Nullable String deviceManufacturer, + @Nullable String deviceModel, + @Nullable String deviceOsVersion, + @Nullable Boolean deviceIsEmulator, + @Nullable String devicePhysicalMemoryBytes, + @Nullable String buildId, + @Nullable String release, + @Nullable String environment, + @NotNull String truncationReason, final @NotNull Map measurementsMap) { this.traceFile = traceFile; this.cpuArchitecture = cpuArchitecture; @@ -141,8 +139,8 @@ public ProfilingTraceData( this.durationNs = durationNanos; // App info - this.versionName = versionName != null ? versionName : ""; - this.versionCode = versionCode != null ? versionCode : ""; + this.versionCode = ""; + this.release = release != null ? release : ""; // Stacktrace context this.transactionId = transaction.getEventId().toString(); @@ -216,12 +214,8 @@ public boolean isDeviceIsEmulator() { return transactionName; } - public @NotNull String getVersionName() { - return versionName; - } - - public @NotNull String getVersionCode() { - return versionCode; + public @NotNull String getRelease() { + return release; } public @NotNull String getTransactionId() { @@ -328,12 +322,8 @@ public void setDurationNs(final @NotNull String durationNs) { this.durationNs = durationNs; } - public void setVersionName(final @NotNull String versionName) { - this.versionName = versionName; - } - - public void setVersionCode(final @NotNull String versionCode) { - this.versionCode = versionCode; + public void setRelease(@NotNull String release) { + this.release = release; } public void setTransactionId(final @NotNull String transactionId) { @@ -382,7 +372,7 @@ public static final class JsonKeys { public static final String BUILD_ID = "build_id"; public static final String TRANSACTION_NAME = "transaction_name"; public static final String DURATION_NS = "duration_ns"; - public static final String VERSION_NAME = "version_name"; + public static final String RELEASE = "version_name"; public static final String VERSION_CODE = "version_code"; public static final String TRANSACTION_LIST = "transactions"; public static final String TRANSACTION_ID = "transaction_id"; @@ -414,7 +404,7 @@ public void serialize(final @NotNull JsonObjectWriter writer, final @NotNull ILo writer.name(JsonKeys.BUILD_ID).value(buildId); writer.name(JsonKeys.TRANSACTION_NAME).value(transactionName); writer.name(JsonKeys.DURATION_NS).value(durationNs); - writer.name(JsonKeys.VERSION_NAME).value(versionName); + writer.name(JsonKeys.RELEASE).value(release); writer.name(JsonKeys.VERSION_CODE).value(versionCode); if (!transactions.isEmpty()) { writer.name(JsonKeys.TRANSACTION_LIST).value(logger, transactions); @@ -552,18 +542,18 @@ public static final class Deserializer implements JsonDeserializer transactions = reader.nextList(logger, new ProfilingTransactionData.Deserializer()); diff --git a/sentry/src/test/java/io/sentry/JsonSerializerTest.kt b/sentry/src/test/java/io/sentry/JsonSerializerTest.kt index 53a4af094e..f86e357c69 100644 --- a/sentry/src/test/java/io/sentry/JsonSerializerTest.kt +++ b/sentry/src/test/java/io/sentry/JsonSerializerTest.kt @@ -509,8 +509,7 @@ class JsonSerializerTest { ) profilingTraceData.transactionName = "transactionName" profilingTraceData.durationNs = "100" - profilingTraceData.versionName = "versionName" - profilingTraceData.versionCode = "versionCode" + profilingTraceData.release = "release" profilingTraceData.transactionId = "transactionId" profilingTraceData.traceId = "traceId" profilingTraceData.profileId = "profileId" @@ -585,8 +584,8 @@ class JsonSerializerTest { ) assertEquals("transactionName", element["transaction_name"] as String) assertEquals("100", element["duration_ns"] as String) - assertEquals("versionName", element["version_name"] as String) - assertEquals("versionCode", element["version_code"] as String) + assertEquals("release", element["version_name"] as String) + assertEquals("", element["version_code"] as String) assertEquals("transactionId", element["transaction_id"] as String) assertEquals("traceId", element["trace_id"] as String) assertEquals("profileId", element["profile_id"] as String) @@ -643,8 +642,8 @@ class JsonSerializerTest { }, "transaction_name":"transactionName", "duration_ns":"100", - "version_name":"versionName", - "version_code":"versionCode", + "version_name":"release", + "version_code":"", "transaction_id":"transactionId", "trace_id":"traceId", "profile_id":"profileId", @@ -697,8 +696,7 @@ class JsonSerializerTest { assertEquals(expectedMeasurements, profilingTraceData.measurementsMap) assertEquals("transactionName", profilingTraceData.transactionName) assertEquals("100", profilingTraceData.durationNs) - assertEquals("versionName", profilingTraceData.versionName) - assertEquals("versionCode", profilingTraceData.versionCode) + assertEquals("release", profilingTraceData.release) assertEquals("transactionId", profilingTraceData.transactionId) assertEquals("traceId", profilingTraceData.traceId) assertEquals("profileId", profilingTraceData.profileId)