diff --git a/CHANGELOG.md b/CHANGELOG.md index 03a5c523ed..71cae8b0f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ - Add `sendModules` option for disable sending modules ([#2926](https://github.com/getsentry/sentry-java/pull/2926)) - Send `db.system` and `db.name` in span data for androidx.sqlite spans ([#2928](https://github.com/getsentry/sentry-java/pull/2928)) +### Fixes + +- Always send memory stats for transactions ([#2936](https://github.com/getsentry/sentry-java/pull/2936)) + - This makes it possible to query transactions by the `device.class` tag on Sentry + ### Dependencies - Bump Gradle from v8.2.1 to v8.3.0 ([#2900](https://github.com/getsentry/sentry-java/pull/2900)) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/DeviceInfoUtil.java b/sentry-android-core/src/main/java/io/sentry/android/core/DeviceInfoUtil.java index d74a8b1e2d..304a30116a 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/DeviceInfoUtil.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/DeviceInfoUtil.java @@ -47,6 +47,8 @@ public final class DeviceInfoUtil { private final @Nullable ContextUtils.SideLoadedInfo sideLoadedInfo; private final @NotNull OperatingSystem os; + private final @Nullable Long totalMem; + public DeviceInfoUtil( final @NotNull Context context, final @NotNull SentryAndroidOptions options) { this.context = context; @@ -59,6 +61,13 @@ public DeviceInfoUtil( isEmulator = buildInfoProvider.isEmulator(); sideLoadedInfo = ContextUtils.retrieveSideLoadedInfo(context, options.getLogger(), buildInfoProvider); + final @Nullable ActivityManager.MemoryInfo memInfo = + ContextUtils.getMemInfo(context, options.getLogger()); + if (memInfo != null) { + totalMem = getMemorySize(memInfo); + } else { + totalMem = null; + } } @NotNull @@ -132,6 +141,8 @@ public Device collectDeviceInformation( device.setProcessorCount(cpuFrequencies.size()); } + device.setMemorySize(totalMem); + // setting such values require IO hence we don't run for transactions if (collectDeviceIO && options.isCollectAdditionalContext()) { setDeviceIO(device, collectDynamicData); @@ -193,16 +204,11 @@ private void setDeviceIO(final @NotNull Device device, final boolean includeDyna device.setOnline(connected); final @Nullable ActivityManager.MemoryInfo memInfo = - ContextUtils.getMemInfo(context, options.getLogger()); - if (memInfo != null) { - // in bytes - device.setMemorySize(getMemorySize(memInfo)); - if (includeDynamicData) { + ContextUtils.getMemInfo(context, options.getLogger()); + if (memInfo != null && includeDynamicData) { + // in bytes device.setFreeMemory(memInfo.availMem); device.setLowMemory(memInfo.lowMemory); - } - // there are runtime.totalMemory() and runtime.freeMemory(), but I kept the same for - // compatibility } // this way of getting the size of storage might be problematic for storages bigger than 2GB diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/DeviceInfoUtilTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/DeviceInfoUtilTest.kt index 5c90395e3b..c01da4b6e7 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/DeviceInfoUtilTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/DeviceInfoUtilTest.kt @@ -34,7 +34,7 @@ class DeviceInfoUtilTest { } @Test - fun `provides os and sideloaded info`() { + fun `provides os, memory and sideloaded info`() { val deviceInfoUtil = DeviceInfoUtil.getInstance(context, SentryAndroidOptions()) val os = deviceInfoUtil.operatingSystem @@ -48,6 +48,7 @@ class DeviceInfoUtilTest { assertNotNull(sideLoadedInfo.isSideLoaded) assertNotNull(deviceInfo.isSimulator) + assertNotNull(deviceInfo.memorySize) } @Test @@ -106,7 +107,6 @@ class DeviceInfoUtilTest { val deviceInfoUtil = DeviceInfoUtil.getInstance(context, options) val deviceInfo = deviceInfoUtil.collectDeviceInformation(false, false) - assertNull(deviceInfo.memorySize) assertNull(deviceInfo.storageSize) assertNull(deviceInfo.freeStorage) }