Skip to content

Commit 2191572

Browse files
authored
Merge pull request #58 from cisco-open/JSONInputSupport/feature/master
Add JSON support for input definition files
2 parents 235391e + cff7909 commit 2191572

File tree

9 files changed

+924
-8
lines changed

9 files changed

+924
-8
lines changed

example-definitions/qa/trace-definition.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ rootSpans:
2424
url: 'roundRobin(["/healthcheck"])'
2525
payloadCount: 20
2626
copyCount: 10
27-
payloadFrequencySeconds: 5
27+
payloadFrequencySeconds: 15
2828
- name: "searchAccountsRequest"
2929
spanKind: SPAN_KIND_SERVER
3030
reportingResource: request

src/main/java/io/opentelemetry/contrib/generator/telemetry/dto/GeneratorInput.java

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public class GeneratorInput {
5353
@Getter
5454
private final boolean hasTraces;
5555
private final boolean loadYAMLs;
56+
private final boolean loadJSONs;
5657

5758
private GeneratorInput(YAMLFilesBuilder yamlFilesBuilder) {
5859
this.entityDefinitionYAML = yamlFilesBuilder.entityDefinitionYAML;
@@ -63,6 +64,19 @@ private GeneratorInput(YAMLFilesBuilder yamlFilesBuilder) {
6364
hasLogs = !StringUtils.defaultString(logDefinitionYAML).trim().isBlank();
6465
hasTraces = !StringUtils.defaultString(traceDefinitionYAML).trim().isBlank();
6566
loadYAMLs = true;
67+
loadJSONs = false;
68+
}
69+
70+
private GeneratorInput(JSONFilesBuilder jsonFilesBuilder) {
71+
this.entityDefinitionYAML = jsonFilesBuilder.entityDefinitionJSON;
72+
this.metricDefinitionYAML = jsonFilesBuilder.metricDefinitionJSON;
73+
this.logDefinitionYAML = jsonFilesBuilder.logDefinitionJSON;
74+
this.traceDefinitionYAML = jsonFilesBuilder.traceDefinitionJSON;
75+
hasMetrics = !StringUtils.defaultString(metricDefinitionYAML).trim().isBlank();
76+
hasLogs = !StringUtils.defaultString(logDefinitionYAML).trim().isBlank();
77+
hasTraces = !StringUtils.defaultString(traceDefinitionYAML).trim().isBlank();
78+
loadYAMLs = false;
79+
loadJSONs = true;
6680
}
6781

6882
private GeneratorInput(DTOBuilder dtoBuilder) {
@@ -74,6 +88,7 @@ private GeneratorInput(DTOBuilder dtoBuilder) {
7488
hasLogs = logDefinitions != null;
7589
hasTraces = traceDefinitions != null;
7690
loadYAMLs = false;
91+
loadJSONs = false;
7792
}
7893

7994
public static YAMLFilesBuilder builder(String entityDefinitionYAML) {
@@ -114,6 +129,36 @@ public GeneratorInput build() {
114129
}
115130
}
116131

132+
public static final class JSONFilesBuilder {
133+
private final String entityDefinitionJSON;
134+
private String metricDefinitionJSON;
135+
private String logDefinitionJSON;
136+
private String traceDefinitionJSON;
137+
138+
public JSONFilesBuilder(String entityDefinitionJSON ) {
139+
this.entityDefinitionJSON = entityDefinitionJSON;
140+
}
141+
142+
public JSONFilesBuilder withMetricDefinitionYAML(String metricDefinitionYAML) {
143+
this.metricDefinitionJSON = metricDefinitionYAML;
144+
return this;
145+
}
146+
147+
public JSONFilesBuilder withLogDefinitionYAML(String logDefinitionYAML) {
148+
this.logDefinitionJSON = logDefinitionYAML;
149+
return this;
150+
}
151+
152+
public JSONFilesBuilder withTraceDefinitionYAML(String traceDefinitionYAML) {
153+
this.traceDefinitionJSON = traceDefinitionYAML;
154+
return this;
155+
}
156+
157+
public GeneratorInput build() {
158+
return new GeneratorInput(this);
159+
}
160+
}
161+
117162
public static final class DTOBuilder {
118163
private final Entities entityDefinitions;
119164
private Metrics metricDefinitions;
@@ -165,6 +210,9 @@ public void checkPreconditions() {
165210
if (loadYAMLs) {
166211
loadYAMLFiles();
167212
}
213+
if(loadJSONs) {
214+
loadJSONFiles();
215+
}
168216
}
169217

170218
private void loadYAMLFiles() {
@@ -176,20 +224,29 @@ private void loadYAMLFiles() {
176224
}
177225
}
178226

179-
private void setDTOs(ObjectMapper yamlMapper) throws IOException {
227+
private void loadJSONFiles() {
228+
var jsonMapper = new ObjectMapper();
229+
try {
230+
setDTOs(jsonMapper);
231+
} catch (IOException ioException) {
232+
throw new GeneratorException("Exception occurred while loading JSON files due to " + ioException.getMessage());
233+
}
234+
}
235+
236+
private void setDTOs(ObjectMapper fileMapper) throws IOException {
180237
File entitiesYAML = validateFile(entityDefinitionYAML);
181-
entityDefinitions = yamlMapper.readValue(entitiesYAML, Entities.class);
238+
entityDefinitions = fileMapper.readValue(entitiesYAML, Entities.class);
182239
if (hasMetrics) {
183240
File metricsYAML = validateFile(metricDefinitionYAML);
184-
metricDefinitions = yamlMapper.readValue(metricsYAML, Metrics.class);
241+
metricDefinitions = fileMapper.readValue(metricsYAML, Metrics.class);
185242
}
186243
if (hasLogs) {
187244
File logsYAML = validateFile(logDefinitionYAML);
188-
logDefinitions = yamlMapper.readValue(logsYAML, Logs.class);
245+
logDefinitions = fileMapper.readValue(logsYAML, Logs.class);
189246
}
190247
if (hasTraces) {
191248
File tracesYAML = validateFile(traceDefinitionYAML);
192-
traceDefinitions = yamlMapper.readValue(tracesYAML, Traces.class);
249+
traceDefinitions = fileMapper.readValue(tracesYAML, Traces.class);
193250
}
194251
}
195252

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package io.opentelemetry.contrib.generator.telemetry;
2+
3+
import io.opentelemetry.contrib.generator.telemetry.dto.GeneratorInput;
4+
import io.opentelemetry.contrib.generator.telemetry.helpers.TestPayloadHandler;
5+
import io.opentelemetry.contrib.generator.telemetry.transport.PayloadHandler;
6+
import io.opentelemetry.contrib.generator.telemetry.transport.TransportStorage;
7+
import io.opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest;
8+
import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest;
9+
import org.testng.Assert;
10+
import org.testng.annotations.BeforeClass;
11+
import org.testng.annotations.Test;
12+
13+
import java.nio.file.Paths;
14+
import java.util.HashMap;
15+
import java.util.List;
16+
import java.util.Map;
17+
import java.util.Set;
18+
19+
public class TestAllGeneratorsWithJSONInput {
20+
private final String ENTITIES_JSON = Paths.get(System.getProperty("user.dir"), "src", "test", "resources",
21+
"test-definitions", "entity-definition.json").toString();
22+
private final String METRICS_JSON = Paths.get(System.getProperty("user.dir"), "src", "test", "resources",
23+
"test-definitions", "metrics-test.json").toString();
24+
private final String LOGS_JSON = Paths.get(System.getProperty("user.dir"), "src", "test", "resources",
25+
"test-definitions", "logs-test-combined.json").toString();
26+
private final String TRACES_JSON = Paths.get(System.getProperty("user.dir"), "src", "test", "resources",
27+
"test-definitions", "trace-definition.json").toString();
28+
private final PayloadHandler payloadStore = new TestPayloadHandler();
29+
private TestPayloadHandler testStore;
30+
private TransportStorage transportStorage;
31+
32+
@BeforeClass
33+
public void generateData() {
34+
GeneratorInput generatorInput = new GeneratorInput.JSONFilesBuilder(ENTITIES_JSON)
35+
.withMetricDefinitionYAML(METRICS_JSON)
36+
.withLogDefinitionYAML(LOGS_JSON)
37+
.withTraceDefinitionYAML(TRACES_JSON)
38+
.build();
39+
TelemetryGenerator telemetryGenerator = new TelemetryGenerator(generatorInput, payloadStore, true);
40+
telemetryGenerator.runGenerator();
41+
testStore = (TestPayloadHandler) payloadStore;
42+
transportStorage = telemetryGenerator.getTransportStorage();
43+
}
44+
45+
@Test
46+
public void validatePacketCounts() {
47+
int NETWORK_INTERFACE_COUNT = 120;
48+
int CONTAINER_COUNT = 150;
49+
int MACHINE_COUNT = 80;
50+
int NODE_COUNT = 25;
51+
int POD_COUNT = 75;
52+
int DISK_COUNT = 100;
53+
int AWS_RDS_COUNT = 50;
54+
int AWS_EBS_COUNT = 50;
55+
int METRIC_REPORTING_ENTITIES_COUNT = NETWORK_INTERFACE_COUNT + CONTAINER_COUNT + MACHINE_COUNT + NODE_COUNT +
56+
POD_COUNT + DISK_COUNT + AWS_EBS_COUNT + AWS_RDS_COUNT;
57+
int LOG_REPORTING_ENTITIES_COUNT = CONTAINER_COUNT + NODE_COUNT + 2 * POD_COUNT + MACHINE_COUNT;
58+
int metricPayloadCount = 10;
59+
int logsPayloadCount = 20;
60+
int expectedMetricPackets = METRIC_REPORTING_ENTITIES_COUNT * metricPayloadCount;
61+
int expectedLogsPackets = LOG_REPORTING_ENTITIES_COUNT * logsPayloadCount;
62+
int expectedSpanPackets = 11518;
63+
Assert.assertEquals(testStore.getMetricsPacketCount(), expectedMetricPackets, "Mismatch in expected metric packets count");
64+
Assert.assertEquals(testStore.getLogsPacketCount(), expectedLogsPackets, "Mismatch in expected log packets count");
65+
Assert.assertEquals(testStore.getTracePacketCount(), expectedSpanPackets, "Mismatch in expected span packets count");
66+
}
67+
68+
@Test
69+
public void validateStorageCounts() {
70+
Assert.assertEquals(transportStorage.getStoredMetricsPayloads().size(), 8,
71+
"Mismatch in entity type counts for metric payloads");
72+
Assert.assertEquals(transportStorage.getStoredLogsPayloads().size(), 3,
73+
"Mismatch in entity type counts for log payloads");
74+
Assert.assertEquals(transportStorage.getStoredLogsPayloads().get("log_by_ttg_0").size(), 3,
75+
"Mismatch in entity type counts for log payloads");
76+
Assert.assertEquals(transportStorage.getStoredLogsPayloads().get("log_by_ttg_0").get("pod").size(), 20,
77+
"Mismatch in entity type counts for log payloads");
78+
Assert.assertEquals(transportStorage.getStoredTracesPayloads().size(), 8,
79+
"Mismatch in entity type counts for trace payloads");
80+
Assert.assertEquals(transportStorage.getMetricsResponses().size(), 8,
81+
"Mismatch in entity type counts for metric response statuses");
82+
Assert.assertEquals(transportStorage.getLogsResponses().size(), 3,
83+
"Mismatch in entity type counts for log response statuses");
84+
Assert.assertEquals(transportStorage.getTracesResponses().size(), 8,
85+
"Mismatch in entity type counts for trace response statuses");
86+
for (Map.Entry<String, List<ExportMetricsServiceRequest>> metricCounts: transportStorage.getStoredMetricsPayloads().entrySet()) {
87+
Assert.assertEquals(metricCounts.getValue().size(), 10, "Expected 10 metric payloads for entity type: " +
88+
metricCounts.getKey());
89+
Assert.assertEquals(transportStorage.getMetricsResponses().get(metricCounts.getKey()).size(), 10,
90+
"Expected 10 metric response statuses for entity type: " + metricCounts.getKey());
91+
}
92+
93+
for (Map.Entry<String, Map<String, List<ExportLogsServiceRequest>>> logCounts: transportStorage.getStoredLogsPayloads().entrySet()) {
94+
Set<String> entityNames = logCounts.getValue().keySet();
95+
for(String name : entityNames){
96+
Assert.assertEquals(logCounts.getValue().get(name).size(), 20, "Expected 20 log payloads for entity type: " +
97+
logCounts.getKey());
98+
Assert.assertEquals(transportStorage.getLogsResponses().get(logCounts.getKey()).get(name).size(), 20,
99+
"Expected 20 log response statuses for " + "log:entity key: " + logCounts.getKey());
100+
}
101+
}
102+
103+
Map<String, Integer> expectedTracePayloads = new HashMap<>();
104+
expectedTracePayloads.put("healthCheck::group::0", 10);
105+
expectedTracePayloads.put("searchAccountsRequest::group::0", 5);
106+
expectedTracePayloads.put("getAccountDetails::group::0", 10);
107+
expectedTracePayloads.put("getAccountDetails::group::1", 10);
108+
expectedTracePayloads.put("updateAccountDetails::group::0", 7);
109+
expectedTracePayloads.put("deleteAccount::group::0", 5);
110+
expectedTracePayloads.put("createNewAccount::group::0", 20);
111+
expectedTracePayloads.put("createNewAccount::group::1", 20);
112+
for (Map.Entry<String, Integer> eachTraceGroup: expectedTracePayloads.entrySet()) {
113+
Assert.assertEquals(transportStorage.getStoredTracesPayloads().get(eachTraceGroup.getKey()).size(), eachTraceGroup.getValue(),
114+
"Mismatch in expected payloads count for trace group " + eachTraceGroup.getKey());
115+
}
116+
}
117+
}

src/test/java/io/opentelemetry/contrib/generator/telemetry/TestAllGenerators.java renamed to src/test/java/io/opentelemetry/contrib/generator/telemetry/TestAllGeneratorsWithYAMLInput.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import java.util.Map;
3333
import java.util.Set;
3434

35-
public class TestAllGenerators {
35+
public class TestAllGeneratorsWithYAMLInput {
3636

3737
private final String ENTITIES_YAML = Paths.get(System.getProperty("user.dir"), "src", "test", "resources",
3838
"test-definitions", "entity-definition.yaml").toString();

src/test/java/io/opentelemetry/contrib/generator/telemetry/ValidateExampleDefinitionsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
public class ValidateExampleDefinitionsTest {
2525

26-
private final String DEFINITION_PATH = Paths.get(System.getProperty("user.dir"), "example-definitions").toString();
26+
private final String DEFINITION_PATH = Paths.get(System.getProperty("user.dir"), "example-definitions", "qa").toString();
2727

2828
@Test
2929
public void validateEntityAndMetricDefinitions() {

0 commit comments

Comments
 (0)