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
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.examples.types.GreetingRequest;
import software.amazon.lambda.durable.otel.OpenTelemetryDurablePlugin;
import software.amazon.lambda.durable.otel.OtelPlugin;

/**
* Example demonstrating OpenTelemetry instrumentation with the Durable Execution SDK.
Expand Down Expand Up @@ -39,7 +39,7 @@ public class OtelExample extends DurableHandler<GreetingRequest, String> {

@Override
protected DurableConfig createConfiguration() {
var otelPlugin = new OpenTelemetryDurablePlugin(
var otelPlugin = new OtelPlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())));

return DurableConfig.builder().withPlugins(otelPlugin).build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.examples.types.GreetingRequest;
import software.amazon.lambda.durable.otel.OpenTelemetryDurablePlugin;
import software.amazon.lambda.durable.otel.OtelPlugin;

/**
* OTel + X-Ray example: map operation that processes items concurrently.
Expand All @@ -22,8 +22,8 @@ public class OtelXRayMapExample extends DurableHandler<GreetingRequest, String>
@Override
protected DurableConfig createConfiguration() {
var otlpExporter = OtlpGrpcSpanExporter.getDefault();
var otelPlugin = new OpenTelemetryDurablePlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(otlpExporter)));
var otelPlugin =
new OtelPlugin(SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(otlpExporter)));
return DurableConfig.builder().withPlugins(otelPlugin).build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.examples.types.GreetingRequest;
import software.amazon.lambda.durable.otel.OpenTelemetryDurablePlugin;
import software.amazon.lambda.durable.otel.OtelPlugin;

/**
* OTel + X-Ray example: nested child contexts with inner steps.
Expand All @@ -21,8 +21,8 @@ public class OtelXRayNestedContextExample extends DurableHandler<GreetingRequest
@Override
protected DurableConfig createConfiguration() {
var otlpExporter = OtlpGrpcSpanExporter.getDefault();
var otelPlugin = new OpenTelemetryDurablePlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(otlpExporter)));
var otelPlugin =
new OtelPlugin(SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(otlpExporter)));
return DurableConfig.builder().withPlugins(otelPlugin).build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.examples.types.GreetingRequest;
import software.amazon.lambda.durable.otel.OpenTelemetryDurablePlugin;
import software.amazon.lambda.durable.otel.OtelPlugin;

/**
* OTel + X-Ray example: parallel operation with multiple branches.
Expand All @@ -21,8 +21,8 @@ public class OtelXRayParallelExample extends DurableHandler<GreetingRequest, Str
@Override
protected DurableConfig createConfiguration() {
var otlpExporter = OtlpGrpcSpanExporter.getDefault();
var otelPlugin = new OpenTelemetryDurablePlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(otlpExporter)));
var otelPlugin =
new OtelPlugin(SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(otlpExporter)));
return DurableConfig.builder().withPlugins(otelPlugin).build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.examples.types.GreetingRequest;
import software.amazon.lambda.durable.otel.OpenTelemetryDurablePlugin;
import software.amazon.lambda.durable.otel.OtelPlugin;

/**
* OTel + X-Ray example: simple steps in a single invocation.
Expand Down Expand Up @@ -39,8 +39,8 @@ protected DurableConfig createConfiguration() {
// OTLP exporter sends spans to the ADOT collector (localhost:4317 by default)
var otlpExporter = OtlpGrpcSpanExporter.getDefault();

var otelPlugin = new OpenTelemetryDurablePlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(otlpExporter)));
var otelPlugin =
new OtelPlugin(SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(otlpExporter)));

return DurableConfig.builder().withPlugins(otelPlugin).build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.examples.types.GreetingRequest;
import software.amazon.lambda.durable.otel.OpenTelemetryDurablePlugin;
import software.amazon.lambda.durable.otel.OtelPlugin;

/**
* OTel + X-Ray example: step → wait → step pattern that forces multiple Lambda invocations.
Expand Down Expand Up @@ -51,8 +51,8 @@ protected DurableConfig createConfiguration() {
// OTLP exporter sends spans to the ADOT collector (localhost:4317 by default)
var otlpExporter = OtlpGrpcSpanExporter.getDefault();

var otelPlugin = new OpenTelemetryDurablePlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(otlpExporter)));
var otelPlugin =
new OtelPlugin(SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(otlpExporter)));

return DurableConfig.builder().withPlugins(otelPlugin).build();
}
Expand Down
22 changes: 11 additions & 11 deletions otel-plugin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ You also need the OpenTelemetry SDK and an exporter:

1. Add the ADOT Lambda Layer to your function and set `AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-handler`
2. Enable X-Ray Active Tracing on the function
3. Register `OpenTelemetryDurablePlugin` in your handler's `DurableConfig`
3. Register `OtelPlugin` in your handler's `DurableConfig`
4. Grant X-Ray write permissions

### 1. ADOT Lambda Layer
Expand Down Expand Up @@ -144,7 +144,7 @@ import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import software.amazon.lambda.durable.DurableConfig;
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.otel.OpenTelemetryDurablePlugin;
import software.amazon.lambda.durable.otel.OtelPlugin;

public class MyHandler extends DurableHandler<MyInput, MyOutput> {

Expand All @@ -153,7 +153,7 @@ public class MyHandler extends DurableHandler<MyInput, MyOutput> {
// OTLP exporter sends spans to the ADOT collector (localhost:4317 by default)
var otlpExporter = OtlpGrpcSpanExporter.getDefault();

var otelPlugin = new OpenTelemetryDurablePlugin(
var otelPlugin = new OtelPlugin(
SdkTracerProvider.builder()
.addSpanProcessor(SimpleSpanProcessor.create(otlpExporter)));

Expand Down Expand Up @@ -207,13 +207,13 @@ durable.invocation

```java
// Default: X-Ray context extraction, MDC enabled
new OpenTelemetryDurablePlugin(tracerProviderBuilder);
new OtelPlugin(tracerProviderBuilder);

// Custom context extractor, MDC enabled
new OpenTelemetryDurablePlugin(tracerProviderBuilder, contextExtractor);
new OtelPlugin(tracerProviderBuilder, contextExtractor);

// Full configuration
new OpenTelemetryDurablePlugin(tracerProviderBuilder, contextExtractor, enableMdc);
new OtelPlugin(tracerProviderBuilder, contextExtractor, enableMdc);
```

| Parameter | Description | Default |
Expand Down Expand Up @@ -262,21 +262,21 @@ For local testing, use a logging exporter to print spans to stdout:
```java
import io.opentelemetry.exporter.logging.LoggingSpanExporter;

var otelPlugin = new OpenTelemetryDurablePlugin(
var otelPlugin = new OtelPlugin(
SdkTracerProvider.builder()
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())));
```

## API Reference

### `OpenTelemetryDurablePlugin`
### `OtelPlugin`

The main plugin class. Implements `DurableExecutionPlugin` from the core SDK.

```java
new OpenTelemetryDurablePlugin(SdkTracerProviderBuilder tracerProviderBuilder)
new OpenTelemetryDurablePlugin(SdkTracerProviderBuilder tracerProviderBuilder, ContextExtractor contextExtractor)
new OpenTelemetryDurablePlugin(SdkTracerProviderBuilder tracerProviderBuilder, ContextExtractor contextExtractor, boolean enableMdc)
new OtelPlugin(SdkTracerProviderBuilder tracerProviderBuilder)
new OtelPlugin(SdkTracerProviderBuilder tracerProviderBuilder, ContextExtractor contextExtractor)
new OtelPlugin(SdkTracerProviderBuilder tracerProviderBuilder, ContextExtractor contextExtractor, boolean enableMdc)
```

### `XRayContextExtractor`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
* </ul>
*
* <p>Usage: Call {@link #inject()} in {@code onUserFunctionStart} (after span is active) and {@link #clear()} in
* {@code onUserFunctionEnd}. Or use the convenience plugin {@link OpenTelemetryDurablePlugin} which handles this
* automatically when MDC enrichment is enabled.
* {@code onUserFunctionEnd}. Or use the convenience plugin {@link OtelPlugin} which handles this automatically when MDC
* enrichment is enabled.
*
* @deprecated This is a preview API that is experimental and may be changed or removed in future releases.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@
* @deprecated This is a preview API that is experimental and may be changed or removed in future releases.
*/
@Deprecated
public class OpenTelemetryDurablePlugin implements DurableExecutionPlugin {
public class OtelPlugin implements DurableExecutionPlugin {

private static final Logger logger = LoggerFactory.getLogger(OpenTelemetryDurablePlugin.class);
private static final Logger logger = LoggerFactory.getLogger(OtelPlugin.class);
private static final String INSTRUMENTATION_NAME = "aws-durable-execution-sdk-java";

private final SdkTracerProvider tracerProvider;
Expand Down Expand Up @@ -98,13 +98,13 @@ public class OpenTelemetryDurablePlugin implements DurableExecutionPlugin {
*
* <pre>{@code
* var otlpExporter = OtlpGrpcSpanExporter.getDefault(); // sends to localhost:4317
* var plugin = new OpenTelemetryDurablePlugin(
* var plugin = new OtelPlugin(
* SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(otlpExporter)));
* }</pre>
*
* @param tracerProviderBuilder the tracer provider builder (ID generator will be overridden)
*/
public OpenTelemetryDurablePlugin(SdkTracerProviderBuilder tracerProviderBuilder) {
public OtelPlugin(SdkTracerProviderBuilder tracerProviderBuilder) {
this(tracerProviderBuilder, new XRayContextExtractor(), true);
}

Expand All @@ -114,8 +114,7 @@ public OpenTelemetryDurablePlugin(SdkTracerProviderBuilder tracerProviderBuilder
* @param tracerProviderBuilder the tracer provider builder (ID generator will be overridden)
* @param contextExtractor extracts parent trace context from the Lambda environment
*/
public OpenTelemetryDurablePlugin(
SdkTracerProviderBuilder tracerProviderBuilder, ContextExtractor contextExtractor) {
public OtelPlugin(SdkTracerProviderBuilder tracerProviderBuilder, ContextExtractor contextExtractor) {
this(tracerProviderBuilder, contextExtractor, true);
}

Expand All @@ -126,7 +125,7 @@ public OpenTelemetryDurablePlugin(
* @param contextExtractor extracts parent trace context from the Lambda environment
* @param enableMdc if true, injects trace_id/span_id into SLF4J MDC for log correlation
*/
public OpenTelemetryDurablePlugin(
public OtelPlugin(
SdkTracerProviderBuilder tracerProviderBuilder, ContextExtractor contextExtractor, boolean enableMdc) {
this.idGenerator = new DeterministicIdGenerator();
this.tracerProvider = tracerProviderBuilder.setIdGenerator(idGenerator).build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ void plugin_withMdcEnabled_setsArnInMdc() {
// Test MDC through the full plugin lifecycle (where makeCurrent is called on same thread)
var spanExporter = InMemorySpanExporter.create();

var plugin = new OpenTelemetryDurablePlugin(
var plugin = new OtelPlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(spanExporter)),
() -> null,
true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,16 @@
import software.amazon.lambda.durable.execution.SuspendExecutionException;
import software.amazon.lambda.durable.plugin.*;

class OpenTelemetryDurablePluginTest {
class OtelPluginTest {

private InMemorySpanExporter spanExporter;
private OpenTelemetryDurablePlugin plugin;
private OtelPlugin plugin;

@BeforeEach
void setUp() {
spanExporter = InMemorySpanExporter.create();

plugin = new OpenTelemetryDurablePlugin(
plugin = new OtelPlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(spanExporter)),
() -> null,
false);
Expand Down Expand Up @@ -213,7 +213,7 @@ void operationNotCompleted_spanEndedAtInvocationEnd() {
@Test
void sampling_disabled_producesNoSpans() {
spanExporter = InMemorySpanExporter.create();
var sampledPlugin = new OpenTelemetryDurablePlugin(
var sampledPlugin = new OtelPlugin(
SdkTracerProvider.builder()
.setSampler(io.opentelemetry.sdk.trace.samplers.Sampler.alwaysOff())
.addSpanProcessor(SimpleSpanProcessor.create(spanExporter)),
Expand Down Expand Up @@ -241,7 +241,7 @@ void xrayExtraction_usesExtractedTraceId_overArnDerived() {
var extractedContext = new ExtractedContext(xrayTraceId, null);

spanExporter = InMemorySpanExporter.create();
var xrayPlugin = new OpenTelemetryDurablePlugin(
var xrayPlugin = new OtelPlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(spanExporter)),
() -> extractedContext,
false);
Expand All @@ -260,7 +260,7 @@ void xrayExtraction_allSpansShareExtractedTraceId() {
var extractedContext = new ExtractedContext(xrayTraceId, null);

spanExporter = InMemorySpanExporter.create();
var xrayPlugin = new OpenTelemetryDurablePlugin(
var xrayPlugin = new OtelPlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(spanExporter)),
() -> extractedContext,
false);
Expand Down Expand Up @@ -289,7 +289,7 @@ void xrayExtraction_withParentSpanId_invocationSpanHasCorrectParent() {
var extractedContext = new ExtractedContext(xrayTraceId, parentSpanId);

spanExporter = InMemorySpanExporter.create();
var xrayPlugin = new OpenTelemetryDurablePlugin(
var xrayPlugin = new OtelPlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(spanExporter)),
() -> extractedContext,
false);
Expand All @@ -314,7 +314,7 @@ void xrayExtraction_withoutParentSpanId_invocationSpanIsRoot() {
var extractedContext = new ExtractedContext(xrayTraceId, null);

spanExporter = InMemorySpanExporter.create();
var xrayPlugin = new OpenTelemetryDurablePlugin(
var xrayPlugin = new OtelPlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(spanExporter)),
() -> extractedContext,
false);
Expand Down Expand Up @@ -344,7 +344,7 @@ void xrayExtraction_multipleInvocations_sameTraceId_unifiedTrace() {
var extractedContext = new ExtractedContext(xrayTraceId, "53995c3f42cd8ad8");

spanExporter = InMemorySpanExporter.create();
var xrayPlugin = new OpenTelemetryDurablePlugin(
var xrayPlugin = new OtelPlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(spanExporter)),
() -> extractedContext,
false);
Expand Down Expand Up @@ -376,7 +376,7 @@ void xrayExtraction_multipleInvocations_sameTraceId_unifiedTrace() {
@Test
void xrayExtraction_nullExtractor_fallsBackToArnDerived() {
spanExporter = InMemorySpanExporter.create();
var noXrayPlugin = new OpenTelemetryDurablePlugin(
var noXrayPlugin = new OtelPlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(spanExporter)),
() -> null,
false);
Expand Down Expand Up @@ -407,7 +407,7 @@ void xrayExtraction_extractedTraceIdMatchesXrayConversion() {
// Now feed it through the plugin
var extractedContext = new ExtractedContext(convertedId, null);
spanExporter = InMemorySpanExporter.create();
var xrayPlugin = new OpenTelemetryDurablePlugin(
var xrayPlugin = new OtelPlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(spanExporter)),
() -> extractedContext,
false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import software.amazon.lambda.durable.config.StepConfig;
import software.amazon.lambda.durable.model.ExecutionStatus;
import software.amazon.lambda.durable.model.WaitForConditionResult;
import software.amazon.lambda.durable.otel.OpenTelemetryDurablePlugin;
import software.amazon.lambda.durable.otel.OtelPlugin;
import software.amazon.lambda.durable.retry.RetryStrategies;
import software.amazon.lambda.durable.testing.LocalDurableTestRunner;

Expand All @@ -33,7 +33,7 @@ class OtelPluginIntegrationTest {
void setUp() {
spanExporter = InMemorySpanExporter.create();

var plugin = new OpenTelemetryDurablePlugin(
var plugin = new OtelPlugin(
SdkTracerProvider.builder().addSpanProcessor(SimpleSpanProcessor.create(spanExporter)),
() -> null,
false);
Expand Down Expand Up @@ -306,7 +306,7 @@ void failedStep_producesErrorSpan() {
void sampling_off_producesNoSpans() {
var sampledExporter = InMemorySpanExporter.create();

var noSamplePlugin = new OpenTelemetryDurablePlugin(
var noSamplePlugin = new OtelPlugin(
SdkTracerProvider.builder()
.setSampler(io.opentelemetry.sdk.trace.samplers.Sampler.alwaysOff())
.addSpanProcessor(SimpleSpanProcessor.create(sampledExporter)),
Expand Down