Skip to content

Commit fef2b4f

Browse files
committed
Rpc size metrics
1 parent 2b966ec commit fef2b4f

File tree

10 files changed

+246
-319
lines changed

10 files changed

+246
-319
lines changed

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcClientMetrics.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ public void onEnd(Context context, Attributes endAttributes, long endNanos) {
9898
clientDurationHistogram.record(
9999
(endNanos - state.startTimeNanos()) / NANOS_PER_MS, attributes, context);
100100

101-
Long rpcClientRequestBodySize = RpcMetricsHolder.getRequestBodySize(context);
101+
Long rpcClientRequestBodySize = attributes.get(RpcSizeAttributesExtractor.RPC_REQUEST_SIZE);
102102
if (rpcClientRequestBodySize != null) {
103103
clientRequestSize.record(rpcClientRequestBodySize, attributes, context);
104104
}
105105

106-
Long rpcClientResponseBodySize = RpcMetricsHolder.getResponseBodySize(context);
106+
Long rpcClientResponseBodySize = attributes.get(RpcSizeAttributesExtractor.RPC_RESPONSE_SIZE);
107107
if (rpcClientResponseBodySize != null) {
108108
clientResponseSize.record(rpcClientResponseBodySize, attributes, context);
109109
}

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcCommonAttributesExtractor.java

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -40,25 +40,5 @@ public final void onEnd(
4040
Context context,
4141
REQUEST request,
4242
@Nullable RESPONSE response,
43-
@Nullable Throwable error) {
44-
Long requestSize = getter.getRequestSize(request);
45-
Long responseSize = getter.getResponseSize(request);
46-
if (this instanceof RpcClientAttributesExtractor) {
47-
if (requestSize != null) {
48-
RpcMetricsHolder.setRequestBodySize(context, requestSize);
49-
}
50-
if (responseSize != null) {
51-
RpcMetricsHolder.setResponseBodySize(context, responseSize);
52-
}
53-
}
54-
55-
if (this instanceof RpcServerAttributesExtractor) {
56-
if (requestSize != null) {
57-
RpcMetricsHolder.setRequestBodySize(context, requestSize);
58-
}
59-
if (responseSize != null) {
60-
RpcMetricsHolder.setResponseBodySize(context, responseSize);
61-
}
62-
}
63-
}
43+
@Nullable Throwable error) {}
6444
}

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcMetricsHolder.java

Lines changed: 0 additions & 65 deletions
This file was deleted.

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcServerMetrics.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ public void onEnd(Context context, Attributes endAttributes, long endNanos) {
9898
serverDurationHistogram.record(
9999
(endNanos - state.startTimeNanos()) / NANOS_PER_MS, attributes, context);
100100

101-
Long rpcServerRequestBodySize = RpcMetricsHolder.getRequestBodySize(context);
101+
Long rpcServerRequestBodySize = attributes.get(RpcSizeAttributesExtractor.RPC_REQUEST_SIZE);
102102
if (rpcServerRequestBodySize != null) {
103103
serverRequestSize.record(rpcServerRequestBodySize, attributes, context);
104104
}
105105

106-
Long rpcServerResponseBodySize = RpcMetricsHolder.getResponseBodySize(context);
106+
Long rpcServerResponseBodySize = attributes.get(RpcSizeAttributesExtractor.RPC_RESPONSE_SIZE);
107107
if (rpcServerResponseBodySize != null) {
108108
serverResponseSize.record(rpcServerResponseBodySize, attributes, context);
109109
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.api.incubator.semconv.rpc;
7+
8+
import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet;
9+
10+
import io.opentelemetry.api.common.AttributeKey;
11+
import io.opentelemetry.api.common.AttributesBuilder;
12+
import io.opentelemetry.context.Context;
13+
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
14+
import javax.annotation.Nullable;
15+
16+
public final class RpcSizeAttributesExtractor<REQUEST, RESPONSE>
17+
implements AttributesExtractor<REQUEST, RESPONSE> {
18+
19+
static final AttributeKey<Long> RPC_REQUEST_SIZE = AttributeKey.longKey("rpc.request.size");
20+
static final AttributeKey<Long> RPC_RESPONSE_SIZE = AttributeKey.longKey("rpc.response.size");
21+
22+
private final RpcAttributesGetter<REQUEST> getter;
23+
24+
RpcSizeAttributesExtractor(RpcAttributesGetter<REQUEST> getter) {
25+
this.getter = getter;
26+
}
27+
28+
/**
29+
* Returns a new {@link RpcSizeAttributesExtractor} that will use the passed {@code
30+
* attributesGetter} instance to determine the request and response size.
31+
*/
32+
public static <REQUEST, RESPONSE> RpcSizeAttributesExtractor<REQUEST, RESPONSE> create(
33+
RpcAttributesGetter<REQUEST> attributesGetter) {
34+
return new RpcSizeAttributesExtractor<>(attributesGetter);
35+
}
36+
37+
@Override
38+
public void onStart(AttributesBuilder attributes, Context parentContext, REQUEST request) {}
39+
40+
@Override
41+
public void onEnd(
42+
AttributesBuilder attributes,
43+
Context context,
44+
REQUEST request,
45+
@Nullable RESPONSE response,
46+
@Nullable Throwable error) {
47+
internalSet(attributes, RPC_REQUEST_SIZE, getter.getRequestSize(request));
48+
internalSet(attributes, RPC_RESPONSE_SIZE, getter.getResponseSize(request));
49+
}
50+
}

instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcClientMetricsTest.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,15 @@ void collectsMetrics() {
3333

3434
OperationListener listener = RpcClientMetrics.get().create(meterProvider.get("test"));
3535

36-
Attributes requestAttributes =
36+
Attributes requestAttributes1 =
37+
Attributes.builder()
38+
.put(RpcIncubatingAttributes.RPC_SYSTEM, "grpc")
39+
.put(RpcIncubatingAttributes.RPC_SERVICE, "myservice.EchoService")
40+
.put(RpcIncubatingAttributes.RPC_METHOD, "exampleMethod")
41+
.put(RpcSizeAttributesExtractor.RPC_REQUEST_SIZE, 10)
42+
.build();
43+
44+
Attributes requestAttributes2 =
3745
Attributes.builder()
3846
.put(RpcIncubatingAttributes.RPC_SYSTEM, "grpc")
3947
.put(RpcIncubatingAttributes.RPC_SERVICE, "myservice.EchoService")
@@ -46,6 +54,7 @@ void collectsMetrics() {
4654
.put(ServerAttributes.SERVER_PORT, 8080)
4755
.put(NetworkAttributes.NETWORK_TRANSPORT, "tcp")
4856
.put(NetworkAttributes.NETWORK_TYPE, "ipv4")
57+
.put(RpcSizeAttributesExtractor.RPC_RESPONSE_SIZE, 20)
4958
.build();
5059

5160
Attributes responseAttributes2 =
@@ -64,17 +73,14 @@ void collectsMetrics() {
6473
TraceFlags.getSampled(),
6574
TraceState.getDefault())));
6675

67-
Context context1 =
68-
RpcMetricsHolder.init(listener.onStart(parent, requestAttributes, nanos(100)));
76+
Context context1 = listener.onStart(parent, requestAttributes1, nanos(100));
6977

7078
assertThat(metricReader.collectAllMetrics()).isEmpty();
7179

72-
Context context2 = listener.onStart(Context.root(), requestAttributes, nanos(150));
80+
Context context2 = listener.onStart(Context.root(), requestAttributes2, nanos(150));
7381

7482
assertThat(metricReader.collectAllMetrics()).isEmpty();
7583

76-
RpcMetricsHolder.setRequestBodySize(context1, 10);
77-
RpcMetricsHolder.setResponseBodySize(context1, 20);
7884
listener.onEnd(context1, responseAttributes1, nanos(250));
7985

8086
assertThat(metricReader.collectAllMetrics())

instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/rpc/RpcServerMetricsTest.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,15 @@ void collectsMetrics() {
3333

3434
OperationListener listener = RpcServerMetrics.get().create(meterProvider.get("test"));
3535

36-
Attributes requestAttributes =
36+
Attributes requestAttributes1 =
37+
Attributes.builder()
38+
.put(RpcIncubatingAttributes.RPC_SYSTEM, "grpc")
39+
.put(RpcIncubatingAttributes.RPC_SERVICE, "myservice.EchoService")
40+
.put(RpcIncubatingAttributes.RPC_METHOD, "exampleMethod")
41+
.put(RpcSizeAttributesExtractor.RPC_REQUEST_SIZE, 10)
42+
.build();
43+
44+
Attributes requestAttributes2 =
3745
Attributes.builder()
3846
.put(RpcIncubatingAttributes.RPC_SYSTEM, "grpc")
3947
.put(RpcIncubatingAttributes.RPC_SERVICE, "myservice.EchoService")
@@ -47,6 +55,7 @@ void collectsMetrics() {
4755
.put(NetworkAttributes.NETWORK_LOCAL_ADDRESS, "127.0.0.1")
4856
.put(NetworkAttributes.NETWORK_TRANSPORT, "tcp")
4957
.put(NetworkAttributes.NETWORK_TYPE, "ipv4")
58+
.put(RpcSizeAttributesExtractor.RPC_RESPONSE_SIZE, 20)
5059
.build();
5160

5261
Attributes responseAttributes2 =
@@ -66,17 +75,14 @@ void collectsMetrics() {
6675
TraceFlags.getSampled(),
6776
TraceState.getDefault())));
6877

69-
Context context1 =
70-
RpcMetricsHolder.init(listener.onStart(parent, requestAttributes, nanos(100)));
78+
Context context1 = listener.onStart(parent, requestAttributes1, nanos(100));
7179

7280
assertThat(metricReader.collectAllMetrics()).isEmpty();
7381

74-
Context context2 = listener.onStart(Context.root(), requestAttributes, nanos(150));
82+
Context context2 = listener.onStart(Context.root(), requestAttributes2, nanos(150));
7583

7684
assertThat(metricReader.collectAllMetrics()).isEmpty();
7785

78-
RpcMetricsHolder.setRequestBodySize(context1, 10);
79-
RpcMetricsHolder.setResponseBodySize(context1, 20);
8086
listener.onEnd(context1, responseAttributes1, nanos(250));
8187

8288
assertThat(metricReader.collectAllMetrics())

instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcTelemetryBuilder.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@
1111
import io.opentelemetry.api.common.AttributeKey;
1212
import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcClientAttributesExtractor;
1313
import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcClientMetrics;
14-
import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcMetricsHolder;
1514
import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcServerAttributesExtractor;
1615
import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcServerMetrics;
16+
import io.opentelemetry.instrumentation.api.incubator.semconv.rpc.RpcSizeAttributesExtractor;
1717
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1818
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1919
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
2020
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
2121
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
22+
import io.opentelemetry.instrumentation.api.internal.Experimental;
2223
import io.opentelemetry.instrumentation.api.semconv.network.NetworkAttributesExtractor;
2324
import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor;
2425
import io.opentelemetry.instrumentation.grpc.v1_6.internal.GrpcClientNetworkAttributesGetter;
@@ -176,7 +177,6 @@ public GrpcTelemetry build() {
176177
GrpcRpcAttributesGetter rpcAttributesGetter = GrpcRpcAttributesGetter.INSTANCE;
177178

178179
clientInstrumenterBuilder
179-
.addContextCustomizer((context, request, attributes) -> RpcMetricsHolder.init(context))
180180
.setSpanStatusExtractor(GrpcSpanStatusExtractor.CLIENT)
181181
.addAttributesExtractors(additionalExtractors)
182182
.addAttributesExtractor(RpcClientAttributesExtractor.create(rpcAttributesGetter))
@@ -187,6 +187,8 @@ public GrpcTelemetry build() {
187187
new GrpcAttributesExtractor(
188188
GrpcRpcAttributesGetter.INSTANCE, capturedClientRequestMetadata))
189189
.addOperationMetrics(RpcClientMetrics.get());
190+
Experimental.addOperationListenerAttributesExtractor(
191+
clientInstrumenterBuilder, RpcSizeAttributesExtractor.create(rpcAttributesGetter));
190192
serverInstrumenterBuilder
191193
.setSpanStatusExtractor(GrpcSpanStatusExtractor.SERVER)
192194
.addAttributesExtractors(additionalExtractors)
@@ -198,6 +200,8 @@ public GrpcTelemetry build() {
198200
GrpcRpcAttributesGetter.INSTANCE, capturedServerRequestMetadata))
199201
.addAttributesExtractors(additionalServerExtractors)
200202
.addOperationMetrics(RpcServerMetrics.get());
203+
Experimental.addOperationListenerAttributesExtractor(
204+
serverInstrumenterBuilder, RpcSizeAttributesExtractor.create(rpcAttributesGetter));
201205

202206
if (peerService != null) {
203207
clientInstrumenterBuilder.addAttributesExtractor(

instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/TracingClientInterceptor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ public void start(Listener<RESPONSE> responseListener, Metadata headers) {
126126

127127
@Override
128128
public void sendMessage(REQUEST message) {
129+
request.setRequestSize(BodySizeUtil.getBodySize(message));
129130
try (Scope ignored = context.makeCurrent()) {
130131
super.sendMessage(message);
131132
} catch (Throwable e) {
@@ -159,6 +160,7 @@ final class TracingClientCallListener
159160

160161
@Override
161162
public void onMessage(RESPONSE message) {
163+
request.setResponseSize(BodySizeUtil.getBodySize(message));
162164
long messageId = RECEIVED_MESSAGE_ID_UPDATER.incrementAndGet(TracingClientCall.this);
163165
if (emitMessageEvents) {
164166
Attributes attributes = Attributes.of(MESSAGE_TYPE, RECEIVED, MESSAGE_ID, messageId);

0 commit comments

Comments
 (0)