use of io.jaegertracing.thriftjava.Tag in project instrumentation-java by census-instrumentation.
the class JaegerExporterHandler method descriptionToTag.
private static Tag descriptionToTag(final String description) {
final Tag tag = new Tag(DESCRIPTION, TagType.STRING);
tag.setVStr(description);
return tag;
}
use of io.jaegertracing.thriftjava.Tag in project instrumentation-java by census-instrumentation.
the class JaegerExporterHandlerTest method convertErrorSpanDataToJaegerThriftSpan.
@Test
public void convertErrorSpanDataToJaegerThriftSpan() throws SenderException {
long startTime = 1519629870001L;
long endTime = 1519630148002L;
String statusMessage = "timeout";
SpanData spanData = SpanData.create(sampleSpanContext(), SpanId.fromBytes(new byte[] { (byte) 0x7F, FF, FF, FF, FF, FF, FF, FF }), true, "test", Kind.SERVER, Timestamp.fromMillis(startTime), SpanData.Attributes.create(Collections.<String, AttributeValue>emptyMap(), 0), SpanData.TimedEvents.create(Collections.<TimedEvent<Annotation>>emptyList(), 0), SpanData.TimedEvents.create(Collections.<TimedEvent<MessageEvent>>emptyList(), 0), SpanData.Links.create(Collections.<Link>emptyList(), 0), 0, Status.DEADLINE_EXCEEDED.withDescription(statusMessage), Timestamp.fromMillis(endTime));
handler.export(singletonList(spanData));
verify(mockSender).send(eq(process), captor.capture());
List<Span> spans = captor.getValue();
assertThat(spans.size()).isEqualTo(1);
Span span = spans.get(0);
assertThat(span.tags.size()).isEqualTo(3);
assertThat(span.tags).containsExactly(new Tag(JaegerExporterHandler.SPAN_KIND, TagType.STRING).setVStr("server"), new Tag(JaegerExporterHandler.STATUS_CODE, TagType.LONG).setVLong(4), new Tag(JaegerExporterHandler.STATUS_MESSAGE, TagType.STRING).setVStr(statusMessage));
}
use of io.jaegertracing.thriftjava.Tag in project instrumentation-java by census-instrumentation.
the class JaegerExporterHandlerTest method exportShouldConvertFromSpanDataToJaegerThriftSpan.
@Test
public void exportShouldConvertFromSpanDataToJaegerThriftSpan() throws SenderException {
final long startTime = 1519629870001L;
final long endTime = 1519630148002L;
final SpanData spanData = SpanData.create(sampleSpanContext(), SpanId.fromBytes(new byte[] { (byte) 0x7F, FF, FF, FF, FF, FF, FF, FF }), true, "test", Kind.SERVER, Timestamp.fromMillis(startTime), SpanData.Attributes.create(sampleAttributes(), 0), SpanData.TimedEvents.create(singletonList(sampleAnnotation()), 0), SpanData.TimedEvents.create(singletonList(sampleMessageEvent()), 0), SpanData.Links.create(sampleLinks(), 0), 0, Status.OK, Timestamp.fromMillis(endTime));
handler.export(singletonList(spanData));
verify(mockSender).send(eq(process), captor.capture());
List<Span> spans = captor.getValue();
assertThat(spans.size()).isEqualTo(1);
Span span = spans.get(0);
assertThat(span.operationName).isEqualTo("test");
assertThat(span.spanId).isEqualTo(256L);
assertThat(span.traceIdHigh).isEqualTo(-72057594037927936L);
assertThat(span.traceIdLow).isEqualTo(1L);
assertThat(span.parentSpanId).isEqualTo(Long.MAX_VALUE);
assertThat(span.flags).isEqualTo(1);
assertThat(span.startTime).isEqualTo(MILLISECONDS.toMicros(startTime));
assertThat(span.duration).isEqualTo(MILLISECONDS.toMicros(endTime - startTime));
assertThat(span.tags.size()).isEqualTo(5);
assertThat(span.tags).containsExactly(new Tag("BOOL", TagType.BOOL).setVBool(false), new Tag("LONG", TagType.LONG).setVLong(Long.MAX_VALUE), new Tag(JaegerExporterHandler.SPAN_KIND, TagType.STRING).setVStr("server"), new Tag("STRING", TagType.STRING).setVStr("Judge of a man by his questions rather than by his answers. -- Voltaire"), new Tag(JaegerExporterHandler.STATUS_CODE, TagType.LONG).setVLong(0));
assertThat(span.logs.size()).isEqualTo(2);
Log log = span.logs.get(0);
assertThat(log.timestamp).isEqualTo(1519629872987654L);
assertThat(log.fields.size()).isEqualTo(4);
assertThat(log.fields).containsExactly(new Tag("message", TagType.STRING).setVStr("annotation #1"), new Tag("bool", TagType.BOOL).setVBool(true), new Tag("long", TagType.LONG).setVLong(1337L), new Tag("string", TagType.STRING).setVStr("Kind words do not cost much. Yet they accomplish much. -- Pascal"));
log = span.logs.get(1);
assertThat(log.timestamp).isEqualTo(1519629871123456L);
assertThat(log.fields.size()).isEqualTo(4);
assertThat(log.fields).containsExactly(new Tag("message", TagType.STRING).setVStr("sent message"), new Tag("id", TagType.LONG).setVLong(42L), new Tag("compressed_size", TagType.LONG).setVLong(69), new Tag("uncompressed_size", TagType.LONG).setVLong(96));
assertThat(span.references.size()).isEqualTo(1);
SpanRef reference = span.references.get(0);
assertThat(reference.traceIdHigh).isEqualTo(-1L);
assertThat(reference.traceIdLow).isEqualTo(-256L);
assertThat(reference.spanId).isEqualTo(512L);
assertThat(reference.refType).isEqualTo(SpanRefType.CHILD_OF);
}
use of io.jaegertracing.thriftjava.Tag in project java by wavefrontHQ.
the class JaegerThriftUtils method processSpan.
private static void processSpan(io.jaegertracing.thriftjava.Span span, String serviceName, String sourceName, String applicationName, String cluster, String shard, List<Annotation> processAnnotations, ReportableEntityHandler<Span, String> spanHandler, ReportableEntityHandler<SpanLogs, String> spanLogsHandler, @Nullable WavefrontInternalReporter wfInternalReporter, Supplier<Boolean> spanLogsDisabled, Supplier<ReportableEntityPreprocessor> preprocessorSupplier, SpanSampler sampler, Set<String> traceDerivedCustomTagKeys, Counter discardedSpansBySampler, Set<Pair<Map<String, String>, String>> discoveredHeartbeatMetrics) {
List<Annotation> annotations = new ArrayList<>(processAnnotations);
String traceId = new UUID(span.getTraceIdHigh(), span.getTraceIdLow()).toString();
String strippedTraceId = StringUtils.stripStart(traceId.replace("-", ""), "0");
strippedTraceId = strippedTraceId.length() > 0 ? strippedTraceId : "0";
annotations.add(new Annotation("jaegerSpanId", Long.toHexString(span.getSpanId())));
annotations.add(new Annotation("jaegerTraceId", strippedTraceId));
// serviceName is mandatory in Jaeger
annotations.add(new Annotation(SERVICE_TAG_KEY, serviceName));
long parentSpanId = span.getParentSpanId();
if (parentSpanId != 0) {
annotations.add(new Annotation("parent", new UUID(0, parentSpanId).toString()));
}
String componentTagValue = NULL_TAG_VAL;
boolean isError = false;
if (span.getTags() != null) {
for (Tag tag : span.getTags()) {
if (IGNORE_TAGS.contains(tag.getKey()) || (tag.vType == TagType.STRING && StringUtils.isBlank(tag.getVStr()))) {
continue;
}
Annotation annotation = tagToAnnotation(tag);
if (annotation != null) {
switch(annotation.getKey()) {
case APPLICATION_TAG_KEY:
applicationName = annotation.getValue();
continue;
case CLUSTER_TAG_KEY:
cluster = annotation.getValue();
continue;
case SHARD_TAG_KEY:
shard = annotation.getValue();
continue;
case SOURCE_KEY:
// Do not add source to annotation span tag list.
sourceName = annotation.getValue();
continue;
case SERVICE_TAG_KEY:
// Do not use service tag from annotations, use field instead
continue;
case COMPONENT_TAG_KEY:
componentTagValue = annotation.getValue();
break;
case ERROR_TAG_KEY:
// only error=true is supported
isError = annotation.getValue().equals(ERROR_SPAN_TAG_VAL);
break;
}
annotations.add(annotation);
}
}
}
// Add all wavefront indexed tags. These are set based on below hierarchy.
// Span Level > Process Level > Proxy Level > Default
annotations.add(new Annotation(APPLICATION_TAG_KEY, applicationName));
annotations.add(new Annotation(CLUSTER_TAG_KEY, cluster));
annotations.add(new Annotation(SHARD_TAG_KEY, shard));
if (span.getReferences() != null) {
for (SpanRef reference : span.getReferences()) {
switch(reference.refType) {
case CHILD_OF:
if (reference.getSpanId() != 0 && reference.getSpanId() != parentSpanId) {
annotations.add(new Annotation(TraceConstants.PARENT_KEY, new UUID(0, reference.getSpanId()).toString()));
}
case FOLLOWS_FROM:
if (reference.getSpanId() != 0) {
annotations.add(new Annotation(TraceConstants.FOLLOWS_FROM_KEY, new UUID(0, reference.getSpanId()).toString()));
}
default:
}
}
}
if (!spanLogsDisabled.get() && span.getLogs() != null && !span.getLogs().isEmpty()) {
annotations.add(new Annotation("_spanLogs", "true"));
}
Span wavefrontSpan = Span.newBuilder().setCustomer("dummy").setName(span.getOperationName()).setSource(sourceName).setSpanId(new UUID(0, span.getSpanId()).toString()).setTraceId(traceId).setStartMillis(span.getStartTime() / 1000).setDuration(span.getDuration() / 1000).setAnnotations(annotations).build();
// Log Jaeger spans as well as Wavefront spans for debugging purposes.
if (JAEGER_DATA_LOGGER.isLoggable(Level.FINEST)) {
JAEGER_DATA_LOGGER.info("Inbound Jaeger span: " + span.toString());
JAEGER_DATA_LOGGER.info("Converted Wavefront span: " + wavefrontSpan.toString());
}
if (preprocessorSupplier != null) {
ReportableEntityPreprocessor preprocessor = preprocessorSupplier.get();
String[] messageHolder = new String[1];
preprocessor.forSpan().transform(wavefrontSpan);
if (!preprocessor.forSpan().filter(wavefrontSpan, messageHolder)) {
if (messageHolder[0] != null) {
spanHandler.reject(wavefrontSpan, messageHolder[0]);
} else {
spanHandler.block(wavefrontSpan);
}
return;
}
}
if (sampler.sample(wavefrontSpan, discardedSpansBySampler)) {
spanHandler.report(wavefrontSpan);
if (span.getLogs() != null && !span.getLogs().isEmpty() && !isFeatureDisabled(spanLogsDisabled, SPANLOGS_DISABLED, null)) {
SpanLogs spanLogs = SpanLogs.newBuilder().setCustomer("default").setTraceId(wavefrontSpan.getTraceId()).setSpanId(wavefrontSpan.getSpanId()).setLogs(span.getLogs().stream().map(x -> {
Map<String, String> fields = new HashMap<>(x.fields.size());
x.fields.forEach(t -> {
switch(t.vType) {
case STRING:
fields.put(t.getKey(), t.getVStr());
break;
case BOOL:
fields.put(t.getKey(), String.valueOf(t.isVBool()));
break;
case LONG:
fields.put(t.getKey(), String.valueOf(t.getVLong()));
break;
case DOUBLE:
fields.put(t.getKey(), String.valueOf(t.getVDouble()));
break;
case BINARY:
// ignore
default:
}
});
return SpanLog.newBuilder().setTimestamp(x.timestamp).setFields(fields).build();
}).collect(Collectors.toList())).build();
spanLogsHandler.report(spanLogs);
}
}
// report stats irrespective of span sampling.
if (wfInternalReporter != null) {
// Set post preprocessor rule values and report converted metrics/histograms from the span
List<Annotation> processedAnnotations = wavefrontSpan.getAnnotations();
for (Annotation processedAnnotation : processedAnnotations) {
switch(processedAnnotation.getKey()) {
case APPLICATION_TAG_KEY:
applicationName = processedAnnotation.getValue();
continue;
case SERVICE_TAG_KEY:
serviceName = processedAnnotation.getValue();
continue;
case CLUSTER_TAG_KEY:
cluster = processedAnnotation.getValue();
continue;
case SHARD_TAG_KEY:
shard = processedAnnotation.getValue();
continue;
case COMPONENT_TAG_KEY:
componentTagValue = processedAnnotation.getValue();
continue;
case ERROR_TAG_KEY:
isError = processedAnnotation.getValue().equals(ERROR_SPAN_TAG_VAL);
continue;
}
}
List<Pair<String, String>> spanTags = processedAnnotations.stream().map(a -> new Pair<>(a.getKey(), a.getValue())).collect(Collectors.toList());
// TODO: Modify to use new method from wavefront internal reporter.
discoveredHeartbeatMetrics.add(reportWavefrontGeneratedData(wfInternalReporter, wavefrontSpan.getName(), applicationName, serviceName, cluster, shard, wavefrontSpan.getSource(), componentTagValue, isError, span.getDuration(), traceDerivedCustomTagKeys, spanTags, true));
}
}
use of io.jaegertracing.thriftjava.Tag in project java by wavefrontHQ.
the class JaegerTChannelCollectorHandlerTest method testJaegerDebugOverride.
@Test
public void testJaegerDebugOverride() throws Exception {
reset(mockTraceHandler, mockTraceLogsHandler);
Span expectedSpan1 = Span.newBuilder().setCustomer("dummy").setStartMillis(startTime).setDuration(9).setName("HTTP GET /").setSource(DEFAULT_SOURCE).setSpanId("00000000-0000-0000-0000-00000023cace").setTraceId("00000000-4996-02d2-0000-011f71fb04cb").setAnnotations(ImmutableList.of(new Annotation("ip", "10.0.0.1"), new Annotation("jaegerSpanId", "23cace"), new Annotation("jaegerTraceId", "499602d20000011f71fb04cb"), new Annotation("service", "frontend"), new Annotation("parent", "00000000-0000-0000-0000-00000012d687"), new Annotation("debug", "true"), new Annotation("application", "Jaeger"), new Annotation("cluster", "none"), new Annotation("shard", "none"), new Annotation("_spanLogs", "true"))).build();
mockTraceHandler.report(expectedSpan1);
expectLastCall();
mockTraceLogsHandler.report(SpanLogs.newBuilder().setCustomer("default").setSpanId("00000000-0000-0000-0000-00000023cace").setTraceId("00000000-4996-02d2-0000-011f71fb04cb").setLogs(ImmutableList.of(SpanLog.newBuilder().setTimestamp(startTime * 1000).setFields(ImmutableMap.of("event", "error", "exception", "NullPointerException")).build())).build());
expectLastCall();
Span expectedSpan2 = Span.newBuilder().setCustomer("dummy").setStartMillis(startTime).setDuration(4).setName("HTTP GET").setSource(DEFAULT_SOURCE).setSpanId("00000000-0000-0000-0000-00000012d687").setTraceId("00000000-4996-02d2-0000-011f71fb04cb").setAnnotations(ImmutableList.of(new Annotation("ip", "10.0.0.1"), new Annotation("jaegerSpanId", "12d687"), new Annotation("jaegerTraceId", "499602d20000011f71fb04cb"), new Annotation("service", "frontend"), new Annotation("sampling.priority", "0.3"), new Annotation("application", "Jaeger"), new Annotation("cluster", "none"), new Annotation("shard", "none"), new Annotation("_spanLogs", "true"), new Annotation("_sampledByPolicy", "test"))).build();
mockTraceHandler.report(expectedSpan2);
expectLastCall();
mockTraceLogsHandler.report(SpanLogs.newBuilder().setCustomer("default").setSpanId("00000000-0000-0000-0000-00000012d687").setTraceId("00000000-4996-02d2-0000-011f71fb04cb").setLogs(ImmutableList.of(SpanLog.newBuilder().setTimestamp(startTime * 1000).setFields(ImmutableMap.of("event", "error", "exception", "NullPointerException")).build())).build());
expectLastCall();
replay(mockTraceHandler, mockTraceLogsHandler);
JaegerTChannelCollectorHandler handler = new JaegerTChannelCollectorHandler("9876", mockTraceHandler, mockTraceLogsHandler, null, () -> false, () -> false, null, new SpanSampler(new DurationSampler(10), () -> ImmutableList.of(new SpanSamplingPolicy("test", "{{sampling.priority}}='0.3'", 100))), null, null);
Tag ipTag = new Tag("ip", TagType.STRING);
ipTag.setVStr("10.0.0.1");
Tag debugTag = new Tag("debug", TagType.STRING);
debugTag.setVStr("true");
io.jaegertracing.thriftjava.Span span1 = new io.jaegertracing.thriftjava.Span(1234567890123L, 1234567890L, 2345678L, 1234567L, "HTTP GET /", 1, startTime * 1000, 9 * 1000);
span1.setTags(ImmutableList.of(debugTag));
Tag samplePriorityTag = new Tag("sampling.priority", TagType.DOUBLE);
samplePriorityTag.setVDouble(0.3);
io.jaegertracing.thriftjava.Span span2 = new io.jaegertracing.thriftjava.Span(1234567890123L, 1234567890L, 1234567L, 0L, "HTTP GET", 1, startTime * 1000, 4 * 1000);
span2.setTags(ImmutableList.of(samplePriorityTag));
Tag tag1 = new Tag("event", TagType.STRING);
tag1.setVStr("error");
Tag tag2 = new Tag("exception", TagType.STRING);
tag2.setVStr("NullPointerException");
span1.setLogs(ImmutableList.of(new Log(startTime * 1000, ImmutableList.of(tag1, tag2))));
span2.setLogs(ImmutableList.of(new Log(startTime * 1000, ImmutableList.of(tag1, tag2))));
Batch testBatch = new Batch();
testBatch.process = new Process();
testBatch.process.serviceName = "frontend";
testBatch.process.setTags(ImmutableList.of(ipTag));
testBatch.setSpans(ImmutableList.of(span1, span2));
Collector.submitBatches_args batches = new Collector.submitBatches_args();
batches.addToBatches(testBatch);
ThriftRequest<Collector.submitBatches_args> request = new ThriftRequest.Builder<Collector.submitBatches_args>("jaeger-collector", "Collector::submitBatches").setBody(batches).build();
handler.handleImpl(request);
verify(mockTraceHandler, mockTraceLogsHandler);
}
Aggregations