1313import com .azure .core .tracing .opentelemetry .implementation .HttpTraceUtil ;
1414import com .azure .core .util .CoreUtils ;
1515import 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 ;
1823import 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 ;
2225import reactor .core .publisher .Mono ;
2326import reactor .core .publisher .Signal ;
2427import 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