Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions eng/versioning/external_dependencies.txt
Original file line number Diff line number Diff line change
Expand Up @@ -165,9 +165,9 @@ com.microsoft.azure:azure-storage;8.0.0
com.microsoft.azure:msal4j;1.8.0
com.microsoft.azure:msal4j-persistence-extension;1.0.0
com.sun.activation:jakarta.activation;1.2.2
io.opentelemetry:opentelemetry-api;0.8.0
io.opentelemetry:opentelemetry-sdk;0.8.0
io.grpc:grpc-context;1.30.2
io.opentelemetry:opentelemetry-api;0.14.1
io.opentelemetry:opentelemetry-sdk;0.14.1
io.opentelemetry:opentelemetry-semconv;0.14.1
io.projectreactor:reactor-test;3.3.12.RELEASE
junit:junit;4.13.1
commons-cli:commons-cli;1.3
Expand Down
1 change: 1 addition & 0 deletions eng/versioning/version_client.txt
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ com.azure.resourcemanager:azure-resourcemanager-confluent;1.0.0-beta.1;1.0.0-bet
# unreleased_<groupId>:<artifactId>;dependency-version
# note: The unreleased dependencies will not be manipulated with the automatic PR creation code.
unreleased_com.azure:azure-core;1.13.0-beta.1
unreleased_com.azure:azure-core-tracing-opentelemetry;1.0.0-beta.7

# Released Beta dependencies: Copy the entry from above, prepend "beta_", remove the current
# version and set the version to the released beta. Released beta dependencies are only valid
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.0</version> <!-- {x-version-update;org.apache.maven.plugins:maven-checkstyle-plugin;external_dependency} -->
<version>3.1.1</version> <!-- {x-version-update;org.apache.maven.plugins:maven-checkstyle-plugin;external_dependency} -->
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be updated in external_dependencies.txt

Copy link
Member Author

@samvaity samvaity Jan 21, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

<configuration>
<configLocation>eng/code-quality-reports/src/main/resources/checkstyle/checkstyle.xml</configLocation>
<suppressionsLocation>eng/code-quality-reports/src/main/resources/checkstyle/checkstyle-suppressions.xml</suppressionsLocation>
Expand Down
3 changes: 3 additions & 0 deletions sdk/core/azure-core-tracing-opentelemetry/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

## 1.0.0-beta.7 (Unreleased)

### Dependency Updates
- Updated versions of `opentelemetry-api` to `0.14.1` version.
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)

## 1.0.0-beta.6 (2020-08-07)
- Update `opentelemetry-api` dependency version to `0.6.0` and included `io.grpc:grpc-context[1.30.0]` external
Expand Down
18 changes: 9 additions & 9 deletions sdk/core/azure-core-tracing-opentelemetry/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,24 +35,24 @@
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>0.8.0</version> <!-- {x-version-update;io.opentelemetry:opentelemetry-api;external_dependency} -->
<version>0.14.1</version> <!-- {x-version-update;io.opentelemetry:opentelemetry-api;external_dependency} -->
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-semconv</artifactId>
<version>0.14.1</version> <!-- {x-version-update;io.opentelemetry:opentelemetry-semconv;external_dependency} -->
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-core</artifactId>
<version>1.13.0-beta.1</version> <!-- {x-version-update;com.azure:azure-core;current} -->
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-context</artifactId>
<version>1.30.2</version> <!-- {x-version-update;io.grpc:grpc-context;external_dependency} -->
</dependency>

<!--test dependencies -->
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
<version>0.8.0</version> <!-- {x-version-update;io.opentelemetry:opentelemetry-sdk;external_dependency} -->
<version>0.14.1</version> <!-- {x-version-update;io.opentelemetry:opentelemetry-sdk;external_dependency} -->
<scope>test</scope>
</dependency>
<dependency>
Expand Down Expand Up @@ -85,8 +85,8 @@
<rules>
<bannedDependencies>
<includes>
<include>io.opentelemetry:opentelemetry-api:[0.8.0]</include> <!-- {x-include-update;io.opentelemetry:opentelemetry-api;external_dependency} -->
<include>io.grpc:grpc-context:[1.30.2]</include> <!-- {x-include-update;io.grpc:grpc-context;external_dependency} -->
<include>io.opentelemetry:opentelemetry-api:[0.14.1]</include> <!-- {x-include-update;io.opentelemetry:opentelemetry-api;external_dependency} -->
<include>io.opentelemetry:opentelemetry-semconv:[0.14.1]</include> <!-- {x-include-update;io.opentelemetry:opentelemetry-semconv;external_dependency} -->
</includes>
</bannedDependencies>
</rules>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@
import com.azure.core.tracing.opentelemetry.implementation.HttpTraceUtil;
import com.azure.core.util.CoreUtils;
import com.azure.core.util.UrlBuilder;
import io.opentelemetry.OpenTelemetry;
import io.opentelemetry.common.AttributeValue;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanBuilder;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.trace.Span;
import io.opentelemetry.trace.SpanContext;
import io.opentelemetry.trace.Tracer;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import reactor.core.publisher.Mono;
import reactor.core.publisher.Signal;
import reactor.util.context.Context;
Expand All @@ -42,28 +45,25 @@ public HttpPipelinePolicy create() {
}

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

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

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

@Override
public Mono<HttpResponse> process(HttpPipelineCallContext context, HttpPipelineNextPolicy next) {
Span parentSpan = (Span) context.getData(PARENT_SPAN_KEY).orElse(TRACER.getCurrentSpan());
Span parentSpan = (Span) context.getData(PARENT_SPAN_KEY).orElse(Span.current());
HttpRequest request = context.getHttpRequest();

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

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

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

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

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

private static void addSpanRequestAttributes(Span span, HttpRequest request,
HttpPipelineCallContext context) {
putAttributeIfNotEmptyOrNull(span, HTTP_USER_AGENT, request.getHeaders().getValue("User-Agent"));
putAttributeIfNotEmptyOrNull(span, HTTP_METHOD, request.getHttpMethod().toString());
putAttributeIfNotEmptyOrNull(span, HTTP_URL, request.getUrl().toString());
putAttributeIfNotEmptyOrNull(span, SemanticAttributes.HTTP_USER_AGENT,
request.getHeaders().getValue("User-Agent"));
putAttributeIfNotEmptyOrNull(span, SemanticAttributes.HTTP_METHOD, request.getHttpMethod().toString());
putAttributeIfNotEmptyOrNull(span, SemanticAttributes.HTTP_URL, request.getUrl().toString());
Optional<Object> tracingNamespace = context.getData(AZ_TRACING_NAMESPACE_KEY);
if (tracingNamespace.isPresent()) {
putAttributeIfNotEmptyOrNull(span, OpenTelemetryTracer.AZ_NAMESPACE_KEY, tracingNamespace.get().toString());
putAttributeIfNotEmptyOrNull(span, AttributeKey.stringKey(OpenTelemetryTracer.AZ_NAMESPACE_KEY),
tracingNamespace.get().toString());
}
}

private static void putAttributeIfNotEmptyOrNull(Span span, String key, String value) {
private static void putAttributeIfNotEmptyOrNull(Span span, AttributeKey<String> key, String value) {
// AttributeValue will throw an error if the value is null.
if (!CoreUtils.isNullOrEmpty(value)) {
span.setAttribute(key, AttributeValue.stringAttributeValue(value));
span.setAttribute(key, value);
}
}

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

putAttributeIfNotEmptyOrNull(span, REQUEST_ID, requestId);
span.setAttribute(HTTP_STATUS_CODE, AttributeValue.longAttributeValue(statusCode));
span.setStatus(HttpTraceUtil.parseResponseStatus(statusCode, error));
putAttributeIfNotEmptyOrNull(span, AttributeKey.stringKey(REQUEST_ID), requestId);
span.setAttribute(SemanticAttributes.HTTP_STATUS_CODE, statusCode);
span = HttpTraceUtil.setSpanStatus(span, statusCode, error);
}

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