Add version to the InstrumenterBuilder and Instrumenter (#4611)
This commit is contained in:
parent
e7b8cca107
commit
21d6648c95
|
@ -58,7 +58,34 @@ public class Instrumenter<REQUEST, RESPONSE> {
|
||||||
OpenTelemetry openTelemetry,
|
OpenTelemetry openTelemetry,
|
||||||
String instrumentationName,
|
String instrumentationName,
|
||||||
SpanNameExtractor<? super REQUEST> spanNameExtractor) {
|
SpanNameExtractor<? super REQUEST> spanNameExtractor) {
|
||||||
return new InstrumenterBuilder<>(openTelemetry, instrumentationName, spanNameExtractor);
|
return new InstrumenterBuilder<>(
|
||||||
|
openTelemetry, instrumentationName, InstrumentationVersion.VERSION, spanNameExtractor);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new {@link InstrumenterBuilder}.
|
||||||
|
*
|
||||||
|
* <p>The {@code instrumentationName} is the name of the instrumentation library, not the name of
|
||||||
|
* the instrument*ed* library. The value passed in this parameter should uniquely identify the
|
||||||
|
* instrumentation library so that during troubleshooting it's possible to pinpoint what tracer
|
||||||
|
* produced problematic telemetry.
|
||||||
|
*
|
||||||
|
* <p>The {@code instrumentationVersion} is the version of the instrumentation library, not the
|
||||||
|
* version of the instrument*ed* library.
|
||||||
|
*
|
||||||
|
* <p>In this project we use a convention to encode the minimum supported version of the
|
||||||
|
* instrument*ed* library into the instrumentation name, for example {@code
|
||||||
|
* io.opentelemetry.apache-httpclient-4.0}. This way, if there are different instrumentations for
|
||||||
|
* different library versions it's easy to find out which instrumentations produced the telemetry
|
||||||
|
* data.
|
||||||
|
*/
|
||||||
|
public static <REQUEST, RESPONSE> InstrumenterBuilder<REQUEST, RESPONSE> builder(
|
||||||
|
OpenTelemetry openTelemetry,
|
||||||
|
String instrumentationName,
|
||||||
|
String instrumentationVersion,
|
||||||
|
SpanNameExtractor<? super REQUEST> spanNameExtractor) {
|
||||||
|
return new InstrumenterBuilder<>(
|
||||||
|
openTelemetry, instrumentationName, instrumentationVersion, spanNameExtractor);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final SupportabilityMetrics supportability = SupportabilityMetrics.instance();
|
private static final SupportabilityMetrics supportability = SupportabilityMetrics.instance();
|
||||||
|
@ -82,7 +109,7 @@ public class Instrumenter<REQUEST, RESPONSE> {
|
||||||
Instrumenter(InstrumenterBuilder<REQUEST, RESPONSE> builder) {
|
Instrumenter(InstrumenterBuilder<REQUEST, RESPONSE> builder) {
|
||||||
this.instrumentationName = builder.instrumentationName;
|
this.instrumentationName = builder.instrumentationName;
|
||||||
this.tracer =
|
this.tracer =
|
||||||
builder.openTelemetry.getTracer(instrumentationName, InstrumentationVersion.VERSION);
|
builder.openTelemetry.getTracer(instrumentationName, builder.instrumentationVersion);
|
||||||
this.spanNameExtractor = builder.spanNameExtractor;
|
this.spanNameExtractor = builder.spanNameExtractor;
|
||||||
this.spanKindExtractor = builder.spanKindExtractor;
|
this.spanKindExtractor = builder.spanKindExtractor;
|
||||||
this.spanStatusExtractor = builder.spanStatusExtractor;
|
this.spanStatusExtractor = builder.spanStatusExtractor;
|
||||||
|
|
|
@ -42,6 +42,7 @@ public final class InstrumenterBuilder<REQUEST, RESPONSE> {
|
||||||
final OpenTelemetry openTelemetry;
|
final OpenTelemetry openTelemetry;
|
||||||
final Meter meter;
|
final Meter meter;
|
||||||
final String instrumentationName;
|
final String instrumentationName;
|
||||||
|
final String instrumentationVersion;
|
||||||
final SpanNameExtractor<? super REQUEST> spanNameExtractor;
|
final SpanNameExtractor<? super REQUEST> spanNameExtractor;
|
||||||
|
|
||||||
final List<SpanLinksExtractor<? super REQUEST>> spanLinksExtractors = new ArrayList<>();
|
final List<SpanLinksExtractor<? super REQUEST>> spanLinksExtractors = new ArrayList<>();
|
||||||
|
@ -63,11 +64,13 @@ public final class InstrumenterBuilder<REQUEST, RESPONSE> {
|
||||||
InstrumenterBuilder(
|
InstrumenterBuilder(
|
||||||
OpenTelemetry openTelemetry,
|
OpenTelemetry openTelemetry,
|
||||||
String instrumentationName,
|
String instrumentationName,
|
||||||
|
String instrumentationVersion,
|
||||||
SpanNameExtractor<? super REQUEST> spanNameExtractor) {
|
SpanNameExtractor<? super REQUEST> spanNameExtractor) {
|
||||||
this.openTelemetry = openTelemetry;
|
this.openTelemetry = openTelemetry;
|
||||||
// TODO(anuraaga): Retrieve from openTelemetry when not alpha anymore.
|
// TODO(anuraaga): Retrieve from openTelemetry when not alpha anymore.
|
||||||
this.meter = GlobalMeterProvider.get().get(instrumentationName);
|
this.meter = GlobalMeterProvider.get().get(instrumentationName);
|
||||||
this.instrumentationName = instrumentationName;
|
this.instrumentationName = instrumentationName;
|
||||||
|
this.instrumentationVersion = instrumentationVersion;
|
||||||
this.spanNameExtractor = spanNameExtractor;
|
this.spanNameExtractor = spanNameExtractor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.ContextKey;
|
import io.opentelemetry.context.ContextKey;
|
||||||
import io.opentelemetry.context.propagation.TextMapGetter;
|
import io.opentelemetry.context.propagation.TextMapGetter;
|
||||||
|
import io.opentelemetry.instrumentation.api.InstrumentationVersion;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.db.DbAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.db.DbAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
|
||||||
|
@ -641,6 +642,53 @@ class InstrumenterTest {
|
||||||
assertThat(SpanKey.PRODUCER.fromContextOrNull(context)).isNull();
|
assertThat(SpanKey.PRODUCER.fromContextOrNull(context)).isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void instrumentationVersion_default() {
|
||||||
|
InstrumenterBuilder<Map<String, String>, Map<String, String>> builder =
|
||||||
|
Instrumenter.builder(otelTesting.getOpenTelemetry(), "test", name -> "span");
|
||||||
|
|
||||||
|
Instrumenter<Map<String, String>, Map<String, String>> instrumenter = builder.newInstrumenter();
|
||||||
|
|
||||||
|
Context context = instrumenter.start(Context.root(), Collections.emptyMap());
|
||||||
|
assertThat(Span.fromContext(context)).isNotNull();
|
||||||
|
|
||||||
|
instrumenter.end(context, Collections.emptyMap(), Collections.emptyMap(), null);
|
||||||
|
|
||||||
|
otelTesting
|
||||||
|
.assertTraces()
|
||||||
|
.hasTracesSatisfyingExactly(
|
||||||
|
trace ->
|
||||||
|
trace.hasSpansSatisfyingExactly(
|
||||||
|
span ->
|
||||||
|
span.hasName("span")
|
||||||
|
.hasInstrumentationLibraryInfo(
|
||||||
|
InstrumentationLibraryInfo.create(
|
||||||
|
"test", InstrumentationVersion.VERSION))));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void instrumentationVersion_custom() {
|
||||||
|
InstrumenterBuilder<Map<String, String>, Map<String, String>> builder =
|
||||||
|
Instrumenter.builder(otelTesting.getOpenTelemetry(), "test", "1.0", name -> "span");
|
||||||
|
|
||||||
|
Instrumenter<Map<String, String>, Map<String, String>> instrumenter = builder.newInstrumenter();
|
||||||
|
|
||||||
|
Context context = instrumenter.start(Context.root(), Collections.emptyMap());
|
||||||
|
assertThat(Span.fromContext(context)).isNotNull();
|
||||||
|
|
||||||
|
instrumenter.end(context, Collections.emptyMap(), Collections.emptyMap(), null);
|
||||||
|
|
||||||
|
otelTesting
|
||||||
|
.assertTraces()
|
||||||
|
.hasTracesSatisfyingExactly(
|
||||||
|
trace ->
|
||||||
|
trace.hasSpansSatisfyingExactly(
|
||||||
|
span ->
|
||||||
|
span.hasName("span")
|
||||||
|
.hasInstrumentationLibraryInfo(
|
||||||
|
InstrumentationLibraryInfo.create("test", "1.0"))));
|
||||||
|
}
|
||||||
|
|
||||||
private static void validateInstrumentationTypeSpanPresent(SpanKey spanKey, Context context) {
|
private static void validateInstrumentationTypeSpanPresent(SpanKey spanKey, Context context) {
|
||||||
Span span = Span.fromContext(context);
|
Span span = Span.fromContext(context);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue