public <T> Span start(TraceContext.ChildContextCreator<T> childContextCreator, T parentContext, long epochMicros, boolean dropped) { onStart(); childContextCreator.asChildOf(traceContext, parentContext); if (dropped) { traceContext.setRecorded(false); } if (epochMicros >= 0) { timestamp = epochMicros; } else { timestamp = getTraceContext().getClock().getEpochMicros(); } if (logger.isDebugEnabled()) { logger.debug("startSpan {} {", this); if (logger.isTraceEnabled()) { logger.trace("starting span at", new RuntimeException("this exception is just used to record where the span has been started from")); } } return this; }
@Test void testSpanTypeSerialization() throws IOException { Span span = new Span(mock(ElasticApmTracer.class)); span.getTraceContext().asRootSpan(ConstantSampler.of(true)); span.withType("template.jsf.render.view"); JsonNode spanJson = objectMapper.readTree(serializer.toJsonString(span)); assertThat(spanJson.get("type").textValue()).isEqualTo("template_jsf_render_view"); span.withType("template").withSubtype("jsf.lifecycle").withAction("render.view"); spanJson = objectMapper.readTree(serializer.toJsonString(span)); assertThat(spanJson.get("type").textValue()).isEqualTo("template.jsf_lifecycle.render_view"); span = new Span(mock(ElasticApmTracer.class)); span.getTraceContext().asRootSpan(ConstantSampler.of(true)); span.withType("template").withAction("jsf.render"); spanJson = objectMapper.readTree(serializer.toJsonString(span)); assertThat(spanJson.get("type").textValue()).isEqualTo("template..jsf_render"); span = new Span(mock(ElasticApmTracer.class)); span.getTraceContext().asRootSpan(ConstantSampler.of(true)); span.withType("template").withSubtype("jsf.render"); spanJson = objectMapper.readTree(serializer.toJsonString(span)); assertThat(spanJson.get("type").textValue()).isEqualTo("template.jsf_render"); span = new Span(mock(ElasticApmTracer.class)); span.getTraceContext().asRootSpan(ConstantSampler.of(true)); span.withSubtype("jsf").withAction("render"); spanJson = objectMapper.readTree(serializer.toJsonString(span)); assertThat(spanJson.get("type").isNull()).isTrue(); System.out.println(spanJson); }
private void serializeSpan(final Span span) { jw.writeByte(OBJECT_START); writeField("name", span.getName()); writeTimestamp(span.getTimestamp()); serializeTraceContext(span.getTraceContext(), true); writeField("duration", span.getDuration()); if (span.getStacktrace() != null) { serializeStacktrace(span.getStacktrace().getStackTrace()); } if (span.getContext().hasContent()) { serializeSpanContext(span.getContext()); } serializeSpanType(span); jw.writeByte(OBJECT_END); }