Skip to content

Commit af1a3ee

Browse files
authored
Merge pull request #3276 from DataDog/yl/profiling/RUM-15189-continuous-sample-rate-api
RUM-15189: Add setContinuousSampleRate API to ProfilingConfiguration
2 parents 61409f2 + d0c0841 commit af1a3ee

8 files changed

Lines changed: 59 additions & 17 deletions

File tree

features/dd-sdk-android-profiling/api/apiSurface

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ object com.datadog.android.profiling.Profiling
1212
data class com.datadog.android.profiling.ProfilingConfiguration
1313
class Builder
1414
fun setApplicationLaunchSampleRate(Float): Builder
15+
fun setContinuousSampleRate(Float): Builder
1516
fun useCustomEndpoint(String): Builder
1617
fun build(): ProfilingConfiguration
1718
companion object

features/dd-sdk-android-profiling/api/dd-sdk-android-profiling.api

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ public final class com/datadog/android/profiling/Profiling {
2323

2424
public final class com/datadog/android/profiling/ProfilingConfiguration {
2525
public static final field Companion Lcom/datadog/android/profiling/ProfilingConfiguration$Companion;
26-
public final fun copy (Ljava/lang/String;F)Lcom/datadog/android/profiling/ProfilingConfiguration;
27-
public static synthetic fun copy$default (Lcom/datadog/android/profiling/ProfilingConfiguration;Ljava/lang/String;FILjava/lang/Object;)Lcom/datadog/android/profiling/ProfilingConfiguration;
26+
public final fun copy (Ljava/lang/String;FF)Lcom/datadog/android/profiling/ProfilingConfiguration;
27+
public static synthetic fun copy$default (Lcom/datadog/android/profiling/ProfilingConfiguration;Ljava/lang/String;FFILjava/lang/Object;)Lcom/datadog/android/profiling/ProfilingConfiguration;
2828
public fun equals (Ljava/lang/Object;)Z
2929
public fun hashCode ()I
3030
public fun toString ()Ljava/lang/String;
@@ -34,6 +34,7 @@ public final class com/datadog/android/profiling/ProfilingConfiguration$Builder
3434
public fun <init> ()V
3535
public final fun build ()Lcom/datadog/android/profiling/ProfilingConfiguration;
3636
public final fun setApplicationLaunchSampleRate (F)Lcom/datadog/android/profiling/ProfilingConfiguration$Builder;
37+
public final fun setContinuousSampleRate (F)Lcom/datadog/android/profiling/ProfilingConfiguration$Builder;
3738
public final fun useCustomEndpoint (Ljava/lang/String;)Lcom/datadog/android/profiling/ProfilingConfiguration$Builder;
3839
}
3940

features/dd-sdk-android-profiling/src/main/java/com/datadog/android/profiling/ProfilingConfiguration.kt

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ import androidx.annotation.FloatRange
1414
@ExperimentalProfilingApi
1515
data class ProfilingConfiguration internal constructor(
1616
internal val customEndpointUrl: String?,
17-
internal val sampleRate: Float
17+
internal val applicationLaunchSampleRate: Float,
18+
internal val continuousSampleRate: Float
1819
) {
1920

2021
/**
@@ -24,6 +25,7 @@ data class ProfilingConfiguration internal constructor(
2425

2526
private var customEndpointUrl: String? = null
2627
private var applicationLaunchSampleRate: Float = DEFAULT_APPLICATION_LAUNCH_SAMPLE_RATE
28+
private var continuousSampleRate: Float = DEFAULT_CONTINUOUS_SAMPLE_RATE
2729

2830
/**
2931
* Sets the sampling rate for Application Launch profiling. It will be applied on the next application launch.
@@ -39,6 +41,21 @@ data class ProfilingConfiguration internal constructor(
3941
return this
4042
}
4143

44+
/**
45+
* Sets the sampling rate for Continuous Profiling.
46+
*
47+
* @param sampleRate The sample rate, expressed as a percentage between 0 and 100 (inclusive).
48+
* A value of 0 disables Continuous Profiling entirely. A value of 100 enables
49+
* Continuous Profiling for all eligible RUM sessions, subject to rate limiting enforced by
50+
* [android.os.ProfilingManager].
51+
*/
52+
fun setContinuousSampleRate(
53+
@FloatRange(from = 0.0, to = 100.0) sampleRate: Float
54+
): Builder {
55+
this.continuousSampleRate = sampleRate
56+
return this
57+
}
58+
4259
/**
4360
* Let the Profiling feature target a custom server.
4461
* The provided url should be the full endpoint url.
@@ -54,7 +71,8 @@ data class ProfilingConfiguration internal constructor(
5471
fun build(): ProfilingConfiguration {
5572
return ProfilingConfiguration(
5673
customEndpointUrl = customEndpointUrl,
57-
sampleRate = applicationLaunchSampleRate
74+
applicationLaunchSampleRate = applicationLaunchSampleRate,
75+
continuousSampleRate = continuousSampleRate
5876
)
5977
}
6078
}
@@ -63,6 +81,11 @@ data class ProfilingConfiguration internal constructor(
6381

6482
private const val DEFAULT_APPLICATION_LAUNCH_SAMPLE_RATE = 15f
6583

84+
/**
85+
* Default sampling rate for Continuous Profiling.
86+
*/
87+
internal const val DEFAULT_CONTINUOUS_SAMPLE_RATE: Float = 15f
88+
6689
/**
6790
* A default configuration for the Profiling feature.
6891
*/

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ internal class ProfilingFeature(
6868
}
6969
}
7070
}
71-
setMinimumSampleRate(appContext, configuration.sampleRate)
71+
setMinimumSampleRate(appContext, configuration.applicationLaunchSampleRate)
7272
// Set the profiling flag in SharedPreferences to profile for the next app launch
7373
ProfilingStorage.addProfilingFlag(appContext, sdkCore.name)
7474
sdkCore.setEventReceiver(name, this)
@@ -114,7 +114,7 @@ internal class ProfilingFeature(
114114
// if old value doesn't exist (we use negative default value in case of absence) or
115115
// the value is bigger than the sample rate, we update the sample rate.
116116
if (oldValue !in 0f..sampleRate) {
117-
ProfilingStorage.setSampleRate(appContext, configuration.sampleRate)
117+
ProfilingStorage.setSampleRate(appContext, configuration.applicationLaunchSampleRate)
118118
}
119119
}
120120

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ class ProfilingFeatureTest {
140140
// Then
141141
verify(mockSharedPreferencesStorage).putFloat(
142142
"dd_profiling_sample_rate",
143-
fakeConfiguration.sampleRate
143+
fakeConfiguration.applicationLaunchSampleRate
144144
)
145145
}
146146

@@ -150,23 +150,23 @@ class ProfilingFeatureTest {
150150
whenever(
151151
mockSharedPreferencesStorage
152152
.getFloat("dd_profiling_sample_rate", -1f)
153-
) doReturn fakeConfiguration.sampleRate - 1f
153+
) doReturn fakeConfiguration.applicationLaunchSampleRate - 1f
154154

155155
// When
156156
testedFeature.onInitialize(mockContext)
157157

158158
// Then
159159
verify(mockSharedPreferencesStorage, never()).putFloat(
160160
"dd_profiling_sample_rate",
161-
fakeConfiguration.sampleRate
161+
fakeConfiguration.applicationLaunchSampleRate
162162
)
163163
}
164164

165165
@Test
166166
fun `M set Profiling sample rate W initialize() {bigger sample rate exists}`() {
167167
whenever(
168168
mockSharedPreferencesStorage.getFloat("dd_profiling_sample_rate", -1f)
169-
) doReturn fakeConfiguration.sampleRate + 1f
169+
) doReturn fakeConfiguration.applicationLaunchSampleRate + 1f
170170

171171
// When
172172
testedFeature.onInitialize(mockContext)
@@ -175,7 +175,7 @@ class ProfilingFeatureTest {
175175
// Since the existing value was higher, it should be updated to the configuration value
176176
verify(mockSharedPreferencesStorage).putFloat(
177177
"dd_profiling_sample_rate",
178-
fakeConfiguration.sampleRate
178+
fakeConfiguration.applicationLaunchSampleRate
179179
)
180180
}
181181

features/dd-sdk-android-profiling/src/test/kotlin/com/datadog/android/profiling/forge/ProfilingConfigurationForgeryFactory.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ class ProfilingConfigurationForgeryFactory :
1616
ForgeryFactory<ProfilingConfiguration> {
1717
override fun getForgery(forge: Forge): ProfilingConfiguration {
1818
return ProfilingConfiguration(
19-
sampleRate = forge.aFloat(min = 0f, max = 100f),
19+
applicationLaunchSampleRate = forge.aFloat(min = 0f, max = 100f),
20+
continuousSampleRate = forge.aFloat(min = 0f, max = 100f),
2021
customEndpointUrl = forge.aNullable {
2122
aStringMatching("http(s?)://[a-z]+\\.com/\\w+")
2223
}

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

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

99
import com.datadog.android.profiling.ExperimentalProfilingApi
1010
import com.datadog.android.profiling.ProfilingConfiguration
11+
import com.datadog.android.profiling.ProfilingConfiguration.Companion.DEFAULT_CONTINUOUS_SAMPLE_RATE
12+
import fr.xgouchet.elmyr.annotation.FloatForgery
1113
import fr.xgouchet.elmyr.annotation.StringForgery
1214
import fr.xgouchet.elmyr.junit5.ForgeExtension
1315
import org.assertj.core.api.Assertions.assertThat
@@ -41,6 +43,20 @@ internal class ProfilingConfigurationBuilderTest {
4143

4244
// Then
4345
assertThat(configuration.customEndpointUrl).isNull()
46+
assertThat(configuration.continuousSampleRate).isEqualTo(DEFAULT_CONTINUOUS_SAMPLE_RATE)
47+
}
48+
49+
@Test
50+
fun `M build config with continuous sample rate W setContinuousSampleRate() and build()`(
51+
@FloatForgery(min = 0f, max = 100f) sampleRate: Float
52+
) {
53+
// When
54+
val configuration = testedBuilder
55+
.setContinuousSampleRate(sampleRate)
56+
.build()
57+
58+
// Then
59+
assertThat(configuration.continuousSampleRate).isEqualTo(sampleRate)
4460
}
4561

4662
@Test

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ internal class ProfilingConfigurationTest {
2929

3030
// Then
3131
assertThat(config.customEndpointUrl).isNull()
32-
assertThat(config.sampleRate).isEqualTo(15f)
32+
assertThat(config.applicationLaunchSampleRate).isEqualTo(15f)
3333
}
3434

3535
@Test
@@ -55,7 +55,7 @@ internal class ProfilingConfigurationTest {
5555
.build()
5656

5757
// Then
58-
assertThat(config.sampleRate).isEqualTo(sampleRate)
58+
assertThat(config.applicationLaunchSampleRate).isEqualTo(sampleRate)
5959
}
6060

6161
@Test
@@ -69,13 +69,13 @@ internal class ProfilingConfigurationTest {
6969
// When
7070
val modified = original.copy(
7171
customEndpointUrl = endpoint,
72-
sampleRate = sampleRate
72+
applicationLaunchSampleRate = sampleRate
7373
)
7474

7575
// Then
7676
assertThat(original.customEndpointUrl).isNull()
77-
assertThat(original.sampleRate).isEqualTo(15f)
77+
assertThat(original.applicationLaunchSampleRate).isEqualTo(15f)
7878
assertThat(modified.customEndpointUrl).isEqualTo(endpoint)
79-
assertThat(modified.sampleRate).isEqualTo(sampleRate)
79+
assertThat(modified.applicationLaunchSampleRate).isEqualTo(sampleRate)
8080
}
8181
}

0 commit comments

Comments
 (0)