Skip to content

Commit 5195622

Browse files
Add Getter.Keys() with Jaeger Baggage support. (#1549)
1 parent 570924b commit 5195622

File tree

17 files changed

+455
-110
lines changed

17 files changed

+455
-110
lines changed

api/src/jmh/java/io/opentelemetry/api/trace/propagation/HttpTraceContextExtractBenchmark.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ public class HttpTraceContextExtractBenchmark {
4040
private final HttpTraceContext httpTraceContext = HttpTraceContext.getInstance();
4141
private final Getter<Map<String, String>> getter =
4242
new Getter<Map<String, String>>() {
43+
@Override
44+
public Iterable<String> keys(Map<String, String> carrier) {
45+
return carrier.keySet();
46+
}
47+
4348
@Override
4449
public String get(Map<String, String> carrier, String key) {
4550
return carrier.get(key);

api/src/test/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagatorFuzzTest.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
import edu.berkeley.cs.jqf.fuzz.Fuzz;
1212
import edu.berkeley.cs.jqf.fuzz.JQF;
1313
import io.opentelemetry.context.Context;
14+
import io.opentelemetry.context.propagation.TextMapPropagator.Getter;
1415
import java.util.Map;
16+
import javax.annotation.Nullable;
1517
import org.junit.runner.RunWith;
1618

1719
@RunWith(JQF.class)
@@ -22,7 +24,21 @@ public class W3CBaggagePropagatorFuzzTest {
2224
@Fuzz
2325
public void safeForRandomInputs(String baggage) {
2426
Context context =
25-
baggagePropagator.extract(Context.root(), ImmutableMap.of("baggage", baggage), Map::get);
27+
baggagePropagator.extract(
28+
Context.root(),
29+
ImmutableMap.of("baggage", baggage),
30+
new Getter<Map<String, String>>() {
31+
@Override
32+
public Iterable<String> keys(Map<String, String> carrier) {
33+
return carrier.keySet();
34+
}
35+
36+
@Nullable
37+
@Override
38+
public String get(Map<String, String> carrier, String key) {
39+
return carrier.get(key);
40+
}
41+
});
2642
assertThat(context).isNotNull();
2743
}
2844
}

api/src/test/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagatorTest.java

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,28 @@
1212
import io.opentelemetry.api.baggage.Baggage;
1313
import io.opentelemetry.api.baggage.EntryMetadata;
1414
import io.opentelemetry.context.Context;
15+
import io.opentelemetry.context.propagation.TextMapPropagator.Getter;
1516
import java.util.HashMap;
1617
import java.util.Map;
18+
import javax.annotation.Nullable;
1719
import org.junit.jupiter.api.Test;
1820

1921
class W3CBaggagePropagatorTest {
2022

23+
private static final Getter<Map<String, String>> getter =
24+
new Getter<Map<String, String>>() {
25+
@Override
26+
public Iterable<String> keys(Map<String, String> carrier) {
27+
return carrier.keySet();
28+
}
29+
30+
@Nullable
31+
@Override
32+
public String get(Map<String, String> carrier, String key) {
33+
return carrier.get(key);
34+
}
35+
};
36+
2137
@Test
2238
void fields() {
2339
assertThat(W3CBaggagePropagator.getInstance().fields()).containsExactly("baggage");
@@ -27,8 +43,7 @@ void fields() {
2743
void extract_noBaggageHeader() {
2844
W3CBaggagePropagator propagator = W3CBaggagePropagator.getInstance();
2945

30-
Context result =
31-
propagator.extract(Context.root(), ImmutableMap.<String, String>of(), Map::get);
46+
Context result = propagator.extract(Context.root(), ImmutableMap.<String, String>of(), getter);
3247

3348
assertThat(result).isEqualTo(Context.root());
3449
}
@@ -37,8 +52,7 @@ void extract_noBaggageHeader() {
3752
void extract_emptyBaggageHeader() {
3853
W3CBaggagePropagator propagator = W3CBaggagePropagator.getInstance();
3954

40-
Context result =
41-
propagator.extract(Context.root(), ImmutableMap.of("baggage", ""), ImmutableMap::get);
55+
Context result = propagator.extract(Context.root(), ImmutableMap.of("baggage", ""), getter);
4256

4357
assertThat(Baggage.fromContext(result)).isEqualTo(Baggage.empty());
4458
}
@@ -48,8 +62,7 @@ void extract_singleEntry() {
4862
W3CBaggagePropagator propagator = W3CBaggagePropagator.getInstance();
4963

5064
Context result =
51-
propagator.extract(
52-
Context.root(), ImmutableMap.of("baggage", "key=value"), ImmutableMap::get);
65+
propagator.extract(Context.root(), ImmutableMap.of("baggage", "key=value"), getter);
5366

5467
Baggage expectedBaggage = Baggage.builder().put("key", "value").build();
5568
assertThat(Baggage.fromContext(result)).isEqualTo(expectedBaggage);
@@ -61,9 +74,7 @@ void extract_multiEntry() {
6174

6275
Context result =
6376
propagator.extract(
64-
Context.root(),
65-
ImmutableMap.of("baggage", "key1=value1,key2=value2"),
66-
ImmutableMap::get);
77+
Context.root(), ImmutableMap.of("baggage", "key1=value1,key2=value2"), getter);
6778

6879
Baggage expectedBaggage = Baggage.builder().put("key1", "value1").put("key2", "value2").build();
6980
assertThat(Baggage.fromContext(result)).isEqualTo(expectedBaggage);
@@ -75,7 +86,7 @@ void extract_duplicateKeys() {
7586

7687
Context result =
7788
propagator.extract(
78-
Context.root(), ImmutableMap.of("baggage", "key=value1,key=value2"), ImmutableMap::get);
89+
Context.root(), ImmutableMap.of("baggage", "key=value1,key=value2"), getter);
7990

8091
Baggage expectedBaggage = Baggage.builder().put("key", "value2").build();
8192
assertThat(Baggage.fromContext(result)).isEqualTo(expectedBaggage);
@@ -89,7 +100,7 @@ void extract_withMetadata() {
89100
propagator.extract(
90101
Context.root(),
91102
ImmutableMap.of("baggage", "key=value;metadata-key=value;othermetadata"),
92-
ImmutableMap::get);
103+
getter);
93104

94105
Baggage expectedBaggage =
95106
Baggage.builder()
@@ -109,7 +120,7 @@ void extract_fullComplexities() {
109120
"baggage",
110121
"key1= value1; metadata-key = value; othermetadata, "
111122
+ "key2 =value2 , key3 =\tvalue3 ; "),
112-
ImmutableMap::get);
123+
getter);
113124

114125
Baggage expectedBaggage =
115126
Baggage.builder()
@@ -135,7 +146,7 @@ void extract_invalidHeader() {
135146
"baggage",
136147
"key1= v;alsdf;-asdflkjasdf===asdlfkjadsf ,,a sdf9asdf-alue1; metadata-key = "
137148
+ "value; othermetadata, key2 =value2 , key3 =\tvalue3 ; "),
138-
ImmutableMap::get);
149+
getter);
139150

140151
assertThat(Baggage.fromContext(result)).isEqualTo(Baggage.empty());
141152
}

api/src/test/java/io/opentelemetry/api/trace/propagation/HttpTraceContextFuzzTest.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
import edu.berkeley.cs.jqf.fuzz.Fuzz;
1212
import edu.berkeley.cs.jqf.fuzz.JQF;
1313
import io.opentelemetry.context.Context;
14+
import io.opentelemetry.context.propagation.TextMapPropagator.Getter;
1415
import java.util.Map;
16+
import javax.annotation.Nullable;
1517
import org.junit.runner.RunWith;
1618

1719
@RunWith(JQF.class)
@@ -25,7 +27,19 @@ public void safeForRandomInputs(String traceParentHeader, String traceStateHeade
2527
httpTraceContext.extract(
2628
Context.root(),
2729
ImmutableMap.of("traceparent", traceParentHeader, "tracestate", traceStateHeader),
28-
Map::get);
30+
new Getter<Map<String, String>>() {
31+
@Override
32+
public Iterable<String> keys(Map<String, String> carrier) {
33+
return carrier.keySet();
34+
}
35+
36+
@Nullable
37+
@Override
38+
public String get(Map<String, String> carrier, String key) {
39+
return carrier.get(key);
40+
}
41+
});
42+
2943
assertThat(context).isNotNull();
3044
}
3145
}

api/src/test/java/io/opentelemetry/api/trace/propagation/HttpTraceContextTest.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.HashMap;
2424
import java.util.LinkedHashMap;
2525
import java.util.Map;
26+
import javax.annotation.Nullable;
2627
import org.junit.jupiter.api.Test;
2728

2829
/** Unit tests for {@link HttpTraceContext}. */
@@ -39,7 +40,19 @@ class HttpTraceContextTest {
3940
private static final String TRACEPARENT_HEADER_NOT_SAMPLED =
4041
"00-" + TRACE_ID_BASE16 + "-" + SPAN_ID_BASE16 + "-00";
4142
private static final Setter<Map<String, String>> setter = Map::put;
42-
private static final Getter<Map<String, String>> getter = Map::get;
43+
private static final Getter<Map<String, String>> getter =
44+
new Getter<Map<String, String>>() {
45+
@Override
46+
public Iterable<String> keys(Map<String, String> carrier) {
47+
return carrier.keySet();
48+
}
49+
50+
@Nullable
51+
@Override
52+
public String get(Map<String, String> carrier, String key) {
53+
return carrier.get(key);
54+
}
55+
};
4356
// Encoding preserves the order which is the reverse order of adding.
4457
private static final String TRACESTATE_NOT_DEFAULT_ENCODING = "bar=baz,foo=bar";
4558
private static final String TRACESTATE_NOT_DEFAULT_ENCODING_WITH_SPACES =
@@ -151,7 +164,7 @@ void extract_Nothing() {
151164
// Context remains untouched.
152165
assertThat(
153166
httpTraceContext.extract(
154-
Context.current(), Collections.<String, String>emptyMap(), Map::get))
167+
Context.current(), Collections.<String, String>emptyMap(), getter))
155168
.isSameAs(Context.current());
156169
}
157170

@@ -169,9 +182,7 @@ void extract_SampledContext() {
169182
void extract_NullCarrier() {
170183
Map<String, String> carrier = new LinkedHashMap<>();
171184
carrier.put(TRACE_PARENT, TRACEPARENT_HEADER_SAMPLED);
172-
assertThat(
173-
getSpanContext(
174-
httpTraceContext.extract(Context.current(), null, (c, k) -> carrier.get(k))))
185+
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), carrier, getter)))
175186
.isEqualTo(
176187
SpanContext.createFromRemoteParent(
177188
TRACE_ID_BASE16, SPAN_ID_BASE16, SAMPLED_TRACE_OPTIONS, TRACE_STATE_DEFAULT));

context/src/main/java/io/opentelemetry/context/propagation/TextMapPropagator.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,14 @@ interface Setter<C> {
115115
*/
116116
interface Getter<C> {
117117

118+
/**
119+
* Returns all the keys in the given carrier.
120+
*
121+
* @param carrier carrier of propagation fields, such as an http request.
122+
* @since 0.10.0
123+
*/
124+
Iterable<String> keys(C carrier);
125+
118126
/**
119127
* Returns the first value of the given propagation {@code key} or returns {@code null}.
120128
*

context/src/test/java/io/opentelemetry/context/propagation/DefaultPropagatorsTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,11 @@ private MapSetter() {}
155155
private static final class MapGetter implements TextMapPropagator.Getter<Map<String, String>> {
156156
private static final MapGetter INSTANCE = new MapGetter();
157157

158+
@Override
159+
public Iterable<String> keys(Map<String, String> map) {
160+
return map.keySet();
161+
}
162+
158163
@Override
159164
public String get(Map<String, String> map, String key) {
160165
return map.get(key);

extensions/trace-propagators/src/jmh/java/io/opentelemetry/extension/trace/propagation/PropagatorContextExtractBenchmark.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,11 @@ public static class JaegerContextExtractBenchmark extends AbstractContextExtract
9494

9595
private final TextMapPropagator.Getter<Map<String, String>> getter =
9696
new TextMapPropagator.Getter<Map<String, String>>() {
97+
@Override
98+
public Iterable<String> keys(Map<String, String> carrier) {
99+
return carrier.keySet();
100+
}
101+
97102
@Override
98103
public String get(Map<String, String> carrier, String key) {
99104
return carrier.get(key);
@@ -137,6 +142,11 @@ public static class JaegerUrlEncodedContextExtractBenchmark
137142

138143
private final TextMapPropagator.Getter<Map<String, String>> getter =
139144
new TextMapPropagator.Getter<Map<String, String>>() {
145+
@Override
146+
public Iterable<String> keys(Map<String, String> carrier) {
147+
return carrier.keySet();
148+
}
149+
140150
@Override
141151
public String get(Map<String, String> carrier, String key) {
142152
return carrier.get(key);
@@ -180,6 +190,11 @@ public static class B3SingleHeaderContextExtractBenchmark
180190

181191
private final TextMapPropagator.Getter<Map<String, String>> getter =
182192
new TextMapPropagator.Getter<Map<String, String>>() {
193+
@Override
194+
public Iterable<String> keys(Map<String, String> carrier) {
195+
return carrier.keySet();
196+
}
197+
183198
@Override
184199
public String get(Map<String, String> carrier, String key) {
185200
return carrier.get(key);
@@ -226,6 +241,11 @@ private static Map<String, String> createHeaders(
226241

227242
private final TextMapPropagator.Getter<Map<String, String>> getter =
228243
new TextMapPropagator.Getter<Map<String, String>>() {
244+
@Override
245+
public Iterable<String> keys(Map<String, String> carrier) {
246+
return carrier.keySet();
247+
}
248+
229249
@Override
230250
public String get(Map<String, String> carrier, String key) {
231251
return carrier.get(key);

0 commit comments

Comments
 (0)