Skip to content

Commit e68845f

Browse files
authored
Support for uploading over the browser-intake endpoint (#208)
1 parent 852e6c9 commit e68845f

File tree

5 files changed

+85
-37
lines changed

5 files changed

+85
-37
lines changed

datadog-ktor/api/datadog-ktor.api

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,43 @@
11
public final class com/juul/datadog/ktor/Configuration {
2-
public fun <init> (Lcom/juul/datadog/ktor/Configuration$Rest;Lcom/juul/datadog/ktor/Configuration$Log;)V
3-
public synthetic fun <init> (Lcom/juul/datadog/ktor/Configuration$Rest;Lcom/juul/datadog/ktor/Configuration$Log;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
4-
public final fun component1 ()Lcom/juul/datadog/ktor/Configuration$Rest;
2+
public fun <init> (Lcom/juul/datadog/ktor/Configuration$Endpoint;Lcom/juul/datadog/ktor/Configuration$Log;)V
3+
public synthetic fun <init> (Lcom/juul/datadog/ktor/Configuration$Endpoint;Lcom/juul/datadog/ktor/Configuration$Log;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
4+
public final fun component1 ()Lcom/juul/datadog/ktor/Configuration$Endpoint;
55
public final fun component2 ()Lcom/juul/datadog/ktor/Configuration$Log;
6-
public final fun copy (Lcom/juul/datadog/ktor/Configuration$Rest;Lcom/juul/datadog/ktor/Configuration$Log;)Lcom/juul/datadog/ktor/Configuration;
7-
public static synthetic fun copy$default (Lcom/juul/datadog/ktor/Configuration;Lcom/juul/datadog/ktor/Configuration$Rest;Lcom/juul/datadog/ktor/Configuration$Log;ILjava/lang/Object;)Lcom/juul/datadog/ktor/Configuration;
6+
public final fun copy (Lcom/juul/datadog/ktor/Configuration$Endpoint;Lcom/juul/datadog/ktor/Configuration$Log;)Lcom/juul/datadog/ktor/Configuration;
7+
public static synthetic fun copy$default (Lcom/juul/datadog/ktor/Configuration;Lcom/juul/datadog/ktor/Configuration$Endpoint;Lcom/juul/datadog/ktor/Configuration$Log;ILjava/lang/Object;)Lcom/juul/datadog/ktor/Configuration;
88
public fun equals (Ljava/lang/Object;)Z
9+
public final fun getEndpoint ()Lcom/juul/datadog/ktor/Configuration$Endpoint;
910
public final fun getLog ()Lcom/juul/datadog/ktor/Configuration$Log;
10-
public final fun getRest ()Lcom/juul/datadog/ktor/Configuration$Rest;
11+
public fun hashCode ()I
12+
public fun toString ()Ljava/lang/String;
13+
}
14+
15+
public abstract interface class com/juul/datadog/ktor/Configuration$Endpoint {
16+
public abstract fun getSite ()Lcom/juul/datadog/Site;
17+
}
18+
19+
public final class com/juul/datadog/ktor/Configuration$Endpoint$BrowserIntake : com/juul/datadog/ktor/Configuration$Endpoint {
20+
public fun <init> (Lcom/juul/datadog/Site;Ljava/lang/String;)V
21+
public final fun component1 ()Lcom/juul/datadog/Site;
22+
public final fun component2 ()Ljava/lang/String;
23+
public final fun copy (Lcom/juul/datadog/Site;Ljava/lang/String;)Lcom/juul/datadog/ktor/Configuration$Endpoint$BrowserIntake;
24+
public static synthetic fun copy$default (Lcom/juul/datadog/ktor/Configuration$Endpoint$BrowserIntake;Lcom/juul/datadog/Site;Ljava/lang/String;ILjava/lang/Object;)Lcom/juul/datadog/ktor/Configuration$Endpoint$BrowserIntake;
25+
public fun equals (Ljava/lang/Object;)Z
26+
public final fun getClientToken ()Ljava/lang/String;
27+
public fun getSite ()Lcom/juul/datadog/Site;
28+
public fun hashCode ()I
29+
public fun toString ()Ljava/lang/String;
30+
}
31+
32+
public final class com/juul/datadog/ktor/Configuration$Endpoint$Rest : com/juul/datadog/ktor/Configuration$Endpoint {
33+
public fun <init> (Lcom/juul/datadog/Site;Ljava/lang/String;)V
34+
public final fun component1 ()Lcom/juul/datadog/Site;
35+
public final fun component2 ()Ljava/lang/String;
36+
public final fun copy (Lcom/juul/datadog/Site;Ljava/lang/String;)Lcom/juul/datadog/ktor/Configuration$Endpoint$Rest;
37+
public static synthetic fun copy$default (Lcom/juul/datadog/ktor/Configuration$Endpoint$Rest;Lcom/juul/datadog/Site;Ljava/lang/String;ILjava/lang/Object;)Lcom/juul/datadog/ktor/Configuration$Endpoint$Rest;
38+
public fun equals (Ljava/lang/Object;)Z
39+
public final fun getApiKey ()Ljava/lang/String;
40+
public fun getSite ()Lcom/juul/datadog/Site;
1141
public fun hashCode ()I
1242
public fun toString ()Ljava/lang/String;
1343
}
@@ -29,19 +59,6 @@ public final class com/juul/datadog/ktor/Configuration$Log {
2959
public fun toString ()Ljava/lang/String;
3060
}
3161

32-
public final class com/juul/datadog/ktor/Configuration$Rest {
33-
public fun <init> (Ljava/lang/String;Lcom/juul/datadog/Site;)V
34-
public final fun component1 ()Ljava/lang/String;
35-
public final fun component2 ()Lcom/juul/datadog/Site;
36-
public final fun copy (Ljava/lang/String;Lcom/juul/datadog/Site;)Lcom/juul/datadog/ktor/Configuration$Rest;
37-
public static synthetic fun copy$default (Lcom/juul/datadog/ktor/Configuration$Rest;Ljava/lang/String;Lcom/juul/datadog/Site;ILjava/lang/Object;)Lcom/juul/datadog/ktor/Configuration$Rest;
38-
public fun equals (Ljava/lang/Object;)Z
39-
public final fun getApiKey ()Ljava/lang/String;
40-
public final fun getSite ()Lcom/juul/datadog/Site;
41-
public fun hashCode ()I
42-
public fun toString ()Ljava/lang/String;
43-
}
44-
4562
public final class com/juul/datadog/ktor/RawBatchUploader {
4663
public synthetic fun <init> (Lcom/juul/datadog/RawSource;Lcom/juul/datadog/ktor/RawUploader;JIILkotlin/jvm/internal/DefaultConstructorMarker;)V
4764
public synthetic fun <init> (Lcom/juul/datadog/RawSource;Lcom/juul/datadog/ktor/RawUploader;JILkotlin/jvm/internal/DefaultConstructorMarker;)V
@@ -72,10 +89,10 @@ public final class com/juul/datadog/ktor/RawUploader {
7289
}
7390

7491
public final class com/juul/datadog/ktor/RawUploaderKt {
75-
public static final fun RawUploader (Lcom/juul/datadog/ktor/Configuration$Rest;Lio/ktor/client/engine/HttpClientEngineFactory;Lkotlin/jvm/functions/Function1;)Lcom/juul/datadog/ktor/RawUploader;
76-
public static final fun RawUploader (Lcom/juul/datadog/ktor/Configuration$Rest;Lkotlin/jvm/functions/Function1;)Lcom/juul/datadog/ktor/RawUploader;
77-
public static synthetic fun RawUploader$default (Lcom/juul/datadog/ktor/Configuration$Rest;Lio/ktor/client/engine/HttpClientEngineFactory;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/juul/datadog/ktor/RawUploader;
78-
public static synthetic fun RawUploader$default (Lcom/juul/datadog/ktor/Configuration$Rest;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/juul/datadog/ktor/RawUploader;
92+
public static final fun RawUploader (Lcom/juul/datadog/ktor/Configuration$Endpoint;Lio/ktor/client/engine/HttpClientEngineFactory;Lkotlin/jvm/functions/Function1;)Lcom/juul/datadog/ktor/RawUploader;
93+
public static final fun RawUploader (Lcom/juul/datadog/ktor/Configuration$Endpoint;Lkotlin/jvm/functions/Function1;)Lcom/juul/datadog/ktor/RawUploader;
94+
public static synthetic fun RawUploader$default (Lcom/juul/datadog/ktor/Configuration$Endpoint;Lio/ktor/client/engine/HttpClientEngineFactory;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/juul/datadog/ktor/RawUploader;
95+
public static synthetic fun RawUploader$default (Lcom/juul/datadog/ktor/Configuration$Endpoint;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/juul/datadog/ktor/RawUploader;
7996
}
8097

8198
public abstract interface class com/juul/datadog/ktor/RestLogger : com/juul/datadog/Logger, com/juul/datadog/TagHandler {

datadog-ktor/src/commonMain/kotlin/Configuration.kt

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,28 @@ package com.juul.datadog.ktor
33
import com.juul.datadog.Site
44

55
public data class Configuration(
6-
public val rest: Rest,
6+
public val endpoint: Endpoint,
77
public val log: Log = Log(),
88
) {
9-
public data class Rest(
10-
public val apiKey: String,
11-
public val site: Site,
12-
)
9+
10+
/**
11+
* Configures the URL and authentication scheme to use. Generally, [Rest] should by used by backends
12+
* (as it uses a fully-fledged API token, which is not considered safe to expose to clients). Use
13+
* [BrowserIntake] for web clients, which uses a "client token" much like the bundled libraries.
14+
*/
15+
public sealed interface Endpoint {
16+
public val site: Site
17+
18+
public data class Rest(
19+
public override val site: Site,
20+
public val apiKey: String,
21+
) : Endpoint
22+
23+
public data class BrowserIntake(
24+
public override val site: Site,
25+
public val clientToken: String,
26+
) : Endpoint
27+
}
1328

1429
public data class Log(
1530
public val source: String? = null,

datadog-ktor/src/commonMain/kotlin/RawUploader.kt

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.juul.datadog.ktor
22

33
import com.github.michaelbull.result.Result
44
import com.github.michaelbull.result.map
5-
import com.juul.datadog.Site
65
import io.ktor.client.HttpClient
76
import io.ktor.client.HttpClientConfig
87
import io.ktor.client.call.body
@@ -24,18 +23,18 @@ import kotlinx.serialization.json.JsonObject
2423
private const val LOGS_URI = "api/v2/logs"
2524

2625
public fun <T : HttpClientEngineConfig> RawUploader(
27-
uploaderConfig: Configuration.Rest,
26+
endpointConfig: Configuration.Endpoint,
2827
engine: HttpClientEngineFactory<T>,
2928
httpConfig: HttpClientConfig<T>.() -> Unit = {},
3029
): RawUploader = RawUploader(
31-
HttpClient(engine) { configure(uploaderConfig.site, uploaderConfig.apiKey, httpConfig) },
30+
HttpClient(engine) { configure(endpointConfig, httpConfig) },
3231
)
3332

3433
public fun RawUploader(
35-
uploaderConfig: Configuration.Rest,
34+
endpointConfig: Configuration.Endpoint,
3635
httpConfig: HttpClientConfig<*>.() -> Unit = {},
3736
): RawUploader = RawUploader(
38-
HttpClient { configure(uploaderConfig.site, uploaderConfig.apiKey, httpConfig) },
37+
HttpClient { configure(endpointConfig, httpConfig) },
3938
)
4039

4140
public class RawUploader internal constructor(
@@ -55,8 +54,7 @@ private suspend inline fun <reified T> Result<HttpResponse, Throwable>.body(): R
5554
map { it.body() }
5655

5756
private fun <T : HttpClientEngineConfig> HttpClientConfig<T>.configure(
58-
site: Site,
59-
apiKey: String,
57+
endpointConfig: Configuration.Endpoint,
6058
config: HttpClientConfig<T>.() -> Unit,
6159
) {
6260
apply(config)
@@ -66,8 +64,18 @@ private fun <T : HttpClientEngineConfig> HttpClientConfig<T>.configure(
6664
}
6765

6866
defaultRequest {
69-
host = site.logHost
70-
header("DD-API-KEY", apiKey)
67+
host = when (endpointConfig) {
68+
is Configuration.Endpoint.Rest -> endpointConfig.site.logHost
69+
is Configuration.Endpoint.BrowserIntake -> endpointConfig.site.browserIntakeHost
70+
}
71+
72+
if (endpointConfig is Configuration.Endpoint.Rest) {
73+
header("DD-API-KEY", endpointConfig.apiKey)
74+
} else if (endpointConfig is Configuration.Endpoint.BrowserIntake) {
75+
this.url {
76+
this.parameters.append("dd-api-key", endpointConfig.clientToken)
77+
}
78+
}
7179
contentType(ContentType.Application.Json)
7280
this.url { protocol = URLProtocol.HTTPS }
7381
}

datadog/api/datadog.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ public final class com/juul/datadog/Site : java/lang/Enum {
166166
public static final field US3 Lcom/juul/datadog/Site;
167167
public static final field US5 Lcom/juul/datadog/Site;
168168
public final fun getApiHost ()Ljava/lang/String;
169+
public final fun getBrowserIntakeHost ()Ljava/lang/String;
169170
public static fun getEntries ()Lkotlin/enums/EnumEntries;
170171
public final fun getLogHost ()Ljava/lang/String;
171172
public static fun valueOf (Ljava/lang/String;)Lcom/juul/datadog/Site;

datadog/src/commonMain/kotlin/Site.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,36 @@ package com.juul.datadog
33
public enum class Site(
44
public val apiHost: String,
55
public val logHost: String,
6+
public val browserIntakeHost: String,
67
) {
78
US1(
89
apiHost = "api.datadoghq.com",
910
logHost = "http-intake.logs.datadoghq.com",
11+
browserIntakeHost = "logs.browser-intake-datadoghq.com",
1012
),
1113
US3(
1214
apiHost = "api.us3.datadoghq.com",
1315
logHost = "http-intake.logs.us3.datadoghq.com",
16+
browserIntakeHost = "logs.browser-intake-us3-datadoghq.com",
1417
),
1518
US5(
1619
apiHost = "api.us5.datadoghq.com",
1720
logHost = "http-intake.logs.us5.datadoghq.com",
21+
browserIntakeHost = "logs.browser-intake-us5-datadoghq.com",
1822
),
1923
EU(
2024
apiHost = "api.datadoghq.eu",
2125
logHost = "http-intake.logs.eu.datadoghq.com",
26+
browserIntakeHost = "mobile-http-intake.logs.datadoghq.eu",
2227
),
2328
AP1(
2429
apiHost = "api.ap1.datadoghq.com",
2530
logHost = "http-intake.logs.ap1.datadoghq.com",
31+
browserIntakeHost = "logs.browser-intake-ap1-datadoghq.com",
2632
),
2733
US1_FED(
2834
apiHost = "api.ddog-gov.com",
2935
logHost = "http-intake.logs.ddog-gov.com",
36+
browserIntakeHost = "logs.browser-intake-ddog-gov.com",
3037
),
3138
}

0 commit comments

Comments
 (0)