Skip to content

Commit 15107da

Browse files
authored
feat(sampler): allow configuring excluded URL paths for tracing (#36)
1 parent ec87abd commit 15107da

File tree

2 files changed

+41
-12
lines changed

2 files changed

+41
-12
lines changed

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# OpenTelemetry Extension
2+
3+
This is an OpenTelemetry SDK extension that provides custom sampling and resource configuration. The extension automatically configures OpenTelemetry instrumentation with environment-specific settings and intelligent sampling rules.
4+
5+
## Configuration
6+
7+
The extension can be configured using the following environment variables:
8+
9+
| Environment Variable | Description |
10+
|----------------------------------| ----------------------------------------------------------------------------------------------------------------------------------------- |
11+
| `SERVICE_NAME` | The name of the service. |
12+
| `STAGE` | The deployment stage (e.g., `production`, `staging`). |
13+
| `BUILD_NUMBER` | The build number of the service. |
14+
| `OTEL_TRACES_SAMPLER_ARG` | The sampling rate to use. Overrides the default sampling rate. |
15+
| `OTEL_TRACES_EXCLUDED_URL_PATHS` | A comma-separated list of URL paths to exclude from tracing (e.g., `/health*,/metrics*`). Defaults to `/health*,/prometheus*,/metrics*`. |

src/main/kotlin/com/monta/otel/extension/Customizer.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@
22

33
import io.opentelemetry.api.trace.SpanKind;
44
import io.opentelemetry.contrib.sampler.RuleBasedRoutingSampler;
5+
import io.opentelemetry.contrib.sampler.RuleBasedRoutingSamplerBuilder;
56
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer;
67
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider;
78
import io.opentelemetry.sdk.resources.Resource;
9+
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
810
import io.opentelemetry.sdk.trace.samplers.Sampler;
911
import io.opentelemetry.semconv.ServiceAttributes;
1012
import io.opentelemetry.semconv.UrlAttributes;
1113

14+
import java.util.Arrays;
1215
import java.util.Objects;
16+
import java.util.Optional;
1317
import java.util.UUID;
1418

1519
/**
@@ -18,6 +22,9 @@
1822
*/
1923
public class Customizer implements AutoConfigurationCustomizerProvider {
2024

25+
private static final String OTEL_TRACES_EXCLUDED_URL_PATHS_ENV_VAR = "OTEL_TRACES_EXCLUDED_URL_PATHS";
26+
private static final String DEFAULT_EXCLUDED_URL_PATHS = "/health*,/prometheus*,/metrics*";
27+
2128
@Override
2229
public void customize(AutoConfigurationCustomizer autoConfiguration) {
2330

@@ -33,21 +40,28 @@ public void customize(AutoConfigurationCustomizer autoConfiguration) {
3340
)
3441
);
3542

36-
// Set the sampler to be the default parentbased_always_on, but drop calls to spring
37-
// boot actuator endpoints
38-
autoConfiguration.addTracerProviderCustomizer((sdkTracerProviderBuilder, configProperties) ->
39-
sdkTracerProviderBuilder.setSampler(
40-
Sampler.parentBased(
41-
RuleBasedRoutingSampler.builder(SpanKind.SERVER, getSampler())
42-
.drop(UrlAttributes.URL_PATH, "/health*")
43-
.drop(UrlAttributes.URL_PATH, "/prometheus*")
44-
.drop(UrlAttributes.URL_PATH, "/metrics*")
45-
.build()
46-
)
47-
)
43+
autoConfiguration.addTracerProviderCustomizer((builder, config) ->
44+
configureSampler(builder)
4845
);
4946
}
5047

48+
/**
49+
* Configures the SdkTracerProviderBuilder with a rule-based routing sampler.
50+
*/
51+
private SdkTracerProviderBuilder configureSampler(SdkTracerProviderBuilder builder) {
52+
RuleBasedRoutingSamplerBuilder samplerBuilder = RuleBasedRoutingSampler.builder(SpanKind.SERVER, getSampler());
53+
54+
String excludedPaths = Optional.ofNullable(System.getenv(OTEL_TRACES_EXCLUDED_URL_PATHS_ENV_VAR))
55+
.orElse(DEFAULT_EXCLUDED_URL_PATHS);
56+
57+
Arrays.stream(excludedPaths.split(","))
58+
.map(String::trim)
59+
.filter(path -> !path.isEmpty())
60+
.forEach(path -> samplerBuilder.drop(UrlAttributes.URL_PATH, path));
61+
62+
return builder.setSampler(Sampler.parentBased(samplerBuilder.build()));
63+
}
64+
5165
private static Sampler getSampler() {
5266

5367
String otelTracesSamplerArg = System.getenv("OTEL_TRACES_SAMPLER_ARG");

0 commit comments

Comments
 (0)