
io.opentelemetry.javaagent.instrumentation.kubernetesclient.KubernetesClientSingletons Maven / Gradle / Ivy
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.kubernetesclient;
import static io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor.alwaysClient;
import static io.opentelemetry.javaagent.instrumentation.kubernetesclient.RequestBuilderInjectAdapter.SETTER;
import io.kubernetes.client.openapi.ApiResponse;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
import okhttp3.Request;
public class KubernetesClientSingletons {
private static final Instrumenter> INSTRUMENTER;
private static final boolean CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES =
Config.get()
.getBoolean("otel.instrumentation.kubernetes-client.experimental-span-attributes", false);
private static final ContextPropagators CONTEXT_PROPAGATORS;
static {
KubernetesHttpAttributesExtractor httpAttributesExtractor =
new KubernetesHttpAttributesExtractor();
SpanNameExtractor spanNameExtractor =
request -> KubernetesRequestDigest.parse(request).toString();
InstrumenterBuilder> instrumenterBuilder =
Instrumenter.>newBuilder(
GlobalOpenTelemetry.get(),
"io.opentelemetry.kubernetes-client-7.0",
spanNameExtractor)
.setSpanStatusExtractor(HttpSpanStatusExtractor.create(httpAttributesExtractor))
.addAttributesExtractor(httpAttributesExtractor)
.addAttributesExtractor(new KubernetesNetAttributesExtractor());
if (CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES) {
instrumenterBuilder.addAttributesExtractor(new KubernetesExperimentalAttributesExtractor());
}
// Initialize with .newInstrumenter(alwaysClient()) instead of .newClientInstrumenter(..)
// because Request is immutable so context must be injected manually
INSTRUMENTER = instrumenterBuilder.newInstrumenter(alwaysClient());
CONTEXT_PROPAGATORS = GlobalOpenTelemetry.getPropagators();
}
public static Instrumenter> instrumenter() {
return INSTRUMENTER;
}
public static void inject(Context context, Request.Builder requestBuilder) {
CONTEXT_PROPAGATORS.getTextMapPropagator().inject(context, requestBuilder, SETTER);
}
private KubernetesClientSingletons() {}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy