Skip to content

Commit e09cb51

Browse files
committed
propagate SourceKind across validation and policy creation
1 parent 93457ac commit e09cb51

11 files changed

Lines changed: 146 additions & 37 deletions

File tree

dynamic-control/src/main/java/io/opentelemetry/contrib/dynamic/policy/AbstractSourcePolicyValidator.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,50 +9,54 @@
99
import io.opentelemetry.contrib.dynamic.policy.source.JsonSourceWrapper;
1010
import io.opentelemetry.contrib.dynamic.policy.source.KeyValueSourceWrapper;
1111
import io.opentelemetry.contrib.dynamic.policy.source.SourceFormat;
12+
import io.opentelemetry.contrib.dynamic.policy.source.SourceKind;
1213
import io.opentelemetry.contrib.dynamic.policy.source.SourceWrapper;
14+
import java.util.Objects;
1315
import javax.annotation.Nullable;
1416

1517
/** Base validator with common source-dispatch and parse helpers. */
1618
public abstract class AbstractSourcePolicyValidator implements PolicyValidator {
1719

1820
@Override
1921
@Nullable
20-
public final TelemetryPolicy validate(SourceWrapper source) {
22+
public final TelemetryPolicy validate(SourceWrapper source, SourceKind sourceKind) {
2123
if (source == null) {
2224
return null;
2325
}
26+
Objects.requireNonNull(sourceKind, "sourceKind cannot be null");
2427
SourceFormat format = source.getFormat();
2528
switch (format) {
2629
case JSONKEYVALUE:
27-
return validateJsonSource(((JsonSourceWrapper) source).asJsonNode());
30+
return validateJsonSource(((JsonSourceWrapper) source).asJsonNode(), sourceKind);
2831
case KEYVALUE:
29-
return validateKeyValueSource((KeyValueSourceWrapper) source);
32+
return validateKeyValueSource((KeyValueSourceWrapper) source, sourceKind);
3033
}
3134
return null;
3235
}
3336

3437
@Nullable
35-
private TelemetryPolicy validateJsonSource(JsonNode node) {
38+
private TelemetryPolicy validateJsonSource(JsonNode node, SourceKind sourceKind) {
3639
JsonNode valueNode = node.get(getPolicyType());
3740
if (valueNode == null) {
3841
return null;
3942
}
40-
return validateJsonValue(valueNode);
43+
return validateJsonValue(valueNode, sourceKind);
4144
}
4245

4346
@Nullable
44-
private TelemetryPolicy validateKeyValueSource(KeyValueSourceWrapper source) {
47+
private TelemetryPolicy validateKeyValueSource(
48+
KeyValueSourceWrapper source, SourceKind sourceKind) {
4549
if (!getPolicyType().equals(source.getKey().trim())) {
4650
return null;
4751
}
48-
return validateKeyValueValue(source.getValue());
52+
return validateKeyValueValue(source.getValue(), sourceKind);
4953
}
5054

5155
@Nullable
52-
protected abstract TelemetryPolicy validateJsonValue(JsonNode valueNode);
56+
protected abstract TelemetryPolicy validateJsonValue(JsonNode valueNode, SourceKind sourceKind);
5357

5458
@Nullable
55-
protected abstract TelemetryPolicy validateKeyValueValue(String value);
59+
protected abstract TelemetryPolicy validateKeyValueValue(String value, SourceKind sourceKind);
5660

5761
@Nullable
5862
protected static Double parseDouble(JsonNode valueNode) {

dynamic-control/src/main/java/io/opentelemetry/contrib/dynamic/policy/LinePerPolicyFileProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.opentelemetry.contrib.dynamic.policy;
77

88
import io.opentelemetry.contrib.dynamic.policy.source.SourceFormat;
9+
import io.opentelemetry.contrib.dynamic.policy.source.SourceKind;
910
import io.opentelemetry.contrib.dynamic.policy.source.SourceWrapper;
1011
import java.io.IOException;
1112
import java.nio.file.Files;
@@ -85,7 +86,7 @@ public List<TelemetryPolicy> fetchPolicies() throws IOException {
8586
if (!policyType.equals(validator.getPolicyType())) {
8687
continue;
8788
}
88-
policy = validator.validate(parsedSource);
89+
policy = validator.validate(parsedSource, SourceKind.FILE);
8990
break;
9091
}
9192
if (policy == null) {

dynamic-control/src/main/java/io/opentelemetry/contrib/dynamic/policy/OpampPolicyProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.opentelemetry.contrib.dynamic.policy.source.JsonSourceWrapper;
1313
import io.opentelemetry.contrib.dynamic.policy.source.KeyValueSourceWrapper;
1414
import io.opentelemetry.contrib.dynamic.policy.source.SourceFormat;
15+
import io.opentelemetry.contrib.dynamic.policy.source.SourceKind;
1516
import io.opentelemetry.contrib.dynamic.policy.source.SourceWrapper;
1617
import io.opentelemetry.opamp.client.OpampClient;
1718
import io.opentelemetry.opamp.client.OpampClientBuilder;
@@ -279,7 +280,7 @@ private void parsePolicyText(String key, String policyText, List<TelemetryPolicy
279280
if (!mappedPolicyType.equals(validator.getPolicyType())) {
280281
continue;
281282
}
282-
TelemetryPolicy policy = validator.validate(normalizedSource);
283+
TelemetryPolicy policy = validator.validate(normalizedSource, SourceKind.OPAMP);
283284
if (policy != null) {
284285
out.add(policy);
285286
break;

dynamic-control/src/main/java/io/opentelemetry/contrib/dynamic/policy/PolicyValidator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,21 @@
55

66
package io.opentelemetry.contrib.dynamic.policy;
77

8+
import io.opentelemetry.contrib.dynamic.policy.source.SourceKind;
89
import io.opentelemetry.contrib.dynamic.policy.source.SourceWrapper;
910
import javax.annotation.Nullable;
1011

1112
public interface PolicyValidator {
1213
/**
13-
* Validates a parsed policy configuration source.
14+
* Validates a parsed policy configuration source from the supplied provider source kind.
1415
*
1516
* @param source parsed source wrapper containing the format and payload
17+
* @param sourceKind provider source kind that supplied the policy
1618
* @return The validated {@link TelemetryPolicy}, or {@code null} if the source does not contain a
1719
* valid policy for this validator.
1820
*/
1921
@Nullable
20-
TelemetryPolicy validate(SourceWrapper source);
22+
TelemetryPolicy validate(SourceWrapper source, SourceKind sourceKind);
2123

2224
/**
2325
* Returns the type of the policy this validator handles.

dynamic-control/src/main/java/io/opentelemetry/contrib/dynamic/policy/tracesampling/TraceSamplingValidator.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.fasterxml.jackson.databind.JsonNode;
99
import io.opentelemetry.contrib.dynamic.policy.AbstractSourcePolicyValidator;
1010
import io.opentelemetry.contrib.dynamic.policy.TelemetryPolicy;
11+
import io.opentelemetry.contrib.dynamic.policy.source.SourceKind;
1112
import java.util.logging.Logger;
1213
import javax.annotation.Nullable;
1314

@@ -26,7 +27,7 @@ public String getPolicyType() {
2627

2728
@Override
2829
@Nullable
29-
protected TelemetryPolicy validateJsonValue(JsonNode valueNode) {
30+
protected TelemetryPolicy validateJsonValue(JsonNode valueNode, SourceKind sourceKind) {
3031
JsonNode probabilityNode = valueNode;
3132
if (valueNode.isObject()) {
3233
probabilityNode = valueNode.get("probability");
@@ -38,23 +39,23 @@ protected TelemetryPolicy validateJsonValue(JsonNode valueNode) {
3839
if (probability == null) {
3940
return null;
4041
}
41-
return createPolicy(probability);
42+
return createPolicy(probability, sourceKind);
4243
}
4344

4445
@Override
4546
@Nullable
46-
protected TelemetryPolicy validateKeyValueValue(String value) {
47+
protected TelemetryPolicy validateKeyValueValue(String value, SourceKind sourceKind) {
4748
Double probability = parseDouble(value);
4849
if (probability == null) {
4950
return null;
5051
}
51-
return createPolicy(probability);
52+
return createPolicy(probability, sourceKind);
5253
}
5354

5455
@Nullable
55-
private static TelemetryPolicy createPolicy(double probability) {
56+
private static TelemetryPolicy createPolicy(double probability, SourceKind sourceKind) {
5657
try {
57-
return new TraceSamplingRatePolicy(probability);
58+
return new TraceSamplingRatePolicy(probability, sourceKind);
5859
} catch (IllegalArgumentException e) {
5960
logger.info(
6061
"Invalid trace-sampling probability '"

dynamic-control/src/test/java/io/opentelemetry/contrib/dynamic/policy/DeletedTelemetryPolicyTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import static org.assertj.core.api.Assertions.assertThat;
99

10+
import io.opentelemetry.contrib.dynamic.policy.source.SourceKind;
1011
import org.junit.jupiter.api.Test;
1112

1213
class DeletedTelemetryPolicyTest {
@@ -19,9 +20,22 @@ void storesIdentityTypeAndDeletedState() {
1920

2021
assertThat(policy.getIdentity()).isEqualTo(identity);
2122
assertThat(policy.getType()).isEqualTo("trace-sampling");
23+
assertThat(policy.getSourceKind()).isEqualTo(SourceKind.CUSTOM);
2224
assertThat(policy.isDeleted()).isTrue();
2325
}
2426

27+
@Test
28+
void storesExplicitSourceKind() {
29+
TelemetryPolicyIdentity identity =
30+
new TelemetryPolicyIdentity("trace-sampling", "Trace sampling rate");
31+
DeletedTelemetryPolicy policy =
32+
new DeletedTelemetryPolicy(identity, "trace-sampling", SourceKind.OPAMP);
33+
34+
assertThat(policy.getIdentity()).isEqualTo(identity);
35+
assertThat(policy.getType()).isEqualTo("trace-sampling");
36+
assertThat(policy.getSourceKind()).isEqualTo(SourceKind.OPAMP);
37+
}
38+
2539
@Test
2640
void ordinaryTelemetryPolicyIsNotDeleted() {
2741
assertThat(new TestTelemetryPolicy("trace-sampling").isDeleted()).isFalse();
@@ -30,10 +44,16 @@ void ordinaryTelemetryPolicyIsNotDeleted() {
3044
private static final class TestTelemetryPolicy implements TelemetryPolicy {
3145
private final TelemetryPolicyIdentity identity;
3246
private final String type;
47+
private final SourceKind sourceKind;
3348

3449
private TestTelemetryPolicy(String type) {
50+
this(type, SourceKind.CUSTOM);
51+
}
52+
53+
private TestTelemetryPolicy(String type, SourceKind sourceKind) {
3554
this.identity = new TelemetryPolicyIdentity(type, "Test policy");
3655
this.type = type;
56+
this.sourceKind = sourceKind;
3757
}
3858

3959
@Override
@@ -45,5 +65,10 @@ public TelemetryPolicyIdentity getIdentity() {
4565
public String getType() {
4666
return type;
4767
}
68+
69+
@Override
70+
public SourceKind getSourceKind() {
71+
return sourceKind;
72+
}
4873
}
4974
}

dynamic-control/src/test/java/io/opentelemetry/contrib/dynamic/policy/LinePerPolicyFileProviderTest.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import static org.assertj.core.api.Assertions.assertThat;
99

1010
import io.opentelemetry.contrib.dynamic.policy.source.SourceFormat;
11+
import io.opentelemetry.contrib.dynamic.policy.source.SourceKind;
1112
import io.opentelemetry.contrib.dynamic.policy.source.SourceWrapper;
1213
import io.opentelemetry.contrib.dynamic.policy.tracesampling.TraceSamplingRatePolicy;
1314
import java.io.IOException;
@@ -46,6 +47,7 @@ void fetchPoliciesParsesJsonLines() throws Exception {
4647

4748
assertThat(policies).hasSize(1);
4849
assertThat(policies.get(0).getType()).isEqualTo(TRACE_SAMPLING_TYPE);
50+
assertThat(policies.get(0).getSourceKind()).isEqualTo(SourceKind.FILE);
4951
}
5052

5153
@Test
@@ -58,6 +60,7 @@ void fetchPoliciesParsesKeyValueLines() throws Exception {
5860

5961
assertThat(policies).hasSize(1);
6062
assertThat(policies.get(0).getType()).isEqualTo(TRACE_SAMPLING_TYPE);
63+
assertThat(policies.get(0).getSourceKind()).isEqualTo(SourceKind.FILE);
6164
}
6265

6366
@Test
@@ -110,35 +113,38 @@ public String getPolicyType() {
110113
}
111114

112115
@Override
113-
public TelemetryPolicy validate(SourceWrapper source) {
116+
public TelemetryPolicy validate(SourceWrapper source, SourceKind sourceKind) {
114117
if (source.getFormat() == SourceFormat.JSONKEYVALUE) {
115118
if (!acceptJson) {
116119
return null;
117120
}
118-
return testPolicy();
121+
return testPolicy(sourceKind);
119122
}
120123
if (source.getFormat() == SourceFormat.KEYVALUE) {
121124
if (!acceptKeyValue) {
122125
return null;
123126
}
124-
return testPolicy();
127+
return testPolicy(sourceKind);
125128
}
126129
return null;
127130
}
128131
}
129132

130-
private static TelemetryPolicy testPolicy() {
133+
private static TelemetryPolicy testPolicy(SourceKind sourceKind) {
131134
return new TestTelemetryPolicy(
132-
new TelemetryPolicyIdentity("test-policy", "Test policy"), TRACE_SAMPLING_TYPE);
135+
new TelemetryPolicyIdentity("test-policy", "Test policy"), TRACE_SAMPLING_TYPE, sourceKind);
133136
}
134137

135138
private static final class TestTelemetryPolicy implements TelemetryPolicy {
136139
private final TelemetryPolicyIdentity identity;
137140
private final String type;
141+
private final SourceKind sourceKind;
138142

139-
private TestTelemetryPolicy(TelemetryPolicyIdentity identity, String type) {
143+
private TestTelemetryPolicy(
144+
TelemetryPolicyIdentity identity, String type, SourceKind sourceKind) {
140145
this.identity = identity;
141146
this.type = type;
147+
this.sourceKind = sourceKind;
142148
}
143149

144150
@Override
@@ -150,5 +156,10 @@ public TelemetryPolicyIdentity getIdentity() {
150156
public String getType() {
151157
return type;
152158
}
159+
160+
@Override
161+
public SourceKind getSourceKind() {
162+
return sourceKind;
163+
}
153164
}
154165
}

dynamic-control/src/test/java/io/opentelemetry/contrib/dynamic/policy/registry/PolicyInitTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import io.opentelemetry.contrib.dynamic.policy.PolicyImplementer;
1717
import io.opentelemetry.contrib.dynamic.policy.TelemetryPolicy;
1818
import io.opentelemetry.contrib.dynamic.policy.TelemetryPolicyIdentity;
19+
import io.opentelemetry.contrib.dynamic.policy.source.SourceKind;
1920
import io.opentelemetry.contrib.dynamic.policy.tracesampling.TraceSamplingRatePolicy;
2021
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
2122
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
@@ -164,6 +165,15 @@ private static String minimalJsonInitConfig() {
164165
private static final class IdempotentTestPolicy implements TelemetryPolicy {
165166
private static final TelemetryPolicyIdentity IDENTITY =
166167
new TelemetryPolicyIdentity("test-policy-idempotent", "Test policy idempotent");
168+
private final SourceKind sourceKind;
169+
170+
private IdempotentTestPolicy() {
171+
this(SourceKind.CUSTOM);
172+
}
173+
174+
private IdempotentTestPolicy(SourceKind sourceKind) {
175+
this.sourceKind = sourceKind;
176+
}
167177

168178
@Override
169179
public TelemetryPolicyIdentity getIdentity() {
@@ -174,5 +184,10 @@ public TelemetryPolicyIdentity getIdentity() {
174184
public String getType() {
175185
return "test-policy-idempotent";
176186
}
187+
188+
@Override
189+
public SourceKind getSourceKind() {
190+
return sourceKind;
191+
}
177192
}
178193
}

dynamic-control/src/test/java/io/opentelemetry/contrib/dynamic/policy/tracesampling/TraceSamplingRatePolicyImplementerTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.opentelemetry.contrib.dynamic.policy.DeletedTelemetryPolicy;
1515
import io.opentelemetry.contrib.dynamic.policy.TelemetryPolicy;
1616
import io.opentelemetry.contrib.dynamic.policy.TelemetryPolicyIdentity;
17+
import io.opentelemetry.contrib.dynamic.policy.source.SourceKind;
1718
import io.opentelemetry.sdk.trace.samplers.Sampler;
1819
import io.opentelemetry.sdk.trace.samplers.SamplingDecision;
1920
import io.opentelemetry.sdk.trace.samplers.SamplingResult;
@@ -89,10 +90,16 @@ private static SamplingDecision decisionFor(DelegatingSampler sampler) {
8990
private static final class TestTelemetryPolicy implements TelemetryPolicy {
9091
private final TelemetryPolicyIdentity identity;
9192
private final String type;
93+
private final SourceKind sourceKind;
9294

9395
private TestTelemetryPolicy(String type) {
96+
this(type, SourceKind.CUSTOM);
97+
}
98+
99+
private TestTelemetryPolicy(String type, SourceKind sourceKind) {
94100
this.identity = new TelemetryPolicyIdentity(type, "Test policy");
95101
this.type = type;
102+
this.sourceKind = sourceKind;
96103
}
97104

98105
@Override
@@ -104,5 +111,10 @@ public TelemetryPolicyIdentity getIdentity() {
104111
public String getType() {
105112
return type;
106113
}
114+
115+
@Override
116+
public SourceKind getSourceKind() {
117+
return sourceKind;
118+
}
107119
}
108120
}

0 commit comments

Comments
 (0)