diff --git a/src/Config/SDK/ComponentProvider/Logs/LogRecordExporterOtlp.php b/src/Config/SDK/ComponentProvider/Logs/LogRecordExporterOtlp.php index 6ee171296..5d2d7b303 100644 --- a/src/Config/SDK/ComponentProvider/Logs/LogRecordExporterOtlp.php +++ b/src/Config/SDK/ComponentProvider/Logs/LogRecordExporterOtlp.php @@ -34,6 +34,10 @@ final class LogRecordExporterOtlp implements ComponentProvider * headers: array, * compression: 'gzip'|null, * timeout: int<0, max>, + * retry: array{ + * initial_delay: int, + * max_attempts: int + * } * } $properties */ public function createPlugin(array $properties, Context $context): LogRecordExporterInterface @@ -46,6 +50,8 @@ public function createPlugin(array $properties, Context $context): LogRecordExpo headers: $properties['headers'], compression: $properties['compression'], timeout: $properties['timeout'], + retryDelay: $properties['retry']['initial_delay'], + maxRetries: $properties['retry']['max_attempts'], cacert: $properties['certificate'], cert: $properties['client_certificate'], key: $properties['client_certificate'], @@ -67,6 +73,13 @@ public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinit ->end() ->enumNode('compression')->values(['gzip'])->defaultNull()->end() ->integerNode('timeout')->min(0)->defaultValue(10)->end() + ->arrayNode('retry') + ->addDefaultsIfNotSet() + ->children() + ->integerNode('max_attempts')->min(0)->defaultValue(3)->end() + ->integerNode('initial_delay')->min(0)->defaultValue(0)->end() + ->end() + ->end() ->end() ; diff --git a/src/Config/SDK/ComponentProvider/Metrics/MetricExporterOtlp.php b/src/Config/SDK/ComponentProvider/Metrics/MetricExporterOtlp.php index b94015b26..e11d05cd0 100644 --- a/src/Config/SDK/ComponentProvider/Metrics/MetricExporterOtlp.php +++ b/src/Config/SDK/ComponentProvider/Metrics/MetricExporterOtlp.php @@ -35,6 +35,10 @@ final class MetricExporterOtlp implements ComponentProvider * headers: array, * compression: 'gzip'|null, * timeout: int<0, max>, + * retry: array{ + * initial_delay: int, + * max_attempts: int, + * }, * temporality_preference: 'cumulative'|'delta'|'lowmemory', * default_histogram_aggregation: 'explicit_bucket_histogram', * } $properties @@ -55,6 +59,8 @@ public function createPlugin(array $properties, Context $context): MetricExporte headers: $properties['headers'], compression: $properties['compression'], timeout: $properties['timeout'], + retryDelay: $properties['retry']['initial_delay'], + maxRetries: $properties['retry']['max_attempts'], cacert: $properties['certificate'], cert: $properties['client_certificate'], key: $properties['client_certificate'], @@ -76,6 +82,13 @@ public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinit ->end() ->enumNode('compression')->values(['gzip'])->defaultNull()->validate()->always(Validation::ensureString())->end()->end() ->integerNode('timeout')->min(0)->defaultValue(10)->end() + ->arrayNode('retry') + ->addDefaultsIfNotSet() + ->children() + ->integerNode('max_attempts')->min(0)->defaultValue(3)->end() + ->integerNode('initial_delay')->min(0)->defaultValue(0)->end() + ->end() + ->end() ->enumNode('temporality_preference') ->values(['cumulative', 'delta', 'lowmemory']) ->defaultValue('cumulative') diff --git a/src/Config/SDK/ComponentProvider/Trace/SpanExporterOtlp.php b/src/Config/SDK/ComponentProvider/Trace/SpanExporterOtlp.php index 4823ed898..6e5ba5d08 100644 --- a/src/Config/SDK/ComponentProvider/Trace/SpanExporterOtlp.php +++ b/src/Config/SDK/ComponentProvider/Trace/SpanExporterOtlp.php @@ -34,6 +34,10 @@ final class SpanExporterOtlp implements ComponentProvider * headers: array, * compression: 'gzip'|null, * timeout: int<0, max>, + * retry: array{ + * initial_delay: int, + * max_attempts: int + * } * } $properties */ public function createPlugin(array $properties, Context $context): SpanExporterInterface @@ -46,6 +50,8 @@ public function createPlugin(array $properties, Context $context): SpanExporterI headers: $properties['headers'], compression: $properties['compression'], timeout: $properties['timeout'], + retryDelay: $properties['retry']['initial_delay'], + maxRetries: $properties['retry']['max_attempts'], cacert: $properties['certificate'], cert: $properties['client_certificate'], key: $properties['client_certificate'], @@ -67,6 +73,13 @@ public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinit ->end() ->enumNode('compression')->values(['gzip'])->defaultNull()->end() ->integerNode('timeout')->min(0)->defaultValue(10)->end() + ->arrayNode('retry') + ->addDefaultsIfNotSet() + ->children() + ->integerNode('max_attempts')->min(0)->defaultValue(3)->end() + ->integerNode('initial_delay')->min(0)->defaultValue(0)->end() + ->end() + ->end() ->end() ; diff --git a/src/Config/SDK/ComponentProvider/Trace/SpanExporterZipkin.php b/src/Config/SDK/ComponentProvider/Trace/SpanExporterZipkin.php index a5665ea46..209ea895c 100644 --- a/src/Config/SDK/ComponentProvider/Trace/SpanExporterZipkin.php +++ b/src/Config/SDK/ComponentProvider/Trace/SpanExporterZipkin.php @@ -25,6 +25,10 @@ final class SpanExporterZipkin implements ComponentProvider * @param array{ * endpoint: string, * timeout: int<0, max>, + * retry: array{ + * initial_delay: int, + * max_attempts: int + * } * } $properties */ public function createPlugin(array $properties, Context $context): SpanExporterInterface @@ -33,6 +37,8 @@ public function createPlugin(array $properties, Context $context): SpanExporterI endpoint: $properties['endpoint'], contentType: 'application/json', timeout: $properties['timeout'], + retryDelay: $properties['retry']['initial_delay'], + maxRetries: $properties['retry']['max_attempts'], )); } @@ -43,6 +49,13 @@ public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinit ->children() ->scalarNode('endpoint')->isRequired()->validate()->always(Validation::ensureString())->end()->end() ->integerNode('timeout')->min(0)->defaultValue(10)->end() + ->arrayNode('retry') + ->addDefaultsIfNotSet() + ->children() + ->integerNode('max_attempts')->min(0)->defaultValue(3)->end() + ->integerNode('initial_delay')->min(0)->defaultValue(0)->end() + ->end() + ->end() ->end() ; diff --git a/tests/Integration/Config/ConfigurationTest.php b/tests/Integration/Config/ConfigurationTest.php index ae204f50b..252529b94 100644 --- a/tests/Integration/Config/ConfigurationTest.php +++ b/tests/Integration/Config/ConfigurationTest.php @@ -24,5 +24,6 @@ public static function openTelemetryConfigurationDataProvider(): iterable { yield 'kitchen-sink' => [__DIR__ . '/configurations/kitchen-sink.yaml']; yield 'anchors' => [__DIR__ . '/configurations/anchors.yaml']; + yield 'minimal' => [__DIR__ . '/configurations/minimal.yaml']; } } diff --git a/tests/Integration/Config/configurations/anchors.yaml b/tests/Integration/Config/configurations/anchors.yaml index 18e409d1a..2308234e0 100644 --- a/tests/Integration/Config/configurations/anchors.yaml +++ b/tests/Integration/Config/configurations/anchors.yaml @@ -12,6 +12,9 @@ exporters: api-key: !!str 1234 compression: gzip timeout: 10000 + retry: + max_attempts: 5 + initial_delay: 100 logger_provider: processors: diff --git a/tests/Integration/Config/configurations/kitchen-sink.yaml b/tests/Integration/Config/configurations/kitchen-sink.yaml index cb82e3862..a4db4ee41 100644 --- a/tests/Integration/Config/configurations/kitchen-sink.yaml +++ b/tests/Integration/Config/configurations/kitchen-sink.yaml @@ -87,6 +87,9 @@ logger_provider: # # Environment variable: OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_EXPORTER_OTLP_LOGS_TIMEOUT timeout: 10000 + retry: + max_attempts: 5 + initial_delay: 100 # Configure log record limits. See also attribute_limits. limits: # Configure max log record attribute value size. Overrides attribute_limits.attribute_value_length_limit. @@ -155,6 +158,9 @@ meter_provider: # # Environment variable: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE temporality_preference: delta + retry: + max_attempts: 5 + initial_delay: 100 # Configure a periodic metric reader. - periodic: # Configure exporter. @@ -257,6 +263,9 @@ tracer_provider: # # Environment variable: OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_EXPORTER_OTLP_TRACES_TIMEOUT timeout: 10000 + retry: + max_attempts: 5 + initial_delay: 100 # Configure a batch span processor. - batch: # Configure exporter. @@ -273,6 +282,9 @@ tracer_provider: # # Environment variable: OTEL_EXPORTER_ZIPKIN_TIMEOUT timeout: 10000 + retry: + max_attempts: 5 + initial_delay: 200 # Configure a simple span processor. - simple: # Configure exporter. diff --git a/tests/Integration/Config/configurations/minimal.yaml b/tests/Integration/Config/configurations/minimal.yaml new file mode 100644 index 000000000..a25a6498b --- /dev/null +++ b/tests/Integration/Config/configurations/minimal.yaml @@ -0,0 +1,33 @@ +# minimal.yaml demonstrates only providing required attributes +file_format: "0.1" +logger_provider: + processors: + - batch: + exporter: + otlp: + protocol: http/protobuf + endpoint: http://localhost:4318 + - simple: + exporter: + console: {} +meter_provider: + readers: + - periodic: + exporter: + otlp: + protocol: http/protobuf + endpoint: http://localhost:4318 +tracer_provider: + processors: + - batch: + exporter: + otlp: + protocol: http/protobuf + endpoint: http://localhost:4318 + - batch: + exporter: + zipkin: + endpoint: http://localhost:9411/api/v2/spans + - simple: + exporter: + console: {} diff --git a/tests/Unit/Config/SDK/Configuration/ExampleSdk/Trace/SpanExporterOtlp.php b/tests/Unit/Config/SDK/Configuration/ExampleSdk/Trace/SpanExporterOtlp.php index 6bd53513e..3d7ed4a0d 100644 --- a/tests/Unit/Config/SDK/Configuration/ExampleSdk/Trace/SpanExporterOtlp.php +++ b/tests/Unit/Config/SDK/Configuration/ExampleSdk/Trace/SpanExporterOtlp.php @@ -25,6 +25,8 @@ final class SpanExporterOtlp implements ComponentProvider * headers: array, * compression: 'gzip'|null, * timeout: int<0, max>, + * retryDelay: int<0, max>, + * maxRetries: int<0, max>, * } $properties */ public function createPlugin(array $properties, Context $context): SpanExporter @@ -47,6 +49,12 @@ public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinit ->end() ->enumNode('compression')->values(['gzip'])->defaultNull()->end() ->integerNode('timeout')->min(0)->defaultValue(10)->end() + ->arrayNode('retry') + ->children() + ->integerNode('max_attempts')->min(0)->defaultValue(3)->end() + ->integerNode('initial_delay')->min(0)->defaultValue(0)->end() + ->end() + ->end() ->end() ; diff --git a/tests/Unit/Config/SDK/Configuration/configurations/kitchen-sink.yaml b/tests/Unit/Config/SDK/Configuration/configurations/kitchen-sink.yaml index 8a8a5b800..221a07e45 100644 --- a/tests/Unit/Config/SDK/Configuration/configurations/kitchen-sink.yaml +++ b/tests/Unit/Config/SDK/Configuration/configurations/kitchen-sink.yaml @@ -293,6 +293,9 @@ tracer_provider: # # Environment variable: OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_EXPORTER_OTLP_TRACES_TIMEOUT timeout: 10000 + retry: + max_attempts: 5 + initial_delay: 100 # Configure a batch span processor. - batch: # Configure exporter.