|  | 
|  | 1 | +/* | 
|  | 2 | + * Copyright The OpenTelemetry Authors | 
|  | 3 | + * SPDX-License-Identifier: Apache-2.0 | 
|  | 4 | + */ | 
|  | 5 | + | 
|  | 6 | +package io.opentelemetry.instrumentation.kafkaclients.v2_6; | 
|  | 7 | + | 
|  | 8 | +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; | 
|  | 9 | +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; | 
|  | 10 | +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; | 
|  | 11 | +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_PARTITION_ID; | 
|  | 12 | +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_CONSUMER_GROUP; | 
|  | 13 | +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_KAFKA_MESSAGE_OFFSET; | 
|  | 14 | +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_BODY_SIZE; | 
|  | 15 | +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; | 
|  | 16 | +import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_SYSTEM; | 
|  | 17 | +import static org.assertj.core.api.Assertions.assertThat; | 
|  | 18 | + | 
|  | 19 | +import io.opentelemetry.api.common.AttributeKey; | 
|  | 20 | +import io.opentelemetry.api.trace.SpanKind; | 
|  | 21 | +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; | 
|  | 22 | +import java.nio.charset.StandardCharsets; | 
|  | 23 | +import java.util.ArrayList; | 
|  | 24 | +import java.util.Arrays; | 
|  | 25 | +import java.util.Collections; | 
|  | 26 | +import java.util.List; | 
|  | 27 | +import org.assertj.core.api.AbstractLongAssert; | 
|  | 28 | +import org.assertj.core.api.AbstractStringAssert; | 
|  | 29 | + | 
|  | 30 | +class WrapperSuppressReceiveSpansTest extends AbstractWrapperTest { | 
|  | 31 | + | 
|  | 32 | +  @Override | 
|  | 33 | +  void configure(KafkaTelemetryBuilder builder) { | 
|  | 34 | +    builder.setMessagingReceiveInstrumentationEnabled(false); | 
|  | 35 | +  } | 
|  | 36 | + | 
|  | 37 | +  @Override | 
|  | 38 | +  void assertTraces(boolean testHeaders) { | 
|  | 39 | +    testing.waitAndAssertTraces( | 
|  | 40 | +        trace -> | 
|  | 41 | +            trace.hasSpansSatisfyingExactly( | 
|  | 42 | +                span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), | 
|  | 43 | +                span -> | 
|  | 44 | +                    span.hasName(SHARED_TOPIC + " publish") | 
|  | 45 | +                        .hasKind(SpanKind.PRODUCER) | 
|  | 46 | +                        .hasParent(trace.getSpan(0)) | 
|  | 47 | +                        .hasAttributesSatisfyingExactly(sendAttributes(testHeaders)), | 
|  | 48 | +                span -> | 
|  | 49 | +                    span.hasName("producer callback") | 
|  | 50 | +                        .hasKind(SpanKind.INTERNAL) | 
|  | 51 | +                        .hasParent(trace.getSpan(0)), | 
|  | 52 | +                span -> | 
|  | 53 | +                    span.hasName(SHARED_TOPIC + " process") | 
|  | 54 | +                        .hasKind(SpanKind.CONSUMER) | 
|  | 55 | +                        .hasParent(trace.getSpan(1)) | 
|  | 56 | +                        .hasLinksSatisfying(links -> assertThat(links).isEmpty()) | 
|  | 57 | +                        .hasAttributesSatisfyingExactly(processAttributes(greeting, testHeaders)), | 
|  | 58 | +                span -> | 
|  | 59 | +                    span.hasName("process child") | 
|  | 60 | +                        .hasKind(SpanKind.INTERNAL) | 
|  | 61 | +                        .hasParent(trace.getSpan(3)))); | 
|  | 62 | +  } | 
|  | 63 | + | 
|  | 64 | +  @SuppressWarnings("deprecation") // using deprecated semconv | 
|  | 65 | +  protected static List<AttributeAssertion> sendAttributes(boolean testHeaders) { | 
|  | 66 | +    List<AttributeAssertion> assertions = | 
|  | 67 | +        new ArrayList<>( | 
|  | 68 | +            Arrays.asList( | 
|  | 69 | +                equalTo(MESSAGING_SYSTEM, "kafka"), | 
|  | 70 | +                equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), | 
|  | 71 | +                equalTo(MESSAGING_OPERATION, "publish"), | 
|  | 72 | +                satisfies(MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("producer")), | 
|  | 73 | +                satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), | 
|  | 74 | +                satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative))); | 
|  | 75 | +    if (testHeaders) { | 
|  | 76 | +      assertions.add( | 
|  | 77 | +          equalTo( | 
|  | 78 | +              AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), | 
|  | 79 | +              Collections.singletonList("test"))); | 
|  | 80 | +    } | 
|  | 81 | +    return assertions; | 
|  | 82 | +  } | 
|  | 83 | + | 
|  | 84 | +  @SuppressWarnings("deprecation") // using deprecated semconv | 
|  | 85 | +  private static List<AttributeAssertion> processAttributes(String greeting, boolean testHeaders) { | 
|  | 86 | +    List<AttributeAssertion> assertions = | 
|  | 87 | +        new ArrayList<>( | 
|  | 88 | +            Arrays.asList( | 
|  | 89 | +                equalTo(MESSAGING_SYSTEM, "kafka"), | 
|  | 90 | +                equalTo(MESSAGING_DESTINATION_NAME, SHARED_TOPIC), | 
|  | 91 | +                equalTo(MESSAGING_OPERATION, "process"), | 
|  | 92 | +                equalTo( | 
|  | 93 | +                    MESSAGING_MESSAGE_BODY_SIZE, greeting.getBytes(StandardCharsets.UTF_8).length), | 
|  | 94 | +                satisfies(MESSAGING_DESTINATION_PARTITION_ID, AbstractStringAssert::isNotEmpty), | 
|  | 95 | +                satisfies(MESSAGING_KAFKA_MESSAGE_OFFSET, AbstractLongAssert::isNotNegative), | 
|  | 96 | +                satisfies( | 
|  | 97 | +                    AttributeKey.longKey("kafka.record.queue_time_ms"), | 
|  | 98 | +                    AbstractLongAssert::isNotNegative), | 
|  | 99 | +                equalTo(MESSAGING_KAFKA_CONSUMER_GROUP, "test"), | 
|  | 100 | +                satisfies( | 
|  | 101 | +                    MESSAGING_CLIENT_ID, stringAssert -> stringAssert.startsWith("consumer")))); | 
|  | 102 | +    if (testHeaders) { | 
|  | 103 | +      assertions.add( | 
|  | 104 | +          equalTo( | 
|  | 105 | +              AttributeKey.stringArrayKey("messaging.header.Test_Message_Header"), | 
|  | 106 | +              Collections.singletonList("test"))); | 
|  | 107 | +    } | 
|  | 108 | +    return assertions; | 
|  | 109 | +  } | 
|  | 110 | +} | 
0 commit comments