Repository: cxf Updated Branches: refs/heads/3.1.x-fixes 0c405f9d7 -> e4f53e1dd
CXF-7129: Provide an optional HTrace Logging receiver, prettified the default output Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/e4f53e1d Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/e4f53e1d Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/e4f53e1d Branch: refs/heads/3.1.x-fixes Commit: e4f53e1ddb11dd6b64cfdfb5820aa330bb2fc5ae Parents: 0c405f9 Author: reta <[email protected]> Authored: Sat Feb 25 14:32:25 2017 -0500 Committer: Sergey Beryozkin <[email protected]> Committed: Mon Feb 27 09:54:20 2017 +0000 ---------------------------------------------------------------------- .../tracing/htrace/ext/LoggingSpanReceiver.java | 114 ++++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/e4f53e1d/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/ext/LoggingSpanReceiver.java ---------------------------------------------------------------------- diff --git a/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/ext/LoggingSpanReceiver.java b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/ext/LoggingSpanReceiver.java index 68845be..332b385 100644 --- a/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/ext/LoggingSpanReceiver.java +++ b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/tracing/htrace/ext/LoggingSpanReceiver.java @@ -20,14 +20,23 @@ package org.apache.cxf.tracing.htrace.ext; import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.function.Function; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.cxf.common.logging.LogUtils; +import org.apache.cxf.common.util.StringUtils; import org.apache.htrace.core.HTraceConfiguration; import org.apache.htrace.core.Span; import org.apache.htrace.core.SpanReceiver; +import org.apache.htrace.core.TimelineAnnotation; +/** + * Span receiver implementation which outputs spans into logs. + */ public class LoggingSpanReceiver extends SpanReceiver { public static final String LOG_LEVEL_KEY = "cxf.log.level"; public static final String LOG_LEVEL_ERROR = Level.SEVERE.getName(); @@ -44,10 +53,113 @@ public class LoggingSpanReceiver extends SpanReceiver { @Override public void receiveSpan(Span span) { - LOG.log(level, span.toString()); + LOG.log(level, toString(span)); } @Override public void close() throws IOException { } + + /** + * Sample log statements: + * + * INFO org.apache.cxf.tracing.htrace.ext.LoggingSpanReceiver - spanId=e5999a29a1ea468201acac30ec04ae39 + * tracerId="tracer-server/192.168.0.100" start=1488049449621 stop=1488049451623 description="Get Employees" + * parents=[e5999a29a1ea4682d346ae17e51e0bd4] kvs=[] timelines=[[time=1488049451623 + * message="Getting all employees"]] + * + * INFO org.apache.cxf.tracing.htrace.ext.LoggingSpanReceiver - spanId=e5999a29a1ea4682ac0a9ad638e084ed + * tracerId="tracer-client/192.168.0.100" start=1488049449074 stop=1488049454894 + * description="GET http://localhost:8282/rest/api/people" parents=[] kvs=[] timelines=[] + */ + + private String toString(TimelineAnnotation annotation) { + final StringBuilder sb = new StringBuilder(); + append(sb, "time", annotation.getTime()); + append(sb, "message", annotation.getMessage(), true); + return sb.toString(); + } + + private String toString(Span span) { + final StringBuilder sb = new StringBuilder(); + + if (span.getSpanId().isValid()) { + append(sb, "spanId", span.getSpanId().toString()); + } + + String tracerId = span.getTracerId(); + if (!StringUtils.isEmpty(tracerId)) { + append(sb, "tracerId", tracerId, true); + } + + if (span.getStartTimeMillis() != 0) { + append(sb, "start", span.getStartTimeMillis()); + } + + if (span.getStopTimeMillis() != 0) { + append(sb, "stop", span.getStopTimeMillis()); + } + + if (!StringUtils.isEmpty(span.getDescription())) { + append(sb, "description", span.getDescription(), true); + } + + append(sb, "parents", span.getParents()); + append(sb, "kvs", span.getKVAnnotations()); + append(sb, "timelines", span.getTimelineAnnotations(), t -> "[" + toString(t) + "]"); + + return sb.toString(); + } + + private<T> void append(StringBuilder sb, String key, Map<String, String> values) { + final StringBuilder inner = new StringBuilder(); + + for (final Map.Entry<String, String> entry : values.entrySet()) { + append(inner, quote(entry.getKey()), entry.getValue(), true); + } + + append(sb, key, inner.insert(0, "[").append("]").toString()); + } + + private<T> void append(StringBuilder sb, String key, Collection<T> values, Function<T, String> stringifyer) { + append(sb, key, Arrays.toString(values.stream().map(stringifyer::apply).toArray(String[]::new))); + } + + private<T> void append(StringBuilder sb, String key, T[] values) { + append(sb, key, Arrays.toString(Arrays.stream(values).map(T::toString).toArray(String[]::new))); + } + + private void append(StringBuilder sb, String key, long value) { + append(sb, key, Long.toString(value)); + } + + private void append(StringBuilder sb, String key, String value) { + append(sb, key, value, false); + } + + private void append(StringBuilder sb, String key, String value, boolean quoted) { + if (sb.length() > 0) { + sb.append(" "); + } + + sb.append(key).append("="); + quote(sb, value, quoted); + } + + private String quote(String value) { + final StringBuilder sb = new StringBuilder(); + quote(sb, value, true); + return sb.toString(); + } + + private void quote(StringBuilder sb, String value, boolean quoted) { + if (quoted) { + sb.append("\""); + } + + sb.append(value); + if (quoted) { + sb.append("\""); + } + } }
