Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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
Copy Markdown
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

@samvaity samvaity Jan 21, 2021

Copy link
Copy Markdown
Member Author

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
- Added support for `opentelemetry-api` latest `0.14.1` version.
For more detailed information, look [here](https://github.com/open-telemetry/opentelemetry-java/blob/master/CHANGELOG.md#version-0130---2020-12-17)
Comment thread
samvaity marked this conversation as resolved.
Outdated

## 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