Skip to content

Commit

Permalink
Disable tracing of /q endpoints by default
Browse files Browse the repository at this point in the history
Resolves #17119
  • Loading branch information
kenfinnigan committed Jun 29, 2021
1 parent d9c7bdc commit 30c1711
Show file tree
Hide file tree
Showing 8 changed files with 164 additions and 2 deletions.
5 changes: 5 additions & 0 deletions extensions/opentelemetry/opentelemetry/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@
<artifactId>quarkus-vertx-http-deployment</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-health-deployment</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>io.quarkus</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package io.quarkus.opentelemetry.deployment;

import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;

import java.util.List;

import javax.inject.Inject;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.opentelemetry.sdk.trace.data.SpanData;
import io.quarkus.test.QuarkusUnitTest;
import io.restassured.RestAssured;

public class NonAppEndpointsDisabledTest {
@RegisterExtension
static final QuarkusUnitTest config = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClass(TracerRouter.class)
.addClass(TestSpanExporter.class));

@Inject
TestSpanExporter testSpanExporter;

@Test
void testHealthEndpointNotTraced() throws InterruptedException {
RestAssured.when().get("/q/health").then()
.statusCode(200)
.body(containsString("\"status\": \"UP\""));

RestAssured.when().get("/q/health/live").then()
.statusCode(200)
.body(containsString("\"status\": \"UP\""));

RestAssured.when().get("/q/health/ready").then()
.statusCode(200)
.body(containsString("\"status\": \"UP\""));

RestAssured.when().get("/tracer").then()
.statusCode(200)
.body(is("Hello Tracer!"));

List<SpanData> spans = testSpanExporter.getFinishedSpanItems();

Assertions.assertEquals(2, spans.size());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package io.quarkus.opentelemetry.deployment;

import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;

import java.util.List;

import javax.inject.Inject;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.opentelemetry.sdk.trace.data.SpanData;
import io.quarkus.test.QuarkusUnitTest;
import io.restassured.RestAssured;

public class NonAppEndpointsEnabledTest {
@RegisterExtension
static final QuarkusUnitTest config = new QuarkusUnitTest()
.overrideConfigKey("quarkus.opentelemetry.tracer.suppress-non-application-uris", "false")
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClass(TracerRouter.class)
.addClass(TestSpanExporter.class));

@Inject
TestSpanExporter testSpanExporter;

@Test
void testHealthEndpointNotTraced() throws InterruptedException {
RestAssured.when().get("/q/health").then()
.statusCode(200)
.body(containsString("\"status\": \"UP\""));

RestAssured.when().get("/q/health/live").then()
.statusCode(200)
.body(containsString("\"status\": \"UP\""));

RestAssured.when().get("/q/health/ready").then()
.statusCode(200)
.body(containsString("\"status\": \"UP\""));

RestAssured.when().get("/tracer").then()
.statusCode(200)
.body(is("Hello Tracer!"));

List<SpanData> spans = testSpanExporter.getFinishedSpanItems();

Assertions.assertEquals(5, spans.size());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public class OpenTelemetrySamplerConfigTest {
.overrideConfigKey("quarkus.opentelemetry.tracer.sampler", "ratio")
.overrideConfigKey("quarkus.opentelemetry.tracer.sampler.ratio", "0.5")
.overrideConfigKey("quarkus.opentelemetry.tracer.sampler.parent-based", "false")
.overrideConfigKey("quarkus.opentelemetry.tracer.suppress-non-application-uris", "false")
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class).addClass(TestUtil.class));

@Inject
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package io.quarkus.opentelemetry.runtime.tracing;

import java.util.List;

import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.context.Context;
import io.opentelemetry.sdk.trace.data.LinkData;
import io.opentelemetry.sdk.trace.samplers.Sampler;
import io.opentelemetry.sdk.trace.samplers.SamplingDecision;
import io.opentelemetry.sdk.trace.samplers.SamplingResult;

public class NonApplicationEndpointSampler implements Sampler {
private static final SamplingResult NEGATIVE_SAMPLING_RESULT = SamplingResult.create(SamplingDecision.DROP);

private final Sampler root;

public NonApplicationEndpointSampler(Sampler root) {
this.root = root;
}

@Override
public SamplingResult shouldSample(Context parentContext, String traceId, String name, SpanKind spanKind,
Attributes attributes, List<LinkData> parentLinks) {
if (name.startsWith("q/") && spanKind == SpanKind.SERVER) {
return NEGATIVE_SAMPLING_RESULT;
}
return root.shouldSample(parentContext, traceId, name, spanKind, attributes, parentLinks);
}

@Override
public String getDescription() {
return "NonApplicationEndpointBased{/q}";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public void setupSampler(TracerRuntimeConfig config) {
lateBoundSampler.setSamplerDelegate(samplerBean.get());
} else {
// Define Sampler using config
lateBoundSampler.setSamplerDelegate(TracerUtil.mapSampler(config.sampler));
lateBoundSampler.setSamplerDelegate(TracerUtil.mapSampler(config.sampler, config.suppressNonApplicationUris));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,18 @@ public class TracerRuntimeConfig {
/** Config for sampler */
public SamplerConfig sampler;

/**
* Suppress non-application uris from trace collection.
* This will suppress tracing of `/q` endpoints.
* <p>
* Providing a custom {@code io.opentelemetry.sdk.trace.samplers.Sampler} CDI Bean
* will ignore this setting.
* <p>
* Suppressing non-application uris is enabled by default.
*/
@ConfigItem(defaultValue = "true")
public boolean suppressNonApplicationUris;

@ConfigGroup
public static class SamplerConfig {
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,13 @@ private static Sampler getBaseSampler(String samplerName, Optional<Double> ratio
}
}

public static Sampler mapSampler(TracerRuntimeConfig.SamplerConfig samplerConfig) {
public static Sampler mapSampler(TracerRuntimeConfig.SamplerConfig samplerConfig, boolean suppressNonApplicationUris) {
Sampler sampler = getBaseSampler(samplerConfig.samplerName, samplerConfig.ratio);

if (suppressNonApplicationUris) {
sampler = new NonApplicationEndpointSampler(sampler);
}

if (samplerConfig.parentBased) {
return Sampler.parentBased(sampler);
}
Expand Down

0 comments on commit 30c1711

Please sign in to comment.