Skip to content

Commit d3a3f83

Browse files
authored
Merge pull request #1653 from DataDog/nogorodnikov/rum-1236/use-enum-for-http-method-arg-in-rummonitor-startresource-api
RUM-1236: Use enum for HTTP method parameter of `RumMonitor#startResource API`
2 parents 100edc9 + 5bcb223 commit d3a3f83

File tree

32 files changed

+500
-140
lines changed

32 files changed

+500
-140
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ interface com.datadog.android.rum.RumMonitor
9393
fun addAction(RumActionType, String, Map<String, Any?>)
9494
fun startAction(RumActionType, String, Map<String, Any?>)
9595
fun stopAction(RumActionType, String, Map<String, Any?> = emptyMap())
96-
fun startResource(String, String, String, Map<String, Any?> = emptyMap())
96+
DEPRECATED fun startResource(String, String, String, Map<String, Any?> = emptyMap())
97+
fun startResource(String, RumResourceMethod, String, Map<String, Any?> = emptyMap())
9798
fun stopResource(String, Int?, Long?, RumResourceKind, Map<String, Any?>)
9899
fun stopResourceWithError(String, Int?, String, RumErrorSource, Throwable, Map<String, Any?> = emptyMap())
99100
fun stopResourceWithError(String, Int?, String, RumErrorSource, String, String?, Map<String, Any?> = emptyMap())
@@ -130,6 +131,13 @@ enum com.datadog.android.rum.RumResourceKind
130131
- OTHER
131132
companion object
132133
fun fromMimeType(String): RumResourceKind
134+
enum com.datadog.android.rum.RumResourceMethod
135+
- POST
136+
- GET
137+
- HEAD
138+
- PUT
139+
- DELETE
140+
- PATCH
133141
interface com.datadog.android.rum.RumSessionListener
134142
fun onSessionStarted(String, Boolean)
135143
class com.datadog.android.rum._RumInternalProxy

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ public abstract interface class com/datadog/android/rum/RumMonitor {
144144
public abstract fun removeAttribute (Ljava/lang/String;)V
145145
public abstract fun setDebug (Z)V
146146
public abstract fun startAction (Lcom/datadog/android/rum/RumActionType;Ljava/lang/String;Ljava/util/Map;)V
147+
public abstract fun startResource (Ljava/lang/String;Lcom/datadog/android/rum/RumResourceMethod;Ljava/lang/String;Ljava/util/Map;)V
147148
public abstract fun startResource (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V
148149
public abstract fun startView (Ljava/lang/Object;Ljava/lang/String;Ljava/util/Map;)V
149150
public abstract fun stopAction (Lcom/datadog/android/rum/RumActionType;Ljava/lang/String;Ljava/util/Map;)V
@@ -155,6 +156,7 @@ public abstract interface class com/datadog/android/rum/RumMonitor {
155156
}
156157

157158
public final class com/datadog/android/rum/RumMonitor$DefaultImpls {
159+
public static synthetic fun startResource$default (Lcom/datadog/android/rum/RumMonitor;Ljava/lang/String;Lcom/datadog/android/rum/RumResourceMethod;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)V
158160
public static synthetic fun startResource$default (Lcom/datadog/android/rum/RumMonitor;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)V
159161
public static synthetic fun startView$default (Lcom/datadog/android/rum/RumMonitor;Ljava/lang/Object;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)V
160162
public static synthetic fun stopAction$default (Lcom/datadog/android/rum/RumMonitor;Lcom/datadog/android/rum/RumActionType;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)V
@@ -197,6 +199,17 @@ public final class com/datadog/android/rum/RumResourceKind$Companion {
197199
public final fun fromMimeType (Ljava/lang/String;)Lcom/datadog/android/rum/RumResourceKind;
198200
}
199201

202+
public final class com/datadog/android/rum/RumResourceMethod : java/lang/Enum {
203+
public static final field DELETE Lcom/datadog/android/rum/RumResourceMethod;
204+
public static final field GET Lcom/datadog/android/rum/RumResourceMethod;
205+
public static final field HEAD Lcom/datadog/android/rum/RumResourceMethod;
206+
public static final field PATCH Lcom/datadog/android/rum/RumResourceMethod;
207+
public static final field POST Lcom/datadog/android/rum/RumResourceMethod;
208+
public static final field PUT Lcom/datadog/android/rum/RumResourceMethod;
209+
public static fun valueOf (Ljava/lang/String;)Lcom/datadog/android/rum/RumResourceMethod;
210+
public static fun values ()[Lcom/datadog/android/rum/RumResourceMethod;
211+
}
212+
200213
public abstract interface class com/datadog/android/rum/RumSessionListener {
201214
public abstract fun onSessionStarted (Ljava/lang/String;Z)V
202215
}

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/RumMonitor.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,35 @@ interface RumMonitor {
111111
* @see [stopResource]
112112
* @see [stopResourceWithError]
113113
*/
114+
@Deprecated(
115+
"This method is deprecated and will be removed in the future versions." +
116+
" Use `startResource` method which takes `RumHttpMethod` as `method` parameter instead."
117+
)
114118
fun startResource(
115119
key: String,
116120
method: String,
117121
url: String,
118122
attributes: Map<String, Any?> = emptyMap()
119123
)
120124

125+
/**
126+
* Notify that a new Resource is being loaded, linked with the [key] instance.
127+
* @param key the instance that represents the resource being loaded (usually your
128+
* request or network call instance).
129+
* @param method the method used to load the resource (E.g., for network: "GET" or "POST")
130+
* @param url the url or local path of the resource being loaded
131+
* @param attributes additional custom attributes to attach to the resource. Attributes can be
132+
* nested up to 9 levels deep. Keys using more than 9 levels will be sanitized by SDK.
133+
* @see [stopResource]
134+
* @see [stopResourceWithError]
135+
*/
136+
fun startResource(
137+
key: String,
138+
method: RumResourceMethod,
139+
url: String,
140+
attributes: Map<String, Any?> = emptyMap()
141+
)
142+
121143
/**
122144
* Stops a previously started Resource, linked with the [key] instance.
123145
* @param key the instance that represents the active view (usually your
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
3+
* This product includes software developed at Datadog (https://www.datadoghq.com/).
4+
* Copyright 2016-Present Datadog, Inc.
5+
*/
6+
7+
package com.datadog.android.rum
8+
9+
/**
10+
* Describes the type of a method associated with resource call.
11+
* @see [RumMonitor]
12+
*/
13+
enum class RumResourceMethod {
14+
/**
15+
* POST Method.
16+
*/
17+
POST,
18+
19+
/**
20+
* GET Method.
21+
*/
22+
GET,
23+
24+
/**
25+
* HEAD Method.
26+
*/
27+
HEAD,
28+
29+
/**
30+
* PUT Method.
31+
*/
32+
PUT,
33+
34+
/**
35+
* DELETE Method.
36+
*/
37+
DELETE,
38+
39+
/**
40+
* PATCH Method.
41+
*/
42+
PATCH
43+
}

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/scope/RumEventExt.kt

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.datadog.android.api.context.NetworkInfo
1313
import com.datadog.android.rum.RumActionType
1414
import com.datadog.android.rum.RumErrorSource
1515
import com.datadog.android.rum.RumResourceKind
16+
import com.datadog.android.rum.RumResourceMethod
1617
import com.datadog.android.rum.internal.RumErrorSourceType
1718
import com.datadog.android.rum.internal.domain.event.ResourceTiming
1819
import com.datadog.android.rum.model.ActionEvent
@@ -22,31 +23,25 @@ import com.datadog.android.rum.model.ResourceEvent
2223
import com.datadog.android.rum.model.ViewEvent
2324
import java.util.Locale
2425

25-
internal fun String.toMethod(internalLogger: InternalLogger): ResourceEvent.Method {
26-
return try {
27-
ResourceEvent.Method.valueOf(this.uppercase(Locale.US))
28-
} catch (e: IllegalArgumentException) {
29-
internalLogger.log(
30-
InternalLogger.Level.ERROR,
31-
listOf(InternalLogger.Target.MAINTAINER, InternalLogger.Target.TELEMETRY),
32-
{ "Unable to convert [$this] to a valid http method" },
33-
e
34-
)
35-
ResourceEvent.Method.GET
26+
internal fun RumResourceMethod.toResourceMethod(): ResourceEvent.Method {
27+
return when (this) {
28+
RumResourceMethod.GET -> ResourceEvent.Method.GET
29+
RumResourceMethod.POST -> ResourceEvent.Method.POST
30+
RumResourceMethod.HEAD -> ResourceEvent.Method.HEAD
31+
RumResourceMethod.PUT -> ResourceEvent.Method.PUT
32+
RumResourceMethod.DELETE -> ResourceEvent.Method.DELETE
33+
RumResourceMethod.PATCH -> ResourceEvent.Method.PATCH
3634
}
3735
}
3836

39-
internal fun String.toErrorMethod(internalLogger: InternalLogger): ErrorEvent.Method {
40-
return try {
41-
ErrorEvent.Method.valueOf(this.uppercase(Locale.US))
42-
} catch (e: IllegalArgumentException) {
43-
internalLogger.log(
44-
InternalLogger.Level.ERROR,
45-
listOf(InternalLogger.Target.MAINTAINER, InternalLogger.Target.TELEMETRY),
46-
{ "Unable to convert [$this] to a valid http method" },
47-
e
48-
)
49-
ErrorEvent.Method.GET
37+
internal fun RumResourceMethod.toErrorMethod(): ErrorEvent.Method {
38+
return when (this) {
39+
RumResourceMethod.GET -> ErrorEvent.Method.GET
40+
RumResourceMethod.POST -> ErrorEvent.Method.POST
41+
RumResourceMethod.HEAD -> ErrorEvent.Method.HEAD
42+
RumResourceMethod.PUT -> ErrorEvent.Method.PUT
43+
RumResourceMethod.DELETE -> ErrorEvent.Method.DELETE
44+
RumResourceMethod.PATCH -> ErrorEvent.Method.PATCH
5045
}
5146
}
5247

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/scope/RumRawEvent.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.datadog.android.rum.RumActionType
1010
import com.datadog.android.rum.RumErrorSource
1111
import com.datadog.android.rum.RumPerformanceMetric
1212
import com.datadog.android.rum.RumResourceKind
13+
import com.datadog.android.rum.RumResourceMethod
1314
import com.datadog.android.rum.internal.RumErrorSourceType
1415
import com.datadog.android.rum.internal.domain.Time
1516
import com.datadog.android.rum.internal.domain.event.ResourceTiming
@@ -51,7 +52,7 @@ internal sealed class RumRawEvent {
5152
internal data class StartResource(
5253
val key: String,
5354
val url: String,
54-
val method: String,
55+
val method: RumResourceMethod,
5556
val attributes: Map<String, Any?>,
5657
override val eventTime: Time = Time()
5758
) : RumRawEvent()

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/scope/RumResourceScope.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.datadog.android.rum.GlobalRumMonitor
1717
import com.datadog.android.rum.RumAttributes
1818
import com.datadog.android.rum.RumErrorSource
1919
import com.datadog.android.rum.RumResourceKind
20+
import com.datadog.android.rum.RumResourceMethod
2021
import com.datadog.android.rum.internal.FeaturesContextResolver
2122
import com.datadog.android.rum.internal.domain.RumContext
2223
import com.datadog.android.rum.internal.domain.Time
@@ -34,7 +35,7 @@ internal class RumResourceScope(
3435
internal val parentScope: RumScope,
3536
internal val sdkCore: InternalSdkCore,
3637
internal val url: String,
37-
internal val method: String,
38+
internal val method: RumResourceMethod,
3839
internal val key: String,
3940
eventTime: Time,
4041
initialAttributes: Map<String, Any?>,
@@ -201,7 +202,7 @@ internal class RumResourceScope(
201202
type = kind.toSchemaType(),
202203
url = url,
203204
duration = duration,
204-
method = method.toMethod(sdkCore.internalLogger),
205+
method = method.toResourceMethod(),
205206
statusCode = statusCode,
206207
size = size,
207208
dns = finalTiming?.dns(),
@@ -323,7 +324,7 @@ internal class RumResourceScope(
323324
isCrash = false,
324325
resource = ErrorEvent.Resource(
325326
url = url,
326-
method = method.toErrorMethod(sdkCore.internalLogger),
327+
method = method.toErrorMethod(),
327328
statusCode = statusCode ?: 0,
328329
provider = resolveErrorProvider()
329330
),

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/monitor/DatadogRumMonitor.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import com.datadog.android.rum.RumErrorSource
2020
import com.datadog.android.rum.RumMonitor
2121
import com.datadog.android.rum.RumPerformanceMetric
2222
import com.datadog.android.rum.RumResourceKind
23+
import com.datadog.android.rum.RumResourceMethod
2324
import com.datadog.android.rum.RumSessionListener
2425
import com.datadog.android.rum._RumInternalProxy
2526
import com.datadog.android.rum.internal.CombinedRumSessionListener
@@ -161,11 +162,46 @@ internal class DatadogRumMonitor(
161162
)
162163
}
163164

165+
@Deprecated(
166+
"This method is deprecated and will be removed in the future versions." +
167+
" Use `startResource` method which takes `RumHttpMethod` as `method` parameter instead."
168+
)
164169
override fun startResource(
165170
key: String,
166171
method: String,
167172
url: String,
168173
attributes: Map<String, Any?>
174+
) {
175+
// enum value names may be changed if obfuscation is aggressive
176+
val rumResourceMethod = when (method.uppercase(Locale.US)) {
177+
"POST" -> RumResourceMethod.POST
178+
"GET" -> RumResourceMethod.GET
179+
"HEAD" -> RumResourceMethod.HEAD
180+
"PUT" -> RumResourceMethod.PUT
181+
"DELETE" -> RumResourceMethod.DELETE
182+
"PATCH" -> RumResourceMethod.PATCH
183+
else -> {
184+
sdkCore.internalLogger.log(
185+
InternalLogger.Level.WARN,
186+
InternalLogger.Target.USER,
187+
{
188+
"Unsupported HTTP method %s reported, using GET instead".format(
189+
Locale.US,
190+
method
191+
)
192+
}
193+
)
194+
RumResourceMethod.GET
195+
}
196+
}
197+
startResource(key, rumResourceMethod, url, attributes)
198+
}
199+
200+
override fun startResource(
201+
key: String,
202+
method: RumResourceMethod,
203+
url: String,
204+
attributes: Map<String, Any?>
169205
) {
170206
val eventTime = getEventTime(attributes)
171207
handleEvent(

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/resource/RumResourceInputStream.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.datadog.android.api.SdkCore
1111
import com.datadog.android.rum.GlobalRumMonitor
1212
import com.datadog.android.rum.RumErrorSource
1313
import com.datadog.android.rum.RumResourceKind
14+
import com.datadog.android.rum.RumResourceMethod
1415
import com.datadog.android.rum.internal.domain.event.ResourceTiming
1516
import com.datadog.android.rum.internal.monitor.AdvancedRumMonitor
1617
import java.io.InputStream
@@ -176,7 +177,7 @@ class RumResourceInputStream @JvmOverloads constructor(
176177
// endregion
177178

178179
internal companion object {
179-
internal const val METHOD: String = "GET"
180+
internal val METHOD: RumResourceMethod = RumResourceMethod.GET
180181

181182
internal const val ERROR_CLOSE = "Error closing input stream"
182183
internal const val ERROR_MARK = "Error marking input stream"

features/dd-sdk-android-rum/src/test/kotlin/com/datadog/android/rum/assertj/ErrorEventAssert.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ package com.datadog.android.rum.assertj
99
import com.datadog.android.api.context.NetworkInfo
1010
import com.datadog.android.api.context.UserInfo
1111
import com.datadog.android.rum.RumErrorSource
12+
import com.datadog.android.rum.RumResourceMethod
1213
import com.datadog.android.rum.internal.domain.RumContext
1314
import com.datadog.android.rum.internal.domain.scope.isConnected
15+
import com.datadog.android.rum.internal.domain.scope.toErrorMethod
1416
import com.datadog.android.rum.internal.domain.scope.toSchemaSource
1517
import com.datadog.android.rum.model.ErrorEvent
1618
import org.assertj.core.api.AbstractObjectAssert
@@ -76,7 +78,7 @@ internal class ErrorEventAssert(actual: ErrorEvent) :
7678

7779
fun hasResource(
7880
expectedUrl: String,
79-
expectedMethod: String,
81+
expectedMethod: RumResourceMethod,
8082
expectedStatusCode: Long
8183
): ErrorEventAssert {
8284
assertThat(actual.error.resource?.url)
@@ -90,7 +92,7 @@ internal class ErrorEventAssert(actual: ErrorEvent) :
9092
"Expected event data to have error.resource.method $expectedMethod " +
9193
"but was ${actual.error.resource?.method}"
9294
)
93-
.isEqualTo(ErrorEvent.Method.valueOf(expectedMethod))
95+
.isEqualTo(expectedMethod.toErrorMethod())
9496
assertThat(actual.error.resource?.statusCode)
9597
.overridingErrorMessage(
9698
"Expected event data to have error.resource.statusCode $expectedStatusCode " +

features/dd-sdk-android-rum/src/test/kotlin/com/datadog/android/rum/assertj/ResourceEventAssert.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@ package com.datadog.android.rum.assertj
99
import com.datadog.android.api.context.NetworkInfo
1010
import com.datadog.android.api.context.UserInfo
1111
import com.datadog.android.rum.RumResourceKind
12+
import com.datadog.android.rum.RumResourceMethod
1213
import com.datadog.android.rum.internal.domain.RumContext
1314
import com.datadog.android.rum.internal.domain.event.ResourceTiming
1415
import com.datadog.android.rum.internal.domain.scope.isConnected
15-
import com.datadog.android.rum.internal.domain.scope.toMethod
16+
import com.datadog.android.rum.internal.domain.scope.toResourceMethod
1617
import com.datadog.android.rum.internal.domain.scope.toSchemaType
1718
import com.datadog.android.rum.model.ResourceEvent
1819
import org.assertj.core.api.AbstractObjectAssert
1920
import org.assertj.core.api.Assertions.assertThat
2021
import org.assertj.core.data.Offset
21-
import org.mockito.kotlin.mock
2222

2323
internal class ResourceEventAssert(actual: ResourceEvent) :
2424
AbstractObjectAssert<ResourceEventAssert, ResourceEvent>(
@@ -68,13 +68,13 @@ internal class ResourceEventAssert(actual: ResourceEvent) :
6868
return this
6969
}
7070

71-
fun hasMethod(expected: String): ResourceEventAssert {
71+
fun hasMethod(expected: RumResourceMethod): ResourceEventAssert {
7272
assertThat(actual.resource.method)
7373
.overridingErrorMessage(
7474
"Expected event data to have resource.method $expected " +
7575
"but was ${actual.resource.method}"
7676
)
77-
.isEqualTo(expected.toMethod(mock()))
77+
.isEqualTo(expected.toResourceMethod())
7878
return this
7979
}
8080

0 commit comments

Comments
 (0)