From 644b328c42df6c72422d39605e17e687fd155a05 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Thu, 29 Aug 2024 10:52:43 -0500 Subject: [PATCH 1/6] Add declarative config support for RuleBasedRoutingSampler --- samplers/README.md | 57 +++++ samplers/build.gradle.kts | 10 +- ...eBasedRoutingSamplerComponentProvider.java | 102 ++++++++ ...toconfigure.spi.internal.ComponentProvider | 1 + ...edRoutingSamplerComponentProviderTest.java | 223 ++++++++++++++++++ settings.gradle.kts | 2 + 6 files changed, 393 insertions(+), 2 deletions(-) create mode 100644 samplers/src/main/java/io/opentelemetry/contrib/sampler/internal/RuleBasedRoutingSamplerComponentProvider.java create mode 100644 samplers/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider create mode 100644 samplers/src/test/java/internal/RuleBasedRoutingSamplerComponentProviderTest.java diff --git a/samplers/README.md b/samplers/README.md index 67a8d561a..235bce36f 100644 --- a/samplers/README.md +++ b/samplers/README.md @@ -1,5 +1,62 @@ # Samplers +## Declarative configuration + +The following samplers support [declarative configuration](https://github.com/open-telemetry/opentelemetry-specification/tree/main/specification/configuration#declarative-configuration): + +* `RuleBasedRoutingSampler` + +To use: + +* Add a dependency on `io.opentelemetry:opentelemetry-sdk-extension-incubator:` +* Follow the [instructions](https://github.com/open-telemetry/opentelemetry-java/blob/main/sdk-extensions/incubator/README.md#file-configuration) to configure OpenTelemetry with declarative configuration. +* Configure the `.tracer_provider.sampler` to include the `rule_based_routing` sampler. + +Schema for `rule_based_routing` sampler: + +```yaml +# The fallback sampler to the use if the criteria is not met. +fallback_sampler: + always_on: +# Filter to spans of this span_kind. Must be one of: SERVER, CLIENT, INTERNAL, CONSUMER, PRODUCER. +span_kind: SERVER # only apply to server spans +# List of rules describing spans to drop. Spans are dropped if they match one of the rules. +rules: + # The action to take when the rule is matches. Must be of: DROP, RECORD_AND_SAMPLE. + - action: DROP + # The span attribute to match against. + attribute: url.path + # The pattern to compare the span attribute to. + pattern: /actuator.* +``` + +`rule_based_routing` sampler can be used anywhere a sampler is used in the configuration model. For example, the following YAML demonstrates a typical configuration, setting `rule_based_routing` sampler as the `root` sampler of `parent_based` sampler. In this configuration: + +* The `parent_based` sampler samples based on the sampling status of the parent. +* Or, if there is no parent, delegates to the `rule_based_routing` sampler. +* The `rule_based_routing` sampler drops spans where `kind=SERVER` and `url.full matches .*/actuator.*`, else it samples and records. + +```yaml +// ... the rest of the configuration file is omitted for brevity +// For more example see: https://github.com/open-telemetry/opentelemetry-configuration/blob/main/README.md#starter-templates +tracer_provider: + sampler: + parent_based: + # Configure the parent_based sampler's root sampler to be rule_based_routing sampler. + root: + rule_based_routing: + # Fallback to the always_on sampler if the criteria is not met. + fallback_sampler: + always_on: + # Only apply to SERVER spans. + span_kind: SERVER + rules: + # Drop spans where url.path matches the regex /actuator.* (i.e. spring boot actuator endpoints). + - action: DROP + attribute: url.path + pattern: /actuator.* +``` + ## Component owners - [Trask Stalnaker](https://github.com/trask), Microsoft diff --git a/samplers/build.gradle.kts b/samplers/build.gradle.kts index ffe2631d3..4d9a12e4c 100644 --- a/samplers/build.gradle.kts +++ b/samplers/build.gradle.kts @@ -7,9 +7,15 @@ description = "Sampler which makes its decision based on semantic attributes val otelJava.moduleName.set("io.opentelemetry.contrib.sampler") dependencies { - api("io.opentelemetry:opentelemetry-sdk") + // TODO: remove SNAPSHOT dependencies before merging + api("io.opentelemetry:opentelemetry-sdk:1.42.0-SNAPSHOT") + api("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.42.0-SNAPSHOT") + + compileOnly("io.opentelemetry:opentelemetry-sdk-extension-incubator:1.42.0-alpha-SNAPSHOT") + implementation("io.opentelemetry.semconv:opentelemetry-semconv") + testImplementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating") testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") - api("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") + testImplementation("io.opentelemetry:opentelemetry-sdk-extension-incubator:1.42.0-alpha-SNAPSHOT") } diff --git a/samplers/src/main/java/io/opentelemetry/contrib/sampler/internal/RuleBasedRoutingSamplerComponentProvider.java b/samplers/src/main/java/io/opentelemetry/contrib/sampler/internal/RuleBasedRoutingSamplerComponentProvider.java new file mode 100644 index 000000000..9bdc0564d --- /dev/null +++ b/samplers/src/main/java/io/opentelemetry/contrib/sampler/internal/RuleBasedRoutingSamplerComponentProvider.java @@ -0,0 +1,102 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.contrib.sampler.internal; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.contrib.sampler.RuleBasedRoutingSampler; +import io.opentelemetry.contrib.sampler.RuleBasedRoutingSamplerBuilder; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; +import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider; +import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties; +import io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfiguration; +import io.opentelemetry.sdk.trace.samplers.Sampler; +import java.util.List; + +/** + * Declarative configuration SPI implementation for {@link RuleBasedRoutingSampler}. + * + *

This class is internal and is hence not for public use. Its APIs are unstable and can change + * at any time. + */ +public class RuleBasedRoutingSamplerComponentProvider implements ComponentProvider { + + private static final String ACTION_RECORD_AND_SAMPLE = "RECORD_AND_SAMPLE"; + private static final String ACTION_DROP = "DROP"; + + @Override + public Class getType() { + return Sampler.class; + } + + @Override + public String getName() { + return "rule_based_routing"; + } + + @Override + public Sampler create(StructuredConfigProperties config) { + StructuredConfigProperties fallbackModel = config.getStructured("fallback_sampler"); + if (fallbackModel == null) { + throw new ConfigurationException( + "rule_based_routing sampler .fallback is required but is null"); + } + Sampler fallbackSampler; + try { + fallbackSampler = FileConfiguration.createSampler(fallbackModel); + } catch (ConfigurationException e) { + throw new ConfigurationException( + "rule_Based_routing sampler failed to create .fallback sampler", e); + } + + String spanKindString = config.getString("span_kind", "SERVER"); + SpanKind spanKind; + try { + spanKind = SpanKind.valueOf(spanKindString); + } catch (IllegalArgumentException e) { + throw new ConfigurationException( + "rule_based_routing sampler .span_kind is invalid: " + spanKindString, e); + } + + RuleBasedRoutingSamplerBuilder builder = + RuleBasedRoutingSampler.builder(spanKind, fallbackSampler); + + List rules = config.getStructuredList("rules"); + if (rules == null || rules.isEmpty()) { + throw new ConfigurationException("rule_based_routing sampler .rules is required"); + } + + for (StructuredConfigProperties rule : rules) { + String attribute = rule.getString("attribute"); + if (attribute == null) { + throw new ConfigurationException( + "rule_based_routing sampler .rules[].attribute is required"); + } + AttributeKey attributeKey = AttributeKey.stringKey(attribute); + String pattern = rule.getString("pattern"); + if (pattern == null) { + throw new ConfigurationException("rule_based_routing sampler .rules[].pattern is required"); + } + String action = rule.getString("action"); + if (action == null) { + throw new ConfigurationException("rule_based_routing sampler .rules[].action is required"); + } + if (action.equals(ACTION_RECORD_AND_SAMPLE)) { + builder.recordAndSample(attributeKey, pattern); + } else if (action.equals(ACTION_DROP)) { + builder.drop(attributeKey, pattern); + } else { + throw new ConfigurationException( + "rule_based_routing sampler .rules[].action is must be " + + ACTION_RECORD_AND_SAMPLE + + " or " + + ACTION_DROP); + } + } + + return builder.build(); + } +} diff --git a/samplers/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider b/samplers/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider new file mode 100644 index 000000000..32c554481 --- /dev/null +++ b/samplers/src/main/resources/META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider @@ -0,0 +1 @@ +io.opentelemetry.contrib.sampler.internal.RuleBasedRoutingSamplerComponentProvider diff --git a/samplers/src/test/java/internal/RuleBasedRoutingSamplerComponentProviderTest.java b/samplers/src/test/java/internal/RuleBasedRoutingSamplerComponentProviderTest.java new file mode 100644 index 000000000..e5807452b --- /dev/null +++ b/samplers/src/test/java/internal/RuleBasedRoutingSamplerComponentProviderTest.java @@ -0,0 +1,223 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package internal; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.context.Context; +import io.opentelemetry.contrib.sampler.RuleBasedRoutingSampler; +import io.opentelemetry.contrib.sampler.internal.RuleBasedRoutingSamplerComponentProvider; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException; +import io.opentelemetry.sdk.autoconfigure.spi.internal.StructuredConfigProperties; +import io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfiguration; +import io.opentelemetry.sdk.trace.IdGenerator; +import io.opentelemetry.sdk.trace.samplers.Sampler; +import io.opentelemetry.sdk.trace.samplers.SamplingResult; +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class RuleBasedRoutingSamplerComponentProviderTest { + + private static final RuleBasedRoutingSamplerComponentProvider PROVIDER = + new RuleBasedRoutingSamplerComponentProvider(); + + @Test + void endToEnd() { + String yaml = + "file_format: 0.1\n" + + "tracer_provider:\n" + + " sampler:\n" + + " parent_based:\n" + + " root:\n" + + " rule_based_routing:\n" + + " fallback_sampler:\n" + + " always_on:\n" + + " span_kind: SERVER\n" + + " rules:\n" + + " - attribute: url.path\n" + + " pattern: /actuator.*\n" + + " action: DROP\n"; + OpenTelemetrySdk openTelemetrySdk = + FileConfiguration.parseAndCreate( + new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8))); + Sampler sampler = openTelemetrySdk.getSdkTracerProvider().getSampler(); + assertThat(sampler.toString()) + .isEqualTo( + "ParentBased{" + + "root:RuleBasedRoutingSampler{" + + "rules=[" + + "SamplingRule{attributeKey=url.path, delegate=AlwaysOffSampler, pattern=/actuator.*}" + + "], " + + "kind=SERVER, " + + "fallback=AlwaysOnSampler" + + "}," + + "remoteParentSampled:AlwaysOnSampler," + + "remoteParentNotSampled:AlwaysOffSampler," + + "localParentSampled:AlwaysOnSampler," + + "localParentNotSampled:AlwaysOffSampler" + + "}"); + + // SERVER span to /actuator.* path should be dropped + assertThat( + sampler.shouldSample( + Context.root(), + IdGenerator.random().generateTraceId(), + "GET /actuator/health", + SpanKind.SERVER, + Attributes.builder().put("url.path", "/actuator/health").build(), + Collections.emptyList())) + .isEqualTo(SamplingResult.drop()); + + // SERVER span to other path should be recorded and sampled + assertThat( + sampler.shouldSample( + Context.root(), + IdGenerator.random().generateTraceId(), + "GET /actuator/health", + SpanKind.SERVER, + Attributes.builder().put("url.path", "/v1/users").build(), + Collections.emptyList())) + .isEqualTo(SamplingResult.recordAndSample()); + } + + @ParameterizedTest + @MethodSource("createValidArgs") + void create_Valid(String yaml, RuleBasedRoutingSampler expectedSampler) { + StructuredConfigProperties configProperties = + FileConfiguration.toConfigProperties( + new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8))); + + Sampler sampler = PROVIDER.create(configProperties); + assertThat(sampler.toString()).isEqualTo(expectedSampler.toString()); + } + + static Stream createValidArgs() { + return Stream.of( + Arguments.of( + "fallback_sampler:\n" + + " always_on:\n" + + "span_kind: SERVER\n" + + "rules:\n" + + " - attribute: url.path\n" + + " pattern: path\n" + + " action: DROP\n", + RuleBasedRoutingSampler.builder(SpanKind.SERVER, Sampler.alwaysOn()) + .drop(AttributeKey.stringKey("url.path"), "path") + .build()), + Arguments.of( + "fallback_sampler:\n" + + " always_off:\n" + + "span_kind: SERVER\n" + + "rules:\n" + + " - attribute: url.path\n" + + " pattern: path\n" + + " action: RECORD_AND_SAMPLE\n", + RuleBasedRoutingSampler.builder(SpanKind.SERVER, Sampler.alwaysOff()) + .recordAndSample(AttributeKey.stringKey("url.path"), "path") + .build()), + Arguments.of( + "fallback_sampler:\n" + + " always_off:\n" + + "span_kind: CLIENT\n" + + "rules:\n" + + " - attribute: http.request.method\n" + + " pattern: GET\n" + + " action: DROP\n" + + " - attribute: url.path\n" + + " pattern: /foo/bar\n" + + " action: DROP\n", + RuleBasedRoutingSampler.builder(SpanKind.CLIENT, Sampler.alwaysOff()) + .drop(AttributeKey.stringKey("http.request.method"), "GET") + .drop(AttributeKey.stringKey("url.path"), "/foo/bar") + .build())); + } + + @ParameterizedTest + @MethodSource("createInvalidArgs") + void create_Invalid(String yaml, String expectedErrorMessage) { + StructuredConfigProperties configProperties = + FileConfiguration.toConfigProperties( + new ByteArrayInputStream(yaml.getBytes(StandardCharsets.UTF_8))); + + assertThatThrownBy(() -> PROVIDER.create(configProperties)) + .isInstanceOf(ConfigurationException.class) + .hasMessage(expectedErrorMessage); + } + + static Stream createInvalidArgs() { + return Stream.of( + Arguments.of( + "span_kind: SERVER\n" + + "rules:\n" + + " - attribute: url.path\n" + + " pattern: path\n", + "rule_based_routing sampler .fallback is required but is null"), + Arguments.of( + "fallback_sampler:\n" + + " foo:\n" + + "span_kind: foo\n" + + "rules:\n" + + " - attribute: url.path\n" + + " pattern: path\n", + "rule_Based_routing sampler failed to create .fallback sampler"), + Arguments.of( + "fallback_sampler:\n" + + " always_on:\n" + + "span_kind: foo\n" + + "rules:\n" + + " - attribute: url.path\n" + + " pattern: path\n", + "rule_based_routing sampler .span_kind is invalid: foo"), + Arguments.of( + "fallback_sampler:\n" + " always_on:\n" + "span_kind: SERVER\n", + "rule_based_routing sampler .rules is required"), + Arguments.of( + "fallback_sampler:\n" + " always_on:\n" + "span_kind: SERVER\n" + "rules: []\n", + "rule_based_routing sampler .rules is required"), + Arguments.of( + "fallback_sampler:\n" + + " always_on:\n" + + "span_kind: SERVER\n" + + "rules:\n" + + " - attribute: url.path\n", + "rule_based_routing sampler .rules[].pattern is required"), + Arguments.of( + "fallback_sampler:\n" + + " always_on:\n" + + "span_kind: SERVER\n" + + "rules:\n" + + " - pattern: path\n", + "rule_based_routing sampler .rules[].attribute is required"), + Arguments.of( + "fallback_sampler:\n" + + " always_on:\n" + + "span_kind: SERVER\n" + + "rules:\n" + + " - attribute: url.path\n" + + " pattern: path\n", + "rule_based_routing sampler .rules[].action is required"), + Arguments.of( + "fallback_sampler:\n" + + " always_on:\n" + + "span_kind: SERVER\n" + + "rules:\n" + + " - attribute: url.path\n" + + " pattern: path\n" + + " action: foo\n", + "rule_based_routing sampler .rules[].action is must be RECORD_AND_SAMPLE or DROP")); + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 917288732..474220fc1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,6 +12,8 @@ plugins { dependencyResolutionManagement { repositories { + // TODO: remove before merging + mavenLocal() mavenCentral() } } From 73607f55c78c0a5e2b6f405ec2c8d4819b4102c3 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Mon, 16 Sep 2024 09:16:52 -0500 Subject: [PATCH 2/6] remove snapshot --- dependencyManagement/build.gradle.kts | 2 +- samplers/build.gradle.kts | 9 ++++----- settings.gradle.kts | 2 -- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/dependencyManagement/build.gradle.kts b/dependencyManagement/build.gradle.kts index a18a60a7a..3dad18a7a 100644 --- a/dependencyManagement/build.gradle.kts +++ b/dependencyManagement/build.gradle.kts @@ -7,7 +7,7 @@ data class DependencySet(val group: String, val version: String, val modules: Li val dependencyVersions = hashMapOf() rootProject.extra["versions"] = dependencyVersions -val otelInstrumentationVersion = "2.7.0-alpha" +val otelInstrumentationVersion = "2.8.0-alpha" val DEPENDENCY_BOMS = listOf( "com.fasterxml.jackson:jackson-bom:2.17.2", diff --git a/samplers/build.gradle.kts b/samplers/build.gradle.kts index 4d9a12e4c..f14ab9d53 100644 --- a/samplers/build.gradle.kts +++ b/samplers/build.gradle.kts @@ -7,15 +7,14 @@ description = "Sampler which makes its decision based on semantic attributes val otelJava.moduleName.set("io.opentelemetry.contrib.sampler") dependencies { - // TODO: remove SNAPSHOT dependencies before merging - api("io.opentelemetry:opentelemetry-sdk:1.42.0-SNAPSHOT") - api("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.42.0-SNAPSHOT") + api("io.opentelemetry:opentelemetry-sdk") - compileOnly("io.opentelemetry:opentelemetry-sdk-extension-incubator:1.42.0-alpha-SNAPSHOT") + compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") + compileOnly("io.opentelemetry:opentelemetry-sdk-extension-incubator") implementation("io.opentelemetry.semconv:opentelemetry-semconv") testImplementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating") testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") - testImplementation("io.opentelemetry:opentelemetry-sdk-extension-incubator:1.42.0-alpha-SNAPSHOT") + testImplementation("io.opentelemetry:opentelemetry-sdk-extension-incubator:1.42.0-alpha") } diff --git a/settings.gradle.kts b/settings.gradle.kts index 474220fc1..917288732 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,8 +12,6 @@ plugins { dependencyResolutionManagement { repositories { - // TODO: remove before merging - mavenLocal() mavenCentral() } } From 919f46d1ac27ebcec0ce96b99a435ab7ca3c671a Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Mon, 16 Sep 2024 09:52:14 -0500 Subject: [PATCH 3/6] remove dependency version --- samplers/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samplers/build.gradle.kts b/samplers/build.gradle.kts index f14ab9d53..47451c79c 100644 --- a/samplers/build.gradle.kts +++ b/samplers/build.gradle.kts @@ -16,5 +16,5 @@ dependencies { testImplementation("io.opentelemetry.semconv:opentelemetry-semconv-incubating") testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") - testImplementation("io.opentelemetry:opentelemetry-sdk-extension-incubator:1.42.0-alpha") + testImplementation("io.opentelemetry:opentelemetry-sdk-extension-incubator") } From ecfa7d04c05f50e766f10fb8040b9a6a4f1a286c Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Mon, 16 Sep 2024 09:57:02 -0500 Subject: [PATCH 4/6] Add jack-berg to component owners --- samplers/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/samplers/README.md b/samplers/README.md index 235bce36f..b943ba158 100644 --- a/samplers/README.md +++ b/samplers/README.md @@ -59,6 +59,7 @@ tracer_provider: ## Component owners +- [Jack Berg](https://github.com/jack-berg), New Relic - [Trask Stalnaker](https://github.com/trask), Microsoft Learn more about component owners in [component_owners.yml](../.github/component_owners.yml). From c8edcf5c70504bf3ed8ff7a449bbeef2cbff0e92 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Mon, 16 Sep 2024 15:59:17 -0500 Subject: [PATCH 5/6] PR feedback --- samplers/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/samplers/README.md b/samplers/README.md index b943ba158..c21877682 100644 --- a/samplers/README.md +++ b/samplers/README.md @@ -12,6 +12,8 @@ To use: * Follow the [instructions](https://github.com/open-telemetry/opentelemetry-java/blob/main/sdk-extensions/incubator/README.md#file-configuration) to configure OpenTelemetry with declarative configuration. * Configure the `.tracer_provider.sampler` to include the `rule_based_routing` sampler. +NOTE: Not yet available for use with the OTEL java agent, but should be in the near future. Please check back for updates. + Schema for `rule_based_routing` sampler: ```yaml @@ -34,11 +36,11 @@ rules: * The `parent_based` sampler samples based on the sampling status of the parent. * Or, if there is no parent, delegates to the `rule_based_routing` sampler. -* The `rule_based_routing` sampler drops spans where `kind=SERVER` and `url.full matches .*/actuator.*`, else it samples and records. +* The `rule_based_routing` sampler drops spans where `kind=SERVER` and `url.full matches /actuator.*`, else it samples and records. ```yaml // ... the rest of the configuration file is omitted for brevity -// For more example see: https://github.com/open-telemetry/opentelemetry-configuration/blob/main/README.md#starter-templates +// For more examples see: https://github.com/open-telemetry/opentelemetry-configuration/blob/main/README.md#starter-templates tracer_provider: sampler: parent_based: From b43dbd7a49c4468ffe67b1435916318f1d72ebfe Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Mon, 16 Sep 2024 15:59:54 -0500 Subject: [PATCH 6/6] Add jack-berg to component_owners.yml --- .github/component_owners.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/component_owners.yml b/.github/component_owners.yml index 371e17dbd..5ed1d3c69 100644 --- a/.github/component_owners.yml +++ b/.github/component_owners.yml @@ -61,6 +61,7 @@ components: - jeanbisutti samplers: - trask + - jack-berg static-instrumenter: - anosek-an kafka-exporter: