Repository: incubator-htrace Updated Branches: refs/heads/master 3d0cf88cf -> e874b1805
HTRACE-32. Change span timeline annotations map to be a map<string, string> (cmccabe) Project: http://git-wip-us.apache.org/repos/asf/incubator-htrace/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-htrace/commit/e874b180 Tree: http://git-wip-us.apache.org/repos/asf/incubator-htrace/tree/e874b180 Diff: http://git-wip-us.apache.org/repos/asf/incubator-htrace/diff/e874b180 Branch: refs/heads/master Commit: e874b1805849d93756bd7bd4e773000fed3d5230 Parents: 3d0cf88 Author: Colin P. Mccabe <[email protected]> Authored: Tue Jan 6 16:25:52 2015 -0800 Committer: Colin P. Mccabe <[email protected]> Committed: Tue Jan 6 16:31:10 2015 -0800 ---------------------------------------------------------------------- .../src/main/java/org/apache/htrace/Span.java | 15 ++++--- .../htrace/impl/LocalFileSpanReceiver.java | 44 +++++++++++++------- .../java/org/apache/htrace/impl/MilliSpan.java | 28 +++++++++---- .../org/apache/htrace/impl/TestMilliSpan.java | 24 ++++------- .../htrace/impl/TestHBaseSpanReceiver.java | 5 ++- .../htrace/zipkin/HTraceToZipkinConverter.java | 14 +++++-- 6 files changed, 79 insertions(+), 51 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e874b180/htrace-core/src/main/java/org/apache/htrace/Span.java ---------------------------------------------------------------------- diff --git a/htrace-core/src/main/java/org/apache/htrace/Span.java b/htrace-core/src/main/java/org/apache/htrace/Span.java index 2731583..df28630 100644 --- a/htrace-core/src/main/java/org/apache/htrace/Span.java +++ b/htrace-core/src/main/java/org/apache/htrace/Span.java @@ -96,6 +96,12 @@ public interface Span { /** * Add a data annotation associated with this span */ + void addKVAnnotation(String key, String value); + + /** + * Add a data annotation associated with this span + */ + @Deprecated void addKVAnnotation(byte[] key, byte[] value); /** @@ -106,7 +112,7 @@ public interface Span { /** * Get data associated with this span (read only) */ - Map<byte[], byte[]> getKVAnnotations(); + Map<String, String> getKVAnnotations(); /** * Get any timeline annotations (read only) @@ -140,12 +146,11 @@ public interface Span { jgen.writeString(String.format("%016x", span.getParentId())); } jgen.writeEndArray(); - Map<byte[], byte[]> traceInfoMap = span.getKVAnnotations(); + Map<String, String> traceInfoMap = span.getKVAnnotations(); if (!traceInfoMap.isEmpty()) { jgen.writeObjectFieldStart("n"); - for (Map.Entry<byte[], byte[]> e : traceInfoMap.entrySet()) { - jgen.writeStringField(new String(e.getKey(), "UTF-8"), - new String(e.getValue(), "UTF-8")); + for (Map.Entry<String, String> e : traceInfoMap.entrySet()) { + jgen.writeStringField(e.getKey(), e.getValue()); } jgen.writeEndObject(); } http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e874b180/htrace-core/src/main/java/org/apache/htrace/impl/LocalFileSpanReceiver.java ---------------------------------------------------------------------- diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/LocalFileSpanReceiver.java b/htrace-core/src/main/java/org/apache/htrace/impl/LocalFileSpanReceiver.java index 7095008..8b037bf 100644 --- a/htrace-core/src/main/java/org/apache/htrace/impl/LocalFileSpanReceiver.java +++ b/htrace-core/src/main/java/org/apache/htrace/impl/LocalFileSpanReceiver.java @@ -16,6 +16,8 @@ */ package org.apache.htrace.impl; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.htrace.HTraceConfiguration; @@ -23,8 +25,11 @@ import org.apache.htrace.Span; import org.apache.htrace.SpanReceiver; import java.io.BufferedWriter; +import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; @@ -42,9 +47,9 @@ public class LocalFileSpanReceiver implements SpanReceiver { public static final int CAPACITY_DEFAULT = 5000; // default timeout duration when calling executor.awaitTermination() public static final long EXECUTOR_TERMINATION_TIMEOUT_DURATION_DEFAULT = 60; + private static ObjectWriter JSON_WRITER = new ObjectMapper().writer(); private String file; - private FileWriter fwriter; - private BufferedWriter bwriter; + private Writer writer; private ExecutorService executor; private long executorTerminationTimeoutDuration; @@ -57,15 +62,28 @@ public class LocalFileSpanReceiver implements SpanReceiver { } this.executor = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(capacity)); + boolean success = false; + FileOutputStream fos = null; try { - this.fwriter = new FileWriter(this.file, true); + fos = new FileOutputStream(file, true); + this.writer = new BufferedWriter( + new OutputStreamWriter(fos,"UTF-8")); + success = true; } catch (IOException ioe) { throw new RuntimeException(ioe); + } finally { + if (!success) { + if (fos == null) { + try { + fos.close(); + } catch (IOException e) { + LOG.error("Error closing output stream for " + file, e); + } + } + } } - this.bwriter = new BufferedWriter(fwriter); } - private class WriteSpanRunnable implements Runnable { public final Span span; @@ -76,9 +94,8 @@ public class LocalFileSpanReceiver implements SpanReceiver { @Override public void run() { try { - bwriter.write(span.toJson()); - bwriter.newLine(); - bwriter.flush(); + JSON_WRITER.writeValue(writer, this); + writer.write("%n"); } catch (IOException e) { LOG.error("Error when writing to file: " + file, e); } @@ -104,14 +121,9 @@ public class LocalFileSpanReceiver implements SpanReceiver { } try { - fwriter.close(); - } catch (IOException e) { - LOG.error("Error closing filewriter for file: " + file, e); - } - try { - bwriter.close(); + writer.close(); } catch (IOException e) { - LOG.error("Error closing bufferedwriter for file: " + file, e); + LOG.error("Error closing writer for file: " + file, e); } } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e874b180/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java ---------------------------------------------------------------------- diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java b/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java index 597b566..b34df64 100644 --- a/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java +++ b/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java @@ -30,6 +30,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.io.StringWriter; +import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.util.ArrayList; import java.util.Collections; @@ -56,7 +57,7 @@ public class MilliSpan implements Span { private final long traceId; private final long parents[]; private final long spanId; - private Map<byte[], byte[]> traceInfo = null; + private Map<String, String> traceInfo = null; private final String processId; private List<TimelineAnnotation> timeline = null; @@ -75,7 +76,7 @@ public class MilliSpan implements Span { private long traceId; private long parents[]; private long spanId; - private Map<byte[], byte[]> traceInfo = null; + private Map<String, String> traceInfo = null; private String processId; private List<TimelineAnnotation> timeline = null; @@ -121,7 +122,7 @@ public class MilliSpan implements Span { return this; } - public Builder traceInfo(Map<byte[], byte[]> traceInfo) { + public Builder traceInfo(Map<String, String> traceInfo) { this.traceInfo = traceInfo.isEmpty() ? null : traceInfo; return this; } @@ -237,9 +238,19 @@ public class MilliSpan implements Span { } @Override - public void addKVAnnotation(byte[] key, byte[] value) { + public void addKVAnnotation(byte[] key, byte[] value) { + // TODO: remove this method + try { + addKVAnnotation(new String(key, "UTF-8"), new String(value, "UTF-8")); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + @Override + public void addKVAnnotation(String key, String value) { if (traceInfo == null) - traceInfo = new HashMap<byte[], byte[]>(); + traceInfo = new HashMap<String, String>(); traceInfo.put(key, value); } @@ -252,7 +263,7 @@ public class MilliSpan implements Span { } @Override - public Map<byte[], byte[]> getKVAnnotations() { + public Map<String, String> getKVAnnotations() { if (traceInfo == null) return Collections.emptyMap(); return Collections.unmodifiableMap(traceInfo); @@ -310,12 +321,11 @@ public class MilliSpan implements Span { builder.parents(parents); JsonNode traceInfoNode = root.get("n"); if (traceInfoNode != null) { - HashMap<byte[], byte[]> traceInfo = new HashMap<byte[], byte[]>(); + HashMap<String, String> traceInfo = new HashMap<String, String>(); for (Iterator<String> iter = traceInfoNode.fieldNames(); iter.hasNext(); ) { String field = iter.next(); - traceInfo.put(field.getBytes("UTF-8"), - traceInfoNode.get(field).asText().getBytes("UTF-8")); + traceInfo.put(field, traceInfoNode.get(field).asText()); } builder.traceInfo(traceInfo); } http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e874b180/htrace-core/src/test/java/org/apache/htrace/impl/TestMilliSpan.java ---------------------------------------------------------------------- diff --git a/htrace-core/src/test/java/org/apache/htrace/impl/TestMilliSpan.java b/htrace-core/src/test/java/org/apache/htrace/impl/TestMilliSpan.java index 677ec61..7ad0482 100644 --- a/htrace-core/src/test/java/org/apache/htrace/impl/TestMilliSpan.java +++ b/htrace-core/src/test/java/org/apache/htrace/impl/TestMilliSpan.java @@ -41,24 +41,14 @@ public class TestMilliSpan { assertEquals(expected.getSpanId(), got.getSpanId()); assertEquals(expected.getProcessId(), got.getProcessId()); assertEquals(expected.getParentId(), got.getParentId()); - Map<byte[], byte[]> expectedT = expected.getKVAnnotations(); - Map<byte[], byte[]> gotT = got.getKVAnnotations(); + Map<String, String> expectedT = expected.getKVAnnotations(); + Map<String, String> gotT = got.getKVAnnotations(); if (expectedT == null) { assertEquals(null, gotT); } else { assertEquals(expectedT.size(), gotT.size()); - Map<String, String> expectedTMap = new HashMap<String, String>(); - for (byte[] key : expectedT.keySet()) { - expectedTMap.put(new String(key, "UTF-8"), - new String(expectedT.get(key), "UTF-8")); - } - Map<String, String> gotTMap = new HashMap<String, String>(); - for (byte[] key : gotT.keySet()) { - gotTMap.put(new String(key, "UTF-8"), - new String(gotT.get(key), "UTF-8")); - } - for (String key : expectedTMap.keySet()) { - assertEquals(expectedTMap.get(key), gotTMap.get(key)); + for (String key : expectedT.keySet()) { + assertEquals(expectedT.get(key), gotT.get(key)); } } List<TimelineAnnotation> expectedTimeline = @@ -137,9 +127,9 @@ public class TestMilliSpan { processId("b2408.halxg.com:8080"). spanId(111111111L). traceId(4443); - Map<byte[], byte[]> traceInfo = new HashMap<byte[], byte[]>(); - traceInfo.put("abc".getBytes("UTF-8"), "123".getBytes("UTF-8")); - traceInfo.put("def".getBytes("UTF-8"), "456".getBytes("UTF-8")); + Map<String, String> traceInfo = new HashMap<String, String>(); + traceInfo.put("abc", "123"); + traceInfo.put("def", "456"); builder.traceInfo(traceInfo); List<TimelineAnnotation> timeline = new LinkedList<TimelineAnnotation>(); timeline.add(new TimelineAnnotation(310L, "something happened")); http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e874b180/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java ---------------------------------------------------------------------- diff --git a/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java b/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java index d3cffe2..52b344c 100644 --- a/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java +++ b/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java @@ -189,7 +189,7 @@ public class TestHBaseSpanReceiver { } @Override - public Map<byte[], byte[]> getKVAnnotations() { + public Map<String, String> getKVAnnotations() { return Collections.emptyMap(); } @@ -202,6 +202,9 @@ public class TestHBaseSpanReceiver { public void addKVAnnotation(byte[] key, byte[] value) {} @Override + public void addKVAnnotation(String key, String value) {} + + @Override public void addTimelineAnnotation(String msg) {} @Override http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e874b180/htrace-zipkin/src/main/java/org/apache/htrace/zipkin/HTraceToZipkinConverter.java ---------------------------------------------------------------------- diff --git a/htrace-zipkin/src/main/java/org/apache/htrace/zipkin/HTraceToZipkinConverter.java b/htrace-zipkin/src/main/java/org/apache/htrace/zipkin/HTraceToZipkinConverter.java index 09ab1ea..8bd6442 100644 --- a/htrace-zipkin/src/main/java/org/apache/htrace/zipkin/HTraceToZipkinConverter.java +++ b/htrace-zipkin/src/main/java/org/apache/htrace/zipkin/HTraceToZipkinConverter.java @@ -23,8 +23,11 @@ import com.twitter.zipkin.gen.Endpoint; import com.twitter.zipkin.gen.Span; import com.twitter.zipkin.gen.zipkinCoreConstants; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.htrace.TimelineAnnotation; +import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -72,6 +75,7 @@ import java.util.Map; * <p/> */ public class HTraceToZipkinConverter { + private static final Log LOG = LogFactory.getLog(HTraceToZipkinConverter.class); private final int ipv4Address; private final short port; @@ -145,11 +149,15 @@ public class HTraceToZipkinConverter { private List<BinaryAnnotation> createZipkinBinaryAnnotations(org.apache.htrace.Span span, Endpoint ep) { List<BinaryAnnotation> l = new ArrayList<BinaryAnnotation>(); - for (Map.Entry<byte[], byte[]> e : span.getKVAnnotations().entrySet()) { + for (Map.Entry<String, String> e : span.getKVAnnotations().entrySet()) { BinaryAnnotation binaryAnn = new BinaryAnnotation(); binaryAnn.setAnnotation_type(AnnotationType.BYTES); - binaryAnn.setKey(new String(e.getKey())); - binaryAnn.setValue(e.getValue()); + binaryAnn.setKey(e.getKey()); + try { + binaryAnn.setValue(e.getValue().getBytes("UTF-8")); + } catch (UnsupportedEncodingException ex) { + LOG.error("Error encoding string as UTF-8", ex); + } binaryAnn.setHost(ep); l.add(binaryAnn); }
