Skip to content

Commit 0ffedc5

Browse files
authored
Merge pull request #36538 from brunobat/otel-flush-timeout
OTel flush timeout
2 parents 6932a4c + fb85771 commit 0ffedc5

File tree

3 files changed

+73
-2
lines changed

3 files changed

+73
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.quarkus.opentelemetry.deployment;
2+
3+
import static org.hamcrest.Matchers.is;
4+
5+
import jakarta.ws.rs.GET;
6+
import jakarta.ws.rs.Path;
7+
8+
import org.jboss.shrinkwrap.api.asset.StringAsset;
9+
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.api.extension.RegisterExtension;
11+
12+
import io.quarkus.opentelemetry.OpenTelemetryDestroyer;
13+
import io.quarkus.opentelemetry.deployment.common.TestSpanExporter;
14+
import io.quarkus.opentelemetry.deployment.common.TestSpanExporterProvider;
15+
import io.quarkus.test.QuarkusDevModeTest;
16+
import io.restassured.RestAssured;
17+
18+
public class OpenTelemetryDestroyerTest {
19+
20+
@RegisterExtension
21+
final static QuarkusDevModeTest TEST = new QuarkusDevModeTest()
22+
.withApplicationRoot((jar) -> jar
23+
.addClasses(TestSpanExporter.class,
24+
TestSpanExporterProvider.class,
25+
HelloResource.class)
26+
.addAsResource(new StringAsset(TestSpanExporterProvider.class.getCanonicalName()),
27+
"META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider")
28+
.add(new StringAsset(
29+
"quarkus.otel.traces.exporter=test-span-exporter\n" +
30+
"quarkus.otel.experimental.shutdown-wait-time=PT60S\n"),
31+
"application.properties"));
32+
33+
@Test
34+
void getShutdownWaitTime() {
35+
RestAssured.when()
36+
.get("/hello").then()
37+
.statusCode(200)
38+
.body(is("PT1M"));
39+
}
40+
41+
@Path("/hello")
42+
public static class HelloResource {
43+
@GET
44+
public String hello() {
45+
return OpenTelemetryDestroyer.getShutdownWaitTime().toString();
46+
}
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,36 @@
11
package io.quarkus.opentelemetry;
22

3+
import static java.util.concurrent.TimeUnit.MILLISECONDS;
4+
5+
import java.time.Duration;
36
import java.util.Map;
47

58
import jakarta.enterprise.context.spi.CreationalContext;
69

10+
import org.eclipse.microprofile.config.ConfigProvider;
11+
712
import io.opentelemetry.api.OpenTelemetry;
813
import io.opentelemetry.sdk.OpenTelemetrySdk;
914
import io.quarkus.arc.BeanDestroyer;
15+
import io.smallrye.config.SmallRyeConfig;
1016

1117
public class OpenTelemetryDestroyer implements BeanDestroyer<OpenTelemetry> {
1218
@Override
1319
public void destroy(OpenTelemetry openTelemetry, CreationalContext<OpenTelemetry> creationalContext,
1420
Map<String, Object> params) {
1521
if (openTelemetry instanceof OpenTelemetrySdk) {
22+
// between flush and shutdown we will wait shutdown-wait-time, at the most.
23+
var waitTime = getShutdownWaitTime().dividedBy(2);
1624
var openTelemetrySdk = ((OpenTelemetrySdk) openTelemetry);
17-
openTelemetrySdk.getSdkTracerProvider().forceFlush();
18-
openTelemetrySdk.getSdkTracerProvider().shutdown();
25+
openTelemetrySdk.getSdkTracerProvider().forceFlush().join(waitTime.toMillis(), MILLISECONDS);
26+
openTelemetrySdk.getSdkTracerProvider().shutdown().join(waitTime.toMillis(), MILLISECONDS);
1927
}
2028
}
29+
30+
public static Duration getShutdownWaitTime() {
31+
var config = ConfigProvider.getConfig().unwrap(SmallRyeConfig.class);
32+
var waitTime = config.getOptionalValue("quarkus.otel.experimental.shutdown-wait-time", Duration.class)
33+
.orElse(Duration.ofSeconds(1));
34+
return waitTime;
35+
}
2136
}

extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/config/runtime/OTelRuntimeConfig.java

+8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.quarkus.opentelemetry.runtime.config.runtime;
22

3+
import java.time.Duration;
34
import java.util.List;
45
import java.util.Optional;
56

@@ -63,4 +64,11 @@ public interface OTelRuntimeConfig {
6364
*/
6465
@WithName("experimental.resource.disabled-keys")
6566
Optional<List<String>> experimentalResourceDisabledKeys();
67+
68+
/**
69+
* The maximum amount of time Quarkus will wait for the OpenTelemetry SDK to flush unsent spans and shutdown.
70+
*/
71+
@WithName("experimental.shutdown-wait-time")
72+
@WithDefault("1s")
73+
Duration experimentalShutdownWaitTime();
6674
}

0 commit comments

Comments
 (0)