Skip to content

Commit 26c5ea0

Browse files
committed
Add file size in profiling telemetry & fix unit test
1 parent 46d5192 commit 26c5ea0

File tree

6 files changed

+31
-8
lines changed

6 files changed

+31
-8
lines changed

dd-sdk-android-core/api/apiSurface

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ interface com.datadog.android.core.internal.persistence.Deserializer<P: Any, R:
293293
fun java.io.File.canReadSafe(com.datadog.android.api.InternalLogger): Boolean
294294
fun java.io.File.existsSafe(com.datadog.android.api.InternalLogger): Boolean
295295
fun java.io.File.listFilesSafe(com.datadog.android.api.InternalLogger, java.io.FilenameFilter): Array<java.io.File>?
296+
fun java.io.File.lengthSafe(com.datadog.android.api.InternalLogger): Long
296297
fun java.io.File.readTextSafe(java.nio.charset.Charset = Charsets.UTF_8, com.datadog.android.api.InternalLogger): String?
297298
fun java.io.File.readBytesSafe(com.datadog.android.api.InternalLogger): ByteArray?
298299
fun java.io.File.readLinesSafe(java.nio.charset.Charset = Charsets.UTF_8, com.datadog.android.api.InternalLogger): List<String>?

dd-sdk-android-core/api/dd-sdk-android-core.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,7 @@ public abstract interface class com/datadog/android/core/internal/persistence/De
798798
public final class com/datadog/android/core/internal/persistence/file/FileExtKt {
799799
public static final fun canReadSafe (Ljava/io/File;Lcom/datadog/android/api/InternalLogger;)Z
800800
public static final fun existsSafe (Ljava/io/File;Lcom/datadog/android/api/InternalLogger;)Z
801+
public static final fun lengthSafe (Ljava/io/File;Lcom/datadog/android/api/InternalLogger;)J
801802
public static final fun listFilesSafe (Ljava/io/File;Lcom/datadog/android/api/InternalLogger;Ljava/io/FilenameFilter;)[Ljava/io/File;
802803
public static final fun readBytesSafe (Ljava/io/File;Lcom/datadog/android/api/InternalLogger;)[B
803804
public static final fun readLinesSafe (Ljava/io/File;Ljava/nio/charset/Charset;Lcom/datadog/android/api/InternalLogger;)Ljava/util/List;

dd-sdk-android-core/src/main/kotlin/com/datadog/android/core/internal/persistence/file/FileExt.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,11 @@ fun File.listFilesSafe(internalLogger: InternalLogger, filter: FilenameFilter):
130130
}
131131
}
132132

133-
internal fun File.lengthSafe(internalLogger: InternalLogger): Long {
133+
/**
134+
* Non-throwing version of [File.length]. If exception happens, 0 is returned.
135+
*/
136+
@InternalApi
137+
fun File.lengthSafe(internalLogger: InternalLogger): Long {
134138
return safeCall(default = 0L, internalLogger) {
135139
@Suppress("UnsafeThirdPartyFunctionCall")
136140
length()

features/dd-sdk-android-profiling/src/main/java/com/datadog/android/profiling/internal/perfetto/PerfettoProfiler.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ import androidx.annotation.RequiresApi
1414
import androidx.core.os.StackSamplingRequestBuilder
1515
import androidx.core.os.requestProfiling
1616
import com.datadog.android.api.InternalLogger
17+
import com.datadog.android.core.internal.persistence.file.lengthSafe
1718
import com.datadog.android.internal.time.TimeProvider
1819
import com.datadog.android.profiling.internal.Profiler
20+
import java.io.File
1921
import java.util.concurrent.ExecutorService
2022
import java.util.concurrent.Executors
2123
import java.util.concurrent.TimeUnit
@@ -114,12 +116,22 @@ internal class PerfettoProfiler(
114116
TELEMETRY_KEY_ERROR_CODE to result.errorCode,
115117
TELEMETRY_KEY_TAG to PROFILING_TAG_APPLICATION_LAUNCH,
116118
TELEMETRY_KEY_ERROR_MESSAGE to result.errorMessage,
117-
TELEMETRY_KEY_DURATION to duration
119+
TELEMETRY_KEY_DURATION to duration,
120+
TELEMETRY_KEY_FILE_SIZE to getFileSize(result.resultFilePath)
118121
)
119122
)
120123
)
121124
}
122125

126+
private fun getFileSize(filePath: String?): Long {
127+
return internalLogger?.let { logger ->
128+
filePath?.let {
129+
val file = File(filePath)
130+
file.lengthSafe(logger)
131+
}
132+
} ?: 0
133+
}
134+
123135
companion object {
124136
private val PROFILING_MAX_DURATION_MS = TimeUnit.MINUTES.toMillis(1).toInt()
125137
private const val PROFILING_TAG_APPLICATION_LAUNCH = "ApplicationLaunch"
@@ -138,5 +150,6 @@ internal class PerfettoProfiler(
138150
private const val TELEMETRY_KEY_TAG = "tag"
139151
private const val TELEMETRY_KEY_ERROR_MESSAGE = "error_message"
140152
private const val TELEMETRY_KEY_DURATION = "duration"
153+
private const val TELEMETRY_KEY_FILE_SIZE = "size_bytes"
141154
}
142155
}

features/dd-sdk-android-profiling/src/test/kotlin/com/datadog/android/profiling/internal/PerfettoProfilerTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ class PerfettoProfilerTest {
188188
"error_code" to ProfilingResult.ERROR_FAILED_PROFILING_IN_PROGRESS,
189189
"tag" to "ApplicationLaunch",
190190
"error_message" to fakeErrorMessage,
191-
"duration" to fakeDuration
191+
"duration" to fakeDuration,
192+
"size_bytes" to 0L,
192193
)
193194
)
194195
verify(mockInternalLogger)

features/dd-sdk-android-profiling/src/test/kotlin/com/datadog/android/profiling/internal/ProfilingStorageTest.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ package com.datadog.android.profiling.internal
88

99
import android.content.Context
1010
import android.content.SharedPreferences
11-
import org.assertj.core.api.Assertions
11+
import org.assertj.core.api.Assertions.assertThat
12+
import org.junit.jupiter.api.AfterEach
1213
import org.junit.jupiter.api.BeforeEach
1314
import org.junit.jupiter.api.Test
1415
import org.junit.jupiter.api.extension.ExtendWith
@@ -18,7 +19,6 @@ import org.mockito.junit.jupiter.MockitoExtension
1819
import org.mockito.junit.jupiter.MockitoSettings
1920
import org.mockito.kotlin.any
2021
import org.mockito.kotlin.doReturn
21-
import org.mockito.kotlin.times
2222
import org.mockito.kotlin.verify
2323
import org.mockito.kotlin.whenever
2424
import org.mockito.quality.Strictness
@@ -46,7 +46,10 @@ internal class ProfilingStorageTest {
4646
whenever(mockPrefs.edit()) doReturn mockEditor
4747
whenever(mockEditor.remove(any())) doReturn mockEditor
4848
whenever(mockEditor.putBoolean(any(), any())) doReturn mockEditor
49+
}
4950

51+
@AfterEach
52+
fun `clean up`() {
5053
// Reset the singleton
5154
val storageField = ProfilingStorage::class.java.getDeclaredField("sharedPreferencesStorage")
5255
storageField.isAccessible = true
@@ -72,7 +75,7 @@ internal class ProfilingStorageTest {
7275
val isEnabled = ProfilingStorage.isProfilingEnabled(mockContext)
7376

7477
// Then
75-
Assertions.assertThat(isEnabled).isTrue()
78+
assertThat(isEnabled).isTrue()
7679
}
7780

7881
@Test
@@ -84,7 +87,7 @@ internal class ProfilingStorageTest {
8487
val isEnabled = ProfilingStorage.isProfilingEnabled(mockContext)
8588

8689
// Then
87-
Assertions.assertThat(isEnabled).isFalse()
90+
assertThat(isEnabled).isFalse()
8891
}
8992

9093
@Test
@@ -112,7 +115,7 @@ internal class ProfilingStorageTest {
112115
latch.await(5, TimeUnit.SECONDS)
113116

114117
// Then
115-
verify(mockContext, times(1)).getSharedPreferences(
118+
verify(mockContext).getSharedPreferences(
116119
DATADOG_PREFERENCES_FILE_NAME,
117120
Context.MODE_PRIVATE
118121
)

0 commit comments

Comments
 (0)