Skip to content

Commit e243da4

Browse files
authored
Emit both old and new metrics under dup setting (#9320)
1 parent f0f86a4 commit e243da4

File tree

7 files changed

+343
-102
lines changed

7 files changed

+343
-102
lines changed

instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientExperimentalMetrics.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMessageBodySizeUtil.getHttpRequestBodySize;
99
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMessageBodySizeUtil.getHttpResponseBodySize;
10-
import static io.opentelemetry.instrumentation.api.instrumenter.http.TemporaryMetricsView.applyClientDurationAndSizeView;
10+
import static io.opentelemetry.instrumentation.api.instrumenter.http.TemporaryMetricsView.applyClientRequestSizeView;
1111
import static java.util.logging.Level.FINE;
1212

1313
import io.opentelemetry.api.common.Attributes;
@@ -81,7 +81,7 @@ public void onEnd(Context context, Attributes endAttributes, long endNanos) {
8181
return;
8282
}
8383

84-
Attributes sizeAttributes = applyClientDurationAndSizeView(startAttributes, endAttributes);
84+
Attributes sizeAttributes = applyClientRequestSizeView(startAttributes, endAttributes);
8585

8686
Long requestBodySize = getHttpRequestBodySize(endAttributes, startAttributes);
8787
if (requestBodySize != null) {

instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpClientMetrics.java

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
package io.opentelemetry.instrumentation.api.instrumenter.http;
77

8-
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMetricsUtil.createDurationHistogram;
9-
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMetricsUtil.nanosToUnit;
10-
import static io.opentelemetry.instrumentation.api.instrumenter.http.TemporaryMetricsView.applyClientDurationAndSizeView;
8+
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMetricsUtil.createStableDurationHistogram;
9+
import static io.opentelemetry.instrumentation.api.instrumenter.http.TemporaryMetricsView.applyOldClientDurationView;
10+
import static io.opentelemetry.instrumentation.api.instrumenter.http.TemporaryMetricsView.applyStableClientDurationView;
1111
import static java.util.logging.Level.FINE;
1212

1313
import com.google.auto.value.AutoValue;
@@ -18,7 +18,10 @@
1818
import io.opentelemetry.context.ContextKey;
1919
import io.opentelemetry.instrumentation.api.instrumenter.OperationListener;
2020
import io.opentelemetry.instrumentation.api.instrumenter.OperationMetrics;
21+
import io.opentelemetry.instrumentation.api.internal.SemconvStability;
22+
import java.util.concurrent.TimeUnit;
2123
import java.util.logging.Logger;
24+
import javax.annotation.Nullable;
2225

2326
/**
2427
* {@link OperationListener} which keeps track of <a
@@ -27,6 +30,9 @@
2730
*/
2831
public final class HttpClientMetrics implements OperationListener {
2932

33+
private static final double NANOS_PER_MS = TimeUnit.MILLISECONDS.toNanos(1);
34+
private static final double NANOS_PER_S = TimeUnit.SECONDS.toNanos(1);
35+
3036
private static final ContextKey<State> HTTP_CLIENT_REQUEST_METRICS_STATE =
3137
ContextKey.named("http-client-metrics-state");
3238

@@ -41,16 +47,27 @@ public static OperationMetrics get() {
4147
return HttpClientMetrics::new;
4248
}
4349

44-
private final DoubleHistogram duration;
50+
@Nullable private final DoubleHistogram stableDuration;
51+
@Nullable private final DoubleHistogram oldDuration;
4552

4653
private HttpClientMetrics(Meter meter) {
47-
String durationInstrumentName =
48-
HttpMetricsUtil.emitNewSemconvMetrics
49-
? "http.client.request.duration"
50-
: "http.client.duration";
51-
duration =
52-
createDurationHistogram(
53-
meter, durationInstrumentName, "The duration of the outbound HTTP request");
54+
if (SemconvStability.emitStableHttpSemconv()) {
55+
stableDuration =
56+
createStableDurationHistogram(
57+
meter, "http.client.request.duration", "The duration of the outbound HTTP request");
58+
} else {
59+
stableDuration = null;
60+
}
61+
if (SemconvStability.emitOldHttpSemconv()) {
62+
oldDuration =
63+
meter
64+
.histogramBuilder("http.client.duration")
65+
.setUnit("ms")
66+
.setDescription("The duration of the outbound HTTP request")
67+
.build();
68+
} else {
69+
oldDuration = null;
70+
}
5471
}
5572

5673
@Override
@@ -71,10 +88,19 @@ public void onEnd(Context context, Attributes endAttributes, long endNanos) {
7188
return;
7289
}
7390

74-
Attributes durationAndSizeAttributes =
75-
applyClientDurationAndSizeView(state.startAttributes(), endAttributes);
76-
duration.record(
77-
nanosToUnit(endNanos - state.startTimeNanos()), durationAndSizeAttributes, context);
91+
if (stableDuration != null) {
92+
Attributes stableDurationAttributes =
93+
applyStableClientDurationView(state.startAttributes(), endAttributes);
94+
stableDuration.record(
95+
(endNanos - state.startTimeNanos()) / NANOS_PER_S, stableDurationAttributes, context);
96+
}
97+
98+
if (oldDuration != null) {
99+
Attributes stableDurationAttributes =
100+
applyOldClientDurationView(state.startAttributes(), endAttributes);
101+
oldDuration.record(
102+
(endNanos - state.startTimeNanos()) / NANOS_PER_MS, stableDurationAttributes, context);
103+
}
78104
}
79105

80106
@AutoValue

instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpMetricsUtil.java

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,42 +12,27 @@
1212
import io.opentelemetry.api.metrics.DoubleHistogramBuilder;
1313
import io.opentelemetry.api.metrics.Meter;
1414
import io.opentelemetry.extension.incubator.metrics.ExtendedDoubleHistogramBuilder;
15-
import io.opentelemetry.instrumentation.api.internal.SemconvStability;
1615
import java.util.List;
17-
import java.util.concurrent.TimeUnit;
1816

1917
final class HttpMetricsUtil {
2018

21-
// we'll use the old unit if the old semconv is in use
22-
static final boolean emitNewSemconvMetrics =
23-
SemconvStability.emitStableHttpSemconv() && !SemconvStability.emitOldHttpSemconv();
24-
2519
static final List<Double> DURATION_SECONDS_BUCKETS =
2620
unmodifiableList(
2721
asList(
2822
0.0, 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1.0, 2.5, 5.0, 7.5,
2923
10.0));
3024

31-
private static final double NANOS_PER_MS = TimeUnit.MILLISECONDS.toNanos(1);
32-
private static final double NANOS_PER_S = TimeUnit.SECONDS.toNanos(1);
33-
34-
static DoubleHistogram createDurationHistogram(Meter meter, String name, String description) {
25+
static DoubleHistogram createStableDurationHistogram(
26+
Meter meter, String name, String description) {
3527
DoubleHistogramBuilder durationBuilder =
36-
meter
37-
.histogramBuilder(name)
38-
.setUnit(emitNewSemconvMetrics ? "s" : "ms")
39-
.setDescription(description);
28+
meter.histogramBuilder(name).setUnit("s").setDescription(description);
4029
// don't set custom buckets if milliseconds are still used
41-
if (emitNewSemconvMetrics && durationBuilder instanceof ExtendedDoubleHistogramBuilder) {
30+
if (durationBuilder instanceof ExtendedDoubleHistogramBuilder) {
4231
((ExtendedDoubleHistogramBuilder) durationBuilder)
4332
.setAdvice(advice -> advice.setExplicitBucketBoundaries(DURATION_SECONDS_BUCKETS));
4433
}
4534
return durationBuilder.build();
4635
}
4736

48-
static double nanosToUnit(long durationNanos) {
49-
return durationNanos / (emitNewSemconvMetrics ? NANOS_PER_S : NANOS_PER_MS);
50-
}
51-
5237
private HttpMetricsUtil() {}
5338
}

instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerExperimentalMetrics.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMessageBodySizeUtil.getHttpRequestBodySize;
99
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMessageBodySizeUtil.getHttpResponseBodySize;
1010
import static io.opentelemetry.instrumentation.api.instrumenter.http.TemporaryMetricsView.applyActiveRequestsView;
11-
import static io.opentelemetry.instrumentation.api.instrumenter.http.TemporaryMetricsView.applyServerDurationAndSizeView;
11+
import static io.opentelemetry.instrumentation.api.instrumenter.http.TemporaryMetricsView.applyServerRequestSizeView;
1212
import static java.util.logging.Level.FINE;
1313

1414
import io.opentelemetry.api.common.Attributes;
@@ -97,7 +97,7 @@ public void onEnd(Context context, Attributes endAttributes, long endNanos) {
9797
// request count (otherwise it will split the timeseries)
9898
activeRequests.add(-1, applyActiveRequestsView(startAttributes), context);
9999

100-
Attributes sizeAttributes = applyServerDurationAndSizeView(startAttributes, endAttributes);
100+
Attributes sizeAttributes = applyServerRequestSizeView(startAttributes, endAttributes);
101101

102102
Long requestBodySize = getHttpRequestBodySize(endAttributes, startAttributes);
103103
if (requestBodySize != null) {

instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/http/HttpServerMetrics.java

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
package io.opentelemetry.instrumentation.api.instrumenter.http;
77

8-
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMetricsUtil.createDurationHistogram;
9-
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMetricsUtil.nanosToUnit;
10-
import static io.opentelemetry.instrumentation.api.instrumenter.http.TemporaryMetricsView.applyServerDurationAndSizeView;
8+
import static io.opentelemetry.instrumentation.api.instrumenter.http.HttpMetricsUtil.createStableDurationHistogram;
9+
import static io.opentelemetry.instrumentation.api.instrumenter.http.TemporaryMetricsView.applyOldServerDurationView;
10+
import static io.opentelemetry.instrumentation.api.instrumenter.http.TemporaryMetricsView.applyStableServerDurationView;
1111
import static java.util.logging.Level.FINE;
1212

1313
import com.google.auto.value.AutoValue;
@@ -18,7 +18,10 @@
1818
import io.opentelemetry.context.ContextKey;
1919
import io.opentelemetry.instrumentation.api.instrumenter.OperationListener;
2020
import io.opentelemetry.instrumentation.api.instrumenter.OperationMetrics;
21+
import io.opentelemetry.instrumentation.api.internal.SemconvStability;
22+
import java.util.concurrent.TimeUnit;
2123
import java.util.logging.Logger;
24+
import javax.annotation.Nullable;
2225

2326
/**
2427
* {@link OperationListener} which keeps track of <a
@@ -27,6 +30,9 @@
2730
*/
2831
public final class HttpServerMetrics implements OperationListener {
2932

33+
private static final double NANOS_PER_MS = TimeUnit.MILLISECONDS.toNanos(1);
34+
private static final double NANOS_PER_S = TimeUnit.SECONDS.toNanos(1);
35+
3036
private static final ContextKey<State> HTTP_SERVER_METRICS_STATE =
3137
ContextKey.named("http-server-metrics-state");
3238

@@ -41,16 +47,27 @@ public static OperationMetrics get() {
4147
return HttpServerMetrics::new;
4248
}
4349

44-
private final DoubleHistogram duration;
50+
@Nullable private final DoubleHistogram stableDuration;
51+
@Nullable private final DoubleHistogram oldDuration;
4552

4653
private HttpServerMetrics(Meter meter) {
47-
String durationInstrumentName =
48-
HttpMetricsUtil.emitNewSemconvMetrics
49-
? "http.server.request.duration"
50-
: "http.server.duration";
51-
duration =
52-
createDurationHistogram(
53-
meter, durationInstrumentName, "The duration of the inbound HTTP request");
54+
if (SemconvStability.emitStableHttpSemconv()) {
55+
stableDuration =
56+
createStableDurationHistogram(
57+
meter, "http.server.request.duration", "The duration of the inbound HTTP request");
58+
} else {
59+
stableDuration = null;
60+
}
61+
if (SemconvStability.emitOldHttpSemconv()) {
62+
oldDuration =
63+
meter
64+
.histogramBuilder("http.server.duration")
65+
.setUnit("ms")
66+
.setDescription("The duration of the inbound HTTP request")
67+
.build();
68+
} else {
69+
oldDuration = null;
70+
}
5471
}
5572

5673
@Override
@@ -70,10 +87,20 @@ public void onEnd(Context context, Attributes endAttributes, long endNanos) {
7087
context);
7188
return;
7289
}
73-
Attributes durationAndSizeAttributes =
74-
applyServerDurationAndSizeView(state.startAttributes(), endAttributes);
75-
duration.record(
76-
nanosToUnit(endNanos - state.startTimeNanos()), durationAndSizeAttributes, context);
90+
91+
if (stableDuration != null) {
92+
Attributes stableDurationAttributes =
93+
applyStableServerDurationView(state.startAttributes(), endAttributes);
94+
stableDuration.record(
95+
(endNanos - state.startTimeNanos()) / NANOS_PER_S, stableDurationAttributes, context);
96+
}
97+
98+
if (oldDuration != null) {
99+
Attributes stableDurationAttributes =
100+
applyOldServerDurationView(state.startAttributes(), endAttributes);
101+
oldDuration.record(
102+
(endNanos - state.startTimeNanos()) / NANOS_PER_MS, stableDurationAttributes, context);
103+
}
77104
}
78105

79106
@AutoValue

0 commit comments

Comments
 (0)