Skip to content

Commit 4c95169

Browse files
committed
Split ArmeriaTelemetry into client and server
1 parent 4af0dd5 commit 4c95169

File tree

11 files changed

+588
-47
lines changed

11 files changed

+588
-47
lines changed

instrumentation/armeria/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaSingletons.java

+20-8
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
import com.linecorp.armeria.server.HttpService;
1010
import io.opentelemetry.api.GlobalOpenTelemetry;
1111
import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig;
12-
import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaTelemetry;
13-
import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaTelemetryBuilder;
12+
import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaClientTelemetry;
13+
import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaClientTelemetryBuilder;
14+
import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaServerTelemetry;
15+
import io.opentelemetry.instrumentation.armeria.v1_3.ArmeriaServerTelemetryBuilder;
1416
import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaInstrumenterBuilderUtil;
1517
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
1618
import java.util.function.Function;
@@ -23,15 +25,25 @@ public final class ArmeriaSingletons {
2325
public static final Function<? super HttpService, ? extends HttpService> SERVER_DECORATOR;
2426

2527
static {
26-
ArmeriaTelemetryBuilder builder = ArmeriaTelemetry.builder(GlobalOpenTelemetry.get());
2728
CommonConfig config = AgentCommonConfig.get();
28-
ArmeriaInstrumenterBuilderUtil.getClientBuilderExtractor().apply(builder).configure(config);
29-
ArmeriaInstrumenterBuilderUtil.getServerBuilderExtractor().apply(builder).configure(config);
30-
ArmeriaTelemetry telemetry = builder.build();
3129

32-
CLIENT_DECORATOR = telemetry.newClientDecorator();
30+
ArmeriaClientTelemetryBuilder clientBuilder =
31+
ArmeriaClientTelemetry.builder(GlobalOpenTelemetry.get());
32+
ArmeriaInstrumenterBuilderUtil.getClientBuilderExtractor()
33+
.apply(clientBuilder)
34+
.configure(config);
35+
ArmeriaClientTelemetry clientTelemetry = clientBuilder.build();
36+
37+
ArmeriaServerTelemetryBuilder serverBuilder =
38+
ArmeriaServerTelemetry.builder(GlobalOpenTelemetry.get());
39+
ArmeriaInstrumenterBuilderUtil.getServerBuilderExtractor()
40+
.apply(serverBuilder)
41+
.configure(config);
42+
ArmeriaServerTelemetry serverTelemetry = serverBuilder.build();
43+
44+
CLIENT_DECORATOR = clientTelemetry.newDecorator();
3345
Function<? super HttpService, ? extends HttpService> libraryDecorator =
34-
telemetry.newServiceDecorator().compose(ResponseCustomizingDecorator::new);
46+
serverTelemetry.newDecorator().compose(ResponseCustomizingDecorator::new);
3547
SERVER_DECORATOR = service -> new ServerDecorator(service, libraryDecorator.apply(service));
3648
}
3749

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.armeria.v1_3;
7+
8+
import com.linecorp.armeria.client.ClientRequestContext;
9+
import com.linecorp.armeria.client.HttpClient;
10+
import com.linecorp.armeria.common.logging.RequestLog;
11+
import io.opentelemetry.api.OpenTelemetry;
12+
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
13+
import java.util.function.Function;
14+
15+
/** Entrypoint for instrumenting Armeria clients. */
16+
public final class ArmeriaClientTelemetry {
17+
18+
/**
19+
* Returns a new {@link ArmeriaClientTelemetry} configured with the given {@link OpenTelemetry}.
20+
*/
21+
public static ArmeriaClientTelemetry create(OpenTelemetry openTelemetry) {
22+
return builder(openTelemetry).build();
23+
}
24+
25+
public static ArmeriaClientTelemetryBuilder builder(OpenTelemetry openTelemetry) {
26+
return new ArmeriaClientTelemetryBuilder(openTelemetry);
27+
}
28+
29+
private final Instrumenter<ClientRequestContext, RequestLog> instrumenter;
30+
31+
ArmeriaClientTelemetry(Instrumenter<ClientRequestContext, RequestLog> instrumenter) {
32+
this.instrumenter = instrumenter;
33+
}
34+
35+
/**
36+
* Returns a new {@link HttpClient} decorator for use with methods like {@link
37+
* com.linecorp.armeria.client.ClientBuilder#decorator(Function)}.
38+
*/
39+
public Function<? super HttpClient, ? extends HttpClient> newDecorator() {
40+
return client -> new OpenTelemetryClient(client, instrumenter);
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.armeria.v1_3;
7+
8+
import com.google.errorprone.annotations.CanIgnoreReturnValue;
9+
import com.linecorp.armeria.client.ClientRequestContext;
10+
import com.linecorp.armeria.common.logging.RequestLog;
11+
import io.opentelemetry.api.OpenTelemetry;
12+
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
13+
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
14+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
15+
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
16+
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
17+
import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaInstrumenterBuilderFactory;
18+
import io.opentelemetry.instrumentation.armeria.v1_3.internal.ArmeriaInstrumenterBuilderUtil;
19+
import io.opentelemetry.instrumentation.armeria.v1_3.internal.Experimental;
20+
import java.util.List;
21+
import java.util.Set;
22+
import java.util.function.Function;
23+
24+
public final class ArmeriaClientTelemetryBuilder {
25+
26+
private final DefaultHttpClientInstrumenterBuilder<ClientRequestContext, RequestLog> builder;
27+
28+
static {
29+
ArmeriaInstrumenterBuilderUtil.setClientBuilderExtractor(
30+
ArmeriaClientTelemetryBuilder::getBuilder);
31+
}
32+
33+
ArmeriaClientTelemetryBuilder(OpenTelemetry openTelemetry) {
34+
builder = ArmeriaInstrumenterBuilderFactory.getClientBuilder(openTelemetry);
35+
}
36+
37+
/** Sets the status extractor for client spans. */
38+
@CanIgnoreReturnValue
39+
public ArmeriaClientTelemetryBuilder setStatusExtractor(
40+
Function<
41+
SpanStatusExtractor<? super ClientRequestContext, ? super RequestLog>,
42+
? extends SpanStatusExtractor<? super ClientRequestContext, ? super RequestLog>>
43+
statusExtractor) {
44+
builder.setStatusExtractor(statusExtractor);
45+
return this;
46+
}
47+
48+
/**
49+
* Adds an extra client-only {@link AttributesExtractor} to invoke to set attributes to
50+
* instrumented items. The {@link AttributesExtractor} will be executed after all default
51+
* extractors.
52+
*/
53+
@CanIgnoreReturnValue
54+
public ArmeriaClientTelemetryBuilder addAttributeExtractor(
55+
AttributesExtractor<? super ClientRequestContext, ? super RequestLog> attributesExtractor) {
56+
builder.addAttributeExtractor(attributesExtractor);
57+
return this;
58+
}
59+
60+
/**
61+
* Sets the {@code peer.service} attribute for http client spans.
62+
*
63+
* @deprecated Use {@link Experimental#setClientPeerService(ArmeriaClientTelemetryBuilder,
64+
* String)} instead.
65+
*/
66+
@Deprecated
67+
@CanIgnoreReturnValue
68+
public ArmeriaClientTelemetryBuilder setPeerService(String peerService) {
69+
builder.setPeerService(peerService);
70+
return this;
71+
}
72+
73+
/**
74+
* Configures the HTTP client request headers that will be captured as span attributes.
75+
*
76+
* @param requestHeaders A list of HTTP header names.
77+
*/
78+
@CanIgnoreReturnValue
79+
public ArmeriaClientTelemetryBuilder setCapturedRequestHeaders(List<String> requestHeaders) {
80+
builder.setCapturedRequestHeaders(requestHeaders);
81+
return this;
82+
}
83+
84+
/**
85+
* Configures the HTTP client response headers that will be captured as span attributes.
86+
*
87+
* @param responseHeaders A list of HTTP header names.
88+
*/
89+
@CanIgnoreReturnValue
90+
public ArmeriaClientTelemetryBuilder setCapturedResponseHeaders(List<String> responseHeaders) {
91+
builder.setCapturedResponseHeaders(responseHeaders);
92+
return this;
93+
}
94+
95+
/**
96+
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
97+
*
98+
* <p>By default, this instrumentation defines "known" methods as the ones listed in <a
99+
* href="https://www.rfc-editor.org/rfc/rfc9110.html#name-methods">RFC9110</a> and the PATCH
100+
* method defined in <a href="https://www.rfc-editor.org/rfc/rfc5789.html">RFC5789</a>.
101+
*
102+
* <p>Note: calling this method <b>overrides</b> the default known method sets completely; it does
103+
* not supplement it.
104+
*
105+
* @param knownMethods A set of recognized HTTP request methods.
106+
* @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set)
107+
*/
108+
@CanIgnoreReturnValue
109+
public ArmeriaClientTelemetryBuilder setKnownMethods(Set<String> knownMethods) {
110+
builder.setKnownMethods(knownMethods);
111+
return this;
112+
}
113+
114+
/**
115+
* Configures the instrumentation to emit experimental HTTP client metrics.
116+
*
117+
* @param emitExperimentalHttpClientMetrics {@code true} if the experimental HTTP client metrics
118+
* are to be emitted.
119+
* @deprecated Use {@link
120+
* Experimental#setEmitExperimentalHttpClientMetrics(ArmeriaClientTelemetryBuilder, boolean)}
121+
* instead.
122+
*/
123+
@Deprecated
124+
@CanIgnoreReturnValue
125+
public ArmeriaClientTelemetryBuilder setEmitExperimentalHttpClientMetrics(
126+
boolean emitExperimentalHttpClientMetrics) {
127+
builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics);
128+
return this;
129+
}
130+
131+
/** Sets custom client {@link SpanNameExtractor} via transform function. */
132+
@CanIgnoreReturnValue
133+
public ArmeriaClientTelemetryBuilder setSpanNameExtractor(
134+
Function<
135+
SpanNameExtractor<? super ClientRequestContext>,
136+
? extends SpanNameExtractor<? super ClientRequestContext>>
137+
clientSpanNameExtractor) {
138+
builder.setSpanNameExtractor(clientSpanNameExtractor);
139+
return this;
140+
}
141+
142+
public ArmeriaClientTelemetry build() {
143+
return new ArmeriaClientTelemetry(builder.build());
144+
}
145+
146+
private DefaultHttpClientInstrumenterBuilder<ClientRequestContext, RequestLog> getBuilder() {
147+
return builder;
148+
}
149+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.armeria.v1_3;
7+
8+
import com.linecorp.armeria.common.logging.RequestLog;
9+
import com.linecorp.armeria.server.HttpService;
10+
import com.linecorp.armeria.server.ServiceRequestContext;
11+
import io.opentelemetry.api.OpenTelemetry;
12+
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
13+
import java.util.function.Function;
14+
15+
/** Entrypoint for instrumenting Armeria services. */
16+
public final class ArmeriaServerTelemetry {
17+
18+
/**
19+
* Returns a new {@link ArmeriaServerTelemetry} configured with the given {@link OpenTelemetry}.
20+
*/
21+
public static ArmeriaServerTelemetry create(OpenTelemetry openTelemetry) {
22+
return builder(openTelemetry).build();
23+
}
24+
25+
public static ArmeriaServerTelemetryBuilder builder(OpenTelemetry openTelemetry) {
26+
return new ArmeriaServerTelemetryBuilder(openTelemetry);
27+
}
28+
29+
private final Instrumenter<ServiceRequestContext, RequestLog> instrumenter;
30+
31+
ArmeriaServerTelemetry(Instrumenter<ServiceRequestContext, RequestLog> instrumenter) {
32+
this.instrumenter = instrumenter;
33+
}
34+
35+
/**
36+
* Returns a new {@link HttpService} decorator for use with methods like {@link
37+
* HttpService#decorate(Function)}.
38+
*/
39+
public Function<? super HttpService, ? extends HttpService> newDecorator() {
40+
return service -> new OpenTelemetryService(service, instrumenter);
41+
}
42+
}

0 commit comments

Comments
 (0)