Skip to content

BatchSpanProcessor does not trigger export timeout #7511

@DavidAkaFunky

Description

@DavidAkaFunky

Describe the bug
Despite the introduction of a delay that is longer than the timeout on both the exporter (using a wrapper class) and my custom-built collector, the export timeout does not affect the export call.

Steps to reproduce
This was the setup I used to test the timeout on the exporter.

@Bean
public OpenTelemetrySdk autoconfiguredSdk() {
    return AutoConfiguredOpenTelemetrySdk.builder()
            .addPropertiesSupplier(() -> properties)
            .addSpanExporterCustomizer((spanExporter, configProperties) -> new CustomSpanExporter(spanExporter))
            .setResultAsGlobal()
            .build()
            .getOpenTelemetrySdk();
}
@AllArgsConstructor
public class CustomSpanExporter implements SpanExporter {

  private final SpanExporter delegate;

  @Override
  public CompletableResultCode export(Collection<SpanData> spans) {
      try {
              Thread.sleep(35000); // Timeout is set to 30000 ms
       } catch (InterruptedException e) {
              Thread.currentThread().interrupt();
              throw new RuntimeException("Sleep interrupted", e);
      }
      return delegate.export(spans);
  }

  @Override
  public CompletableResultCode flush() {
      return delegate.flush();
  }

  @Override
  public CompletableResultCode shutdown() {
      return delegate.shutdown();
  }

  @Override
  public void close() {
      delegate.close();
  }
}

The setup for the collector involves creating a collector server (in my case, a gRPC one) with a timeout immediately after receiving the request.
Although otel.exporter.otlp.timeout, by default, is 10 seconds (lower than otel.bsp.export.timeout's default), meaning the HTTP request times out before the exporter does, I have tested with a lower export timeout, in which case the request finalises normally.

What did you expect to see?
I expected to have my export interrupted after the value set for otel.bsp.export.timeout (by default, 30 seconds).

What did you see instead?
Instead, the export progressed as normal.

What version and what artifacts are you using?

io.opentelemetry.instrumentation:opentelemetry-spring-boot-starter:jar:2.13.1
io.opentelemetry:opentelemetry-sdk:jar:1.47.0

My pom.xml:

<dependency>
    <groupId>io.opentelemetry.instrumentation</groupId>
    <artifactId>opentelemetry-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId>
</dependency>

Environment
Oracle Linux Server 8.9
openjdk version "17.0.14" 2025-01-21 LTS
OpenJDK Runtime Environment (Red_Hat-17.0.14.0.7-3.0.1) (build 17.0.14+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.14.0.7-3.0.1) (build 17.0.14+7-LTS, mixed mode, sharing)

Additional context
If this is the expected behaviour, any help on how to test this property would be appreciated.

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions