33Module ` io.temporal:temporal-opentelemetry-v2 ` provides replay-safe
44OpenTelemetry tracing, metrics, and logs for Temporal.
55
6+ > [ !WARNING]
7+ > This module is experimental, and its API may change.
8+
69## Setup
710
811Use the same version as the rest of your Temporal Java SDK dependencies:
@@ -18,7 +21,13 @@ attach the plugin to your service stubs:
1821
1922``` java
2023import io.opentelemetry.api.GlobalOpenTelemetry ;
24+ import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter ;
25+ import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter ;
2126import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter ;
27+ import io.opentelemetry.sdk.logs.SdkLoggerProvider ;
28+ import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor ;
29+ import io.opentelemetry.sdk.metrics.SdkMeterProvider ;
30+ import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader ;
2231import io.opentelemetry.sdk.trace.SdkTracerProvider ;
2332import io.opentelemetry.sdk.trace.export.BatchSpanProcessor ;
2433import io.temporal.client.WorkflowClient ;
@@ -34,6 +43,16 @@ ReplaySafeOpenTelemetry openTelemetry =
3443 SdkTracerProvider . builder()
3544 .addSpanProcessor(
3645 BatchSpanProcessor . builder(OtlpGrpcSpanExporter . builder(). build()). build()))
46+ .setMeterProviderBuilder(
47+ SdkMeterProvider . builder()
48+ .registerMetricReader(
49+ PeriodicMetricReader . builder(OtlpGrpcMetricExporter . builder(). build())
50+ .build()))
51+ .setLoggerProviderBuilder(
52+ SdkLoggerProvider . builder()
53+ .addLogRecordProcessor(
54+ BatchLogRecordProcessor . builder(OtlpGrpcLogRecordExporter . builder(). build())
55+ .build()))
3756 .build();
3857GlobalOpenTelemetry . set(openTelemetry);
3958
@@ -51,6 +70,13 @@ Plugins configured on `WorkflowServiceStubsOptions` propagate to clients and
5170workers created from those stubs. It can also be configured directly on
5271` WorkflowClientOptions ` .
5372
73+ Build ` ReplaySafeOpenTelemetry ` before anything else uses the OpenTelemetry
74+ ` Context ` , and register it as the global before building the plugin. Otherwise,
75+ ` OpenTelemetryPlugin.Builder.build() ` throws ` IllegalStateException ` .
76+
77+ Call ` ReplaySafeOpenTelemetry.close() ` after your workers and clients have
78+ stopped to export buffered telemetry and shut down its providers.
79+
5480## Tracing
5581
5682The plugin propagates application trace context through Temporal headers.
@@ -81,7 +107,8 @@ try (Scope ignored = span.makeCurrent()) {
81107
82108## Metrics
83109
84- Create synchronous metrics in workflow, client, and activity code with the standard OpenTelemetry API:
110+ Create metrics in workflow, client, and activity code with the standard
111+ OpenTelemetry API. Workflow code supports only synchronous instruments:
85112
86113``` java
87114import io.opentelemetry.api.GlobalOpenTelemetry ;
0 commit comments