Search in sources :

Example 41 with Record

use of com.amazon.dataprepper.model.record.Record in project data-prepper by opensearch-project.

the class OTelTraceRawPrepperTest method testExportRequestFlushByParentSpan.

@Test
public void testExportRequestFlushByParentSpan() throws IOException {
    final ExportTraceServiceRequest exportTraceServiceRequest = buildExportTraceServiceRequestFromJsonFile(TEST_REQUEST_TWO_FULL_TRACE_GROUP_JSON_FILE);
    final List<Record<String>> processedRecords = (List<Record<String>>) oTelTraceRawPrepper.doExecute(Collections.singletonList(new Record<>(exportTraceServiceRequest)));
    Assertions.assertThat(processedRecords.size()).isEqualTo(6);
    Assertions.assertThat(getMissingTraceGroupFieldsSpanCount(processedRecords)).isEqualTo(0);
}
Also used : ExportTraceServiceRequest(io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest) Record(com.amazon.dataprepper.model.record.Record) ArrayList(java.util.ArrayList) List(java.util.List) Test(org.junit.Test)

Example 42 with Record

use of com.amazon.dataprepper.model.record.Record in project data-prepper by opensearch-project.

the class OTelTraceRawPrepperTest method testExportRequestFlushByMixedMultiThread.

@Test
public void testExportRequestFlushByMixedMultiThread() throws IOException, InterruptedException, ExecutionException {
    final ExportTraceServiceRequest exportTraceServiceRequest1 = buildExportTraceServiceRequestFromJsonFile(TEST_REQUEST_ONE_FULL_TRACE_GROUP_JSON_FILE);
    final ExportTraceServiceRequest exportTraceServiceRequest2 = buildExportTraceServiceRequestFromJsonFile(TEST_REQUEST_ONE_TRACE_GROUP_MISSING_ROOT_JSON_FILE);
    List<Record<String>> processedRecords = new ArrayList<>();
    List<Future<Collection<Record<String>>>> futures = new ArrayList<>();
    futures.addAll(submitExportTraceServiceRequests(Collections.singletonList(exportTraceServiceRequest1)));
    futures.addAll(submitExportTraceServiceRequests(Collections.singletonList(exportTraceServiceRequest2)));
    for (Future<Collection<Record<String>>> future : futures) {
        processedRecords.addAll(future.get());
    }
    await().atMost(2 * TEST_TRACE_FLUSH_INTERVAL, TimeUnit.SECONDS).untilAsserted(() -> {
        List<Future<Collection<Record<String>>>> futureList = submitExportTraceServiceRequests(Collections.emptyList());
        for (Future<Collection<Record<String>>> future : futureList) {
            processedRecords.addAll(future.get());
        }
        Assertions.assertThat(processedRecords.size()).isEqualTo(5);
        Assertions.assertThat(getMissingTraceGroupFieldsSpanCount(processedRecords)).isEqualTo(2);
    });
}
Also used : ExportTraceServiceRequest(io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest) ArrayList(java.util.ArrayList) Future(java.util.concurrent.Future) Collection(java.util.Collection) Record(com.amazon.dataprepper.model.record.Record) Test(org.junit.Test)

Example 43 with Record

use of com.amazon.dataprepper.model.record.Record in project data-prepper by opensearch-project.

the class OTelTraceRawPrepperTest method testPrepareForShutdown.

@Test
public void testPrepareForShutdown() throws Exception {
    // Assert no records in memory
    assertTrue(oTelTraceRawPrepper.isReadyForShutdown());
    // Add records to memory/queue
    final ExportTraceServiceRequest exportTraceServiceRequest = buildExportTraceServiceRequestFromJsonFile(TEST_REQUEST_TWO_TRACE_GROUP_MISSING_ROOTS_JSON_FILE);
    oTelTraceRawPrepper.doExecute(Collections.singletonList(new Record<>(exportTraceServiceRequest)));
    // Assert records exist in memory
    assertFalse(oTelTraceRawPrepper.isReadyForShutdown());
    // Force records to be flushed
    oTelTraceRawPrepper.prepareForShutdown();
    oTelTraceRawPrepper.doExecute(Collections.emptyList());
    // Assert records have been flushed
    assertTrue(oTelTraceRawPrepper.isReadyForShutdown());
}
Also used : ExportTraceServiceRequest(io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest) Record(com.amazon.dataprepper.model.record.Record) Test(org.junit.Test)

Example 44 with Record

use of com.amazon.dataprepper.model.record.Record in project data-prepper by opensearch-project.

the class OTelTraceRawPrepperTest method testExportRequestFlushByGC.

@Test
public void testExportRequestFlushByGC() throws IOException {
    final ExportTraceServiceRequest exportTraceServiceRequest = buildExportTraceServiceRequestFromJsonFile(TEST_REQUEST_TWO_TRACE_GROUP_MISSING_ROOTS_JSON_FILE);
    oTelTraceRawPrepper.doExecute(Collections.singletonList(new Record<>(exportTraceServiceRequest)));
    await().atMost(2 * TEST_TRACE_FLUSH_INTERVAL, TimeUnit.SECONDS).untilAsserted(() -> {
        final List<Record<String>> processedRecords = (List<Record<String>>) oTelTraceRawPrepper.doExecute(Collections.emptyList());
        Assertions.assertThat(processedRecords.size()).isEqualTo(4);
        Assertions.assertThat(getMissingTraceGroupFieldsSpanCount(processedRecords)).isEqualTo(4);
    });
}
Also used : ExportTraceServiceRequest(io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest) Record(com.amazon.dataprepper.model.record.Record) ArrayList(java.util.ArrayList) List(java.util.List) Test(org.junit.Test)

Example 45 with Record

use of com.amazon.dataprepper.model.record.Record in project data-prepper by opensearch-project.

the class OTelTraceGroupPrepper method doExecute.

@Override
public Collection<Record<String>> doExecute(final Collection<Record<String>> rawSpanStringRecords) {
    final List<Record<String>> recordsOut = new LinkedList<>();
    final Map<Record<String>, Map<String, Object>> recordMissingTraceGroupToRawSpanMap = new HashMap<>();
    final Set<String> traceIdsToLookUp = new HashSet<>();
    for (Record<String> record : rawSpanStringRecords) {
        try {
            final Map<String, Object> rawSpanMap = OBJECT_MAPPER.readValue(record.getData(), MAP_TYPE_REFERENCE);
            final String traceGroupName = (String) rawSpanMap.get(TraceGroup.TRACE_GROUP_NAME_FIELD);
            final String traceId = (String) rawSpanMap.get(OTelTraceGroupPrepperConfig.TRACE_ID_FIELD);
            if (Strings.isNullOrEmpty(traceGroupName)) {
                traceIdsToLookUp.add(traceId);
                recordMissingTraceGroupToRawSpanMap.put(record, rawSpanMap);
                recordsInMissingTraceGroupCounter.increment();
            } else {
                recordsOut.add(record);
            }
        } catch (JsonProcessingException e) {
            LOG.error("Failed to parse the record: [{}]", record.getData());
        }
    }
    final Map<String, TraceGroup> traceIdToTraceGroup = searchTraceGroupByTraceIds(traceIdsToLookUp);
    for (final Map.Entry<Record<String>, Map<String, Object>> entry : recordMissingTraceGroupToRawSpanMap.entrySet()) {
        final Record<String> record = entry.getKey();
        final Map<String, Object> rawSpanMap = entry.getValue();
        final String traceId = (String) rawSpanMap.get(OTelTraceGroupPrepperConfig.TRACE_ID_FIELD);
        final TraceGroup traceGroup = traceIdToTraceGroup.get(traceId);
        if (traceGroup != null) {
            try {
                Map<String, Object> traceGroupMap = OBJECT_MAPPER.convertValue(traceGroup, MAP_TYPE_REFERENCE);
                rawSpanMap.putAll(traceGroupMap);
                final String newData = OBJECT_MAPPER.writeValueAsString(rawSpanMap);
                recordsOut.add(new Record<>(newData, record.getMetadata()));
                recordsOutFixedTraceGroupCounter.increment();
            } catch (Exception e) {
                recordsOut.add(record);
                recordsOutMissingTraceGroupCounter.increment();
                LOG.error("Failed to process the raw span: [{}]", record.getData(), e);
            }
        } else {
            recordsOut.add(record);
            recordsOutMissingTraceGroupCounter.increment();
            final String spanId = (String) rawSpanMap.get(OTelTraceGroupPrepperConfig.SPAN_ID_FIELD);
            LOG.warn("Failed to find traceGroup for spanId: {} due to traceGroup missing for traceId: {}", spanId, traceId);
        }
    }
    return recordsOut;
}
Also used : HashMap(java.util.HashMap) LinkedList(java.util.LinkedList) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) IOException(java.io.IOException) Record(com.amazon.dataprepper.model.record.Record) HashMap(java.util.HashMap) Map(java.util.Map) AbstractMap(java.util.AbstractMap) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) TraceGroup(com.amazon.dataprepper.plugins.prepper.oteltracegroup.model.TraceGroup) HashSet(java.util.HashSet)

Aggregations

Record (com.amazon.dataprepper.model.record.Record)103 Test (org.junit.Test)43 Measurement (io.micrometer.core.instrument.Measurement)35 StringJoiner (java.util.StringJoiner)35 PluginSetting (com.amazon.dataprepper.model.configuration.PluginSetting)33 ArrayList (java.util.ArrayList)31 Map (java.util.Map)30 Test (org.junit.jupiter.api.Test)30 HashMap (java.util.HashMap)29 List (java.util.List)28 Event (com.amazon.dataprepper.model.event.Event)23 ExportTraceServiceRequest (io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest)20 ResourceSpans (io.opentelemetry.proto.trace.v1.ResourceSpans)19 ParameterizedTest (org.junit.jupiter.params.ParameterizedTest)16 JacksonEvent (com.amazon.dataprepper.model.event.JacksonEvent)14 ByteString (com.google.protobuf.ByteString)13 ExecutorService (java.util.concurrent.ExecutorService)13 Resource (io.opentelemetry.proto.resource.v1.Resource)12 Channel (io.grpc.Channel)11 MetricNames (com.amazon.dataprepper.metrics.MetricNames)10