Skip to content

Commit 5884ffc

Browse files
authored
Support latest opentelemetry version for tracing sdk (Azure#18534)
1 parent 057dd88 commit 5884ffc

File tree

27 files changed

+682
-550
lines changed

27 files changed

+682
-550
lines changed

eng/versioning/external_dependencies.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,9 @@ com.microsoft.azure:azure-storage;8.0.0
165165
com.microsoft.azure:msal4j;1.8.1
166166
com.microsoft.azure:msal4j-persistence-extension;1.0.0
167167
com.sun.activation:jakarta.activation;1.2.2
168-
io.opentelemetry:opentelemetry-api;0.8.0
169-
io.opentelemetry:opentelemetry-sdk;0.8.0
170-
io.grpc:grpc-context;1.30.2
168+
io.opentelemetry:opentelemetry-api;0.14.1
169+
io.opentelemetry:opentelemetry-sdk;0.14.1
170+
io.opentelemetry:opentelemetry-semconv;0.14.1
171171
io.projectreactor:reactor-test;3.3.12.RELEASE
172172
junit:junit;4.13.1
173173
commons-cli:commons-cli;1.3

eng/versioning/version_client.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ com.azure.resourcemanager:azure-resourcemanager-confluent;1.0.0-beta.1;1.0.0-bet
203203
# unreleased_<groupId>:<artifactId>;dependency-version
204204
# note: The unreleased dependencies will not be manipulated with the automatic PR creation code.
205205
unreleased_com.azure:azure-core;1.13.0-beta.1
206+
unreleased_com.azure:azure-core-tracing-opentelemetry;1.0.0-beta.7
206207

207208
# Released Beta dependencies: Copy the entry from above, prepend "beta_", remove the current
208209
# version and set the version to the released beta. Released beta dependencies are only valid

sdk/core/azure-core-tracing-opentelemetry/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## 1.0.0-beta.7 (Unreleased)
44

5+
### Dependency Updates
6+
- Updated versions of `opentelemetry-api` to `0.14.1` version.
7+
More detailed information about the new OpenTelemetry API version can be found in [OpenTelemetry changelog](https://github.com/open-telemetry/opentelemetry-java/blob/master/CHANGELOG.md#version-0141---2021-01-14)
58

69
## 1.0.0-beta.6 (2020-08-07)
710
- Update `opentelemetry-api` dependency version to `0.6.0` and included `io.grpc:grpc-context[1.30.0]` external

sdk/core/azure-core-tracing-opentelemetry/pom.xml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,24 @@
3535
<dependency>
3636
<groupId>io.opentelemetry</groupId>
3737
<artifactId>opentelemetry-api</artifactId>
38-
<version>0.8.0</version> <!-- {x-version-update;io.opentelemetry:opentelemetry-api;external_dependency} -->
38+
<version>0.14.1</version> <!-- {x-version-update;io.opentelemetry:opentelemetry-api;external_dependency} -->
39+
</dependency>
40+
<dependency>
41+
<groupId>io.opentelemetry</groupId>
42+
<artifactId>opentelemetry-semconv</artifactId>
43+
<version>0.14.1</version> <!-- {x-version-update;io.opentelemetry:opentelemetry-semconv;external_dependency} -->
3944
</dependency>
4045
<dependency>
4146
<groupId>com.azure</groupId>
4247
<artifactId>azure-core</artifactId>
4348
<version>1.13.0-beta.1</version> <!-- {x-version-update;com.azure:azure-core;current} -->
4449
</dependency>
45-
<dependency>
46-
<groupId>io.grpc</groupId>
47-
<artifactId>grpc-context</artifactId>
48-
<version>1.30.2</version> <!-- {x-version-update;io.grpc:grpc-context;external_dependency} -->
49-
</dependency>
5050

5151
<!--test dependencies -->
5252
<dependency>
5353
<groupId>io.opentelemetry</groupId>
5454
<artifactId>opentelemetry-sdk</artifactId>
55-
<version>0.8.0</version> <!-- {x-version-update;io.opentelemetry:opentelemetry-sdk;external_dependency} -->
55+
<version>0.14.1</version> <!-- {x-version-update;io.opentelemetry:opentelemetry-sdk;external_dependency} -->
5656
<scope>test</scope>
5757
</dependency>
5858
<dependency>
@@ -85,8 +85,8 @@
8585
<rules>
8686
<bannedDependencies>
8787
<includes>
88-
<include>io.opentelemetry:opentelemetry-api:[0.8.0]</include> <!-- {x-include-update;io.opentelemetry:opentelemetry-api;external_dependency} -->
89-
<include>io.grpc:grpc-context:[1.30.2]</include> <!-- {x-include-update;io.grpc:grpc-context;external_dependency} -->
88+
<include>io.opentelemetry:opentelemetry-api:[0.14.1]</include> <!-- {x-include-update;io.opentelemetry:opentelemetry-api;external_dependency} -->
89+
<include>io.opentelemetry:opentelemetry-semconv:[0.14.1]</include> <!-- {x-include-update;io.opentelemetry:opentelemetry-semconv;external_dependency} -->
9090
</includes>
9191
</bannedDependencies>
9292
</rules>

sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryHttpPolicy.java

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,15 @@
1313
import com.azure.core.tracing.opentelemetry.implementation.HttpTraceUtil;
1414
import com.azure.core.util.CoreUtils;
1515
import com.azure.core.util.UrlBuilder;
16-
import io.opentelemetry.OpenTelemetry;
17-
import io.opentelemetry.common.AttributeValue;
16+
import io.opentelemetry.api.GlobalOpenTelemetry;
17+
import io.opentelemetry.api.common.AttributeKey;
18+
import io.opentelemetry.api.trace.Span;
19+
import io.opentelemetry.api.trace.SpanBuilder;
20+
import io.opentelemetry.api.trace.SpanContext;
21+
import io.opentelemetry.api.trace.Tracer;
22+
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
1823
import io.opentelemetry.context.propagation.TextMapPropagator;
19-
import io.opentelemetry.trace.Span;
20-
import io.opentelemetry.trace.SpanContext;
21-
import io.opentelemetry.trace.Tracer;
24+
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
2225
import reactor.core.publisher.Mono;
2326
import reactor.core.publisher.Signal;
2427
import reactor.util.context.Context;
@@ -42,28 +45,25 @@ public HttpPipelinePolicy create() {
4245
}
4346

4447
// Singleton OpenTelemetry tracer capable of starting and exporting spans.
45-
private static final Tracer TRACER = OpenTelemetry.getTracerProvider().get("Azure-OpenTelemetry");
48+
private static final Tracer TRACER = GlobalOpenTelemetry.getTracer("Azure-OpenTelemetry");
4649

4750
// standard attributes with http call information
48-
private static final String HTTP_USER_AGENT = "http.user_agent";
49-
private static final String HTTP_METHOD = "http.method";
50-
private static final String HTTP_URL = "http.url";
51-
private static final String HTTP_STATUS_CODE = "http.status_code";
5251
private static final String REQUEST_ID = "x-ms-request-id";
5352

5453
// This helper class implements W3C distributed tracing protocol and injects SpanContext into the outgoing http
5554
// request
56-
private final TextMapPropagator traceContextFormat = OpenTelemetry.getPropagators().getTextMapPropagator();
55+
private final TextMapPropagator traceContextFormat = W3CTraceContextPropagator.getInstance();
5756

5857
@Override
5958
public Mono<HttpResponse> process(HttpPipelineCallContext context, HttpPipelineNextPolicy next) {
60-
Span parentSpan = (Span) context.getData(PARENT_SPAN_KEY).orElse(TRACER.getCurrentSpan());
59+
Span parentSpan = (Span) context.getData(PARENT_SPAN_KEY).orElse(Span.current());
6160
HttpRequest request = context.getHttpRequest();
6261

6362
// Build new child span representing this outgoing request.
6463
final UrlBuilder urlBuilder = UrlBuilder.parse(context.getHttpRequest().getUrl());
6564

66-
Span.Builder spanBuilder = TRACER.spanBuilder(urlBuilder.getPath()).setParent(parentSpan);
65+
SpanBuilder spanBuilder = TRACER.spanBuilder(urlBuilder.getPath())
66+
.setParent(io.opentelemetry.context.Context.current().with(parentSpan));
6767

6868
// A span's kind can be SERVER (incoming request) or CLIENT (outgoing request);
6969
spanBuilder.setSpanKind(Span.Kind.CLIENT);
@@ -77,9 +77,9 @@ public Mono<HttpResponse> process(HttpPipelineCallContext context, HttpPipelineN
7777
}
7878

7979
// For no-op tracer, SpanContext is INVALID; inject valid span headers onto outgoing request
80-
SpanContext spanContext = span.getContext();
80+
SpanContext spanContext = span.getSpanContext();
8181
if (spanContext.isValid()) {
82-
traceContextFormat.inject(io.grpc.Context.current(), request, contextSetter);
82+
traceContextFormat.inject(io.opentelemetry.context.Context.current(), request, contextSetter);
8383
}
8484

8585
// run the next policy and handle success and error
@@ -90,19 +90,21 @@ public Mono<HttpResponse> process(HttpPipelineCallContext context, HttpPipelineN
9090

9191
private static void addSpanRequestAttributes(Span span, HttpRequest request,
9292
HttpPipelineCallContext context) {
93-
putAttributeIfNotEmptyOrNull(span, HTTP_USER_AGENT, request.getHeaders().getValue("User-Agent"));
94-
putAttributeIfNotEmptyOrNull(span, HTTP_METHOD, request.getHttpMethod().toString());
95-
putAttributeIfNotEmptyOrNull(span, HTTP_URL, request.getUrl().toString());
93+
putAttributeIfNotEmptyOrNull(span, SemanticAttributes.HTTP_USER_AGENT,
94+
request.getHeaders().getValue("User-Agent"));
95+
putAttributeIfNotEmptyOrNull(span, SemanticAttributes.HTTP_METHOD, request.getHttpMethod().toString());
96+
putAttributeIfNotEmptyOrNull(span, SemanticAttributes.HTTP_URL, request.getUrl().toString());
9697
Optional<Object> tracingNamespace = context.getData(AZ_TRACING_NAMESPACE_KEY);
9798
if (tracingNamespace.isPresent()) {
98-
putAttributeIfNotEmptyOrNull(span, OpenTelemetryTracer.AZ_NAMESPACE_KEY, tracingNamespace.get().toString());
99+
putAttributeIfNotEmptyOrNull(span, AttributeKey.stringKey(OpenTelemetryTracer.AZ_NAMESPACE_KEY),
100+
tracingNamespace.get().toString());
99101
}
100102
}
101103

102-
private static void putAttributeIfNotEmptyOrNull(Span span, String key, String value) {
104+
private static void putAttributeIfNotEmptyOrNull(Span span, AttributeKey<String> key, String value) {
103105
// AttributeValue will throw an error if the value is null.
104106
if (!CoreUtils.isNullOrEmpty(value)) {
105-
span.setAttribute(key, AttributeValue.stringAttributeValue(value));
107+
span.setAttribute(key, value);
106108
}
107109
}
108110

@@ -156,9 +158,9 @@ private static void spanEnd(Span span, HttpResponse response, Throwable error) {
156158
requestId = response.getHeaderValue(REQUEST_ID);
157159
}
158160

159-
putAttributeIfNotEmptyOrNull(span, REQUEST_ID, requestId);
160-
span.setAttribute(HTTP_STATUS_CODE, AttributeValue.longAttributeValue(statusCode));
161-
span.setStatus(HttpTraceUtil.parseResponseStatus(statusCode, error));
161+
putAttributeIfNotEmptyOrNull(span, AttributeKey.stringKey(REQUEST_ID), requestId);
162+
span.setAttribute(SemanticAttributes.HTTP_STATUS_CODE, statusCode);
163+
span = HttpTraceUtil.setSpanStatus(span, statusCode, error);
162164
}
163165

164166
// Ending the span schedules it for export if sampled in or just ignores it if sampled out.

0 commit comments

Comments
 (0)