Skip to content

Commit

Permalink
Merge branch '1.1.x'
Browse files Browse the repository at this point in the history
  • Loading branch information
marcingrzejszczak committed Aug 18, 2023
2 parents affb017 + 6d013d9 commit f1aab1c
Show file tree
Hide file tree
Showing 9 changed files with 344 additions and 45 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
/**
* Copyright 2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.micrometer.tracing.brave.bridge;

import brave.Tracing;
import brave.baggage.BaggageField;
import brave.baggage.BaggagePropagation;
import brave.baggage.BaggagePropagationConfig;
import brave.handler.SpanHandler;
import brave.propagation.B3Propagation;
import brave.propagation.StrictCurrentTraceContext;
import brave.sampler.Sampler;
import brave.test.TestSpanHandler;
import io.micrometer.common.util.internal.logging.InternalLogger;
import io.micrometer.common.util.internal.logging.InternalLoggerFactory;
import io.micrometer.tracing.*;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import reactor.core.publisher.Hooks;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;

import java.util.HashMap;
import java.util.Map;

import static org.assertj.core.api.BDDAssertions.then;

class BaggageTests {

private static final InternalLogger log = InternalLoggerFactory.getInstance(BaggageTests.class);

public static final String KEY_1 = "key1";

public static final String VALUE_1 = "value1";

SpanHandler spanHandler = new TestSpanHandler();

StrictCurrentTraceContext braveCurrentTraceContext = StrictCurrentTraceContext.create();

CurrentTraceContext bridgeContext = new BraveCurrentTraceContext(this.braveCurrentTraceContext);

Tracing tracing = Tracing.newBuilder()
.currentTraceContext(this.braveCurrentTraceContext)
.supportsJoin(false)
.traceId128Bit(true)
.propagationFactory(BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)
.add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create(KEY_1)))
.build())
.sampler(Sampler.ALWAYS_SAMPLE)
.addSpanHandler(this.spanHandler)
.build();

brave.Tracer braveTracer = this.tracing.tracer();

BravePropagator propagator = new BravePropagator(tracing);

Tracer tracer = new BraveTracer(this.braveTracer, this.bridgeContext, new BraveBaggageManager());

@AfterEach
void cleanup() {
tracing.close();
}

@Test
void canSetAndGetBaggage() {
// GIVEN
Span span = tracer.nextSpan().start();
try (Tracer.SpanInScope spanInScope = tracer.withSpan(span)) {
// WHEN
try (BaggageInScope baggageInScope = this.tracer.getBaggage(KEY_1).makeCurrent(VALUE_1)) {
// THEN
then(tracer.getBaggage(KEY_1).get()).isEqualTo(VALUE_1);
}
}
}

@Test
void canSetAndGetBaggageWithLegacyApi() {
// GIVEN
Span span = tracer.nextSpan().start();
try (Tracer.SpanInScope spanInScope = tracer.withSpan(span)) {
// WHEN
this.tracer.getBaggage(KEY_1).set(VALUE_1);

// THEN
then(tracer.getBaggage(KEY_1).get()).isEqualTo(VALUE_1);
}
}

@Test
void injectAndExtractKeepsTheBaggage() {
// GIVEN
Map<String, String> carrier = new HashMap<>();

Span span = tracer.nextSpan().start();
try (Tracer.SpanInScope spanInScope = tracer.withSpan(span)) {
try (BaggageInScope baggageInScope = this.tracer.createBaggageInScope(KEY_1, VALUE_1)) {
// WHEN
this.propagator.inject(tracer.currentTraceContext().context(), carrier, Map::put);
}

// THEN
then(carrier.get(KEY_1)).isEqualTo(VALUE_1);
}

// WHEN
Span extractedSpan = propagator.extract(carrier, Map::get).start();

// THEN
try (Tracer.SpanInScope spanInScope = tracer.withSpan(extractedSpan)) {
then(tracer.getBaggage(KEY_1).get(extractedSpan.context())).isEqualTo(VALUE_1);
try (BaggageInScope baggageInScope = tracer.getBaggage(KEY_1).makeCurrent()) {
then(baggageInScope.get()).isEqualTo(VALUE_1);
}
}
}

@Test
void injectAndExtractKeepsTheBaggageWithLegacyApi() {
// GIVEN
Map<String, String> carrier = new HashMap<>();

Span span = tracer.nextSpan().start();
try (Tracer.SpanInScope spanInScope = tracer.withSpan(span)) {
this.tracer.createBaggage(KEY_1, VALUE_1);

// WHEN
this.propagator.inject(tracer.currentTraceContext().context(), carrier, Map::put);

// THEN
then(carrier.get(KEY_1)).isEqualTo(VALUE_1);
}

// WHEN
Span extractedSpan = propagator.extract(carrier, Map::get).start();

// THEN
try (Tracer.SpanInScope spanInScope = tracer.withSpan(extractedSpan)) {
then(tracer.getBaggage(KEY_1).get(extractedSpan.context())).isEqualTo(VALUE_1);
try (BaggageInScope baggageInScope = tracer.getBaggage(KEY_1).makeCurrent()) {
then(baggageInScope.get()).isEqualTo(VALUE_1);
}
}
}

@Test
void baggageWithContextPropagation() {
Hooks.enableAutomaticContextPropagation();

Span span = tracer.nextSpan().start();
try (Tracer.SpanInScope spanInScope = tracer.withSpan(span)) {
try (BaggageInScope scope = this.tracer.createBaggageInScope(KEY_1, VALUE_1)) {
String baggageOutside = this.tracer.getBaggage(KEY_1).get();
then(baggageOutside).isEqualTo(VALUE_1);
log.info(
"BAGGAGE OUTSIDE OF REACTOR [" + baggageOutside + "], thread [" + Thread.currentThread() + "]");
Baggage baggageFromReactor = Mono.just(KEY_1)
.publishOn(Schedulers.boundedElastic())
.flatMap(s -> Mono.just(this.tracer.getBaggage(s))
.doOnNext(baggage -> log.info("BAGGAGE IN OF REACTOR [" + baggageOutside + "], thread ["
+ Thread.currentThread() + "]")))
.block();
then(baggageFromReactor).isNotNull();
then(baggageFromReactor.get()).isEqualTo(VALUE_1);
}
}
}

@Test
void baggageWithContextPropagationWithLegacyApi() {
Hooks.enableAutomaticContextPropagation();

Span span = tracer.nextSpan().start();
try (Tracer.SpanInScope spanInScope = tracer.withSpan(span)) {
try (BaggageInScope scope = this.tracer.createBaggage(KEY_1, VALUE_1).makeCurrent()) {
String baggageOutside = this.tracer.getBaggage(KEY_1).get();
then(baggageOutside).isEqualTo(VALUE_1);
log.info(
"BAGGAGE OUTSIDE OF REACTOR [" + baggageOutside + "], thread [" + Thread.currentThread() + "]");
Baggage baggageFromReactor = Mono.just(KEY_1)
.publishOn(Schedulers.boundedElastic())
.flatMap(s -> Mono.just(this.tracer.getBaggage(s))
.doOnNext(baggage -> log.info("BAGGAGE IN OF REACTOR [" + baggageOutside + "], thread ["
+ Thread.currentThread() + "]")))
.block();
then(baggageFromReactor).isNotNull();
then(baggageFromReactor.get()).isEqualTo(VALUE_1);
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -204,36 +204,37 @@ void works_with_scopes_and_observations() {
ThreadLocalCurrentTraceContext currentTraceContext = ThreadLocalCurrentTraceContext.newBuilder()
.addScopeDecorator(correlationScopeDecorator(mdcCorrelationScopeDecoratorBuilder()))
.build();
Tracing tracing = Tracing.newBuilder()
try (Tracing tracing = Tracing.newBuilder()
.propagationFactory(micrometerTracingPropagationWithBaggage(w3cPropagationFactory(braveBaggageManager)))
// .propagationFactory(micrometerTracingPropagationWithBaggage(b3PropagationFactory()))
.currentTraceContext(currentTraceContext)
.build();
Tracer tracer = new BraveTracer(tracing.tracer(), new BraveCurrentTraceContext(tracing.currentTraceContext()),
braveBaggageManager);
BravePropagator bravePropagator = new BravePropagator(tracing);

// Observation
TestObservationRegistry registry = TestObservationRegistry.create();
registry.observationConfig()
.observationHandler(new ObservationHandler.FirstMatchingCompositeObservationHandler(
new PropagatingReceiverTracingObservationHandler<>(tracer, bravePropagator),
new DefaultTracingObservationHandler(tracer)));

ReceiverContext<Map<String, String>> receiverContext = new ReceiverContext<>((c, key) -> c.get(key));
receiverContext.setCarrier(carrier);
Observation parent = Observation.start("foo", () -> receiverContext, registry);
parent.scoped(() -> {
assertThat(MDC.getCopyOfContextMap()).containsEntry("key", "value")
.containsEntry("key2", "value2")
.containsEntry("traceId", "4bf92f3577b34da6a3ce929d0e0e4736");
Observation child = Observation.start("bar", registry);
child.scoped(() -> {
.build()) {
Tracer tracer = new BraveTracer(tracing.tracer(),
new BraveCurrentTraceContext(tracing.currentTraceContext()), braveBaggageManager);
BravePropagator bravePropagator = new BravePropagator(tracing);

// Observation
TestObservationRegistry registry = TestObservationRegistry.create();
registry.observationConfig()
.observationHandler(new ObservationHandler.FirstMatchingCompositeObservationHandler(
new PropagatingReceiverTracingObservationHandler<>(tracer, bravePropagator),
new DefaultTracingObservationHandler(tracer)));

ReceiverContext<Map<String, String>> receiverContext = new ReceiverContext<>((c, key) -> c.get(key));
receiverContext.setCarrier(carrier);
Observation parent = Observation.start("foo", () -> receiverContext, registry);
parent.scoped(() -> {
assertThat(MDC.getCopyOfContextMap()).containsEntry("key", "value")
.containsEntry("key2", "value2")
.containsEntry("traceId", "4bf92f3577b34da6a3ce929d0e0e4736");
Observation child = Observation.start("bar", registry);
child.scoped(() -> {
assertThat(MDC.getCopyOfContextMap()).containsEntry("key", "value")
.containsEntry("key2", "value2")
.containsEntry("traceId", "4bf92f3577b34da6a3ce929d0e0e4736");
});
});
});
}

}

Expand All @@ -251,35 +252,38 @@ void works_with_scopes_and_observations_and_ignores_baggage() {
ThreadLocalCurrentTraceContext currentTraceContext = ThreadLocalCurrentTraceContext.newBuilder()
.addScopeDecorator(correlationScopeDecorator(mdcCorrelationScopeDecoratorBuilder()))
.build();
Tracing tracing = Tracing.newBuilder()
try (Tracing tracing = Tracing.newBuilder()
.propagationFactory(micrometerTracingPropagationWithBaggage(w3cPropagationFactoryWithoutBaggage()))
// .propagationFactory(micrometerTracingPropagationWithBaggage(b3PropagationFactory()))
.currentTraceContext(currentTraceContext)
.build();
Tracer tracer = new BraveTracer(tracing.tracer(), new BraveCurrentTraceContext(tracing.currentTraceContext()));
BravePropagator bravePropagator = new BravePropagator(tracing);

// Observation
TestObservationRegistry registry = TestObservationRegistry.create();
registry.observationConfig()
.observationHandler(new ObservationHandler.FirstMatchingCompositeObservationHandler(
new PropagatingReceiverTracingObservationHandler<>(tracer, bravePropagator),
new DefaultTracingObservationHandler(tracer)));

ReceiverContext<Map<String, String>> receiverContext = new ReceiverContext<>((c, key) -> c.get(key));
receiverContext.setCarrier(carrier);
Observation parent = Observation.start("foo", () -> receiverContext, registry);
parent.scoped(() -> {
assertThat(MDC.getCopyOfContextMap()).doesNotContainEntry("key", "value")
.doesNotContainEntry("key2", "value2")
.containsEntry("traceId", "4bf92f3577b34da6a3ce929d0e0e4736");
Observation child = Observation.start("bar", registry);
child.scoped(() -> {
.build()) {

Tracer tracer = new BraveTracer(tracing.tracer(),
new BraveCurrentTraceContext(tracing.currentTraceContext()));
BravePropagator bravePropagator = new BravePropagator(tracing);

// Observation
TestObservationRegistry registry = TestObservationRegistry.create();
registry.observationConfig()
.observationHandler(new ObservationHandler.FirstMatchingCompositeObservationHandler(
new PropagatingReceiverTracingObservationHandler<>(tracer, bravePropagator),
new DefaultTracingObservationHandler(tracer)));

ReceiverContext<Map<String, String>> receiverContext = new ReceiverContext<>((c, key) -> c.get(key));
receiverContext.setCarrier(carrier);
Observation parent = Observation.start("foo", () -> receiverContext, registry);
parent.scoped(() -> {
assertThat(MDC.getCopyOfContextMap()).doesNotContainEntry("key", "value")
.doesNotContainEntry("key2", "value2")
.containsEntry("traceId", "4bf92f3577b34da6a3ce929d0e0e4736");
Observation child = Observation.start("bar", registry);
child.scoped(() -> {
assertThat(MDC.getCopyOfContextMap()).doesNotContainEntry("key", "value")
.doesNotContainEntry("key2", "value2")
.containsEntry("traceId", "4bf92f3577b34da6a3ce929d0e0e4736");
});
});
});
}

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import io.micrometer.tracing.handler.DefaultTracingObservationHandler;
import io.micrometer.tracing.handler.TracingObservationHandler;
import org.assertj.core.api.BDDAssertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

Expand All @@ -50,6 +51,11 @@ void setup() {
observationRegistry.observationConfig().observationHandler(handler);
}

@AfterEach
void cleanup() {
tracing.close();
}

@Test
void nestedScopesShouldBeMaintained() {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import io.micrometer.tracing.brave.bridge.BraveCurrentTraceContext;
import io.micrometer.tracing.brave.bridge.BraveTracer;
import io.micrometer.tracing.handler.DefaultTracingObservationHandler;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import reactor.core.publisher.Hooks;
Expand Down Expand Up @@ -73,6 +74,11 @@ void setup() {
ObservationThreadLocalAccessor.getInstance().setObservationRegistry(observationRegistry);
}

@AfterEach
void cleanup() {
tracing.close();
}

@Test
void should_open_and_close_scopes_with_reactor() {
Observation obs1 = Observation.start("1", observationRegistry);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import io.micrometer.tracing.handler.TracingObservationHandler;
import io.micrometer.tracing.test.simple.SpanAssert;
import io.micrometer.tracing.test.simple.SpansAssert;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.io.IOException;
Expand All @@ -58,6 +59,11 @@ class DefaultTracingObservationHandlerBraveTests {

DefaultTracingObservationHandler handler = new DefaultTracingObservationHandler(tracer);

@AfterEach
void cleanup() {
tracing.close();
}

@Test
void should_be_applicable_for_non_null_context() {
then(handler.supportsContext(new Observation.Context())).isTrue();
Expand Down
Loading

0 comments on commit f1aab1c

Please sign in to comment.