Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion custom/src/main/resources/co/elastic/otel/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,12 @@ meter_provider:
otlp_http:
endpoint: ${OTEL_EXPORTER_OTLP_ENDPOINT:-http://localhost:4318}/v1/metrics
headers_list: ${OTEL_EXPORTER_OTLP_HEADERS}
temporality_preference: ${OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE:-delta}
# use the following for grpc
# otlp_grpc:
# endpoint: ${OTEL_EXPORTER_OTLP_ENDPOINT}
# headers_list: ${OTEL_EXPORTER_OTLP_HEADERS}
# temporality_preference: ${OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE:-delta}

logger_provider:
processors:
Expand All @@ -70,4 +72,4 @@ instrumentation/development:
java:
runtime_telemetry:
# emit not-yet stable runtime telemetry metrics which are currently part of semconv for java runtime
emit_experimental_metrics/development: true
emit_experimental_metrics/development: ${OTEL_INSTRUMENTATION_RUNTIME_TELEMETRY_EMIT_EXPERIMENTAL_METRICS:-true}
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ void testDefaults() {
assertThatJson(json(config.getMeterProvider().getReaders().get(0)))
.inPath("periodic.exporter.otlp_http")
.isObject()
.containsEntry("endpoint", "http://localhost:4318/v1/metrics");
.containsEntry("endpoint", "http://localhost:4318/v1/metrics")
.containsEntry("temporality_preference", "delta");

assertThat(config.getLoggerProvider()).isNotNull();
assertThat(config.getLoggerProvider().getProcessors()).hasSize(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,17 @@ static void afterAll() {
@Test
void tomcat() {
target =
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[for reviewer] this (and below) a test refactor to use builder pattern to make test slightly more readable/maintainable.

startTarget(
"tomcat:latest",
container ->
container
.withExposedPorts(PORT)
.waitingFor(Wait.forListeningPorts(PORT))
.withCopyFileToContainer(
MountableFile.forHostPath(testAppWar),
"/usr/local/tomcat/webapps/app.war"));
testTarget("tomcat:latest")
.withBaseEnvironmentVariables(true)
.customize(
container ->
container
.withExposedPorts(PORT)
.waitingFor(Wait.forListeningPorts(PORT))
.withCopyFileToContainer(
MountableFile.forHostPath(testAppWar),
"/usr/local/tomcat/webapps/app.war"))
.start();

await()
.atMost(Duration.ofSeconds(30))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,55 +108,79 @@ static void setupSpec() {
backend.start();
}

protected static GenericContainer<?> startTarget(
String image, Consumer<GenericContainer<?>> customizeContainer) {
public static TestTarget testTarget(String image) {
return new TestTarget(image);
}

@SuppressWarnings("resource")
GenericContainer<?> target =
new GenericContainer<>(image)
.withNetwork(network)
.withLogConsumer(new Slf4jLogConsumer(logger))
.withCopyFileToContainer(MountableFile.forHostPath(AGENT_PATH), JAVAAGENT_JAR_PATH);
public static class TestTarget {
private final String image;
private Consumer<GenericContainer<?>> customizeContainer;
private boolean baseEnvVariables;

StringBuilder jvmArgs = new StringBuilder();
public TestTarget(String image) {
this.image = image;
}

if (JavaExecutable.isDebugging()) {
// when debugging, automatically use verbose debug logging
target.withEnv("OTEL_JAVAAGENT_DEBUG", "true");
public TestTarget customize(Consumer<GenericContainer<?>> customizeContainer) {
this.customizeContainer = customizeContainer;
return this;
}

if (JavaExecutable.isListeningDebuggerStarted(TARGET_DEBUG_PORT, "target")) {
target = addDockerDebugHost(target);
jvmArgs
.append(JavaExecutable.jvmDebugArgument("remote-localhost", TARGET_DEBUG_PORT))
.append(" ");
}
// Use very long startup delay when debugging as the remote JVM is likely stopped before the
// app has started
target.waitingFor(Wait.defaultWaitStrategy().withStartupTimeout(Duration.ofMinutes(10)));
public TestTarget withBaseEnvironmentVariables(boolean value) {
this.baseEnvVariables = value;
return this;
}

jvmArgs.append(JavaExecutable.jvmAgentArgument(JAVAAGENT_JAR_PATH));
target.withEnv("JAVA_TOOL_OPTIONS", jvmArgs.toString());
public GenericContainer<?> start() {
@SuppressWarnings("resource")
GenericContainer<?> target =
new GenericContainer<>(image)
.withNetwork(network)
.withLogConsumer(new Slf4jLogConsumer(logger))
.withCopyFileToContainer(MountableFile.forHostPath(AGENT_PATH), JAVAAGENT_JAR_PATH);

StringBuilder jvmArgs = new StringBuilder();

if (JavaExecutable.isDebugging()) {
// when debugging, automatically use verbose debug logging
target.withEnv("OTEL_JAVAAGENT_DEBUG", "true");

if (JavaExecutable.isListeningDebuggerStarted(TARGET_DEBUG_PORT, "target")) {
target = addDockerDebugHost(target);
jvmArgs
.append(JavaExecutable.jvmDebugArgument("remote-localhost", TARGET_DEBUG_PORT))
.append(" ");
}
// Use very long startup delay when debugging as the remote JVM is likely stopped before the
// app has started
target.waitingFor(Wait.defaultWaitStrategy().withStartupTimeout(Duration.ofMinutes(10)));
}

customizeContainer.accept(target);
jvmArgs.append(JavaExecutable.jvmAgentArgument(JAVAAGENT_JAR_PATH));
target.withEnv("JAVA_TOOL_OPTIONS", jvmArgs.toString());

if (baseEnvVariables) {
target
// batch span processor: very small batch size for testing
.withEnv("OTEL_BSP_MAX_EXPORT_BATCH", "1")
// batch span processor: very short delay for testing
.withEnv("OTEL_BSP_SCHEDULE_DELAY", "10")
// use grpc endpoint as default is now http/protobuf with agent 2.x
.withEnv("OTEL_EXPORTER_OTLP_PROTOCOL", "grpc")
.withEnv("OTEL_PROPAGATORS", "tracecontext,baggage")
.withEnv("OTEL_EXPORTER_OTLP_ENDPOINT", BACKEND_ENDPOINT);
}

Objects.requireNonNull(target).start();
if (customizeContainer != null) {
customizeContainer.accept(target);
}

startedContainers.add(target);
Objects.requireNonNull(target).start();

return target;
}
startedContainers.add(target);

protected static void setBaseEnvironmentVariables(GenericContainer<?> target) {
target
// batch span processor: very small batch size for testing
.withEnv("OTEL_BSP_MAX_EXPORT_BATCH", "1")
// batch span processor: very short delay for testing
.withEnv("OTEL_BSP_SCHEDULE_DELAY", "10")
// use grpc endpoint as default is now http/protobuf with agent 2.x
.withEnv("OTEL_EXPORTER_OTLP_PROTOCOL", "grpc")
.withEnv("OTEL_PROPAGATORS", "tracecontext,baggage")
.withEnv("OTEL_EXPORTER_OTLP_ENDPOINT", BACKEND_ENDPOINT);
return target;
}
}

private static GenericContainer<?> addDockerDebugHost(GenericContainer<?> target) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,15 @@ public static void startTestApp(Consumer<GenericContainer<?>> customizeContainer
public static void startTestApp(
Consumer<GenericContainer<?>> customizeContainer, boolean defaultEnv) {
target =
startTarget(
TEST_APP_IMAGE,
customizeContainer.andThen(
container -> {
if (defaultEnv) {
setBaseEnvironmentVariables(container);
}
container
.withExposedPorts(PORT)
.waitingFor(Wait.forHttp("/health").forPort(PORT));
}));
testTarget(TEST_APP_IMAGE)
.withBaseEnvironmentVariables(defaultEnv)
.customize(
customizeContainer.andThen(
container ->
container
.withExposedPorts(PORT)
.waitingFor(Wait.forHttp("/health").forPort(PORT))))
.start();
}

protected static String getContainerId() {
Expand Down
Loading