Skip to content

Commit 968ca7b

Browse files
committed
Implement SDK metrics for trace
1 parent 67df5bc commit 968ca7b

File tree

21 files changed

+1501
-81
lines changed

21 files changed

+1501
-81
lines changed
Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,24 @@
11
Comparing source compatibility of opentelemetry-sdk-trace-1.57.0-SNAPSHOT.jar against opentelemetry-sdk-trace-1.56.0.jar
2-
No changes.
2+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.trace.export.BatchSpanProcessorBuilder (not serializable)
3+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
4+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.trace.export.BatchSpanProcessorBuilder setInternalTelemetryVersion(io.opentelemetry.sdk.common.InternalTelemetryVersion)
5+
+++ NEW CLASS: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.trace.export.SpanProcessorMetrics$LegacyProcessorMetrics (not serializable)
6+
+++ CLASS FILE FORMAT VERSION: 52.0 <- n.a.
7+
+++ NEW INTERFACE: io.opentelemetry.sdk.trace.export.SpanProcessorMetrics
8+
+++ NEW SUPERCLASS: java.lang.Object
9+
+++ NEW METHOD: PUBLIC(+) void buildQueueCapacityMetric(long)
10+
+++ NEW METHOD: PUBLIC(+) void buildQueueSizeMetric(io.opentelemetry.sdk.trace.export.SpanProcessorMetrics$LongCallable)
11+
+++ NEW METHOD: PUBLIC(+) void dropSpans(int)
12+
+++ NEW METHOD: PUBLIC(+) void finishSpans(int, java.lang.String)
13+
+++ NEW INTERFACE: PUBLIC(+) ABSTRACT(+) STATIC(+) io.opentelemetry.sdk.trace.export.SpanProcessorMetrics$LongCallable (not serializable)
14+
+++ CLASS FILE FORMAT VERSION: 52.0 <- n.a.
15+
+++ NEW SUPERCLASS: java.lang.Object
16+
+++ NEW METHOD: PUBLIC(+) ABSTRACT(+) long get()
17+
+++ NEW CLASS: PUBLIC(+) STATIC(+) FINAL(+) io.opentelemetry.sdk.trace.export.SpanProcessorMetrics$SemConvSpanProcessorMetrics (not serializable)
18+
+++ CLASS FILE FORMAT VERSION: 52.0 <- n.a.
19+
+++ NEW INTERFACE: io.opentelemetry.sdk.trace.export.SpanProcessorMetrics
20+
+++ NEW SUPERCLASS: java.lang.Object
21+
+++ NEW METHOD: PUBLIC(+) void buildQueueCapacityMetric(long)
22+
+++ NEW METHOD: PUBLIC(+) void buildQueueSizeMetric(io.opentelemetry.sdk.trace.export.SpanProcessorMetrics$LongCallable)
23+
+++ NEW METHOD: PUBLIC(+) void dropSpans(int)
24+
+++ NEW METHOD: PUBLIC(+) void finishSpans(int, java.lang.String)

sdk-extensions/autoconfigure/src/main/java/io/opentelemetry/sdk/autoconfigure/TracerProviderConfiguration.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.opentelemetry.sdk.trace.export.BatchSpanProcessorBuilder;
2020
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
2121
import io.opentelemetry.sdk.trace.export.SpanExporter;
22+
import io.opentelemetry.sdk.trace.internal.SdkTracerProviderUtil;
2223
import io.opentelemetry.sdk.trace.samplers.Sampler;
2324
import java.io.Closeable;
2425
import java.time.Duration;
@@ -49,6 +50,7 @@ static void configureTracerProvider(
4950
List<Closeable> closeables) {
5051

5152
tracerProviderBuilder.setSpanLimits(configureSpanLimits(config));
53+
SdkTracerProviderUtil.setMeterProvider(tracerProviderBuilder, meterProvider);
5254

5355
String sampler = config.getString("otel.traces.sampler", PARENTBASED_ALWAYS_ON);
5456
tracerProviderBuilder.setSampler(
@@ -80,7 +82,10 @@ static List<SpanProcessor> configureSpanProcessors(
8082
for (String simpleProcessorExporterNames : simpleProcessorExporterNames) {
8183
SpanExporter exporter = exportersByNameCopy.remove(simpleProcessorExporterNames);
8284
if (exporter != null) {
83-
SpanProcessor spanProcessor = SimpleSpanProcessor.create(exporter);
85+
SpanProcessor spanProcessor =
86+
SdkTracerProviderUtil.setMeterProvider(
87+
SimpleSpanProcessor.builder(exporter), meterProvider)
88+
.build();
8489
closeables.add(spanProcessor);
8590
spanProcessors.add(spanProcessor);
8691
}

sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/SpanProcessorFactory.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
1515
import io.opentelemetry.sdk.trace.export.BatchSpanProcessorBuilder;
1616
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
17+
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessorBuilder;
1718
import io.opentelemetry.sdk.trace.export.SpanExporter;
19+
import io.opentelemetry.sdk.trace.internal.SdkTracerProviderUtil;
1820
import java.time.Duration;
1921
import java.util.Map;
2022

@@ -62,7 +64,12 @@ public SpanProcessor create(SpanProcessorModel model, DeclarativeConfigContext c
6264
FileConfigUtil.requireNonNull(
6365
simpleModel.getExporter(), "simple span processor exporter");
6466
SpanExporter spanExporter = SpanExporterFactory.getInstance().create(exporterModel, context);
65-
return context.addCloseable(SimpleSpanProcessor.create(spanExporter));
67+
SimpleSpanProcessorBuilder builder = SimpleSpanProcessor.builder(spanExporter);
68+
MeterProvider meterProvider = context.getMeterProvider();
69+
if (meterProvider != null) {
70+
SdkTracerProviderUtil.setMeterProvider(builder, meterProvider);
71+
}
72+
return context.addCloseable(builder.build());
6673
}
6774

6875
Map.Entry<String, Object> keyValue =

sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/OpenTelemetryConfigurationFactoryTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,8 @@ void create_Configured() throws NoSuchFieldException, IllegalAccessException {
343343
.extracting("sharedState")
344344
.extracting("activeSpanProcessor")
345345
.extracting("worker")
346-
.extracting("processedSpansCounter")
346+
.extracting("spanProcessorMetrics")
347+
.extracting("processedSpans")
347348
.extracting("sdkMeter")
348349
.extracting("meterProviderSharedState")
349350
.isEqualTo(sharedState);

sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ExtendedSdkSpanBuilder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ final class ExtendedSdkSpanBuilder extends SdkSpanBuilder implements ExtendedSpa
3030
String spanName,
3131
InstrumentationScopeInfo instrumentationScopeInfo,
3232
TracerSharedState tracerSharedState,
33-
SpanLimits spanLimits) {
34-
super(spanName, instrumentationScopeInfo, tracerSharedState, spanLimits);
33+
SpanLimits spanLimits,
34+
SdkTracerMetrics tracerProviderMetrics) {
35+
super(spanName, instrumentationScopeInfo, tracerSharedState, spanLimits, tracerProviderMetrics);
3536
}
3637

3738
@Override

sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ExtendedSdkTracer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ final class ExtendedSdkTracer extends SdkTracer implements ExtendedTracer {
1616
ExtendedSdkTracer(
1717
TracerSharedState sharedState,
1818
InstrumentationScopeInfo instrumentationScopeInfo,
19-
TracerConfig tracerConfig) {
20-
super(sharedState, instrumentationScopeInfo, tracerConfig);
19+
TracerConfig tracerConfig,
20+
SdkTracerMetrics tracerProviderMetrics) {
21+
super(sharedState, instrumentationScopeInfo, tracerConfig, tracerProviderMetrics);
2122
}
2223

2324
@Override

sdk/trace/src/main/java/io/opentelemetry/sdk/trace/IncubatingUtil.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,19 @@ private IncubatingUtil() {}
2020
static SdkTracer createExtendedTracer(
2121
TracerSharedState sharedState,
2222
InstrumentationScopeInfo instrumentationScopeInfo,
23-
TracerConfig tracerConfig) {
24-
return new ExtendedSdkTracer(sharedState, instrumentationScopeInfo, tracerConfig);
23+
TracerConfig tracerConfig,
24+
SdkTracerMetrics tracerProviderMetrics) {
25+
return new ExtendedSdkTracer(
26+
sharedState, instrumentationScopeInfo, tracerConfig, tracerProviderMetrics);
2527
}
2628

2729
static SdkSpanBuilder createExtendedSpanBuilder(
2830
String spanName,
2931
InstrumentationScopeInfo instrumentationScopeInfo,
3032
TracerSharedState tracerSharedState,
31-
SpanLimits spanLimits) {
33+
SpanLimits spanLimits,
34+
SdkTracerMetrics tracerProviderMetrics) {
3235
return new ExtendedSdkSpanBuilder(
33-
spanName, instrumentationScopeInfo, tracerSharedState, spanLimits);
36+
spanName, instrumentationScopeInfo, tracerSharedState, spanLimits, tracerProviderMetrics);
3437
}
3538
}

sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ final class SdkSpan implements ReadWriteSpan {
6161
private final InstrumentationScopeInfo instrumentationScopeInfo;
6262
// The start time of the span.
6363
private final long startEpochNanos;
64+
// Callback to run when span ends.
65+
private final Runnable onEnd;
66+
6467
// Lock used to internally guard the mutable state of this instance
6568
private final Object lock = new Object();
6669

@@ -132,7 +135,8 @@ private SdkSpan(
132135
@Nullable AttributesMap attributes,
133136
@Nullable List<LinkData> links,
134137
int totalRecordedLinks,
135-
long startEpochNanos) {
138+
long startEpochNanos,
139+
Runnable onEnd) {
136140
this.context = context;
137141
this.instrumentationScopeInfo = instrumentationScopeInfo;
138142
this.parentSpanContext = parentSpanContext;
@@ -148,6 +152,7 @@ private SdkSpan(
148152
this.startEpochNanos = startEpochNanos;
149153
this.attributes = attributes;
150154
this.spanLimits = spanLimits;
155+
this.onEnd = onEnd;
151156
}
152157

153158
/**
@@ -163,6 +168,7 @@ private SdkSpan(
163168
* @param resource the resource associated with this span.
164169
* @param attributes the attributes set during span creation.
165170
* @param links the links set during span creation, may be truncated. The list MUST be immutable.
171+
* @param onEnd a {@link Runnable} to run when the span is ended.
166172
* @return a new and started span.
167173
*/
168174
static SdkSpan startSpan(
@@ -180,7 +186,8 @@ static SdkSpan startSpan(
180186
@Nullable AttributesMap attributes,
181187
@Nullable List<LinkData> links,
182188
int totalRecordedLinks,
183-
long userStartEpochNanos) {
189+
long userStartEpochNanos,
190+
Runnable onEnd) {
184191
boolean createdAnchoredClock;
185192
AnchoredClock clock;
186193
if (parentSpan instanceof SdkSpan) {
@@ -219,7 +226,8 @@ static SdkSpan startSpan(
219226
attributes,
220227
links,
221228
totalRecordedLinks,
222-
startEpochNanos);
229+
startEpochNanos,
230+
onEnd);
223231
// Call onStart here instead of calling in the constructor to make sure the span is completely
224232
// initialized.
225233
if (spanProcessor.isStartRequired()) {
@@ -557,6 +565,7 @@ private void endInternal(long endEpochNanos) {
557565
spanEndingThread = Thread.currentThread();
558566
hasEnded = EndState.ENDING;
559567
}
568+
onEnd.run();
560569
if (spanProcessor instanceof ExtendedSpanProcessor) {
561570
ExtendedSpanProcessor extendedSpanProcessor = (ExtendedSpanProcessor) spanProcessor;
562571
if (extendedSpanProcessor.isOnEndingRequired()) {

sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class SdkSpanBuilder implements SpanBuilder {
3939
private final InstrumentationScopeInfo instrumentationScopeInfo;
4040
private final TracerSharedState tracerSharedState;
4141
private final SpanLimits spanLimits;
42+
private final SdkTracerMetrics tracerProviderMetrics;
4243

4344
@Nullable private Context parent; // null means: Use current context.
4445
private SpanKind spanKind = SpanKind.INTERNAL;
@@ -51,11 +52,13 @@ class SdkSpanBuilder implements SpanBuilder {
5152
String spanName,
5253
InstrumentationScopeInfo instrumentationScopeInfo,
5354
TracerSharedState tracerSharedState,
54-
SpanLimits spanLimits) {
55+
SpanLimits spanLimits,
56+
SdkTracerMetrics tracerProviderMetrics) {
5557
this.spanName = spanName;
5658
this.instrumentationScopeInfo = instrumentationScopeInfo;
5759
this.tracerSharedState = tracerSharedState;
5860
this.spanLimits = spanLimits;
61+
this.tracerProviderMetrics = tracerProviderMetrics;
5962
}
6063

6164
@Override
@@ -204,6 +207,9 @@ public Span startSpan() {
204207
/* remote= */ false,
205208
tracerSharedState.isIdGeneratorSafeToSkipIdValidation());
206209

210+
Runnable recordEndSpanMetrics =
211+
tracerProviderMetrics.startSpan(parentSpanContext, samplingDecision);
212+
207213
if (!isRecording(samplingDecision)) {
208214
return Span.wrap(spanContext);
209215
}
@@ -232,7 +238,8 @@ public Span startSpan() {
232238
recordedAttributes,
233239
currentLinks,
234240
totalNumberOfLinksAdded,
235-
startEpochNanos);
241+
startEpochNanos,
242+
recordEndSpanMetrics);
236243
}
237244

238245
private AttributesMap attributes() {

sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracer.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,25 +30,30 @@ class SdkTracer implements Tracer {
3030

3131
private final TracerSharedState sharedState;
3232
private final InstrumentationScopeInfo instrumentationScopeInfo;
33+
private final SdkTracerMetrics tracerProviderMetrics;
3334

3435
protected volatile boolean tracerEnabled;
3536

3637
SdkTracer(
3738
TracerSharedState sharedState,
3839
InstrumentationScopeInfo instrumentationScopeInfo,
39-
TracerConfig tracerConfig) {
40+
TracerConfig tracerConfig,
41+
SdkTracerMetrics tracerProviderMetrics) {
4042
this.sharedState = sharedState;
4143
this.instrumentationScopeInfo = instrumentationScopeInfo;
4244
this.tracerEnabled = tracerConfig.isEnabled();
45+
this.tracerProviderMetrics = tracerProviderMetrics;
4346
}
4447

4548
static SdkTracer create(
4649
TracerSharedState sharedState,
4750
InstrumentationScopeInfo instrumentationScopeInfo,
48-
TracerConfig tracerConfig) {
51+
TracerConfig tracerConfig,
52+
SdkTracerMetrics tracerProviderMetrics) {
4953
return INCUBATOR_AVAILABLE
50-
? IncubatingUtil.createExtendedTracer(sharedState, instrumentationScopeInfo, tracerConfig)
51-
: new SdkTracer(sharedState, instrumentationScopeInfo, tracerConfig);
54+
? IncubatingUtil.createExtendedTracer(
55+
sharedState, instrumentationScopeInfo, tracerConfig, tracerProviderMetrics)
56+
: new SdkTracer(sharedState, instrumentationScopeInfo, tracerConfig, tracerProviderMetrics);
5257
}
5358

5459
/**
@@ -68,9 +73,17 @@ public SpanBuilder spanBuilder(String spanName) {
6873
}
6974
return INCUBATOR_AVAILABLE
7075
? IncubatingUtil.createExtendedSpanBuilder(
71-
spanName, instrumentationScopeInfo, sharedState, sharedState.getSpanLimits())
76+
spanName,
77+
instrumentationScopeInfo,
78+
sharedState,
79+
sharedState.getSpanLimits(),
80+
tracerProviderMetrics)
7281
: new SdkSpanBuilder(
73-
spanName, instrumentationScopeInfo, sharedState, sharedState.getSpanLimits());
82+
spanName,
83+
instrumentationScopeInfo,
84+
sharedState,
85+
sharedState.getSpanLimits(),
86+
tracerProviderMetrics);
7487
}
7588

7689
// Visible for testing

0 commit comments

Comments
 (0)