Skip to content

Commit df9a72b

Browse files
committed
Implement Environment Variable Context Propagation carriers in api/incubator
1 parent fff95e0 commit df9a72b

File tree

4 files changed

+176
-0
lines changed

4 files changed

+176
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.api.incubator.propagation;
7+
8+
import io.opentelemetry.context.propagation.TextMapGetter;
9+
import java.util.Collections;
10+
import java.util.Locale;
11+
import java.util.Map;
12+
import javax.annotation.Nullable;
13+
14+
/**
15+
* A {@link TextMapGetter} that extracts context from a map carrier, intended for use with
16+
* environment variables.
17+
*
18+
* <p>Standard environment variable names are uppercase (e.g., {@code TRACEPARENT}, {@code
19+
* TRACESTATE}, {@code BAGGAGE}). This getter translates keys to uppercase before looking them up in
20+
* the carrier.
21+
*/
22+
public enum EnvironmentGetter implements TextMapGetter<Map<String, String>> {
23+
INSTANCE;
24+
25+
@Override
26+
public Iterable<String> keys(Map<String, String> carrier) {
27+
if (carrier == null) {
28+
return Collections.emptyList();
29+
}
30+
return carrier.keySet();
31+
}
32+
33+
@Nullable
34+
@Override
35+
public String get(@Nullable Map<String, String> carrier, String key) {
36+
if (carrier == null || key == null) {
37+
return null;
38+
}
39+
// Spec recommends using uppercase for environment variable names.
40+
return carrier.get(key.toUpperCase(Locale.ROOT));
41+
}
42+
43+
@Override
44+
public String toString() {
45+
return "EnvironmentGetter";
46+
}
47+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.api.incubator.propagation;
7+
8+
import io.opentelemetry.context.propagation.TextMapSetter;
9+
import java.util.Locale;
10+
import java.util.Map;
11+
import javax.annotation.Nullable;
12+
13+
/**
14+
* A {@link TextMapSetter} that injects context into a map carrier, intended for use with
15+
* environment variables.
16+
*
17+
* <p>Standard environment variable names are uppercase (e.g., {@code TRACEPARENT}, {@code
18+
* TRACESTATE}, {@code BAGGAGE}). This setter translates keys to uppercase before inserting them
19+
* into the carrier.
20+
*/
21+
public enum EnvironmentSetter implements TextMapSetter<Map<String, String>> {
22+
INSTANCE;
23+
24+
@Override
25+
public void set(@Nullable Map<String, String> carrier, String key, String value) {
26+
if (carrier == null || key == null || value == null) {
27+
return;
28+
}
29+
// Spec recommends using uppercase for environment variable names.
30+
carrier.put(key.toUpperCase(Locale.ROOT), value);
31+
}
32+
33+
@Override
34+
public String toString() {
35+
return "EnvironmentSetter";
36+
}
37+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.api.incubator.propagation;
7+
8+
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
9+
10+
import java.util.Collections;
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
import org.junit.jupiter.api.Test;
14+
15+
class EnvironmentGetterTest {
16+
17+
@Test
18+
void get() {
19+
Map<String, String> carrier = new HashMap<>();
20+
carrier.put("TRACEPARENT", "val1");
21+
carrier.put("TRACESTATE", "val2");
22+
carrier.put("BAGGAGE", "val3");
23+
carrier.put("OTHER", "val4");
24+
25+
assertThat(EnvironmentGetter.INSTANCE.get(carrier, "traceparent")).isEqualTo("val1");
26+
assertThat(EnvironmentGetter.INSTANCE.get(carrier, "TRACESTATE")).isEqualTo("val2");
27+
assertThat(EnvironmentGetter.INSTANCE.get(carrier, "Baggage")).isEqualTo("val3");
28+
assertThat(EnvironmentGetter.INSTANCE.get(carrier, "other")).isEqualTo("val4");
29+
}
30+
31+
@Test
32+
void get_null() {
33+
assertThat(EnvironmentGetter.INSTANCE.get(null, "key")).isNull();
34+
assertThat(EnvironmentGetter.INSTANCE.get(Collections.emptyMap(), null)).isNull();
35+
}
36+
37+
@Test
38+
void keys() {
39+
Map<String, String> carrier = new HashMap<>();
40+
carrier.put("K1", "V1");
41+
carrier.put("K2", "V2");
42+
43+
assertThat(EnvironmentGetter.INSTANCE.keys(carrier)).containsExactlyInAnyOrder("K1", "K2");
44+
assertThat(EnvironmentGetter.INSTANCE.keys(null)).isEmpty();
45+
}
46+
47+
@Test
48+
void testToString() {
49+
assertThat(EnvironmentGetter.INSTANCE.toString()).isEqualTo("EnvironmentGetter");
50+
}
51+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.api.incubator.propagation;
7+
8+
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
9+
10+
import java.util.HashMap;
11+
import java.util.Map;
12+
import org.junit.jupiter.api.Test;
13+
14+
class EnvironmentSetterTest {
15+
16+
@Test
17+
void set() {
18+
Map<String, String> carrier = new HashMap<>();
19+
EnvironmentSetter.INSTANCE.set(carrier, "traceparent", "val1");
20+
EnvironmentSetter.INSTANCE.set(carrier, "TRACESTATE", "val2");
21+
EnvironmentSetter.INSTANCE.set(carrier, "Baggage", "val3");
22+
23+
assertThat(carrier).containsEntry("TRACEPARENT", "val1");
24+
assertThat(carrier).containsEntry("TRACESTATE", "val2");
25+
assertThat(carrier).containsEntry("BAGGAGE", "val3");
26+
}
27+
28+
@Test
29+
void set_null() {
30+
Map<String, String> carrier = new HashMap<>();
31+
EnvironmentSetter.INSTANCE.set(null, "key", "val");
32+
EnvironmentSetter.INSTANCE.set(carrier, null, "val");
33+
EnvironmentSetter.INSTANCE.set(carrier, "key", null);
34+
assertThat(carrier).isEmpty();
35+
}
36+
37+
@Test
38+
void testToString() {
39+
assertThat(EnvironmentSetter.INSTANCE.toString()).isEqualTo("EnvironmentSetter");
40+
}
41+
}

0 commit comments

Comments
 (0)