Deprecate trace mutli propagator (#2342)

* add deprecation

* backfill tests

* remove invalid tests

* add @

* Update extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/TraceMultiPropagator.java

Co-authored-by: John Watson <jkwatson@gmail.com>

* Update api/context/src/test/java/io/opentelemetry/context/propagation/MultiTextMapPropagatorTest.java

Co-authored-by: Anuraag Agrawal <anuraaga@gmail.com>

* Update extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/TraceMultiPropagator.java

Co-authored-by: Anuraag Agrawal <anuraaga@gmail.com>

* Update api/context/src/test/java/io/opentelemetry/context/propagation/MultiTextMapPropagatorTest.java

* suppress warnings

* get spotless

Co-authored-by: John Watson <jkwatson@gmail.com>
Co-authored-by: Anuraag Agrawal <anuraaga@gmail.com>
This commit is contained in:
jason plumb 2020-12-23 10:23:50 -08:00 committed by GitHub
parent 9f675da85a
commit 8ef80f0db2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 148 additions and 0 deletions

View File

@ -7,6 +7,7 @@ package io.opentelemetry.context.propagation;
import io.opentelemetry.context.Context;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
@ -18,6 +19,10 @@ final class MultiTextMapPropagator implements TextMapPropagator {
private final TextMapPropagator[] textPropagators;
private final Collection<String> allFields;
MultiTextMapPropagator(TextMapPropagator... textPropagators) {
this(Arrays.asList(textPropagators));
}
MultiTextMapPropagator(List<TextMapPropagator> textPropagators) {
this.textPropagators = new TextMapPropagator[textPropagators.size()];
textPropagators.toArray(this.textPropagators);

View File

@ -0,0 +1,136 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.context.propagation;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import io.opentelemetry.context.Context;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
@SuppressWarnings("deprecation") // we're testing deprecated stuff in here.
class MultiTextMapPropagatorTest {
@Mock private TextMapPropagator propagator1;
@Mock private TextMapPropagator propagator2;
@Mock private TextMapPropagator propagator3;
private static final TextMapPropagator.Getter<Map<String, String>> getter =
new TextMapPropagator.Getter<Map<String, String>>() {
@Override
public Iterable<String> keys(Map<String, String> carrier) {
return carrier.keySet();
}
@Nullable
@Override
public String get(Map<String, String> carrier, String key) {
return carrier.get(key);
}
};
@Test
void addPropagator_null() {
assertThrows(
NullPointerException.class,
() -> new MultiTextMapPropagator((List<TextMapPropagator>) null));
}
@Test
void fields() {
when(propagator1.fields()).thenReturn(Arrays.asList("foo", "bar"));
when(propagator2.fields()).thenReturn(Arrays.asList("hello", "world"));
TextMapPropagator prop = new MultiTextMapPropagator(propagator1, propagator2);
Collection<String> fields = prop.fields();
assertThat(fields).containsExactly("foo", "bar", "hello", "world");
}
@Test
void fields_duplicates() {
when(propagator1.fields()).thenReturn(Arrays.asList("foo", "bar", "foo"));
when(propagator2.fields()).thenReturn(Arrays.asList("hello", "world", "world", "bar"));
TextMapPropagator prop = new MultiTextMapPropagator(propagator1, propagator2);
Collection<String> fields = prop.fields();
assertThat(fields).containsExactly("foo", "bar", "hello", "world");
}
@Test
void fields_readOnly() {
when(propagator1.fields()).thenReturn(Arrays.asList("rubber", "baby"));
when(propagator2.fields()).thenReturn(Arrays.asList("buggy", "bumpers"));
TextMapPropagator prop = new MultiTextMapPropagator(propagator1, propagator2);
Collection<String> fields = prop.fields();
assertThrows(UnsupportedOperationException.class, () -> fields.add("hi"));
}
@Test
void inject_allDelegated() {
Map<String, String> carrier = new HashMap<>();
Context context = mock(Context.class);
TextMapPropagator.Setter<Map<String, String>> setter = Map::put;
TextMapPropagator prop = new MultiTextMapPropagator(propagator1, propagator2, propagator3);
prop.inject(context, carrier, setter);
verify(propagator1).inject(context, carrier, setter);
verify(propagator2).inject(context, carrier, setter);
verify(propagator3).inject(context, carrier, setter);
}
@Test
void extract_noPropagators() {
Map<String, String> carrier = new HashMap<>();
Context context = mock(Context.class);
TextMapPropagator prop = new MultiTextMapPropagator();
Context resContext = prop.extract(context, carrier, getter);
assertThat(context).isSameAs(resContext);
}
@Test
void extract_found_all() {
Map<String, String> carrier = new HashMap<>();
TextMapPropagator prop = new MultiTextMapPropagator(propagator1, propagator2, propagator3);
Context context1 = mock(Context.class);
Context context2 = mock(Context.class);
Context context3 = mock(Context.class);
Context expectedContext = mock(Context.class);
when(propagator1.extract(context1, carrier, getter)).thenReturn(context2);
when(propagator2.extract(context2, carrier, getter)).thenReturn(context3);
when(propagator3.extract(context3, carrier, getter)).thenReturn(expectedContext);
assertThat(prop.extract(context1, carrier, getter)).isEqualTo(expectedContext);
}
@Test
void extract_notFound() {
Map<String, String> carrier = new HashMap<>();
Context context = mock(Context.class);
when(propagator1.extract(context, carrier, getter)).thenReturn(context);
when(propagator2.extract(context, carrier, getter)).thenReturn(context);
TextMapPropagator prop = new MultiTextMapPropagator(propagator1, propagator2);
Context result = prop.extract(context, carrier, getter);
assertThat(result).isSameAs(context);
}
}

View File

@ -48,8 +48,14 @@ import javax.annotation.concurrent.Immutable;
* Context context = OpenTelemetry.getPropagators().getTextMapPropagator()
* .extract(context, carrier, carrierGetter);
* }</pre>
*
* <p>This class is @deprecated and will be removed in 0.14.0. Users should migrate to the
* MultiTextMapPropagator in the api.
*
* @deprecated Use {@link TextMapPropagator#composite}
*/
@Immutable
@Deprecated
public final class TraceMultiPropagator implements TextMapPropagator {
/** Returns a {@link TraceMultiPropagator} for the given {@code propagators}. */

View File

@ -30,6 +30,7 @@ import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
@SuppressWarnings("deprecation") // the class under test will go away soon
class TraceMultiPropagatorTest {
private static final TextMapPropagator PROPAGATOR1 = B3Propagator.getInstance();
private static final TextMapPropagator PROPAGATOR2 =