Skip to content

Commit 4708bfc

Browse files
committed
refactor and tests for deserializer
1 parent c3a0119 commit 4708bfc

File tree

37 files changed

+465
-99
lines changed

37 files changed

+465
-99
lines changed

docs/instrumentation-list.yaml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -991,14 +991,6 @@ libraries:
991991
type: STRING
992992
- name: user_agent.original
993993
type: STRING
994-
- name: aws-lambda-events-3.11
995-
source_path: instrumentation/aws-lambda/aws-lambda-events-3.11
996-
scope:
997-
name: io.opentelemetry.aws-lambda-events-3.11
998-
target_versions:
999-
library:
1000-
- com.amazonaws:aws-lambda-java-events:3.11.0
1001-
- com.amazonaws:aws-lambda-java-core:1.0.0
1002994
- name: aws-sdk-1.11
1003995
description: |
1004996
This instrumentation covers the AWS SDK 1.11+ client library, enabling messaging and client spans and metrics for calls to AWS services including DynamoDB, EC2, Kinesis, Lambda, RDS, S3, secrets manager, SNS/SQS and step functions.

instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/DocGeneratorApplication.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ public static void main(String[] args) throws IOException {
4949
printStats(modules);
5050
}
5151

52-
@SuppressWarnings("unused") // temporary helper method used for project tracking
5352
private static void printStats(List<InstrumentationModule> modules) {
5453
List<InstrumentationModule> metadata =
5554
modules.stream().filter(m -> m.getMetadata() != null).toList();

instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationAnalyzer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import com.fasterxml.jackson.core.JsonProcessingException;
99
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
1010
import com.fasterxml.jackson.databind.exc.ValueInstantiationException;
11-
import io.opentelemetry.instrumentation.docs.internal.InstrumentationMetaData;
11+
import io.opentelemetry.instrumentation.docs.internal.InstrumentationMetadata;
1212
import io.opentelemetry.instrumentation.docs.internal.InstrumentationModule;
1313
import io.opentelemetry.instrumentation.docs.internal.InstrumentationType;
1414
import io.opentelemetry.instrumentation.docs.parsers.GradleParser;
@@ -58,7 +58,7 @@ public List<InstrumentationModule> analyze() throws IOException {
5858
}
5959

6060
private void enrichModule(InstrumentationModule module) throws IOException {
61-
InstrumentationMetaData metaData = getMetadata(module);
61+
InstrumentationMetadata metaData = getMetadata(module);
6262
if (metaData != null) {
6363
module.setMetadata(metaData);
6464
}
@@ -69,7 +69,7 @@ private void enrichModule(InstrumentationModule module) throws IOException {
6969
}
7070

7171
@Nullable
72-
private InstrumentationMetaData getMetadata(InstrumentationModule module)
72+
private InstrumentationMetadata getMetadata(InstrumentationModule module)
7373
throws JsonProcessingException {
7474
String metadataFile = fileManager.getMetaDataFile(module.getSrcPath());
7575
if (metadataFile == null) {
Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
* Represents the data in a metadata.yaml file. This class is internal and is hence not for public
1818
* use. Its APIs are unstable and can change at any time.
1919
*/
20-
public class InstrumentationMetaData {
20+
public class InstrumentationMetadata {
2121
@Nullable private String description;
2222

2323
@JsonProperty("disabled_by_default")
@@ -28,11 +28,11 @@ public class InstrumentationMetaData {
2828

2929
private List<ConfigurationOption> configurations = emptyList();
3030

31-
public InstrumentationMetaData() {
31+
public InstrumentationMetadata() {
3232
this.classifications = singletonList(InstrumentationClassification.LIBRARY.name());
3333
}
3434

35-
public InstrumentationMetaData(
35+
public InstrumentationMetadata(
3636
@Nullable String description,
3737
@Nullable List<String> classifications,
3838
@Nullable Boolean disabledByDefault,
@@ -54,7 +54,17 @@ public List<InstrumentationClassification> getClassifications() {
5454
if (classifications == null || classifications.isEmpty()) {
5555
return singletonList(InstrumentationClassification.LIBRARY);
5656
}
57-
return classifications.stream().map(InstrumentationClassification::fromString).toList();
57+
return classifications.stream()
58+
.map(
59+
classification -> {
60+
InstrumentationClassification result =
61+
InstrumentationClassification.fromString(classification);
62+
if (result == null) {
63+
throw new IllegalArgumentException("Invalid classification: " + classification);
64+
}
65+
return result;
66+
})
67+
.toList();
5868
}
5969

6070
public Boolean getDisabledByDefault() {
Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.opentelemetry.instrumentation.docs.internal;
77

88
import static java.util.Collections.emptyList;
9+
import static java.util.Collections.singletonList;
910
import static java.util.Collections.unmodifiableList;
1011

1112
import com.fasterxml.jackson.core.JsonParser;
@@ -15,19 +16,18 @@
1516
import java.io.IOException;
1617
import java.util.ArrayList;
1718
import java.util.List;
18-
import java.util.Locale;
1919
import java.util.Objects;
2020
import javax.annotation.Nullable;
2121

2222
/**
2323
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
2424
* any time.
2525
*/
26-
public final class InstrumentationMetaDataDeserializer
27-
extends JsonDeserializer<InstrumentationMetaData> {
26+
public final class InstrumentationMetadataDeserializer
27+
extends JsonDeserializer<InstrumentationMetadata> {
2828

2929
@Override
30-
public InstrumentationMetaData deserialize(JsonParser p, DeserializationContext ctx)
30+
public InstrumentationMetadata deserialize(JsonParser p, DeserializationContext ctx)
3131
throws IOException {
3232
JsonNode node = p.getCodec().readTree(p);
3333

@@ -37,7 +37,7 @@ public InstrumentationMetaData deserialize(JsonParser p, DeserializationContext
3737
List<String> classifications = readClassifications(node.path("classification"));
3838
List<ConfigurationOption> configurations = readConfigurations(node.path("configurations"));
3939

40-
return new InstrumentationMetaData(
40+
return new InstrumentationMetadata(
4141
description, classifications, disabledByDefault, configurations);
4242
}
4343

@@ -55,46 +55,60 @@ private static Boolean boolOrNull(JsonNode parent, String field) {
5555

5656
private static List<String> readClassifications(JsonNode node) {
5757
if (node.isMissingNode() || node.isNull()) {
58-
return List.of(InstrumentationClassification.LIBRARY.name());
58+
return singletonList(InstrumentationClassification.LIBRARY.name());
5959
}
60-
List<String> out = new ArrayList<>();
61-
if (node.isArray()) {
62-
for (JsonNode c : node) {
63-
if (c.isTextual()) {
64-
out.add(c.asText());
65-
}
60+
if (!node.isArray()) {
61+
throw new IllegalArgumentException("Classification must be an array");
62+
}
63+
List<String> result = new ArrayList<>();
64+
for (JsonNode c : node) {
65+
if (c.isTextual()) {
66+
result.add(c.asText());
6667
}
67-
} else if (node.isTextual()) {
68-
out.add(node.asText());
6968
}
70-
if (out.isEmpty()) {
71-
out.add(InstrumentationClassification.LIBRARY.name());
69+
if (result.isEmpty()) {
70+
result.add(InstrumentationClassification.LIBRARY.name());
7271
}
73-
return unmodifiableList(out);
72+
return unmodifiableList(result);
7473
}
7574

7675
private static List<ConfigurationOption> readConfigurations(JsonNode configs) {
77-
if (!configs.isArray()) {
76+
if (!configs.isArray() || configs.size() == 0) {
7877
return emptyList();
7978
}
80-
List<ConfigurationOption> out = new ArrayList<>(configs.size());
81-
int i = 0;
79+
List<ConfigurationOption> configurationOptions = new ArrayList<>(configs.size());
8280
for (JsonNode cfg : configs) {
83-
String name = Objects.requireNonNull(textOrNull(cfg, "name"));
84-
String desc = Objects.requireNonNull(textOrNull(cfg, "description"));
85-
String def = Objects.requireNonNull(textOrNull(cfg, "default"));
86-
String typeStr = Objects.requireNonNull(textOrNull(cfg, "type"));
81+
if (cfg.isNull() || !cfg.isObject()) {
82+
throw new IllegalArgumentException("Configuration entry must be an object");
83+
}
84+
85+
String name = textOrNull(cfg, "name");
86+
if (name == null) {
87+
throw new IllegalArgumentException("Configuration entry is missing required 'name' field");
88+
}
89+
90+
String desc =
91+
Objects.requireNonNull(
92+
textOrNull(cfg, "description"),
93+
"Configuration '" + name + "' is missing required 'description' field");
94+
String def =
95+
Objects.requireNonNull(
96+
textOrNull(cfg, "default"),
97+
"Configuration '" + name + "' is missing required 'default' field");
98+
String typeStr =
99+
Objects.requireNonNull(
100+
textOrNull(cfg, "type"),
101+
"Configuration '" + name + "' is missing required 'type' field");
87102

88103
ConfigurationType type;
89104
try {
90-
type = ConfigurationType.valueOf(typeStr.toUpperCase(Locale.ROOT));
105+
type = ConfigurationType.from(typeStr);
91106
} catch (IllegalArgumentException ex) {
92107
throw new IllegalArgumentException(
93-
"configurations[" + i + "].type invalid: '" + typeStr + "'", ex);
108+
"Configuration '" + name + "' has invalid type: '" + typeStr + "'", ex);
94109
}
95-
out.add(new ConfigurationOption(name, desc, def, type));
96-
i++;
110+
configurationOptions.add(new ConfigurationOption(name, desc, def, type));
97111
}
98-
return unmodifiableList(out);
112+
return unmodifiableList(configurationOptions);
99113
}
100114
}

instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/internal/InstrumentationModule.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class InstrumentationModule {
3535

3636
@Nullable private Integer minJavaVersion;
3737

38-
@Nullable private InstrumentationMetaData metadata;
38+
@Nullable private InstrumentationMetadata metadata;
3939

4040
/**
4141
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
@@ -79,9 +79,9 @@ public InstrumentationScopeInfo getScopeInfo() {
7979
return scopeInfo;
8080
}
8181

82-
public InstrumentationMetaData getMetadata() {
82+
public InstrumentationMetadata getMetadata() {
8383
if (metadata == null) {
84-
metadata = new InstrumentationMetaData();
84+
metadata = new InstrumentationMetadata();
8585
}
8686

8787
return metadata;
@@ -109,7 +109,7 @@ public void setTargetVersions(Map<InstrumentationType, Set<String>> targetVersio
109109
this.targetVersions = targetVersions;
110110
}
111111

112-
public void setMetadata(InstrumentationMetaData metadata) {
112+
public void setMetadata(InstrumentationMetadata metadata) {
113113
this.metadata = metadata;
114114
}
115115

@@ -135,7 +135,7 @@ public static class Builder {
135135
@Nullable private String namespace;
136136
@Nullable private String group;
137137
@Nullable private Integer minJavaVersion;
138-
@Nullable private InstrumentationMetaData metadata;
138+
@Nullable private InstrumentationMetadata metadata;
139139
@Nullable private Map<InstrumentationType, Set<String>> targetVersions;
140140
@Nullable private Map<String, List<EmittedMetrics.Metric>> metrics;
141141
@Nullable private Map<String, List<EmittedSpans.Span>> spans;
@@ -171,7 +171,7 @@ public Builder group(String group) {
171171
}
172172

173173
@CanIgnoreReturnValue
174-
public Builder metadata(InstrumentationMetaData metadata) {
174+
public Builder metadata(InstrumentationMetadata metadata) {
175175
this.metadata = metadata;
176176
return this;
177177
}

instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/YamlHelper.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
import io.opentelemetry.instrumentation.docs.internal.EmittedMetrics;
1515
import io.opentelemetry.instrumentation.docs.internal.EmittedSpans;
1616
import io.opentelemetry.instrumentation.docs.internal.InstrumentationClassification;
17-
import io.opentelemetry.instrumentation.docs.internal.InstrumentationMetaData;
18-
import io.opentelemetry.instrumentation.docs.internal.InstrumentationMetaDataDeserializer;
17+
import io.opentelemetry.instrumentation.docs.internal.InstrumentationMetadata;
18+
import io.opentelemetry.instrumentation.docs.internal.InstrumentationMetadataDeserializer;
1919
import io.opentelemetry.instrumentation.docs.internal.InstrumentationModule;
2020
import io.opentelemetry.instrumentation.docs.internal.TelemetryAttribute;
2121
import java.io.BufferedWriter;
@@ -47,7 +47,7 @@ public class YamlHelper {
4747
mapper = new ObjectMapper(new YAMLFactory());
4848
SimpleModule module = new SimpleModule();
4949
module.addDeserializer(
50-
InstrumentationMetaData.class, new InstrumentationMetaDataDeserializer());
50+
InstrumentationMetadata.class, new InstrumentationMetadataDeserializer());
5151
mapper.registerModule(module);
5252
}
5353

@@ -311,9 +311,9 @@ private static Map<String, Object> getSpanMap(EmittedSpans.Span span) {
311311
return innerMetricMap;
312312
}
313313

314-
public static InstrumentationMetaData metaDataParser(String input)
314+
public static InstrumentationMetadata metaDataParser(String input)
315315
throws JsonProcessingException {
316-
return mapper.readValue(input, InstrumentationMetaData.class);
316+
return mapper.readValue(input, InstrumentationMetadata.class);
317317
}
318318

319319
public static EmittedMetrics emittedMetricsParser(String input) throws JsonProcessingException {

0 commit comments

Comments
 (0)