Map<String, AttributeValue> resourceLabels, Map<String, AttributeValue> fixedAttributes) { SpanContext context = spanData.getContext(); final String spanIdHex = context.getSpanId().toLowerBase16(); SpanName spanName = .setSpanId(spanIdHex) .setDisplayName( toTruncatableStringProto(toDisplayName(spanData.getName(), spanData.getKind()))) .setStartTime(toTimestampProto(spanData.getStartTimestamp())) .setAttributes( toAttributesProto(spanData.getAttributes(), resourceLabels, fixedAttributes)) .setTimeEvents( toTimeEventsProto(spanData.getAnnotations(), spanData.getMessageEvents())); io.opencensus.trace.Status status = spanData.getStatus(); if (status != null) { spanBuilder.setStatus(toStatusProto(status)); Timestamp end = spanData.getEndTimestamp(); if (end != null) { spanBuilder.setEndTime(toTimestampProto(end)); spanBuilder.setLinks(toLinksProto(spanData.getLinks())); Integer childSpanCount = spanData.getChildSpanCount(); if (childSpanCount != null) { spanBuilder.setChildSpanCount(Int32Value.newBuilder().setValue(childSpanCount).build()); if (spanData.getParentSpanId() != null && spanData.getParentSpanId().isValid()) { spanBuilder.setParentSpanId(spanData.getParentSpanId().toLowerBase16());
private static String toSpanType(SpanData spanData) { if (spanData.getKind() == Kind.SERVER || (spanData.getKind() == null && (spanData.getParentSpanId() == null || Boolean.TRUE.equals(spanData.getHasRemoteParent())))) { return "ENTRY"; } // This is a hack because the Span API did not have SpanKind. if (spanData.getKind() == Kind.CLIENT || (spanData.getKind() == null && spanData.getName().startsWith("Sent."))) { return "EXIT"; } return "INTERMEDIATE"; }
@javax.annotation.Nullable private static Span.Kind toSpanKind(SpanData spanData) { // This is a hack because the Span API did not have SpanKind. if (spanData.getKind() == Kind.SERVER || (spanData.getKind() == null && Boolean.TRUE.equals(spanData.getHasRemoteParent()))) { return Span.Kind.SERVER; } // This is a hack because the Span API did not have SpanKind. if (spanData.getKind() == Kind.CLIENT || spanData.getName().startsWith("Sent.")) { return Span.Kind.CLIENT; } return null; }
String convertToJson(Collection<SpanData> spanDataList) { final ArrayList<DatadogSpan> datadogSpans = new ArrayList<>(); for (SpanData sd : spanDataList) { SpanContext sc = sd.getContext(); final long startTime = timestampToNanos(sd.getStartTimestamp()); final Timestamp endTimestamp = Optional.ofNullable(sd.getEndTimestamp()).orElseGet(() -> Tracing.getClock().now()); final long endTime = timestampToNanos(endTimestamp); final long duration = endTime - startTime; Optional.ofNullable(sd.getParentSpanId()) .map(DatadogExporterHandler::convertSpanId) .orElse(null); final Map<String, AttributeValue> attributes = sd.getAttributes().getAttributeMap(); final Map<String, String> meta = attributes.isEmpty() ? new HashMap<>() : attributesToMeta(attributes); sc.getTraceId().getLowerLong(), convertSpanId(sc.getSpanId()), sd.getName(), resource, this.service, duration, parentId, errorCode(sd.getStatus()), meta); datadogSpans.add(span);
span.addLink(link); SpanData spanData = span.toSpanData(); assertThat(spanData.getContext()).isEqualTo(spanContext); assertThat(spanData.getName()).isEqualTo(SPAN_NAME); assertThat(spanData.getParentSpanId()).isEqualTo(parentSpanId); assertThat(spanData.getHasRemoteParent()).isTrue(); assertThat(spanData.getAttributes().getDroppedAttributesCount()).isEqualTo(0); assertThat(spanData.getAttributes().getAttributeMap()).isEqualTo(expectedAttributes); assertThat(spanData.getAnnotations().getDroppedEventsCount()).isEqualTo(0); assertThat(spanData.getAnnotations().getEvents().size()).isEqualTo(2); assertThat(spanData.getAnnotations().getEvents().get(0).getTimestamp()) .isEqualTo(timestamp.addNanos(100)); assertThat(spanData.getAnnotations().getEvents().get(0).getEvent()) .isEqualTo(Annotation.fromDescription(ANNOTATION_DESCRIPTION)); assertThat(spanData.getAnnotations().getEvents().get(1).getTimestamp()) .isEqualTo(timestamp.addNanos(200)); assertThat(spanData.getAnnotations().getEvents().get(1).getEvent()) .isEqualTo(Annotation.fromDescriptionAndAttributes(ANNOTATION_DESCRIPTION, attributes)); assertThat(spanData.getNetworkEvents().getDroppedEventsCount()).isEqualTo(0); assertThat(spanData.getNetworkEvents().getEvents().size()).isEqualTo(1); assertThat(spanData.getNetworkEvents().getEvents().get(0).getTimestamp()) .isEqualTo(timestamp.addNanos(300)); assertThat(spanData.getNetworkEvents().getEvents().get(0).getEvent()).isEqualTo(networkEvent); assertThat(spanData.getLinks().getDroppedLinksCount()).isEqualTo(0); assertThat(spanData.getLinks().getLinks().size()).isEqualTo(1); assertThat(spanData.getLinks().getLinks().get(0)).isEqualTo(link); assertThat(spanData.getStartTimestamp()).isEqualTo(timestamp); assertThat(spanData.getStatus()).isNull(); assertThat(spanData.getEndTimestamp()).isNull();
private Span spanDataToJaegerThriftSpan(final SpanData spanData) { final long startTimeInMicros = timestampToMicros(spanData.getStartTimestamp()); final long endTimeInMicros = timestampToMicros(spanData.getEndTimestamp()); final SpanContext context = spanData.getContext(); copyToBuffer(context.getTraceId()); return new com.uber.jaeger.thriftjava.Span( traceIdLow(), traceIdHigh(), spanIdToLong(context.getSpanId()), spanIdToLong(spanData.getParentSpanId()), spanData.getName(), optionsToFlags(context.getTraceOptions()), startTimeInMicros, endTimeInMicros - startTimeInMicros) .setReferences(linksToReferences(spanData.getLinks().getLinks())) .setTags( attributesToTags( spanData.getAttributes().getAttributeMap(), spanKindToTag(spanData.getKind()))) .setLogs( timedEventsToLogs( spanData.getAnnotations().getEvents(), spanData.getMessageEvents().getEvents())); }
@SuppressWarnings("deprecation") static Span generateSpan(SpanData spanData, Endpoint localEndpoint) { SpanContext context = spanData.getContext(); long startTimestamp = toEpochMicros(spanData.getStartTimestamp()); long endTimestamp = toEpochMicros(spanData.getEndTimestamp()); .id(context.getSpanId().toLowerBase16()) .kind(toSpanKind(spanData)) .name(spanData.getName()) .timestamp(toEpochMicros(spanData.getStartTimestamp())) .duration(endTimestamp - startTimestamp) .localEndpoint(localEndpoint); if (spanData.getParentSpanId() != null && spanData.getParentSpanId().isValid()) { spanBuilder.parentId(spanData.getParentSpanId().toLowerBase16()); spanData.getAttributes().getAttributeMap().entrySet()) { spanBuilder.putTag(label.getKey(), attributeValueToString(label.getValue())); Status status = spanData.getStatus(); if (status != null) { spanBuilder.putTag(STATUS_CODE, status.getCanonicalCode().toString()); for (TimedEvent<Annotation> annotation : spanData.getAnnotations().getEvents()) { spanBuilder.addAnnotation( toEpochMicros(annotation.getTimestamp()), annotation.getEvent().getDescription()); spanData.getMessageEvents().getEvents()) { spanBuilder.addAnnotation(
@SuppressWarnings("deprecation") private static void emitSingleSpan(Formatter formatter, SpanData span) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(TimeUnit.SECONDS.toMillis(span.getStartTimestamp().getSeconds())); long microsField = TimeUnit.NANOSECONDS.toMicros(span.getStartTimestamp().getNanos()); String elapsedSecondsStr = span.getEndTimestamp() != null ? String.format( "%13.6f", durationToNanos(span.getEndTimestamp().subtractTimestamp(span.getStartTimestamp())) * 1.0e-9) : String.format("%13s", " "); SpanContext spanContext = span.getContext(); formatter.format( "<b>%04d/%02d/%02d-%02d:%02d:%02d.%06d %s TraceId: <b style=\"color:%s;\">%s</b> " .lowerCase() .encode( span.getParentSpanId() == null ? SpanId.INVALID.getBytes() : span.getParentSpanId().getBytes())); Timestamp lastTimestampNanos = span.getStartTimestamp(); TimedEvents<Annotation> annotations = span.getAnnotations(); TimedEvents<io.opencensus.trace.NetworkEvent> networkEvents = span.getNetworkEvents(); List<TimedEvent<?>> timedEvents = new ArrayList<TimedEvent<?>>(annotations.getEvents()); timedEvents.addAll(networkEvents.getEvents()); Status status = span.getStatus();
span.addLink(Link.fromSpanContext(spanContext, Link.Type.CHILD_LINKED_SPAN)); SpanData spanData = span.toSpanData(); assertThat(spanData.getStartTimestamp()).isEqualTo(timestamp); assertThat(spanData.getAttributes().getAttributeMap()).isEmpty(); assertThat(spanData.getAnnotations().getEvents()).isEmpty(); assertThat(spanData.getNetworkEvents().getEvents()).isEmpty(); assertThat(spanData.getLinks().getLinks()).isEmpty(); assertThat(spanData.getStatus()).isEqualTo(Status.OK); assertThat(spanData.getEndTimestamp()).isEqualTo(timestamp);
@Test public void generateSpan_WithResourceLabels() { SpanData spanData = SpanData.create( spanContext, parentSpanId, /* hasRemoteParent= */ true, SPAN_NAME, null, startTimestamp, attributes, annotations, messageEvents, links, CHILD_SPAN_COUNT, status, endTimestamp); Span span = handler.generateSpan( spanData, AWS_RESOURCE_LABELS, Collections.<String, AttributeValue>emptyMap()); Map<String, AttributeValue> attributeMap = span.getAttributes().getAttributeMapMap(); assertThat(attributeMap.entrySet()).containsAllIn(AWS_RESOURCE_LABELS.entrySet()); }
@Test public void startSpanNullParent() { RecordEventsSpanImpl span = (RecordEventsSpanImpl) SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) .setRecordEvents(true) .startSpan(); assertThat(span.getContext().isValid()).isTrue(); assertThat(span.getOptions().contains(Options.RECORD_EVENTS)).isTrue(); assertThat(span.getContext().getTraceOptions().isSampled()).isTrue(); SpanData spanData = span.toSpanData(); assertThat(spanData.getParentSpanId()).isNull(); assertThat(spanData.getHasRemoteParent()).isNull(); assertThat(spanData.getStartTimestamp()).isEqualTo(testClock.now()); assertThat(spanData.getName()).isEqualTo(SPAN_NAME); }
@Test public void startRemoteSpanInvalidParent() { RecordEventsSpanImpl span = (RecordEventsSpanImpl) SpanBuilderImpl.createWithRemoteParent( SPAN_NAME, SpanContext.INVALID, spanBuilderOptions) .startSpan(); assertThat(span.getContext().isValid()).isTrue(); assertThat(span.getOptions().contains(Options.RECORD_EVENTS)).isTrue(); assertThat(span.getContext().getTraceOptions().isSampled()).isTrue(); SpanData spanData = span.toSpanData(); assertThat(spanData.getParentSpanId()).isNull(); assertThat(spanData.getHasRemoteParent()).isNull(); }
@Test public void sqlExecute() throws Exception { // When String sql = "select 1"; Sample sample = (Sample) context.getBean("sample"); sample.execute(sql); // Then List<SpanData> data = handler.waitForExport(1); assertThat(data).isNotNull(); assertThat(data.size()).isEqualTo(1); assertThat(data.get(0).getName()).isEqualTo("execute-4705ea0d"); // sql-{hash of sql statement} List<SpanData.TimedEvent<Annotation>> events = data.get(0).getAnnotations().getEvents(); assertThat(events.size()).isEqualTo(1); assertThat(events.get(0).getEvent().getDescription()).isEqualTo(sql); }
@Test public void handlesException() { // When Sample sample = (Sample) context.getBean("sample"); try { sample.boom(); } catch (Exception ignored) { // ok } // Then List<SpanData> spanList = handler.waitForExport(1); assertThat(spanList).isNotNull(); assertThat(spanList.size()).isEqualTo(1); SpanData spanData = spanList.get(0); assertThat(spanData.getName()).isEqualTo("boom"); assertThat(spanData.getStatus()).isEqualTo(Status.UNKNOWN); SpanData.TimedEvents<Annotation> annotations = spanData.getAnnotations(); assertThat(annotations).isNotNull(); List<SpanData.TimedEvent<Annotation>> events = annotations.getEvents(); assertThat(events.size()).isEqualTo(1); assertThat(events.get(0).getEvent().getDescription()).isEqualTo("error"); }
private static String toSpanName(SpanData spanData) { return spanData.getName(); }
assertThat(spanData.getAttributes().getDroppedAttributesCount()) .isEqualTo(maxNumberOfAttributes); assertThat(spanData.getAttributes().getAttributeMap().size()).isEqualTo(maxNumberOfAttributes); for (int i = 0; i < maxNumberOfAttributes; i++) { assertThat( spanData .getAttributes() .getAttributeMap() .get("MyStringAttributeKey" + (i + maxNumberOfAttributes))) assertThat(spanData.getAttributes().getDroppedAttributesCount()) .isEqualTo(maxNumberOfAttributes); assertThat(spanData.getAttributes().getAttributeMap().size()).isEqualTo(maxNumberOfAttributes); for (int i = 0; i < maxNumberOfAttributes; i++) { assertThat( spanData .getAttributes() .getAttributeMap() .get("MyStringAttributeKey" + (i + maxNumberOfAttributes)))
@Override public int compare(SpanData o1, SpanData o2) { return incremental ? o1.getStartTimestamp().compareTo(o2.getStartTimestamp()) : o2.getStartTimestamp().compareTo(o1.getStartTimestamp()); } }
/** Emits the list of SampledRequets with a header. */ private static void emitSpans(PrintWriter out, Formatter formatter, Collection<SpanData> spans) { out.write("<pre>\n"); formatter.format("%-23s %18s%n", "When", "Elapsed(s)"); out.write("-------------------------------------------\n"); for (SpanData span : spans) { tracer .getCurrentSpan() .addAnnotation( "Render span.", ImmutableMap.<String, AttributeValue>builder() .put( "SpanId", AttributeValue.stringAttributeValue( BaseEncoding.base16() .lowerCase() .encode(span.getContext().getSpanId().getBytes()))) .build()); emitSingleSpan(formatter, span); } out.write("</pre>\n"); }
@Test public void setSpanKind_DefaultNull() { RecordEventsSpanImpl span = (RecordEventsSpanImpl) SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) .setRecordEvents(true) .startSpan(); assertThat(span.getKind()).isNull(); assertThat(span.toSpanData().getKind()).isNull(); }