From 7839d9f7854a1257c22acf3ec5a8cd2fcb0db9a2 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 21 Mar 2017 15:08:20 +0100 Subject: [PATCH] Java 6 compatibility (#132) jaeger-crossdock still requires Java 7 because it calls InetAddress#getLoopbackAddress() Add animal sniffer plugin (closes #129) --- build.gradle | 22 ++++-- jaeger-apachehttpclient/build.gradle | 2 + jaeger-context/build.gradle | 2 + .../jaeger/context/TracedExecutorService.java | 6 +- jaeger-core/build.gradle | 2 + .../src/main/java/com/uber/jaeger/Span.java | 34 ++++---- .../java/com/uber/jaeger/SpanContext.java | 2 +- .../src/main/java/com/uber/jaeger/Tracer.java | 25 +++--- .../jaeger/metrics/InMemoryStatsReporter.java | 12 +-- .../java/com/uber/jaeger/metrics/Metrics.java | 6 +- .../uber/jaeger/propagation/TextMapCodec.java | 21 +++-- .../jaeger/reporters/CompositeReporter.java | 2 +- .../uber/jaeger/reporters/RemoteReporter.java | 2 +- .../protocols/JaegerThriftSpanConverter.java | 3 +- .../reporters/protocols/TUDPTransport.java | 10 ++- .../protocols/ThriftSpanConverter.java | 14 ++-- .../uber/jaeger/samplers/ConstSampler.java | 2 +- .../jaeger/samplers/HTTPSamplingManager.java | 10 ++- .../jaeger/samplers/ProbabilisticSampler.java | 5 +- .../jaeger/samplers/RateLimitingSampler.java | 2 +- .../uber/jaeger/senders/InMemorySender.java | 12 +-- .../com/uber/jaeger/senders/UDPSender.java | 2 +- .../Java6CompatibleThreadLocalRandom.java | 68 ++++++++++++++++ .../java/com/uber/jaeger/utils/Utils.java | 7 +- .../Java6CompatibleThreadLocalRandomTest.java | 77 +++++++++++++++++++ jaeger-crossdock/build.gradle | 7 ++ jaeger-dropwizard/build.gradle | 2 + .../uber/jaeger/dropwizard/JaegerFeature.java | 3 +- .../jaeger/dropwizard/JerseyServerFilter.java | 43 +++++++---- jaeger-jaxrs2/build.gradle | 2 + jaeger-thrift/build.gradle | 8 ++ jaeger-zipkin/build.gradle | 2 + .../jaeger/senders/zipkin/ZipkinSender.java | 8 +- 33 files changed, 321 insertions(+), 104 deletions(-) create mode 100644 jaeger-core/src/main/java/com/uber/jaeger/utils/Java6CompatibleThreadLocalRandom.java create mode 100644 jaeger-core/src/test/java/com/uber/jaeger/utils/Java6CompatibleThreadLocalRandomTest.java diff --git a/build.gradle b/build.gradle index 24bca37cf..f114122f3 100644 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,7 @@ plugins { id 'com.github.sherter.google-java-format' version '0.3.2' id "com.github.johnrengelman.shadow" version "1.2.3" id "net.ltgt.errorprone" version "0.0.9" + id 'ru.vyarus.animalsniffer' version '1.2.0' } @@ -31,10 +32,6 @@ allprojects { mavenCentral() } - repositories { - mavenCentral() - } - task wrapper(type: Wrapper) { gradleVersion = '3.1.2' //version required } @@ -42,13 +39,25 @@ allprojects { subprojects { + apply plugin: 'ru.vyarus.animalsniffer' apply plugin: 'com.github.hierynomus.license' apply plugin: 'java' apply plugin: 'maven' apply plugin: 'signing' - sourceCompatibility = 1.7 - targetCompatibility = 1.7 + compileJava { + sourceCompatibility = 1.6 + targetCompatibility = 1.6 + } + + compileTestJava { + sourceCompatibility = 1.7 + targetCompatibility = 1.7 + } + + animalsniffer { + sourceSets = [sourceSets.main] + } [compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' @@ -91,6 +100,7 @@ subprojects { dependencies { compileOnly 'org.projectlombok:lombok:1.16.12' + compileOnly 'org.codehaus.mojo:animal-sniffer-annotations:1.15' } } diff --git a/jaeger-apachehttpclient/build.gradle b/jaeger-apachehttpclient/build.gradle index 8f582d530..6880b1dbb 100644 --- a/jaeger-apachehttpclient/build.gradle +++ b/jaeger-apachehttpclient/build.gradle @@ -10,6 +10,8 @@ dependencies { testCompile group: 'org.mock-server', name: 'mockserver-netty', version: '3.10.4' testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.mockito', name: 'mockito-core', version: mockitoVersion + + signature 'org.codehaus.mojo.signature:java16:1.1@signature' } sourceSets { diff --git a/jaeger-context/build.gradle b/jaeger-context/build.gradle index 6a3468e16..e5bdf0a3f 100644 --- a/jaeger-context/build.gradle +++ b/jaeger-context/build.gradle @@ -6,6 +6,8 @@ dependencies { // Testing Frameworks testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.mockito', name: 'mockito-core', version: mockitoVersion + + signature 'org.codehaus.mojo.signature:java16:1.1@signature' } sourceSets { diff --git a/jaeger-context/src/main/java/com/uber/jaeger/context/TracedExecutorService.java b/jaeger-context/src/main/java/com/uber/jaeger/context/TracedExecutorService.java index 16e6eb05c..41fdaf656 100644 --- a/jaeger-context/src/main/java/com/uber/jaeger/context/TracedExecutorService.java +++ b/jaeger-context/src/main/java/com/uber/jaeger/context/TracedExecutorService.java @@ -66,7 +66,7 @@ public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedE @Override public Future submit(java.util.concurrent.Callable task) { - return delegate.submit(new Callable<>(task, traceContext)); + return delegate.submit(new Callable(task, traceContext)); } @Override @@ -113,9 +113,9 @@ public void execute(final java.lang.Runnable command) { private Collection> wrapJaegerCallableCollection( Collection> originalCollection) { Collection> collection = - new ArrayList<>(originalCollection.size()); + new ArrayList>(originalCollection.size()); for (java.util.concurrent.Callable c : originalCollection) { - collection.add(new Callable<>(c, traceContext)); + collection.add(new Callable(c, traceContext)); } return collection; } diff --git a/jaeger-core/build.gradle b/jaeger-core/build.gradle index 910efc20e..5361947bb 100644 --- a/jaeger-core/build.gradle +++ b/jaeger-core/build.gradle @@ -13,6 +13,8 @@ dependencies { testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.mockito', name: 'mockito-core', version: mockitoVersion testCompile group: 'com.tngtech.java', name: 'junit-dataprovider', version: junitDataProviderVersion + + signature 'org.codehaus.mojo.signature:java16:1.1@signature' } sourceSets { diff --git a/jaeger-core/src/main/java/com/uber/jaeger/Span.java b/jaeger-core/src/main/java/com/uber/jaeger/Span.java index 754213dec..8768bee6f 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/Span.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/Span.java @@ -22,7 +22,6 @@ package com.uber.jaeger; import com.twitter.zipkin.thriftjava.Endpoint; -import io.opentracing.tag.Tags; import java.util.ArrayList; import java.util.Collections; @@ -30,6 +29,8 @@ import java.util.List; import java.util.Map; +import io.opentracing.tag.Tags; + public class Span implements io.opentracing.Span { private final Tracer tracer; private final long startTimeMicroseconds; @@ -59,7 +60,7 @@ public class Span implements io.opentracing.Span { this.startTimeMicroseconds = startTimeMicroseconds; this.startTimeNanoTicks = startTimeNanoTicks; this.computeDurationViaNanoTicks = computeDurationViaNanoTicks; - this.tags = new HashMap<>(); + this.tags = new HashMap(); for (Map.Entry tag : tags.entrySet()) { setTagAsObject(tag.getKey(), tag.getValue()); @@ -205,6 +206,7 @@ public synchronized Span setTag(String key, Number value) { /** * Sets various fields on the {@link Span} when certain {@link Tags} are encountered + * * @return true iff a special tag is handled */ private boolean handleSpecialTag(String key, Object value) { @@ -245,23 +247,23 @@ private boolean handleSpecialTag(String key, Object value) { * See {@link #handleSpecialTag(String, Object)} */ private Span setTagAsObject(String key, Object value) { - if (key.equals(Tags.SAMPLING_PRIORITY.getKey()) && (value instanceof Number)) { - int priority = ((Number) value).intValue(); - byte newFlags; - if (priority > 0) { - newFlags = (byte) (context.getFlags() | SpanContext.flagSampled | SpanContext.flagDebug); - } else { - newFlags = (byte) (context.getFlags() & (~SpanContext.flagSampled)); - } - - context = context.withFlags(newFlags); + if (key.equals(Tags.SAMPLING_PRIORITY.getKey()) && (value instanceof Number)) { + int priority = ((Number) value).intValue(); + byte newFlags; + if (priority > 0) { + newFlags = (byte) (context.getFlags() | SpanContext.flagSampled | SpanContext.flagDebug); + } else { + newFlags = (byte) (context.getFlags() & (~SpanContext.flagSampled)); } - if (context.isSampled()) { - if (!handleSpecialTag(key, value)) { - tags.put(key, value); - } + context = context.withFlags(newFlags); + } + + if (context.isSampled()) { + if (!handleSpecialTag(key, value)) { + tags.put(key, value); } + } return this; } diff --git a/jaeger-core/src/main/java/com/uber/jaeger/SpanContext.java b/jaeger-core/src/main/java/com/uber/jaeger/SpanContext.java index 43a526c38..e2ae75730 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/SpanContext.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/SpanContext.java @@ -132,7 +132,7 @@ public static SpanContext contextFromString(String value) } public SpanContext withBaggageItem(String key, String val) { - Map newBaggage = new HashMap<>(this.baggage); + Map newBaggage = new HashMap(this.baggage); newBaggage.put(key, val); return new SpanContext(traceID, spanID, parentID, flags, newBaggage, debugID); } diff --git a/jaeger-core/src/main/java/com/uber/jaeger/Tracer.java b/jaeger-core/src/main/java/com/uber/jaeger/Tracer.java index 26b7880a2..e94d3b895 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/Tracer.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/Tracer.java @@ -35,9 +35,6 @@ import com.uber.jaeger.utils.Clock; import com.uber.jaeger.utils.SystemClock; import com.uber.jaeger.utils.Utils; -import io.opentracing.References; -import io.opentracing.propagation.Format; -import io.opentracing.tag.Tags; import java.io.InputStream; import java.net.Inet4Address; @@ -46,8 +43,11 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Objects; import java.util.Properties; + +import io.opentracing.References; +import io.opentracing.propagation.Format; +import io.opentracing.tag.Tags; import lombok.ToString; import lombok.extern.slf4j.Slf4j; @@ -89,7 +89,7 @@ private Tracer( this.version = loadVersion(); - Map tags = new HashMap<>(); + Map tags = new HashMap(); tags.put("jaeger.version", this.version); String hostname = getHostName(); if (hostname != null) { @@ -164,7 +164,7 @@ class SpanBuilder implements io.opentracing.Tracer.SpanBuilder { private String operationName = null; private long startTimeMicroseconds; private SpanContext parent; - private final Map tags = new HashMap<>(); + private final Map tags = new HashMap(); SpanBuilder(String operationName) { this.operationName = operationName; @@ -192,8 +192,8 @@ public io.opentracing.Tracer.SpanBuilder asChildOf(io.opentracing.Span parent) { public io.opentracing.Tracer.SpanBuilder addReference( String referenceType, io.opentracing.SpanContext referencedContext) { if (parent == null - && (Objects.equals(referenceType, References.CHILD_OF) - || Objects.equals(referenceType, References.FOLLOWS_FROM))) { + && (Utils.equals(referenceType, References.CHILD_OF) + || Utils.equals(referenceType, References.FOLLOWS_FROM))) { this.parent = (SpanContext) referencedContext; } return this; @@ -376,8 +376,8 @@ public Tracer build() { } private static class PropagationRegistry { - private final Map, Injector> injectors = new HashMap<>(); - private final Map, Extractor> extractors = new HashMap<>(); + private final Map, Injector> injectors = new HashMap, Injector>(); + private final Map, Extractor> extractors = new HashMap, Extractor>(); @SuppressWarnings("unchecked") Injector getInjector(Format format) { @@ -401,10 +401,13 @@ public void register(Format format, Extractor extractor) { private static String loadVersion() { String version; try { - try (InputStream is = Tracer.class.getResourceAsStream("jaeger.properties")) { + InputStream is = Tracer.class.getResourceAsStream("jaeger.properties"); + try { Properties prop = new Properties(); prop.load(is); version = prop.getProperty("jaeger.version"); + } finally { + is.close(); } } catch (Exception e) { throw new RuntimeException("Cannot read jaeger.properties", e); diff --git a/jaeger-core/src/main/java/com/uber/jaeger/metrics/InMemoryStatsReporter.java b/jaeger-core/src/main/java/com/uber/jaeger/metrics/InMemoryStatsReporter.java index 0e7bbcf4f..c523fda84 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/metrics/InMemoryStatsReporter.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/metrics/InMemoryStatsReporter.java @@ -25,14 +25,14 @@ import java.util.Map; public class InMemoryStatsReporter implements StatsReporter { - public Map counters = new HashMap<>(); - public Map gauges = new HashMap<>(); - public Map timers = new HashMap<>(); + public Map counters = new HashMap(); + public Map gauges = new HashMap(); + public Map timers = new HashMap(); void reset() { - counters = new HashMap<>(); - gauges = new HashMap<>(); - timers = new HashMap<>(); + counters = new HashMap(); + gauges = new HashMap(); + timers = new HashMap(); } @Override diff --git a/jaeger-core/src/main/java/com/uber/jaeger/metrics/Metrics.java b/jaeger-core/src/main/java/com/uber/jaeger/metrics/Metrics.java index c4ba77056..b9e746b63 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/metrics/Metrics.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/metrics/Metrics.java @@ -40,7 +40,7 @@ public Metrics(StatsFactory factory) { } String metricName = "jaeger."; - HashMap tags = new HashMap<>(); + HashMap tags = new HashMap(); Annotation[] annotations = field.getAnnotations(); for (Annotation anno : annotations) { @@ -66,7 +66,7 @@ public Metrics(StatsFactory factory) { throw new RuntimeException( "A field type that was neither Counter, Gauge, or Timer was parsed in reflection."); } - } catch (ReflectiveOperationException e) { + } catch (Exception e) { // This exception should only happen at the start of a program if the code below is not set up correctly. // As long as tests are run this code should never be thrown in production. throw new RuntimeException( @@ -84,7 +84,7 @@ public static String addTagsToMetricName(String name, Map tags) StringBuilder sb = new StringBuilder(); sb.append(name); - SortedSet sortedKeys = new TreeSet<>(tags.keySet()); + SortedSet sortedKeys = new TreeSet(tags.keySet()); for (String key : sortedKeys) { sb.append("."); sb.append(key); diff --git a/jaeger-core/src/main/java/com/uber/jaeger/propagation/TextMapCodec.java b/jaeger-core/src/main/java/com/uber/jaeger/propagation/TextMapCodec.java index 792776613..47fdf04c5 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/propagation/TextMapCodec.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/propagation/TextMapCodec.java @@ -23,7 +23,6 @@ import com.uber.jaeger.Constants; import com.uber.jaeger.SpanContext; -import io.opentracing.propagation.TextMap; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; @@ -31,6 +30,8 @@ import java.util.HashMap; import java.util.Map; +import io.opentracing.propagation.TextMap; + public class TextMapCodec implements Injector, Extractor { /** Key used to store serialized span context representation */ private static final String SPAN_CONTEXT_KEY = "uber-trace-id"; @@ -78,7 +79,7 @@ public SpanContext extract(TextMap carrier) { debugID = decodedValue(entry.getValue()); } else if (key.startsWith(baggagePrefix)) { if (baggage == null) { - baggage = new HashMap<>(); + baggage = new HashMap(); } baggage.put(keys.unprefixedKey(key, baggagePrefix), decodedValue(entry.getValue())); } @@ -98,9 +99,17 @@ public SpanContext extract(TextMap carrier) { @Override public String toString() { StringBuilder buffer = new StringBuilder(); - buffer.append("TextMapCodec{").append("contextKey=").append(contextKey).append(',') - .append("baggagePrefix=").append(baggagePrefix).append(',') - .append("urlEncoding=").append(urlEncoding).append('}'); + buffer + .append("TextMapCodec{") + .append("contextKey=") + .append(contextKey) + .append(',') + .append("baggagePrefix=") + .append(baggagePrefix) + .append(',') + .append("urlEncoding=") + .append(urlEncoding) + .append('}'); return buffer.toString(); } @@ -130,6 +139,7 @@ private String decodedValue(String value) { /** * Returns a builder for TextMapCodec + * * @return Builder */ public static Builder builder() { @@ -160,6 +170,5 @@ public Builder withBaggagePrefix(String baggagePrefix) { public TextMapCodec build() { return new TextMapCodec(this); } - } } diff --git a/jaeger-core/src/main/java/com/uber/jaeger/reporters/CompositeReporter.java b/jaeger-core/src/main/java/com/uber/jaeger/reporters/CompositeReporter.java index 38e582509..a75d293dc 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/reporters/CompositeReporter.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/reporters/CompositeReporter.java @@ -32,7 +32,7 @@ public class CompositeReporter implements Reporter { private final List reporters; public CompositeReporter(Reporter... reporters) { - this.reporters = new ArrayList<>(); + this.reporters = new ArrayList(); for (int i = 0; i < reporters.length; i++) { this.reporters.add(reporters[i]); } diff --git a/jaeger-core/src/main/java/com/uber/jaeger/reporters/RemoteReporter.java b/jaeger-core/src/main/java/com/uber/jaeger/reporters/RemoteReporter.java index 6869583b1..d941de002 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/reporters/RemoteReporter.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/reporters/RemoteReporter.java @@ -56,7 +56,7 @@ public RemoteReporter(final Sender sender, int flushInterval, int maxQueueSize, this.sender = sender; this.maxQueueSize = maxQueueSize; this.metrics = metrics; - commandQueue = new ArrayBlockingQueue<>(maxQueueSize); + commandQueue = new ArrayBlockingQueue(maxQueueSize); // start a thread to append spans queueProcessor = new QueueProcessor(); diff --git a/jaeger-core/src/main/java/com/uber/jaeger/reporters/protocols/JaegerThriftSpanConverter.java b/jaeger-core/src/main/java/com/uber/jaeger/reporters/protocols/JaegerThriftSpanConverter.java index 1d9dee3ca..27e888dd3 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/reporters/protocols/JaegerThriftSpanConverter.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/reporters/protocols/JaegerThriftSpanConverter.java @@ -46,8 +46,7 @@ public static com.uber.jaeger.thriftjava.Span convertSpan(Span span) { span.getOperationName(), context.getFlags(), span.getStart(), - span.getDuration() - ) + span.getDuration()) .setTags(buildTags(span.getTags())) .setLogs(buildLogs(span.getLogs())); } diff --git a/jaeger-core/src/main/java/com/uber/jaeger/reporters/protocols/TUDPTransport.java b/jaeger-core/src/main/java/com/uber/jaeger/reporters/protocols/TUDPTransport.java index 501667b57..5afa1f19c 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/reporters/protocols/TUDPTransport.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/reporters/protocols/TUDPTransport.java @@ -24,16 +24,22 @@ import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; +import java.io.Closeable; import java.io.IOException; -import java.net.*; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetSocketAddress; +import java.net.SocketException; +import java.net.UnknownHostException; import java.nio.ByteBuffer; + import lombok.ToString; /* * A thrift transport for sending sending/receiving spans. */ @ToString(exclude = {"writeBuffer"}) -public class TUDPTransport extends TTransport implements AutoCloseable { +public class TUDPTransport extends TTransport implements Closeable { public static final int MAX_PACKET_SIZE = 65000; public final DatagramSocket socket; diff --git a/jaeger-core/src/main/java/com/uber/jaeger/reporters/protocols/ThriftSpanConverter.java b/jaeger-core/src/main/java/com/uber/jaeger/reporters/protocols/ThriftSpanConverter.java index a23acaff2..623d7d598 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/reporters/protocols/ThriftSpanConverter.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/reporters/protocols/ThriftSpanConverter.java @@ -32,13 +32,15 @@ import com.uber.jaeger.SpanContext; import com.uber.jaeger.Tracer; -import java.nio.charset.StandardCharsets; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.Map; public class ThriftSpanConverter { + private static final Charset UTF_8 = Charset.forName("UTF-8"); + public static com.twitter.zipkin.thriftjava.Span convertSpan(Span span) { Tracer tracer = span.getTracer(); Endpoint host = new Endpoint(tracer.getIP(), (short) 0, tracer.getServiceName()); @@ -57,7 +59,7 @@ public static com.twitter.zipkin.thriftjava.Span convertSpan(Span span) { } private static List buildAnnotations(Span span, Endpoint host) { - List annotations = new ArrayList<>(); + List annotations = new ArrayList(); if (span.isRPC()) { String startLabel = zipkincoreConstants.SERVER_RECV; @@ -99,10 +101,10 @@ private static List buildBinaryAnnotations(Span span, Endpoint if (!span.isRPC()) { byte[] componentName; if (span.getLocalComponent() != null) { - componentName = span.getLocalComponent().getBytes(StandardCharsets.UTF_8); + componentName = span.getLocalComponent().getBytes(UTF_8); } else { // spans always have associated tracers, and service names - componentName = span.getTracer().getServiceName().getBytes(StandardCharsets.UTF_8); + componentName = span.getTracer().getServiceName().getBytes(UTF_8); } binaryAnnotations.add( @@ -133,9 +135,7 @@ private static BinaryAnnotation buildBinaryAnnotation(String tagKey, Object tagV tagValue = stringTagValue.substring(0, Constants.MAX_TAG_LENGTH); } - banno - .setValue(stringTagValue.getBytes(StandardCharsets.UTF_8)) - .setAnnotation_type(AnnotationType.STRING); + banno.setValue(stringTagValue.getBytes(UTF_8)).setAnnotation_type(AnnotationType.STRING); return banno; } diff --git a/jaeger-core/src/main/java/com/uber/jaeger/samplers/ConstSampler.java b/jaeger-core/src/main/java/com/uber/jaeger/samplers/ConstSampler.java index cfdcbeeb8..7fb5574d8 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/samplers/ConstSampler.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/samplers/ConstSampler.java @@ -39,7 +39,7 @@ public class ConstSampler implements Sampler { public ConstSampler(boolean decision) { this.decision = decision; - Map tags = new HashMap<>(); + Map tags = new HashMap(); tags.put(Constants.SAMPLER_TYPE_TAG_KEY, TYPE); tags.put(Constants.SAMPLER_PARAM_TAG_KEY, decision); this.tags = Collections.unmodifiableMap(tags); diff --git a/jaeger-core/src/main/java/com/uber/jaeger/samplers/HTTPSamplingManager.java b/jaeger-core/src/main/java/com/uber/jaeger/samplers/HTTPSamplingManager.java index dd93dc9f5..28fa8713a 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/samplers/HTTPSamplingManager.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/samplers/HTTPSamplingManager.java @@ -33,7 +33,8 @@ import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; +import java.nio.charset.Charset; + import lombok.ToString; @ToString @@ -54,13 +55,16 @@ private String makeGetRequest(String urlToRead) throws IOException { StringBuilder result = new StringBuilder(); try { conn.setRequestMethod("GET"); - try (BufferedReader rd = + BufferedReader rd = new BufferedReader( - new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { + new InputStreamReader(conn.getInputStream(), Charset.forName("UTF-8"))); + try { String line; while ((line = rd.readLine()) != null) { result.append(line); } + } finally { + rd.close(); } } finally { conn.disconnect(); diff --git a/jaeger-core/src/main/java/com/uber/jaeger/samplers/ProbabilisticSampler.java b/jaeger-core/src/main/java/com/uber/jaeger/samplers/ProbabilisticSampler.java index e522b0fd4..696f868a4 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/samplers/ProbabilisticSampler.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/samplers/ProbabilisticSampler.java @@ -36,8 +36,7 @@ public class ProbabilisticSampler implements Sampler { private final long positiveSamplingBoundary; private final long negativeSamplingBoundary; - @Getter - private final double samplingRate; + @Getter private final double samplingRate; private final Map tags; public ProbabilisticSampler(double samplingRate) { @@ -50,7 +49,7 @@ public ProbabilisticSampler(double samplingRate) { this.positiveSamplingBoundary = (long) (((1L << 63) - 1) * samplingRate); this.negativeSamplingBoundary = (long) ((1L << 63) * samplingRate); - Map tags = new HashMap<>(); + Map tags = new HashMap(); tags.put(Constants.SAMPLER_TYPE_TAG_KEY, TYPE); tags.put(Constants.SAMPLER_PARAM_TAG_KEY, samplingRate); this.tags = Collections.unmodifiableMap(tags); diff --git a/jaeger-core/src/main/java/com/uber/jaeger/samplers/RateLimitingSampler.java b/jaeger-core/src/main/java/com/uber/jaeger/samplers/RateLimitingSampler.java index 4ef8ec76f..39ce4dc4c 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/samplers/RateLimitingSampler.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/samplers/RateLimitingSampler.java @@ -43,7 +43,7 @@ public RateLimitingSampler(double maxTracesPerSecond) { double maxBalance = maxTracesPerSecond < 1.0 ? 1.0 : maxTracesPerSecond; this.rateLimiter = new RateLimiter(maxTracesPerSecond, maxBalance); - Map tags = new HashMap<>(); + Map tags = new HashMap(); tags.put(Constants.SAMPLER_TYPE_TAG_KEY, TYPE); tags.put(Constants.SAMPLER_PARAM_TAG_KEY, maxTracesPerSecond); this.tags = Collections.unmodifiableMap(tags); diff --git a/jaeger-core/src/main/java/com/uber/jaeger/senders/InMemorySender.java b/jaeger-core/src/main/java/com/uber/jaeger/senders/InMemorySender.java index 1af2eb04f..0067e423a 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/senders/InMemorySender.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/senders/InMemorySender.java @@ -35,21 +35,21 @@ public class InMemorySender implements Sender { private List received; public InMemorySender() { - appended = new ArrayList<>(); - flushed = new ArrayList<>(); - received = new ArrayList<>(); + appended = new ArrayList(); + flushed = new ArrayList(); + received = new ArrayList(); } public List getAppended() { - return new ArrayList<>(appended); + return new ArrayList(appended); } public List getFlushed() { - return new ArrayList<>(flushed); + return new ArrayList(flushed); } public List getReceived() { - return new ArrayList<>(received); + return new ArrayList(received); } @Override diff --git a/jaeger-core/src/main/java/com/uber/jaeger/senders/UDPSender.java b/jaeger-core/src/main/java/com/uber/jaeger/senders/UDPSender.java index 031679f5b..65f6eee78 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/senders/UDPSender.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/senders/UDPSender.java @@ -65,7 +65,7 @@ public UDPSender(String host, int port, int maxPacketSize) { udpTransport = TUDPTransport.NewTUDPClient(host, port); udpClient = new Agent.Client(new TCompactProtocol(udpTransport)); maxSpanBytes = maxPacketSize - emitZipkinBatchOverhead; - spanBuffer = new ArrayList<>(); + spanBuffer = new ArrayList(); } int getSizeOfSerializedSpan(Span span) throws SenderException { diff --git a/jaeger-core/src/main/java/com/uber/jaeger/utils/Java6CompatibleThreadLocalRandom.java b/jaeger-core/src/main/java/com/uber/jaeger/utils/Java6CompatibleThreadLocalRandom.java new file mode 100644 index 000000000..e7ab0664a --- /dev/null +++ b/jaeger-core/src/main/java/com/uber/jaeger/utils/Java6CompatibleThreadLocalRandom.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2017, Uber Technologies, Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.uber.jaeger.utils; + +import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +public final class Java6CompatibleThreadLocalRandom { + + static boolean threadLocalRandomPresent = true; + + private static final String THREAD_LOCAL_RANDOM_CLASS_NAME = + "java.util.concurrent.ThreadLocalRandom"; + + static { + try { + Class.forName(THREAD_LOCAL_RANDOM_CLASS_NAME); + } catch (ClassNotFoundException e) { + threadLocalRandomPresent = false; + } + } + + private static final ThreadLocal threadLocal = + new ThreadLocal() { + @Override + protected Random initialValue() { + return new Random(); + } + }; + + /** + * Calls {@link ThreadLocalRandom#current()}, if this class is present (if you are using Java 7). + * Otherwise uses a Java 6 compatible fallback. + * + * @return the current thread's {@link Random} + */ + @IgnoreJRERequirement + public static Random current() { + if (threadLocalRandomPresent) { + return ThreadLocalRandom.current(); + } else { + return threadLocal.get(); + } + } + + private Java6CompatibleThreadLocalRandom() {} +} diff --git a/jaeger-core/src/main/java/com/uber/jaeger/utils/Utils.java b/jaeger-core/src/main/java/com/uber/jaeger/utils/Utils.java index 25b657a70..25fcc5689 100644 --- a/jaeger-core/src/main/java/com/uber/jaeger/utils/Utils.java +++ b/jaeger-core/src/main/java/com/uber/jaeger/utils/Utils.java @@ -26,7 +26,6 @@ import java.net.InetAddress; import java.net.UnknownHostException; -import java.util.concurrent.ThreadLocalRandom; public class Utils { public static String normalizeBaggageKey(String key) { @@ -59,8 +58,12 @@ public static int ipToInt(String ip) throws EmptyIPException, NotFourOctetsExcep public static long uniqueID() { long val = 0; while (val == 0) { - val = ThreadLocalRandom.current().nextLong(); + val = Java6CompatibleThreadLocalRandom.current().nextLong(); } return val; } + + public static boolean equals(Object a, Object b) { + return (a == b) || (a != null && a.equals(b)); + } } diff --git a/jaeger-core/src/test/java/com/uber/jaeger/utils/Java6CompatibleThreadLocalRandomTest.java b/jaeger-core/src/test/java/com/uber/jaeger/utils/Java6CompatibleThreadLocalRandomTest.java new file mode 100644 index 000000000..75f629d7d --- /dev/null +++ b/jaeger-core/src/test/java/com/uber/jaeger/utils/Java6CompatibleThreadLocalRandomTest.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2017, Uber Technologies, Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.uber.jaeger.utils; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicReference; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; + +public class Java6CompatibleThreadLocalRandomTest { + + @After + @Before + public void clearState() throws Exception { + // As test classes are targeted at 1.7 and gradle 3.x can't be run with Java 6, + // its safe to say that this test won't ever be executed with JDK 6 + Java6CompatibleThreadLocalRandom.threadLocalRandomPresent = true; + } + + @Test + public void testThreadLocalRandomPresent() throws Exception { + assertSame(Java6CompatibleThreadLocalRandom.current(), ThreadLocalRandom.current()); + assertNotNull(Java6CompatibleThreadLocalRandom.current().nextLong()); + } + + @Test + public void testThreadLocalRandomNotPresent() throws Exception { + Java6CompatibleThreadLocalRandom.threadLocalRandomPresent = false; + assertNotSame(Java6CompatibleThreadLocalRandom.current(), ThreadLocalRandom.current()); + assertNotNull(Java6CompatibleThreadLocalRandom.current().nextLong()); + } + + @Test + public void testRandomFromOtherThreadIsNotSame() throws Exception { + Java6CompatibleThreadLocalRandom.threadLocalRandomPresent = false; + final AtomicReference randomFromOtherThread = new AtomicReference<>(); + final Thread thread = new Thread(new Runnable() { + @Override + public void run() { + randomFromOtherThread.set(Java6CompatibleThreadLocalRandom.current()); + } + }); + thread.start(); + thread.join(); + assertNotSame(Java6CompatibleThreadLocalRandom.current(), randomFromOtherThread.get()); + assertNotNull(Java6CompatibleThreadLocalRandom.current().nextLong()); + assertNotNull(randomFromOtherThread.get()); + assertNotNull(randomFromOtherThread.get().nextLong()); + } + +} \ No newline at end of file diff --git a/jaeger-crossdock/build.gradle b/jaeger-crossdock/build.gradle index a12e1fbb8..06062740e 100644 --- a/jaeger-crossdock/build.gradle +++ b/jaeger-crossdock/build.gradle @@ -5,6 +5,11 @@ description = 'A jaeger instrumented java server meant for testing interoperabil ext.jacksonVersion = '2.7.4' shadowJar.archiveName = 'jaeger-crossdock.jar' +compileJava { + sourceCompatibility = 1.7 + targetCompatibility = 1.7 +} + dependencies { compile project(':jaeger-jaxrs2') @@ -20,6 +25,8 @@ dependencies { // Testing Frameworks testCompile group: 'junit', name: 'junit', version: junitVersion + + signature 'org.codehaus.mojo.signature:java17:1.0@signature' } sourceSets { diff --git a/jaeger-dropwizard/build.gradle b/jaeger-dropwizard/build.gradle index ce54cedd5..343db732d 100644 --- a/jaeger-dropwizard/build.gradle +++ b/jaeger-dropwizard/build.gradle @@ -11,6 +11,8 @@ dependencies { testCompile group: 'org.glassfish.jersey.test-framework.providers', name: 'jersey-test-framework-provider-grizzly2', version: jerseyVersion testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.mockito', name: 'mockito-core', version: mockitoVersion + + signature 'org.codehaus.mojo.signature:java16:1.1@signature' } sourceSets { diff --git a/jaeger-dropwizard/src/main/java/com/uber/jaeger/dropwizard/JaegerFeature.java b/jaeger-dropwizard/src/main/java/com/uber/jaeger/dropwizard/JaegerFeature.java index 9b0733536..aec6e2869 100644 --- a/jaeger-dropwizard/src/main/java/com/uber/jaeger/dropwizard/JaegerFeature.java +++ b/jaeger-dropwizard/src/main/java/com/uber/jaeger/dropwizard/JaegerFeature.java @@ -43,7 +43,8 @@ public boolean configure(FeatureContext featureContext) { switch (featureContext.getConfiguration().getRuntimeType()) { case SERVER: - featureContext.register(new JerseyServerFilter(tracer, com.uber.jaeger.context.TracingUtils.getTraceContext())); + featureContext.register( + new JerseyServerFilter(tracer, com.uber.jaeger.context.TracingUtils.getTraceContext())); break; case CLIENT: featureContext.register(TracingUtils.clientFilter(tracer)); diff --git a/jaeger-dropwizard/src/main/java/com/uber/jaeger/dropwizard/JerseyServerFilter.java b/jaeger-dropwizard/src/main/java/com/uber/jaeger/dropwizard/JerseyServerFilter.java index 3fa68905f..ddae72b72 100644 --- a/jaeger-dropwizard/src/main/java/com/uber/jaeger/dropwizard/JerseyServerFilter.java +++ b/jaeger-dropwizard/src/main/java/com/uber/jaeger/dropwizard/JerseyServerFilter.java @@ -25,7 +25,7 @@ import com.uber.jaeger.context.TraceContext; import com.uber.jaeger.filters.jaxrs2.ServerFilter; -import io.opentracing.Tracer; + import org.glassfish.jersey.server.ContainerRequest; import org.glassfish.jersey.server.ExtendedUriInfo; import org.glassfish.jersey.server.internal.routing.UriRoutingContext; @@ -36,17 +36,20 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; + import javax.inject.Singleton; import javax.ws.rs.Path; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.ext.Provider; + +import io.opentracing.Tracer; import lombok.Value; import lombok.extern.slf4j.Slf4j; /** * A {@link ServerFilter} that provides a Jersey specific {@link #getOperationName} implementation. - * When using this Filter with Jersey, the full @Path template hierarchy is used as the - * operation name. + * When using this Filter with Jersey, the full @Path template hierarchy is used as the operation + * name. * * WARNING: This class relies on an private implementation detail * {@link UriTemplate#normalizedTemplate} to provide functionality. @@ -56,11 +59,10 @@ @Singleton public class JerseyServerFilter extends ServerFilter { - private Map methodToPathCache = new ConcurrentHashMap<>(); + private Map methodToPathCache = new ConcurrentHashMap(); private Field normalizedTemplate; - public JerseyServerFilter(Tracer tracer, - TraceContext traceContext) { + public JerseyServerFilter(Tracer tracer, TraceContext traceContext) { super(tracer, traceContext); try { @@ -68,19 +70,23 @@ public JerseyServerFilter(Tracer tracer, normalizedTemplate.setAccessible(true); } catch (NoSuchFieldException e) { //TODO: Add metrics for failure counts - log.error("Cannot access the normalizedTemplate field from UriTemplate. " - + "Path operation name for tracing will be disabled.", e); + log.error( + "Cannot access the normalizedTemplate field from UriTemplate. " + + "Path operation name for tracing will be disabled.", + e); } } /** * Gets an operation name by first calling {@link #getPathOperationName(ContainerRequestContext)}, * and falling back on {@link #getResourceMethodOperationName(ContainerRequestContext)}. + * * @return operation name */ @Override protected String getOperationName(ContainerRequestContext containerRequestContext) { - CacheKey key = CacheKey.of(resourceInfo.getResourceMethod(), containerRequestContext.getMethod()); + CacheKey key = + CacheKey.of(resourceInfo.getResourceMethod(), containerRequestContext.getMethod()); String operationName = methodToPathCache.get(key); if (operationName != null) { return operationName; @@ -98,17 +104,22 @@ protected String getOperationName(ContainerRequestContext containerRequestContex /** * Retrieves an operation name that uses the resource method name of the matched jersey resource + * * @return the operation name */ private String getResourceMethodOperationName(ContainerRequestContext containerRequestContext) { Method method = resourceInfo.getResourceMethod(); - return String.format("%s:%s:%s", containerRequestContext.getMethod(), - method.getDeclaringClass().getCanonicalName(), method.getName()); + return String.format( + "%s:%s:%s", + containerRequestContext.getMethod(), + method.getDeclaringClass().getCanonicalName(), + method.getName()); } /** - * Retrieves an operation name that contains the http method and value of the - * {@link Path} used by a Jersey server implementation. + * Retrieves an operation name that contains the http method and value of the {@link Path} used by + * a Jersey server implementation. + * * @return the operation name */ private String getPathOperationName(ContainerRequestContext containerRequestContext) { @@ -136,11 +147,11 @@ private String getPathOperationName(ContainerRequestContext containerRequestCont } @VisibleForTesting - Map getCache(){ - return new ConcurrentHashMap<>(methodToPathCache); + Map getCache() { + return new ConcurrentHashMap(methodToPathCache); } - @Value (staticConstructor = "of") + @Value(staticConstructor = "of") static class CacheKey { private final Method resourceMethod; private final String httpMethod; diff --git a/jaeger-jaxrs2/build.gradle b/jaeger-jaxrs2/build.gradle index 82346286b..a5e0d8f41 100644 --- a/jaeger-jaxrs2/build.gradle +++ b/jaeger-jaxrs2/build.gradle @@ -12,6 +12,8 @@ dependencies { testCompile group: 'org.glassfish.jersey.media', name: 'jersey-media-moxy', version: jerseyVersion testCompile group: 'junit', name: 'junit', version: junitVersion testCompile group: 'org.mockito', name: 'mockito-core', version: mockitoVersion + + signature 'org.codehaus.mojo.signature:java16:1.1@signature' } sourceSets { diff --git a/jaeger-thrift/build.gradle b/jaeger-thrift/build.gradle index 8f715e95f..b57c050b1 100644 --- a/jaeger-thrift/build.gradle +++ b/jaeger-thrift/build.gradle @@ -7,8 +7,16 @@ description = 'Generated thrift code' dependencies { compile group: 'org.apache.thrift', name: 'libthrift', version: apacheThriftVersion + + signature 'org.codehaus.mojo.signature:java16:1.1@signature' } +/** + * Note that you need to install thrift 0.9.2 on your system for this task to work. + * + * If you are using macOS, you can install this specific version via homebrew like so: + * `brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/56d8c1eba1e5ac30290dd0c486f4bba37f821e42/Formula/thrift.rb` + */ compileThrift { sourceDir "${projectDir}/../idl/thrift" outputDir 'src/main/gen-java' diff --git a/jaeger-zipkin/build.gradle b/jaeger-zipkin/build.gradle index 58b8ec038..5f1574537 100644 --- a/jaeger-zipkin/build.gradle +++ b/jaeger-zipkin/build.gradle @@ -9,6 +9,8 @@ dependencies { testCompile group: 'org.mockito', name: 'mockito-core', version: mockitoVersion testCompile group: 'io.zipkin.java', name: 'zipkin-junit', version: '1.16.2' testCompile group: 'io.zipkin.brave', name: 'brave-http', version: '3.15.3' + + signature 'org.codehaus.mojo.signature:java16:1.1@signature' } sourceSets { diff --git a/jaeger-zipkin/src/main/java/com/uber/jaeger/senders/zipkin/ZipkinSender.java b/jaeger-zipkin/src/main/java/com/uber/jaeger/senders/zipkin/ZipkinSender.java index 31506fb63..9f81f6a7a 100644 --- a/jaeger-zipkin/src/main/java/com/uber/jaeger/senders/zipkin/ZipkinSender.java +++ b/jaeger-zipkin/src/main/java/com/uber/jaeger/senders/zipkin/ZipkinSender.java @@ -101,20 +101,18 @@ public int append(Span span) throws SenderException { byte[] next = encoder.encode(backFillHostOnAnnotations(span)); int messageSizeOfNextSpan = delegate.messageSizeInBytes(Collections.singletonList(next)); // don't enqueue something larger than we can drain - if (Integer.compare(messageSizeOfNextSpan, delegate.messageMaxBytes()) > 0) { + if (messageSizeOfNextSpan > delegate.messageMaxBytes()) { throw new SenderException( delegate.toString() + " received a span that was too large", null, 1); } spanBuffer.add(next); // speculatively add to the buffer so we can size it int nextSizeInBytes = delegate.messageSizeInBytes(spanBuffer); - int includingNextVsMaxMessageSize = - Integer.compare(nextSizeInBytes, delegate.messageMaxBytes()); // If we can fit queued spans and the next into one message... - if (includingNextVsMaxMessageSize <= 0) { + if (nextSizeInBytes <= delegate.messageMaxBytes()) { // If there's still room, don't flush yet. - if (includingNextVsMaxMessageSize < 0) { + if (nextSizeInBytes < delegate.messageMaxBytes()) { return 0; } // If we have exactly met the max message size, flush