Skip to content

Commit 706b14a

Browse files
committed
ktor
1 parent e6c9ebe commit 706b14a

File tree

3 files changed

+36
-64
lines changed

3 files changed

+36
-64
lines changed

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/builder/internal/DefaultHttpServerTelemetryBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public final class DefaultHttpServerTelemetryBuilder<REQUEST, RESPONSE> {
4141
private final String instrumentationName;
4242
private final OpenTelemetry openTelemetry;
4343

44-
private final List<AttributesExtractor<REQUEST, RESPONSE>> additionalExtractors =
44+
private final List<AttributesExtractor<? super REQUEST, ? super RESPONSE>> additionalExtractors =
4545
new ArrayList<>();
4646
private Function<
4747
SpanStatusExtractor<? super REQUEST, ? super RESPONSE>,
@@ -75,7 +75,7 @@ public DefaultHttpServerTelemetryBuilder(
7575
*/
7676
@CanIgnoreReturnValue
7777
public DefaultHttpServerTelemetryBuilder<REQUEST, RESPONSE> addAttributesExtractor(
78-
AttributesExtractor<REQUEST, RESPONSE> attributesExtractor) {
78+
AttributesExtractor<? super REQUEST, ? super RESPONSE> attributesExtractor) {
7979
additionalExtractors.add(attributesExtractor);
8080
return this;
8181
}

instrumentation/ktor/ktor-1.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v1_0/KtorServerTracing.kt

Lines changed: 26 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -14,73 +14,73 @@ import io.ktor.util.pipeline.*
1414
import io.opentelemetry.api.OpenTelemetry
1515
import io.opentelemetry.context.Context
1616
import io.opentelemetry.extension.kotlin.asContextElement
17+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpServerTelemetryBuilder
1718
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor
1819
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter
1920
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor
21+
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusBuilder
2022
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor
2123
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil
22-
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesExtractor
23-
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerMetrics
2424
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute
2525
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource
26-
import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanNameExtractor
27-
import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor
2826
import kotlinx.coroutines.withContext
27+
import java.util.Optional
2928

3029
class KtorServerTracing private constructor(
3130
private val instrumenter: Instrumenter<ApplicationRequest, ApplicationResponse>,
3231
) {
3332

3433
class Configuration {
35-
internal lateinit var openTelemetry: OpenTelemetry
36-
37-
internal val additionalExtractors = mutableListOf<AttributesExtractor<in ApplicationRequest, in ApplicationResponse>>()
38-
39-
internal val httpAttributesExtractorBuilder = HttpServerAttributesExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE)
40-
41-
internal val httpSpanNameExtractorBuilder = HttpSpanNameExtractor.builder(KtorHttpServerAttributesGetter.INSTANCE)
42-
43-
internal val httpServerRouteBuilder = HttpServerRoute.builder(KtorHttpServerAttributesGetter.INSTANCE)
44-
45-
internal var statusExtractor:
46-
(SpanStatusExtractor<ApplicationRequest, ApplicationResponse>) -> SpanStatusExtractor<in ApplicationRequest, in ApplicationResponse> = { a -> a }
34+
internal lateinit var serverBuilder: DefaultHttpServerTelemetryBuilder<ApplicationRequest, ApplicationResponse>
4735

4836
internal var spanKindExtractor:
4937
(SpanKindExtractor<ApplicationRequest>) -> SpanKindExtractor<ApplicationRequest> = { a -> a }
5038

5139
fun setOpenTelemetry(openTelemetry: OpenTelemetry) {
52-
this.openTelemetry = openTelemetry
40+
this.serverBuilder = DefaultHttpServerTelemetryBuilder(
41+
INSTRUMENTATION_NAME,
42+
openTelemetry,
43+
KtorHttpServerAttributesGetter.INSTANCE,
44+
Optional.empty()
45+
)
5346
}
5447

5548
fun setStatusExtractor(
5649
extractor: (SpanStatusExtractor<ApplicationRequest, ApplicationResponse>) -> SpanStatusExtractor<in ApplicationRequest, in ApplicationResponse>
5750
) {
58-
this.statusExtractor = extractor
51+
serverBuilder.setStatusExtractor{ prevExtractor ->
52+
SpanStatusExtractor { spanStatusBuilder: SpanStatusBuilder,
53+
request: ApplicationRequest,
54+
response: ApplicationResponse?,
55+
throwable: Throwable? ->
56+
@Suppress("UNCHECKED_CAST")
57+
extractor(prevExtractor as SpanStatusExtractor<ApplicationRequest, ApplicationResponse>)
58+
.extract(spanStatusBuilder, request, response, throwable)
59+
}
60+
}
5961
}
6062

6163
fun setSpanKindExtractor(extractor: (SpanKindExtractor<ApplicationRequest>) -> SpanKindExtractor<ApplicationRequest>) {
6264
this.spanKindExtractor = extractor
6365
}
6466

6567
fun addAttributeExtractor(extractor: AttributesExtractor<in ApplicationRequest, in ApplicationResponse>) {
66-
additionalExtractors.add(extractor)
68+
serverBuilder.addAttributesExtractor(extractor)
6769
}
6870

6971
fun setCapturedRequestHeaders(requestHeaders: List<String>) {
70-
httpAttributesExtractorBuilder.setCapturedRequestHeaders(requestHeaders)
72+
serverBuilder.setCapturedRequestHeaders(requestHeaders)
7173
}
7274

7375
fun setCapturedResponseHeaders(responseHeaders: List<String>) {
74-
httpAttributesExtractorBuilder.setCapturedResponseHeaders(responseHeaders)
76+
serverBuilder.setCapturedResponseHeaders(responseHeaders)
7577
}
7678

7779
fun setKnownMethods(knownMethods: Set<String>) {
78-
httpAttributesExtractorBuilder.setKnownMethods(knownMethods)
79-
httpSpanNameExtractorBuilder.setKnownMethods(knownMethods)
80-
httpServerRouteBuilder.setKnownMethods(knownMethods)
80+
serverBuilder.setKnownMethods(knownMethods)
8181
}
8282

83-
internal fun isOpenTelemetryInitialized(): Boolean = this::openTelemetry.isInitialized
83+
internal fun isOpenTelemetryInitialized(): Boolean = this::serverBuilder.isInitialized
8484
}
8585

8686
private fun start(call: ApplicationCall): Context? {
@@ -111,25 +111,8 @@ class KtorServerTracing private constructor(
111111
throw IllegalArgumentException("OpenTelemetry must be set")
112112
}
113113

114-
val httpAttributesGetter = KtorHttpServerAttributesGetter.INSTANCE
115-
116-
val instrumenterBuilder = Instrumenter.builder<ApplicationRequest, ApplicationResponse>(
117-
configuration.openTelemetry,
118-
INSTRUMENTATION_NAME,
119-
configuration.httpSpanNameExtractorBuilder.build()
120-
)
121-
122-
configuration.additionalExtractors.forEach { instrumenterBuilder.addAttributesExtractor(it) }
123-
124-
with(instrumenterBuilder) {
125-
setSpanStatusExtractor(configuration.statusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)))
126-
addAttributesExtractor(configuration.httpAttributesExtractorBuilder.build())
127-
addOperationMetrics(HttpServerMetrics.get())
128-
addContextCustomizer(configuration.httpServerRouteBuilder.build())
129-
}
130-
131114
val instrumenter = InstrumenterUtil.buildUpstreamInstrumenter(
132-
instrumenterBuilder,
115+
configuration.serverBuilder.instrumenterBuilder {},
133116
ApplicationRequestGetter,
134117
configuration.spanKindExtractor(SpanKindExtractor.alwaysServer())
135118
)

instrumentation/ktor/ktor-2.0/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/server/KtorServerTracing.kt

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor
2626
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil
2727
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute
2828
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource
29-
import io.opentelemetry.instrumentation.api.semconv.http.HttpSpanStatusExtractor
3029
import io.opentelemetry.instrumentation.ktor.v2_0.InstrumentationProperties.INSTRUMENTATION_NAME
3130
import kotlinx.coroutines.withContext
3231
import java.util.*
@@ -38,9 +37,6 @@ class KtorServerTracing private constructor(
3837
class Configuration {
3938
internal lateinit var serverBuilder: DefaultHttpServerTelemetryBuilder<ApplicationRequest, ApplicationResponse>
4039

41-
internal var statusExtractor:
42-
(SpanStatusExtractor<ApplicationRequest, ApplicationResponse>) -> SpanStatusExtractor<in ApplicationRequest, in ApplicationResponse> = { a -> a }
43-
4440
internal var spanKindExtractor:
4541
(SpanKindExtractor<ApplicationRequest>) -> SpanKindExtractor<ApplicationRequest> = { a -> a }
4642

@@ -63,12 +59,13 @@ class KtorServerTracing private constructor(
6359
}
6460

6561
fun spanStatusExtractor(extract: SpanStatusData.(SpanStatusExtractor<ApplicationRequest, ApplicationResponse>) -> Unit) {
66-
statusExtractor = { prevExtractor ->
67-
SpanStatusExtractor<ApplicationRequest, ApplicationResponse> { spanStatusBuilder: SpanStatusBuilder,
68-
request: ApplicationRequest,
69-
response: ApplicationResponse?,
70-
throwable: Throwable? ->
71-
extract(SpanStatusData(spanStatusBuilder, request, response, throwable), prevExtractor)
62+
serverBuilder.setStatusExtractor{ prevExtractor ->
63+
SpanStatusExtractor { spanStatusBuilder: SpanStatusBuilder,
64+
request: ApplicationRequest,
65+
response: ApplicationResponse?,
66+
throwable: Throwable? ->
67+
@Suppress("UNCHECKED_CAST")
68+
extract(SpanStatusData(spanStatusBuilder, request, response, throwable), prevExtractor as SpanStatusExtractor<ApplicationRequest, ApplicationResponse>)
7269
}
7370
}
7471
}
@@ -226,16 +223,8 @@ class KtorServerTracing private constructor(
226223

227224
require(configuration.isOpenTelemetryInitialized()) { "OpenTelemetry must be set" }
228225

229-
val httpAttributesGetter = KtorHttpServerAttributesGetter.INSTANCE
230-
231-
val instrumenterBuilder = configuration.serverBuilder.instrumenterBuilder { }
232-
233-
with(instrumenterBuilder) {
234-
setSpanStatusExtractor(configuration.statusExtractor(HttpSpanStatusExtractor.create(httpAttributesGetter)))
235-
}
236-
237226
val instrumenter = InstrumenterUtil.buildUpstreamInstrumenter(
238-
instrumenterBuilder,
227+
configuration.serverBuilder.instrumenterBuilder { },
239228
ApplicationRequestGetter,
240229
configuration.spanKindExtractor(SpanKindExtractor.alwaysServer())
241230
)

0 commit comments

Comments
 (0)