Skip to content

Commit 6290041

Browse files
committed
testcontainers don't work with graalvm native
1 parent 8baa7f2 commit 6290041

File tree

4 files changed

+59
-19
lines changed

4 files changed

+59
-19
lines changed

.github/workflows/reusable-native-tests.yml

+6
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,10 @@ jobs:
2424
echo "JAVA_HOME: $JAVA_HOME"
2525
java --version
2626
native-image --version
27+
# Testcontainers does not work with native-image,
28+
# therefore we're starting a Kafka container manually for the tests
29+
# The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested
30+
# todo: build image from https://github.com/hey-johnnypark/docker-kafka-zookeeper and publish
31+
docker run -p 2181:2181 -p 9092:9092 -e ADVERTISED_HOST=localhost --rm kafka-zookeepter
2732
./gradlew nativeTest
33+
docker stop kafka # is this needed?

smoke-tests-otel-starter/spring-boot-3/src/test/java/io/opentelemetry/smoketest/KafkaSpringStarterSmokeTest.java smoke-tests-otel-starter/spring-boot-3/src/test/java/io/opentelemetry/smoketest/AbstractKafkaSpringStarterSmokeTest.java

+3-19
Original file line numberDiff line numberDiff line change
@@ -14,49 +14,33 @@
1414
import io.opentelemetry.spring.smoketest.AbstractSpringStarterSmokeTest;
1515
import io.opentelemetry.spring.smoketest.OtelSpringStarterSmokeTestApplication;
1616
import io.opentelemetry.spring.smoketest.SpringSmokeOtelConfiguration;
17-
import java.time.Duration;
1817
import org.apache.kafka.clients.admin.NewTopic;
1918
import org.apache.kafka.clients.consumer.ConsumerRecord;
2019
import org.assertj.core.api.AbstractLongAssert;
2120
import org.assertj.core.api.AbstractStringAssert;
2221
import org.junit.jupiter.api.Test;
2322
import org.springframework.beans.factory.annotation.Autowired;
2423
import org.springframework.boot.test.context.SpringBootTest;
25-
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
2624
import org.springframework.context.annotation.Bean;
2725
import org.springframework.context.annotation.Configuration;
2826
import org.springframework.kafka.annotation.KafkaListener;
2927
import org.springframework.kafka.config.TopicBuilder;
3028
import org.springframework.kafka.core.KafkaTemplate;
31-
import org.testcontainers.containers.KafkaContainer;
32-
import org.testcontainers.containers.wait.strategy.Wait;
33-
import org.testcontainers.junit.jupiter.Container;
34-
import org.testcontainers.junit.jupiter.Testcontainers;
35-
import org.testcontainers.utility.DockerImageName;
3629

37-
@Testcontainers
3830
@SpringBootTest(
3931
classes = {
4032
OtelSpringStarterSmokeTestApplication.class,
4133
SpringSmokeOtelConfiguration.class,
42-
KafkaSpringStarterSmokeTest.KafkaConfig.class
34+
AbstractKafkaSpringStarterSmokeTest.KafkaConfig.class
4335
},
4436
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
4537
properties = {
4638
"spring.kafka.consumer.auto-offset-reset=earliest",
4739
"spring.kafka.consumer.linger-ms=10",
48-
"spring.kafka.admin.operation-timeout=5m",
4940
"spring.kafka.listener.idle-between-polls=1000",
5041
"spring.kafka.producer.transaction-id-prefix=test-"
5142
})
52-
public class KafkaSpringStarterSmokeTest extends AbstractSpringStarterSmokeTest {
53-
54-
@Container @ServiceConnection
55-
static KafkaContainer kafka =
56-
new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:6.2.10"))
57-
.withEnv("KAFKA_HEAP_OPTS", "-Xmx256m")
58-
.waitingFor(Wait.forLogMessage(".*started \\(kafka.server.KafkaServer\\).*", 1))
59-
.withStartupTimeout(Duration.ofMinutes(1));
43+
abstract class AbstractKafkaSpringStarterSmokeTest extends AbstractSpringStarterSmokeTest {
6044

6145
@Autowired private KafkaTemplate<String, String> kafkaTemplate;
6246

@@ -106,7 +90,7 @@ void shouldInstrumentProducerAndConsumer() {
10690
span.hasName("testTopic process")
10791
.hasKind(SpanKind.CONSUMER)
10892
.hasParent(trace.getSpan(1))
109-
.hasAttributesSatisfyingExactly(
93+
.hasAttributesSatisfying(
11094
equalTo(MessagingIncubatingAttributes.MESSAGING_SYSTEM, "kafka"),
11195
equalTo(
11296
MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.smoketest;
7+
8+
import org.junit.jupiter.api.condition.EnabledInNativeImage;
9+
10+
/**
11+
* GraalVM native image doesn't support Testcontainers in our case, so the docker container is
12+
* started manually before running the tests.
13+
*
14+
* <p>In other cases, it does work, e.g. <a
15+
* href="https://info.michael-simons.eu/2023/10/25/run-your-integration-tests-against-testcontainers-with-graalvm-native-image/">here</a>,
16+
* it's not yet clear why it doesn't work in our case.
17+
*
18+
* <p>In CI, this is done in reusable-native-tests.yml. If you want to run the tests locally, you
19+
* need to start the container manually: docker run -d -p 9092:9092 --name kafka --rm
20+
* confluentinc/cp-kafka:6.2.10
21+
*/
22+
@EnabledInNativeImage
23+
public class GraalVmNativeKafkaSpringStarterSmokeTest extends AbstractKafkaSpringStarterSmokeTest {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.smoketest;
7+
8+
import java.time.Duration;
9+
import org.junit.jupiter.api.condition.DisabledInNativeImage;
10+
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
11+
import org.testcontainers.containers.KafkaContainer;
12+
import org.testcontainers.containers.wait.strategy.Wait;
13+
import org.testcontainers.junit.jupiter.Container;
14+
import org.testcontainers.junit.jupiter.Testcontainers;
15+
import org.testcontainers.utility.DockerImageName;
16+
17+
@Testcontainers
18+
@DisabledInNativeImage
19+
public class JvmKafkaSpringStarterSmokeTest extends AbstractKafkaSpringStarterSmokeTest {
20+
21+
@Container @ServiceConnection
22+
static KafkaContainer kafka =
23+
new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:6.2.10"))
24+
.withEnv("KAFKA_HEAP_OPTS", "-Xmx256m")
25+
.waitingFor(Wait.forLogMessage(".*started \\(kafka.server.KafkaServer\\).*", 1))
26+
.withStartupTimeout(Duration.ofMinutes(1));
27+
}

0 commit comments

Comments
 (0)