From 547e8ff5793e779f5b0da934213553aec3d66660 Mon Sep 17 00:00:00 2001 From: "jianwei.xujw" Date: Wed, 1 Apr 2020 19:25:39 +0800 Subject: [PATCH] skip some url e.g heart beat --- .../contrib/okhttp3/SkipPatternUtil.java | 39 +++++++++++++++++++ .../contrib/okhttp3/TracingCallFactory.java | 6 +++ .../contrib/okhttp3/TracingInterceptor.java | 9 ++++- .../contrib/okhttp3/AbstractOkHttpTest.java | 17 ++++++++ .../okhttp3/TracingCallFactoryTest.java | 4 ++ .../okhttp3/TracingInterceptorTest.java | 4 ++ 6 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 opentracing-okhttp3/src/main/java/io/opentracing/contrib/okhttp3/SkipPatternUtil.java diff --git a/opentracing-okhttp3/src/main/java/io/opentracing/contrib/okhttp3/SkipPatternUtil.java b/opentracing-okhttp3/src/main/java/io/opentracing/contrib/okhttp3/SkipPatternUtil.java new file mode 100644 index 0000000..24cf60c --- /dev/null +++ b/opentracing-okhttp3/src/main/java/io/opentracing/contrib/okhttp3/SkipPatternUtil.java @@ -0,0 +1,39 @@ +package io.opentracing.contrib.okhttp3; + +import java.util.regex.Pattern; + +public class SkipPatternUtil { + private static Pattern SKIP_PATTERN = null; + + private static final Pattern EMPTY_SKIP_PATTERN = Pattern.compile("emptyPartter"); + + public static final String SKIP_PATTERN_PROPERTY_KEY = "opentracing.okhttp.skipPattern"; + public static boolean isTraced(String url) { + if (SKIP_PATTERN == null) { + String okhhtpSkipPattern = System.getProperty(SKIP_PATTERN_PROPERTY_KEY); + if (okhhtpSkipPattern != null && okhhtpSkipPattern.length() > 0) { + Pattern skipPatter = Pattern.compile(okhhtpSkipPattern); + // dubbo check + if (SKIP_PATTERN == null) { + synchronized (SkipPatternUtil.class) { + SKIP_PATTERN = skipPatter; + } + } + } else { + // dubbo check + if (SKIP_PATTERN == null) { + synchronized (SkipPatternUtil.class) { + SKIP_PATTERN = EMPTY_SKIP_PATTERN; + } + } + } + } + // dono't need to use equals + if (EMPTY_SKIP_PATTERN == SKIP_PATTERN) { + return true; + } + // skip URLs matching skip pattern + // e.g. pattern is defined as '/health|/status' then URL 'http://localhost:5000/context/health' won't be traced + return !SKIP_PATTERN.matcher(url).find(); + } +} diff --git a/opentracing-okhttp3/src/main/java/io/opentracing/contrib/okhttp3/TracingCallFactory.java b/opentracing-okhttp3/src/main/java/io/opentracing/contrib/okhttp3/TracingCallFactory.java index 5f0076d..ea94e12 100644 --- a/opentracing-okhttp3/src/main/java/io/opentracing/contrib/okhttp3/TracingCallFactory.java +++ b/opentracing-okhttp3/src/main/java/io/opentracing/contrib/okhttp3/TracingCallFactory.java @@ -42,6 +42,12 @@ public TracingCallFactory(OkHttpClient okHttpClient, Tracer tracer, List decorators; - /** * Create tracing interceptor. Interceptor has to be added to {@link OkHttpClient.Builder#addInterceptor(Interceptor)} * and {@link OkHttpClient.Builder#addNetworkInterceptor(Interceptor)}. @@ -75,6 +75,13 @@ public static OkHttpClient addTracing(OkHttpClient.Builder builder, public Response intercept(Chain chain) throws IOException { Response response = null; + if (chain.request().url() != null) { + String url = chain.request().url().url().toString(); + if (url != null && !SkipPatternUtil.isTraced(url)) { + return chain.proceed(chain.request().newBuilder().build()); + } + } + // application interceptor? if (chain.connection() == null) { Span span = tracer.buildSpan(chain.request().method()) diff --git a/opentracing-okhttp3/src/test/java/io/opentracing/contrib/okhttp3/AbstractOkHttpTest.java b/opentracing-okhttp3/src/test/java/io/opentracing/contrib/okhttp3/AbstractOkHttpTest.java index 6142bcd..e9400c6 100644 --- a/opentracing-okhttp3/src/test/java/io/opentracing/contrib/okhttp3/AbstractOkHttpTest.java +++ b/opentracing-okhttp3/src/test/java/io/opentracing/contrib/okhttp3/AbstractOkHttpTest.java @@ -412,6 +412,23 @@ public void testFollowRedirectsTrue() throws IOException { Assert.assertEquals("localhost", networkSpan.tags().get(Tags.PEER_HOSTNAME.getKey())); } + @Test + public void testSkipTracing() throws IOException { + + { + mockWebServer.enqueue(new MockResponse() + .setResponseCode(200)); + client.newCall(new Request.Builder() + .url(mockWebServer.url("/healthabc?foo1")) + .build()) + .execute(); + } + + List mockSpans = mockTracer.finishedSpans(); + Assert.assertEquals(0, mockSpans.size()); + + } + protected void assertLocalSpan(List mockSpans) { MockSpan localSpan = mockSpans.get(mockSpans.size() - 1); Assert.assertNotNull(localSpan.tags().get(Tags.COMPONENT.getKey())); diff --git a/opentracing-okhttp3/src/test/java/io/opentracing/contrib/okhttp3/TracingCallFactoryTest.java b/opentracing-okhttp3/src/test/java/io/opentracing/contrib/okhttp3/TracingCallFactoryTest.java index bbec2fb..a3e5239 100644 --- a/opentracing-okhttp3/src/test/java/io/opentracing/contrib/okhttp3/TracingCallFactoryTest.java +++ b/opentracing-okhttp3/src/test/java/io/opentracing/contrib/okhttp3/TracingCallFactoryTest.java @@ -11,6 +11,10 @@ */ public class TracingCallFactoryTest extends AbstractOkHttpTest { + static { + System.setProperty(SkipPatternUtil.SKIP_PATTERN_PROPERTY_KEY, "/health*"); + } + public TracingCallFactoryTest() { super(new TracingCallFactory(new OkHttpClient(), AbstractOkHttpTest.mockTracer)); } diff --git a/opentracing-okhttp3/src/test/java/io/opentracing/contrib/okhttp3/TracingInterceptorTest.java b/opentracing-okhttp3/src/test/java/io/opentracing/contrib/okhttp3/TracingInterceptorTest.java index a2692ec..2e6bbf9 100644 --- a/opentracing-okhttp3/src/test/java/io/opentracing/contrib/okhttp3/TracingInterceptorTest.java +++ b/opentracing-okhttp3/src/test/java/io/opentracing/contrib/okhttp3/TracingInterceptorTest.java @@ -11,6 +11,10 @@ */ public class TracingInterceptorTest extends AbstractOkHttpTest { + static { + System.setProperty(SkipPatternUtil.SKIP_PATTERN_PROPERTY_KEY, "/health*"); + } + public TracingInterceptorTest() { super(TracingInterceptor.addTracing(new OkHttpClient.Builder(), AbstractOkHttpTest.mockTracer)); }