From 7329cb03d24622bcc284abebdfc7601f2d3baf40 Mon Sep 17 00:00:00 2001 From: deividasstr Date: Tue, 18 Feb 2025 14:56:33 +0200 Subject: [PATCH 1/7] Remove min cache size and available space allocation from DiskManager --- .../features/persistence/DiskManager.kt | 32 ++++--------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/core/src/main/java/io/opentelemetry/android/internal/features/persistence/DiskManager.kt b/core/src/main/java/io/opentelemetry/android/internal/features/persistence/DiskManager.kt index 69dc2c333..306118923 100644 --- a/core/src/main/java/io/opentelemetry/android/internal/features/persistence/DiskManager.kt +++ b/core/src/main/java/io/opentelemetry/android/internal/features/persistence/DiskManager.kt @@ -37,12 +37,10 @@ internal class DiskManager( val maxFolderSize: Int /** - * It checks for the available cache space in disk, then it attempts to divide by 3 in order to - * get each signal's folder max size. The resulting value is subtracted the max file size value - * in order to account for temp files used during the reading process. + * It divides the requested cache size by 3 in order to + * get each signal's folder max size. * - * @return If the calculated size is < the max file size value, it returns 0. The calculated - * size is stored in the preferences and returned otherwise. + * @return The calculated size is stored in the preferences and returned. */ get() { val storedSize = preferences.retrieveInt(MAX_FOLDER_SIZE_KEY, -1) @@ -54,31 +52,15 @@ internal class DiskManager( return storedSize } val requestedSize = diskBufferingConfig.maxCacheSize - val availableCacheSize = - cacheStorage.ensureCacheSpaceAvailable(requestedSize.toLong()).toInt() - // Divides the available cache size by 3 (for each signal's folder) and then subtracts the - // size of a single file to be aware of a temp file used when reading data back from the - // disk. - val maxCacheFileSize = maxCacheFileSize - val calculatedSize = availableCacheSize / 3 - maxCacheFileSize - if (calculatedSize < maxCacheFileSize) { - Log.w( - RumConstants.OTEL_RUM_LOG_TAG, - String.format( - "Insufficient folder cache size: %s, it must be at least: %s", - calculatedSize, - maxCacheFileSize, - ), - ) - return 0 - } + + // Divides the available cache size by 3 (for each signal's folder) + val calculatedSize = requestedSize / 3 preferences.store(MAX_FOLDER_SIZE_KEY, calculatedSize) Log.d( RumConstants.OTEL_RUM_LOG_TAG, String.format( - "Requested cache size: %s, available cache size: %s, folder size: %s", + "Requested cache size: %s, folder size: %s", requestedSize, - availableCacheSize, calculatedSize, ), ) From 02085a476cdb19e6e891725dac10348322019c53 Mon Sep 17 00:00:00 2001 From: deividasstr Date: Tue, 18 Feb 2025 14:57:06 +0200 Subject: [PATCH 2/7] Remove unused available space and allocation methods --- .../internal/services/CacheStorage.java | 62 +------------------ 1 file changed, 2 insertions(+), 60 deletions(-) diff --git a/services/src/main/java/io/opentelemetry/android/internal/services/CacheStorage.java b/services/src/main/java/io/opentelemetry/android/internal/services/CacheStorage.java index 2f4751411..c53bf28f8 100644 --- a/services/src/main/java/io/opentelemetry/android/internal/services/CacheStorage.java +++ b/services/src/main/java/io/opentelemetry/android/internal/services/CacheStorage.java @@ -5,16 +5,8 @@ package io.opentelemetry.android.internal.services; -import android.content.Context; -import android.os.Build; -import android.os.storage.StorageManager; -import android.util.Log; -import androidx.annotation.RequiresApi; -import androidx.annotation.WorkerThread; -import io.opentelemetry.android.common.RumConstants; -import java.io.File; -import java.io.IOException; -import java.util.UUID; +import android.content.*; +import java.io.*; /** * Utility to get information about the host app. @@ -32,54 +24,4 @@ public CacheStorage(Context appContext) { public File getCacheDir() { return appContext.getCacheDir(); } - - /** - * Checks for available cache space in the device and compares it to the max amount needed, if - * the available space is lower than the provided max value, the available space is returned, - * otherwise, the provided amount is returned. - * - *

On Android OS with API level 26 and above, it will also ask the OS to clear stale cache - * from the device in order to make room for the provided max value if needed. - */ - @WorkerThread - public long ensureCacheSpaceAvailable(long maxSpaceNeeded) { - File cacheDir = getCacheDir(); - if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) { - return getLegacyAvailableSpace(cacheDir, maxSpaceNeeded); - } - return getAvailableSpace(cacheDir, maxSpaceNeeded); - } - - @RequiresApi(api = Build.VERSION_CODES.O) - private long getAvailableSpace(File directory, long maxSpaceNeeded) { - Log.d( - RumConstants.OTEL_RUM_LOG_TAG, - String.format( - "Getting available space for %s, max needed is: %s", - directory, maxSpaceNeeded)); - try { - StorageManager storageManager = appContext.getSystemService(StorageManager.class); - UUID appSpecificInternalDirUuid = storageManager.getUuidForPath(directory); - // Get the minimum amount of allocatable space. - long spaceToAllocate = - Math.min( - storageManager.getAllocatableBytes(appSpecificInternalDirUuid), - maxSpaceNeeded); - // Ensure the space is available by asking the OS to clear stale cache if needed. - storageManager.allocateBytes(appSpecificInternalDirUuid, spaceToAllocate); - return spaceToAllocate; - } catch (IOException e) { - Log.w(RumConstants.OTEL_RUM_LOG_TAG, "Failed to get available space", e); - return getLegacyAvailableSpace(directory, maxSpaceNeeded); - } - } - - private long getLegacyAvailableSpace(File directory, long maxSpaceNeeded) { - Log.d( - RumConstants.OTEL_RUM_LOG_TAG, - String.format( - "Getting legacy available space for %s max needed is: %s", - directory, maxSpaceNeeded)); - return Math.min(directory.getUsableSpace(), maxSpaceNeeded); - } } From 23ad1c18fae07ac2d4f3fee6b8b7a36a0f7a957e Mon Sep 17 00:00:00 2001 From: deividasstr Date: Tue, 18 Feb 2025 14:57:38 +0200 Subject: [PATCH 3/7] Modify DiskManager tests --- .../features/persistence/DiskManagerTest.kt | 22 ++----------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/core/src/test/java/io/opentelemetry/android/internal/features/persistence/DiskManagerTest.kt b/core/src/test/java/io/opentelemetry/android/internal/features/persistence/DiskManagerTest.kt index 84ba933bf..47d82e78f 100644 --- a/core/src/test/java/io/opentelemetry/android/internal/features/persistence/DiskManagerTest.kt +++ b/core/src/test/java/io/opentelemetry/android/internal/features/persistence/DiskManagerTest.kt @@ -90,13 +90,11 @@ internal class DiskManagerTest { val maxCacheFileSize = 1024 * 1024 // 1 MB every { diskBufferingConfig.maxCacheSize }.returns(maxCacheSize.toInt()) every { diskBufferingConfig.maxCacheFileSize }.returns(maxCacheFileSize) - every { cacheStorage.ensureCacheSpaceAvailable(maxCacheSize) }.returns(maxCacheSize) every { preferences.retrieveInt(MAX_FOLDER_SIZE_KEY, -1) }.returns(-1) every { preferences.store(any(), any()) } just Runs - // Expects the size of a single signal type folder minus the size of a cache file, to use as - // temporary space for reading. - val expected = 2446677 + // Expects the size of a single signal type folder, to use as temporary space for reading. + val expected = (maxCacheSize / 3).toInt() assertThat(diskManager.maxFolderSize).isEqualTo(expected) verify { preferences.store(MAX_FOLDER_SIZE_KEY, expected) @@ -115,22 +113,6 @@ internal class DiskManagerTest { verify { diskBufferingConfig wasNot Called } } - @Test - fun `max folder size is used when calculated size is invalid`() { - val maxCacheSize = (1024 * 1024).toLong() // 1 MB - val maxCacheFileSize = 1024 * 1024 // 1 MB - every { diskBufferingConfig.maxCacheSize }.returns(maxCacheSize.toInt()) - every { diskBufferingConfig.maxCacheFileSize }.returns(maxCacheFileSize) - every { cacheStorage.ensureCacheSpaceAvailable(maxCacheSize) }.returns(maxCacheSize) - every { preferences.retrieveInt(MAX_FOLDER_SIZE_KEY, -1) }.returns(-1) - // Expects the size of a single signal type folder minus the size of a cache file, to use as - // temporary space for reading. - assertThat(diskManager.maxFolderSize).isEqualTo(0) - verify(inverse = true) { - preferences.store(any(), any()) - } - } - companion object { private const val MAX_FOLDER_SIZE_KEY = "max_signal_folder_size" } From 3122bd8aa09fb475b51bcb709d8f948972f8071f Mon Sep 17 00:00:00 2001 From: deividasstr Date: Tue, 18 Feb 2025 14:58:04 +0200 Subject: [PATCH 4/7] Modify otel rum builder test --- .../android/OpenTelemetryRumBuilderTest.java | 144 +++++++----------- 1 file changed, 52 insertions(+), 92 deletions(-) diff --git a/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java b/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java index fad402555..69ee80b54 100644 --- a/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java +++ b/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java @@ -5,94 +5,57 @@ package io.opentelemetry.android; -import static io.opentelemetry.android.common.RumConstants.SCREEN_NAME_KEY; -import static io.opentelemetry.api.common.AttributeKey.longKey; -import static io.opentelemetry.api.common.AttributeKey.stringKey; -import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; -import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; -import static io.opentelemetry.semconv.incubating.SessionIncubatingAttributes.SESSION_ID; -import static org.awaitility.Awaitility.await; -import static org.mockito.ArgumentMatchers.anyCollection; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoInteractions; -import static org.mockito.Mockito.when; - -import android.app.Application; -import android.net.ConnectivityManager; -import android.os.Looper; -import androidx.annotation.NonNull; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import io.opentelemetry.android.config.OtelRumConfig; -import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfig; -import io.opentelemetry.android.features.diskbuffering.SignalFromDiskExporter; -import io.opentelemetry.android.features.diskbuffering.scheduler.ExportScheduleHandler; -import io.opentelemetry.android.instrumentation.AndroidInstrumentation; -import io.opentelemetry.android.instrumentation.AndroidInstrumentationLoader; -import io.opentelemetry.android.instrumentation.InstallationContext; -import io.opentelemetry.android.instrumentation.internal.AndroidInstrumentationLoaderImpl; -import io.opentelemetry.android.internal.initialization.InitializationEvents; -import io.opentelemetry.android.internal.services.CacheStorage; -import io.opentelemetry.android.internal.services.Preferences; -import io.opentelemetry.android.internal.services.Services; -import io.opentelemetry.android.internal.services.applifecycle.AppLifecycle; -import io.opentelemetry.android.internal.services.applifecycle.ApplicationStateListener; -import io.opentelemetry.android.internal.services.visiblescreen.VisibleScreenTracker; -import io.opentelemetry.android.internal.session.SessionIdTimeoutHandler; -import io.opentelemetry.android.session.SessionManager; -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.common.KeyValue; -import io.opentelemetry.api.common.Value; -import io.opentelemetry.api.incubator.events.EventLogger; -import io.opentelemetry.api.logs.Logger; -import io.opentelemetry.api.logs.Severity; -import io.opentelemetry.api.metrics.LongCounter; -import io.opentelemetry.api.metrics.Meter; -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.context.Context; -import io.opentelemetry.context.Scope; -import io.opentelemetry.context.propagation.TextMapGetter; -import io.opentelemetry.context.propagation.TextMapPropagator; -import io.opentelemetry.contrib.disk.buffering.SpanToDiskExporter; -import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.logs.data.LogRecordData; -import io.opentelemetry.sdk.logs.export.LogRecordExporter; -import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor; -import io.opentelemetry.sdk.logs.internal.SdkEventLoggerProvider; -import io.opentelemetry.sdk.metrics.SdkMeterProvider; -import io.opentelemetry.sdk.metrics.data.AggregationTemporality; -import io.opentelemetry.sdk.metrics.data.MetricData; -import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; -import io.opentelemetry.sdk.resources.Resource; -import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions; -import io.opentelemetry.sdk.testing.exporter.InMemoryLogRecordExporter; -import io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter; -import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; -import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter; -import io.opentelemetry.sdk.trace.data.SpanData; -import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; -import io.opentelemetry.sdk.trace.export.SpanExporter; -import java.io.IOException; -import java.time.Duration; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Function; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; +import android.app.*; +import android.net.*; +import android.os.*; +import androidx.annotation.*; +import androidx.test.ext.junit.runners.*; +import static io.opentelemetry.android.common.RumConstants.*; +import io.opentelemetry.android.config.*; +import io.opentelemetry.android.features.diskbuffering.*; +import io.opentelemetry.android.features.diskbuffering.scheduler.*; +import io.opentelemetry.android.instrumentation.*; +import io.opentelemetry.android.instrumentation.internal.*; +import io.opentelemetry.android.internal.initialization.*; +import io.opentelemetry.android.internal.services.*; +import io.opentelemetry.android.internal.services.applifecycle.*; +import io.opentelemetry.android.internal.services.visiblescreen.*; +import io.opentelemetry.android.internal.session.*; +import io.opentelemetry.android.session.*; +import static io.opentelemetry.api.common.AttributeKey.*; +import io.opentelemetry.api.common.*; +import io.opentelemetry.api.incubator.events.*; +import io.opentelemetry.api.logs.*; +import io.opentelemetry.api.metrics.*; +import io.opentelemetry.api.trace.*; +import io.opentelemetry.context.*; +import io.opentelemetry.context.propagation.*; +import io.opentelemetry.contrib.disk.buffering.*; +import io.opentelemetry.sdk.*; +import io.opentelemetry.sdk.logs.data.*; +import io.opentelemetry.sdk.logs.export.*; +import io.opentelemetry.sdk.logs.internal.*; +import io.opentelemetry.sdk.metrics.*; +import io.opentelemetry.sdk.metrics.data.*; +import io.opentelemetry.sdk.metrics.export.*; +import io.opentelemetry.sdk.resources.*; +import io.opentelemetry.sdk.testing.assertj.*; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.*; +import io.opentelemetry.sdk.testing.exporter.*; +import io.opentelemetry.sdk.trace.data.*; +import io.opentelemetry.sdk.trace.export.*; +import static io.opentelemetry.semconv.incubating.SessionIncubatingAttributes.*; +import java.io.*; +import java.time.*; +import java.util.*; +import java.util.concurrent.atomic.*; +import java.util.function.*; +import static org.awaitility.Awaitility.*; +import org.junit.*; +import org.junit.runner.*; +import org.mockito.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; @RunWith(AndroidJUnit4.class) public class OpenTelemetryRumBuilderTest { @@ -417,9 +380,7 @@ public void setLogRecordExporterCustomizer() { @Test public void diskBufferingEnabled() { - Services services = createAndSetServiceManager(); - CacheStorage cacheStorage = services.getCacheStorage(); - doReturn(60 * 1024 * 1024L).when(cacheStorage).ensureCacheSpaceAvailable(anyLong()); + createAndSetServiceManager(); OtelRumConfig config = buildConfig(); ExportScheduleHandler scheduleHandler = mock(); config.setDiskBufferingConfig(new DiskBufferingConfig(true)); @@ -447,7 +408,6 @@ public void diskBufferingEnabled_when_exception_thrown() { Services services = createAndSetServiceManager(); CacheStorage cacheStorage = services.getCacheStorage(); ExportScheduleHandler scheduleHandler = mock(); - doReturn(60 * 1024 * 1024L).when(cacheStorage).ensureCacheSpaceAvailable(anyLong()); doAnswer( invocation -> { throw new IOException(); From 1acb0865484be8600ade30054b06a72ef53797b2 Mon Sep 17 00:00:00 2001 From: deividasstr Date: Tue, 18 Feb 2025 15:11:36 +0200 Subject: [PATCH 5/7] Revert import conversion to wildcard grouping --- .../android/OpenTelemetryRumBuilderTest.java | 137 +++++++++++------- .../internal/services/CacheStorage.java | 4 +- 2 files changed, 88 insertions(+), 53 deletions(-) diff --git a/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java b/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java index 69ee80b54..1ddafa442 100644 --- a/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java +++ b/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java @@ -5,57 +5,92 @@ package io.opentelemetry.android; -import android.app.*; -import android.net.*; -import android.os.*; -import androidx.annotation.*; -import androidx.test.ext.junit.runners.*; -import static io.opentelemetry.android.common.RumConstants.*; -import io.opentelemetry.android.config.*; -import io.opentelemetry.android.features.diskbuffering.*; -import io.opentelemetry.android.features.diskbuffering.scheduler.*; -import io.opentelemetry.android.instrumentation.*; -import io.opentelemetry.android.instrumentation.internal.*; -import io.opentelemetry.android.internal.initialization.*; -import io.opentelemetry.android.internal.services.*; -import io.opentelemetry.android.internal.services.applifecycle.*; -import io.opentelemetry.android.internal.services.visiblescreen.*; -import io.opentelemetry.android.internal.session.*; -import io.opentelemetry.android.session.*; -import static io.opentelemetry.api.common.AttributeKey.*; -import io.opentelemetry.api.common.*; -import io.opentelemetry.api.incubator.events.*; -import io.opentelemetry.api.logs.*; -import io.opentelemetry.api.metrics.*; -import io.opentelemetry.api.trace.*; -import io.opentelemetry.context.*; -import io.opentelemetry.context.propagation.*; -import io.opentelemetry.contrib.disk.buffering.*; -import io.opentelemetry.sdk.*; -import io.opentelemetry.sdk.logs.data.*; -import io.opentelemetry.sdk.logs.export.*; -import io.opentelemetry.sdk.logs.internal.*; -import io.opentelemetry.sdk.metrics.*; -import io.opentelemetry.sdk.metrics.data.*; -import io.opentelemetry.sdk.metrics.export.*; -import io.opentelemetry.sdk.resources.*; -import io.opentelemetry.sdk.testing.assertj.*; -import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.*; -import io.opentelemetry.sdk.testing.exporter.*; -import io.opentelemetry.sdk.trace.data.*; -import io.opentelemetry.sdk.trace.export.*; -import static io.opentelemetry.semconv.incubating.SessionIncubatingAttributes.*; -import java.io.*; -import java.time.*; -import java.util.*; -import java.util.concurrent.atomic.*; -import java.util.function.*; -import static org.awaitility.Awaitility.*; -import org.junit.*; -import org.junit.runner.*; -import org.mockito.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; +import static io.opentelemetry.android.common.RumConstants.SCREEN_NAME_KEY; +import static io.opentelemetry.api.common.AttributeKey.longKey; +import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.SessionIncubatingAttributes.SESSION_ID; +import static org.awaitility.Awaitility.await; +import static org.mockito.ArgumentMatchers.anyCollection; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isA; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.when; + +import android.app.Application; +import android.net.ConnectivityManager; +import android.os.Looper; +import androidx.annotation.NonNull; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import io.opentelemetry.android.config.OtelRumConfig; +import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfig; +import io.opentelemetry.android.features.diskbuffering.SignalFromDiskExporter; +import io.opentelemetry.android.features.diskbuffering.scheduler.ExportScheduleHandler; +import io.opentelemetry.android.instrumentation.AndroidInstrumentation; +import io.opentelemetry.android.instrumentation.AndroidInstrumentationLoader; +import io.opentelemetry.android.instrumentation.InstallationContext; +import io.opentelemetry.android.instrumentation.internal.AndroidInstrumentationLoaderImpl; +import io.opentelemetry.android.internal.initialization.InitializationEvents; +import io.opentelemetry.android.internal.services.CacheStorage; +import io.opentelemetry.android.internal.services.Preferences; +import io.opentelemetry.android.internal.services.Services; +import io.opentelemetry.android.internal.services.applifecycle.AppLifecycle; +import io.opentelemetry.android.internal.services.applifecycle.ApplicationStateListener; +import io.opentelemetry.android.internal.services.visiblescreen.VisibleScreenTracker; +import io.opentelemetry.android.internal.session.SessionIdTimeoutHandler; +import io.opentelemetry.android.session.SessionManager; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.KeyValue; +import io.opentelemetry.api.common.Value; +import io.opentelemetry.api.incubator.events.EventLogger; +import io.opentelemetry.api.logs.Logger; +import io.opentelemetry.api.logs.Severity; +import io.opentelemetry.api.metrics.LongCounter; +import io.opentelemetry.api.metrics.Meter; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; +import io.opentelemetry.context.propagation.TextMapGetter; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.contrib.disk.buffering.SpanToDiskExporter; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.logs.data.LogRecordData; +import io.opentelemetry.sdk.logs.export.LogRecordExporter; +import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor; +import io.opentelemetry.sdk.logs.internal.SdkEventLoggerProvider; +import io.opentelemetry.sdk.metrics.SdkMeterProvider; +import io.opentelemetry.sdk.metrics.data.AggregationTemporality; +import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; +import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions; +import io.opentelemetry.sdk.testing.exporter.InMemoryLogRecordExporter; +import io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter; +import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; +import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter; +import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; +import io.opentelemetry.sdk.trace.export.SpanExporter; +import java.io.IOException; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) public class OpenTelemetryRumBuilderTest { diff --git a/services/src/main/java/io/opentelemetry/android/internal/services/CacheStorage.java b/services/src/main/java/io/opentelemetry/android/internal/services/CacheStorage.java index c53bf28f8..900ea2822 100644 --- a/services/src/main/java/io/opentelemetry/android/internal/services/CacheStorage.java +++ b/services/src/main/java/io/opentelemetry/android/internal/services/CacheStorage.java @@ -5,8 +5,8 @@ package io.opentelemetry.android.internal.services; -import android.content.*; -import java.io.*; +import android.content.Context; +import java.io.File; /** * Utility to get information about the host app. From f548c704b02c37df3c2f7503c6be97a58c0e08b8 Mon Sep 17 00:00:00 2001 From: deividasstr Date: Wed, 19 Feb 2025 11:34:19 +0200 Subject: [PATCH 6/7] Remove maxFolderSize calculation caching --- .../android/OpenTelemetryRumBuilder.java | 4 +-- .../features/persistence/DiskManager.kt | 12 -------- .../features/persistence/DiskManagerTest.kt | 29 +------------------ 3 files changed, 2 insertions(+), 43 deletions(-) diff --git a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java index bc8dafc2b..4c1dde394 100644 --- a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java +++ b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java @@ -31,7 +31,6 @@ import io.opentelemetry.android.internal.processors.ScreenAttributesLogRecordProcessor; import io.opentelemetry.android.internal.processors.SessionIdLogRecordAppender; import io.opentelemetry.android.internal.services.CacheStorage; -import io.opentelemetry.android.internal.services.Preferences; import io.opentelemetry.android.internal.services.Services; import io.opentelemetry.android.internal.services.periodicwork.PeriodicWork; import io.opentelemetry.android.internal.session.SessionIdTimeoutHandler; @@ -446,10 +445,9 @@ public OpenTelemetryRumBuilder setExportScheduleHandler( } private StorageConfiguration createStorageConfiguration(Services services) throws IOException { - Preferences preferences = services.getPreferences(); CacheStorage storage = services.getCacheStorage(); DiskBufferingConfig config = this.config.getDiskBufferingConfig(); - DiskManager diskManager = new DiskManager(storage, preferences, config); + DiskManager diskManager = new DiskManager(storage, config); return StorageConfiguration.builder() .setRootDir(diskManager.getSignalsBufferDir()) .setMaxFileSize(diskManager.getMaxCacheFileSize()) diff --git a/core/src/main/java/io/opentelemetry/android/internal/features/persistence/DiskManager.kt b/core/src/main/java/io/opentelemetry/android/internal/features/persistence/DiskManager.kt index 306118923..5bff8ab80 100644 --- a/core/src/main/java/io/opentelemetry/android/internal/features/persistence/DiskManager.kt +++ b/core/src/main/java/io/opentelemetry/android/internal/features/persistence/DiskManager.kt @@ -9,13 +9,11 @@ import android.util.Log import io.opentelemetry.android.common.RumConstants import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfig import io.opentelemetry.android.internal.services.CacheStorage -import io.opentelemetry.android.internal.services.Preferences import java.io.File import java.io.IOException internal class DiskManager( private val cacheStorage: CacheStorage, - private val preferences: Preferences, private val diskBufferingConfig: DiskBufferingConfig, ) { @get:Throws(IOException::class) @@ -43,19 +41,10 @@ internal class DiskManager( * @return The calculated size is stored in the preferences and returned. */ get() { - val storedSize = preferences.retrieveInt(MAX_FOLDER_SIZE_KEY, -1) - if (storedSize > 0) { - Log.d( - RumConstants.OTEL_RUM_LOG_TAG, - String.format("Returning max folder size from preferences: %s", storedSize), - ) - return storedSize - } val requestedSize = diskBufferingConfig.maxCacheSize // Divides the available cache size by 3 (for each signal's folder) val calculatedSize = requestedSize / 3 - preferences.store(MAX_FOLDER_SIZE_KEY, calculatedSize) Log.d( RumConstants.OTEL_RUM_LOG_TAG, String.format( @@ -71,7 +60,6 @@ internal class DiskManager( get() = diskBufferingConfig.maxCacheFileSize companion object { - private const val MAX_FOLDER_SIZE_KEY = "max_signal_folder_size" private fun deleteFiles(dir: File) { val files = dir.listFiles() diff --git a/core/src/test/java/io/opentelemetry/android/internal/features/persistence/DiskManagerTest.kt b/core/src/test/java/io/opentelemetry/android/internal/features/persistence/DiskManagerTest.kt index 47d82e78f..eda343ce1 100644 --- a/core/src/test/java/io/opentelemetry/android/internal/features/persistence/DiskManagerTest.kt +++ b/core/src/test/java/io/opentelemetry/android/internal/features/persistence/DiskManagerTest.kt @@ -7,16 +7,11 @@ package io.opentelemetry.android.internal.features.persistence import io.mockk.Called import io.mockk.MockKAnnotations -import io.mockk.Runs -import io.mockk.clearMocks -import io.mockk.confirmVerified import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.just import io.mockk.verify import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfig import io.opentelemetry.android.internal.services.CacheStorage -import io.opentelemetry.android.internal.services.Preferences import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach @@ -28,9 +23,6 @@ internal class DiskManagerTest { @MockK lateinit var cacheStorage: CacheStorage - @MockK - lateinit var preferences: Preferences - @MockK lateinit var diskBufferingConfig: DiskBufferingConfig @@ -43,7 +35,7 @@ internal class DiskManagerTest { MockKAnnotations.init(this) every { cacheStorage.cacheDir }.returns(cacheDir) diskManager = - DiskManager(cacheStorage, preferences, diskBufferingConfig) + DiskManager(cacheStorage, diskBufferingConfig) } @Test @@ -90,30 +82,11 @@ internal class DiskManagerTest { val maxCacheFileSize = 1024 * 1024 // 1 MB every { diskBufferingConfig.maxCacheSize }.returns(maxCacheSize.toInt()) every { diskBufferingConfig.maxCacheFileSize }.returns(maxCacheFileSize) - every { preferences.retrieveInt(MAX_FOLDER_SIZE_KEY, -1) }.returns(-1) - every { preferences.store(any(), any()) } just Runs // Expects the size of a single signal type folder, to use as temporary space for reading. val expected = (maxCacheSize / 3).toInt() assertThat(diskManager.maxFolderSize).isEqualTo(expected) - verify { - preferences.store(MAX_FOLDER_SIZE_KEY, expected) - } - - // On a second call, should get the value from the preferences. - clearMocks(cacheStorage, diskBufferingConfig, preferences) - every { preferences.retrieveInt(MAX_FOLDER_SIZE_KEY, -1) }.returns(expected) - assertThat(diskManager.maxFolderSize).isEqualTo(expected) - verify { - preferences.retrieveInt(MAX_FOLDER_SIZE_KEY, -1) - } - confirmVerified(preferences) verify { cacheStorage wasNot Called } - verify { diskBufferingConfig wasNot Called } - } - - companion object { - private const val MAX_FOLDER_SIZE_KEY = "max_signal_folder_size" } } From 506f07bf0f247cebe434286b6653b423615e9300 Mon Sep 17 00:00:00 2001 From: deividasstr Date: Wed, 19 Feb 2025 12:47:33 +0200 Subject: [PATCH 7/7] Fix lint issue --- .../android/internal/features/persistence/DiskManager.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/io/opentelemetry/android/internal/features/persistence/DiskManager.kt b/core/src/main/java/io/opentelemetry/android/internal/features/persistence/DiskManager.kt index 5bff8ab80..24a8ed28e 100644 --- a/core/src/main/java/io/opentelemetry/android/internal/features/persistence/DiskManager.kt +++ b/core/src/main/java/io/opentelemetry/android/internal/features/persistence/DiskManager.kt @@ -60,7 +60,6 @@ internal class DiskManager( get() = diskBufferingConfig.maxCacheFileSize companion object { - private fun deleteFiles(dir: File) { val files = dir.listFiles() if (files != null) {