diff --git a/src/Sampler/RuleBased/README.md b/src/Sampler/RuleBased/README.md index ccde5d7bc..3104347a3 100644 --- a/src/Sampler/RuleBased/README.md +++ b/src/Sampler/RuleBased/README.md @@ -1,6 +1,6 @@ -# Contrib Sampler +# RuleBasedSampler -Provides additional samplers that are not part of the official specification. +Allows sampling based on a list of rule sets. ## Installation @@ -8,9 +8,13 @@ Provides additional samplers that are not part of the official specification. composer require open-telemetry/sampler-rule-based ``` -## RuleBasedSampler +## Usage -Allows sampling based on a list of rule sets. The first matching rule set will decide the sampling result. +Provide a list of `RuleSet` instances and a fallback sampler to the `RuleBasedSampler` constructor. Each rule set +contains a list of rules and a delegate sampler to execute if the rule matches. The rules are evaluated in the order +they are defined. The first matching rule set will decide the sampling result. + +If no rules match, then the fallback sampler is used. ```php $sampler = new RuleBasedSampler( @@ -27,12 +31,29 @@ $sampler = new RuleBasedSampler( ); ``` -### Configuration +## Configuration -###### Example: drop spans for the /health endpoint +The RuleBased sampler can be configured through [Declarative Configuration](https://opentelemetry.io/docs/specs/otel/configuration/#declarative-configuration), using the +key `php_rule_based` under `tracer_provider.sampler.sampler`: ```yaml -contrib_rule_based: +file_format: "0.4" + +tracer_provider: + sampler: + php_rule_based: + rule_sets: + # ... + fallback: + # ... +``` + +### Examples + +Drop spans for the /health endpoint: + +```yaml +php_rule_based: rule_sets: - rules: - span_kind: { kind: SERVER } @@ -42,10 +63,10 @@ contrib_rule_based: fallback: # ... ``` -###### Example: sample spans with at least one sampled link +Sample spans with at least one sampled link: ```yaml -contrib_rule_based: +php_rule_based: rule_sets: - rules: [ link: { sampled: true } ] delegate: @@ -53,10 +74,10 @@ contrib_rule_based: fallback: # ... ``` -###### Example: modeling parent based sampler as rule based sampler +Modeling parent-based sampler as rule-based sampler: ```yaml -rule_based: +php_rule_based: rule_sets: - rules: [ parent: { sampled: true, remote: true } ] delegate: # remote_parent_sampled @@ -67,21 +88,4 @@ rule_based: - rules: [ parent: { sampled: false, remote: false } ] delegate: # local_parent_not_sampled fallback: # root -``` - -## AlwaysRecordingSampler - -Records all spans to allow the usage of span processors that generate metrics from spans. - -```php -$sampler = new AlwaysRecordingSampler( - new ParentBasedSampler(new AlwaysOnSampler()), -); -``` - -### Configuration - -```yaml -always_recording: - sampler: # ... -``` +``` \ No newline at end of file diff --git a/src/Sampler/RuleBased/composer.json b/src/Sampler/RuleBased/composer.json index 7094aad40..e96fc495e 100644 --- a/src/Sampler/RuleBased/composer.json +++ b/src/Sampler/RuleBased/composer.json @@ -7,7 +7,7 @@ "php": "^8.1", "open-telemetry/api": "^1.1.0", "open-telemetry/sdk": "^1.1.0", - "open-telemetry/sdk-configuration": "^0.0.5" + "open-telemetry/sdk-configuration": "^0.0.9" }, "require-dev": { "symfony/config": "^5.4 || ^6.4 || ^7.0", diff --git a/src/Sampler/RuleBased/src/ComponentProvider/SamplerRuleBased.php b/src/Sampler/RuleBased/src/ComponentProvider/SamplerRuleBased.php index aa01e64d9..1fecbd39d 100644 --- a/src/Sampler/RuleBased/src/ComponentProvider/SamplerRuleBased.php +++ b/src/Sampler/RuleBased/src/ComponentProvider/SamplerRuleBased.php @@ -13,6 +13,7 @@ use OpenTelemetry\Contrib\Sampler\RuleBased\SamplingRule; use OpenTelemetry\SDK\Trace\SamplerInterface; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; +use Symfony\Component\Config\Definition\Builder\NodeBuilder; /** * @implements ComponentProvider @@ -49,9 +50,9 @@ public function createPlugin(array $properties, Context $context): SamplerInterf ); } - public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinition + public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition { - $node = new ArrayNodeDefinition('contrib_rule_based'); + $node = $builder->arrayNode('php_rule_based'); /** @psalm-suppress PossiblyNullReference */ $node @@ -59,7 +60,7 @@ public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinit ->arrayNode('rule_sets') ->arrayPrototype() ->children() - ->append($registry->componentArrayList('rules', SamplingRule::class)->isRequired()->cannotBeEmpty()) + ->append($registry->componentList('rules', SamplingRule::class)->isRequired()->cannotBeEmpty()) ->append($registry->component('delegate', SamplerInterface::class)->isRequired()) ->end() ->end() diff --git a/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleAttribute.php b/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleAttribute.php index c409e7df4..8f66dadfd 100644 --- a/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleAttribute.php +++ b/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleAttribute.php @@ -11,6 +11,7 @@ use OpenTelemetry\Contrib\Sampler\RuleBased\SamplingRule; use OpenTelemetry\Contrib\Sampler\RuleBased\SamplingRule\AttributeRule; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; +use Symfony\Component\Config\Definition\Builder\NodeBuilder; /** * @implements ComponentProvider @@ -33,9 +34,9 @@ public function createPlugin(array $properties, Context $context): SamplingRule ); } - public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinition + public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition { - $node = new ArrayNodeDefinition('attribute'); + $node = $builder->arrayNode('attribute'); /** @psalm-suppress PossiblyNullReference */ $node diff --git a/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleLink.php b/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleLink.php index dec9bc70e..7b63c6e29 100644 --- a/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleLink.php +++ b/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleLink.php @@ -10,6 +10,7 @@ use OpenTelemetry\Contrib\Sampler\RuleBased\SamplingRule; use OpenTelemetry\Contrib\Sampler\RuleBased\SamplingRule\LinkRule; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; +use Symfony\Component\Config\Definition\Builder\NodeBuilder; /** * @implements ComponentProvider @@ -31,9 +32,9 @@ public function createPlugin(array $properties, Context $context): SamplingRule ); } - public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinition + public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition { - $node = new ArrayNodeDefinition('link'); + $node = $builder->arrayNode('link'); /** @psalm-suppress PossiblyNullReference */ $node diff --git a/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleParent.php b/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleParent.php index 40dbcc74b..8ac6ca1e3 100644 --- a/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleParent.php +++ b/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleParent.php @@ -10,6 +10,7 @@ use OpenTelemetry\Contrib\Sampler\RuleBased\SamplingRule; use OpenTelemetry\Contrib\Sampler\RuleBased\SamplingRule\ParentRule; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; +use Symfony\Component\Config\Definition\Builder\NodeBuilder; /** * @implements ComponentProvider @@ -31,9 +32,9 @@ public function createPlugin(array $properties, Context $context): SamplingRule ); } - public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinition + public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition { - $node = new ArrayNodeDefinition('parent'); + $node = $builder->arrayNode('parent'); /** @psalm-suppress PossiblyNullReference */ $node diff --git a/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleSpanKind.php b/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleSpanKind.php index b7dfa61d2..30c410a0c 100644 --- a/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleSpanKind.php +++ b/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleSpanKind.php @@ -11,6 +11,7 @@ use OpenTelemetry\Contrib\Sampler\RuleBased\SamplingRule; use OpenTelemetry\Contrib\Sampler\RuleBased\SamplingRule\SpanKindRule; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; +use Symfony\Component\Config\Definition\Builder\NodeBuilder; /** * @implements ComponentProvider @@ -36,9 +37,9 @@ public function createPlugin(array $properties, Context $context): SamplingRule ); } - public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinition + public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition { - $node = new ArrayNodeDefinition('span_kind'); + $node = $builder->arrayNode('span_kind'); /** @psalm-suppress PossiblyNullReference */ $node diff --git a/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleSpanName.php b/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleSpanName.php index 49f5e605c..0290554f3 100644 --- a/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleSpanName.php +++ b/src/Sampler/RuleBased/src/ComponentProvider/SamplingRuleSpanName.php @@ -11,6 +11,7 @@ use OpenTelemetry\Contrib\Sampler\RuleBased\SamplingRule; use OpenTelemetry\Contrib\Sampler\RuleBased\SamplingRule\SpanNameRule; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; +use Symfony\Component\Config\Definition\Builder\NodeBuilder; /** * @implements ComponentProvider @@ -31,9 +32,9 @@ public function createPlugin(array $properties, Context $context): SamplingRule ); } - public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinition + public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition { - $node = new ArrayNodeDefinition('span_name'); + $node = $builder->arrayNode('span_name'); /** @psalm-suppress PossiblyNullReference */ $node diff --git a/src/Sampler/RuleBased/tests/Integration/config/sdk-config.yaml b/src/Sampler/RuleBased/tests/Integration/config/sdk-config.yaml index c12a88597..2da7a6a6c 100644 --- a/src/Sampler/RuleBased/tests/Integration/config/sdk-config.yaml +++ b/src/Sampler/RuleBased/tests/Integration/config/sdk-config.yaml @@ -1,8 +1,8 @@ -file_format: "0.3" +file_format: "0.4" tracer_provider: sampler: - contrib_rule_based: + php_rule_based: rule_sets: - rules: - attribute: {key: is.important, pattern: ~false~ }