public Map<String, String> extract(Span span, TraceSpan.SpanKind kind, String instanceId) { Map<String, String> labels = new HashMap<>(); for (Map.Entry<String, String> tag : span.tags().entrySet()) { labels.put(label(tag.getKey()), tag.getValue()); } for (Log log : span.logs()) { labels.put(label(log.getEvent()), formatTimestamp(log.getTimestamp())); } if (span.tags().containsKey(Span.SPAN_PEER_SERVICE_TAG_NAME)) { labels.put("/component", span.tags().get(Span.SPAN_PEER_SERVICE_TAG_NAME)); } if (span.getParents() == null || span.getParents().isEmpty()) { labels.put("/agent", this.agentName); } if ((kind == TraceSpan.SpanKind.RPC_CLIENT || kind == TraceSpan.SpanKind.RPC_SERVER) && StringUtils.hasText(instanceId)) { if (StringUtils.hasText(instanceId)) { labels.put(label(Span.INSTANCEID), instanceId); } } return labels; }
/** * Adds tags from the sleuth Span */ private void addZipkinTags(zipkin2.Span.Builder zipkinSpan, Span span) { Endpoint.Builder remoteEndpoint = Endpoint.newBuilder(); boolean shouldAddRemote = false; // don't add redundant tags to the output for (Map.Entry<String, String> e : span.tags().entrySet()) { String key = e.getKey(); if (key.equals("peer.service")) { shouldAddRemote = true; remoteEndpoint.serviceName(e.getValue()); } else if (key.equals("peer.ipv4") || key.equals("peer.ipv6")) { shouldAddRemote = true; remoteEndpoint.ip(e.getValue()); } else if (key.equals("peer.port")) { shouldAddRemote = true; try { remoteEndpoint.port(Integer.parseInt(e.getValue())); } catch (NumberFormatException ignored) { } } else { zipkinSpan.putTag(e.getKey(), e.getValue()); } } if (shouldAddRemote) { zipkinSpan.remoteEndpoint(remoteEndpoint.build()); } }
protected void attachTraceInfo(Tracer tracer, Span span, final Request request) { if (span == null) { setHeader(request, Span.SAMPLED_NAME, Span.SPAN_NOT_SAMPLED); return; } setHeader(request, TraceRequestAttributes.HANDLED_SPAN_REQUEST_ATTR, "true"); setHeader(request, Span.SPAN_ID_NAME, Span.idToHex(span.getSpanId())); setHeader(request, Span.TRACE_ID_NAME, span.traceIdString()); setHeader(request, Span.SPAN_NAME_NAME, span.getName()); setHeader(request, Span.SAMPLED_NAME, span.isExportable() ? Span.SPAN_SAMPLED : Span.SPAN_NOT_SAMPLED); setHeader(request, Span.PARENT_ID_NAME,Span.idToHex(getParentId(span))); setHeader(request, Span.PROCESS_ID_NAME, span.getProcessId()); if(span.getSavedSpan()!=null && span.getSavedSpan().tags()!=null){ for (Entry<String, String> stringStringEntry : span.getSavedSpan().tags().entrySet()) { setHeader(request, stringStringEntry.getKey(), stringStringEntry.getValue()); } } /*spanInjector.inject(span,null); tracer.inject(span.context(), Format.Builtin.TEXT_MAP, new TextMap() { @Override public void put(String key, String value) { request.setAttachment(key, value); } @Override public Iterator<Entry<String, String>> iterator() { throw new UnsupportedOperationException("TextMapInjectAdapter should only be used with Tracer.inject()"); } });*/ }