Skip to content

Commit 4500ff1

Browse files
feat: support fullUrl in EndpointConfiguration to bypass default signal path appending
1 parent a18074b commit 4500ff1

6 files changed

Lines changed: 129 additions & 104 deletions

File tree

android-agent/api/android-agent.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@ public final class io/opentelemetry/android/agent/dsl/DiskBufferingConfiguration
3333

3434
public final class io/opentelemetry/android/agent/dsl/EndpointConfiguration {
3535
public final fun getCompression ()Lio/opentelemetry/android/agent/connectivity/Compression;
36+
public final fun getFullUrl ()Ljava/lang/String;
3637
public final fun getHeaders ()Ljava/util/Map;
3738
public final fun getUrl ()Ljava/lang/String;
3839
public final fun setCompression (Lio/opentelemetry/android/agent/connectivity/Compression;)V
40+
public final fun setFullUrl (Ljava/lang/String;)V
3941
public final fun setHeaders (Ljava/util/Map;)V
4042
public final fun setUrl (Ljava/lang/String;)V
4143
}

android-agent/src/main/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity.kt

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,67 +2,68 @@
22
* Copyright The OpenTelemetry Authors
33
* SPDX-License-Identifier: Apache-2.0
44
*/
5-
65
package io.opentelemetry.android.agent.connectivity
76

87
internal class HttpEndpointConnectivity private constructor(
98
private val url: String,
109
private val headers: Map<String, String>,
1110
private val compression: Compression,
1211
private val sslContext: SSLContextConnectivity?,
13-
private val clientTls: ClientTlsConnectivity? = null
12+
private val clientTls: ClientTlsConnectivity? = null,
1413
) : EndpointConnectivity {
1514
companion object {
1615
fun forTraces(
1716
baseUrl: String,
17+
fullUrl: Boolean = false,
1818
headers: Map<String, String>,
1919
compression: Compression,
2020
sslContext: SSLContextConnectivity?,
21-
clientTls: ClientTlsConnectivity?
22-
): HttpEndpointConnectivity = HttpEndpointConnectivity(
23-
baseUrl.trimEnd('/') + "/v1/traces",
24-
headers,
25-
compression,
26-
sslContext,
27-
clientTls
28-
)
21+
clientTls: ClientTlsConnectivity?,
22+
): HttpEndpointConnectivity =
23+
HttpEndpointConnectivity(
24+
if (fullUrl) baseUrl else baseUrl.trimEnd('/') + "/v1/traces",
25+
headers,
26+
compression,
27+
sslContext,
28+
clientTls,
29+
)
2930

3031
fun forLogs(
3132
baseUrl: String,
33+
fullUrl: Boolean = false,
3234
headers: Map<String, String>,
3335
compression: Compression,
3436
sslContext: SSLContextConnectivity?,
35-
clientTls: ClientTlsConnectivity?
36-
): HttpEndpointConnectivity = HttpEndpointConnectivity(
37-
baseUrl.trimEnd('/') + "/v1/logs",
38-
headers,
39-
compression,
40-
sslContext,
41-
clientTls
42-
)
37+
clientTls: ClientTlsConnectivity?,
38+
): HttpEndpointConnectivity =
39+
HttpEndpointConnectivity(
40+
if (fullUrl) baseUrl else baseUrl.trimEnd('/') + "/v1/logs",
41+
headers,
42+
compression,
43+
sslContext,
44+
clientTls,
45+
)
4346

4447
fun forMetrics(
4548
baseUrl: String,
49+
fullUrl: Boolean = false,
4650
headers: Map<String, String>,
4751
compression: Compression,
4852
sslContext: SSLContextConnectivity?,
49-
clientTls: ClientTlsConnectivity?
50-
): HttpEndpointConnectivity = HttpEndpointConnectivity(
51-
baseUrl.trimEnd('/') + "/v1/metrics",
52-
headers,
53-
compression,
54-
sslContext,
55-
clientTls
56-
)
53+
clientTls: ClientTlsConnectivity?,
54+
): HttpEndpointConnectivity =
55+
HttpEndpointConnectivity(
56+
if (fullUrl) baseUrl else baseUrl.trimEnd('/') + "/v1/metrics",
57+
headers,
58+
compression,
59+
sslContext,
60+
clientTls,
61+
)
5762
}
5863

5964
override fun getUrl(): String = url
60-
6165
override fun getHeaders(): Map<String, String> = headers
62-
6366
override fun getCompression(): Compression = compression
64-
6567
override fun getSslContext(): SSLContextConnectivity? = sslContext
66-
6768
override fun getClientTls(): ClientTlsConnectivity? = clientTls
6869
}

android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/EndpointConfiguration.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
* Copyright The OpenTelemetry Authors
33
* SPDX-License-Identifier: Apache-2.0
44
*/
5-
65
package io.opentelemetry.android.agent.dsl
76

87
import io.opentelemetry.android.agent.connectivity.Compression
@@ -13,9 +12,17 @@ import io.opentelemetry.android.agent.connectivity.Compression
1312
@OpenTelemetryDslMarker
1413
class EndpointConfiguration internal constructor(
1514
/**
16-
* URL for HTTP export requests.
15+
* Base URL for HTTP export requests. The signal-specific path (e.g. /v1/logs) will be
16+
* appended automatically.
1717
*/
1818
var url: String,
19+
/**
20+
* Full URL for HTTP export requests. When set, this URL is used as-is without appending
21+
* any signal-specific path. Use this to specify a completely custom endpoint path,
22+
* for example "https://example.com/v2/logs".
23+
* Note: when set, this overrides the baseUrl from the surrounding httpExport block entirely.
24+
*/
25+
var fullUrl: String? = null,
1926
/**
2027
* Headers that should be attached to HTTP export requests.
2128
*/

android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/HttpExportConfiguration.kt

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
* Copyright The OpenTelemetry Authors
33
* SPDX-License-Identifier: Apache-2.0
44
*/
5-
65
package io.opentelemetry.android.agent.dsl
76

87
import io.opentelemetry.android.Incubating
@@ -50,33 +49,40 @@ class HttpExportConfiguration internal constructor() {
5049
internal fun spansEndpoint(): HttpEndpointConnectivity =
5150
HttpEndpointConnectivity.forTraces(
5251
chooseUrlSource(spansConfig),
52+
isFullUrl(spansConfig),
5353
spansConfig.headers + baseHeaders,
5454
chooseCompression(spansConfig.compression),
5555
sslContext,
56-
clientTls
56+
clientTls,
5757
)
5858

5959
internal fun logsEndpoint(): HttpEndpointConnectivity =
6060
HttpEndpointConnectivity.forLogs(
6161
chooseUrlSource(logsConfig),
62+
isFullUrl(logsConfig),
6263
logsConfig.headers + baseHeaders,
6364
chooseCompression(logsConfig.compression),
6465
sslContext,
65-
clientTls
66+
clientTls,
6667
)
6768

6869
internal fun metricsEndpoint(): HttpEndpointConnectivity =
6970
HttpEndpointConnectivity.forMetrics(
7071
chooseUrlSource(metricsConfig),
72+
isFullUrl(metricsConfig),
7173
metricsConfig.headers + baseHeaders,
7274
chooseCompression(metricsConfig.compression),
7375
sslContext,
74-
clientTls
76+
clientTls,
7577
)
7678

77-
private fun chooseUrlSource(cfg: EndpointConfiguration): String = cfg.url.ifBlank { baseUrl }
79+
private fun chooseUrlSource(cfg: EndpointConfiguration): String =
80+
cfg.fullUrl ?: cfg.url.ifBlank { baseUrl }
81+
82+
private fun isFullUrl(cfg: EndpointConfiguration): Boolean = cfg.fullUrl != null
7883

79-
private fun chooseCompression(signalConfigCompression: Compression?): Compression = signalConfigCompression ?: this.compression
84+
private fun chooseCompression(signalConfigCompression: Compression?): Compression =
85+
signalConfigCompression ?: this.compression
8086

8187
/**
8288
* Override the default configuration for the v1/traces endpoint only.

android-agent/src/test/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivityTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ class HttpEndpointConnectivityTest {
1717
val sslContext = SSLContextConnectivity(mockk(), mockk())
1818
val clientTls: ClientTlsConnectivity = mockk()
1919
val tracesConnectivity =
20-
HttpEndpointConnectivity.forTraces("http://some.endpoint", headers, compression, sslContext, clientTls)
20+
HttpEndpointConnectivity.forTraces("http://some.endpoint", false, headers, compression, sslContext, clientTls)
2121
val logsConnectivity =
22-
HttpEndpointConnectivity.forLogs("http://some.endpoint/", headers, compression, sslContext, clientTls)
22+
HttpEndpointConnectivity.forLogs("http://some.endpoint/", false, headers, compression, sslContext, clientTls)
2323
val metricsConnectivity =
24-
HttpEndpointConnectivity.forMetrics("http://some.endpoint", headers, compression, sslContext, clientTls)
24+
HttpEndpointConnectivity.forMetrics("http://some.endpoint", false, headers, compression, sslContext, clientTls)
2525

2626
assertThat(tracesConnectivity.getUrl()).isEqualTo("http://some.endpoint/v1/traces")
2727
assertThat(tracesConnectivity.getHeaders()).isEqualTo(headers)

0 commit comments

Comments
 (0)