use of io.opencensus.trace.SpanId in project ignite by apache.
the class OpenCensusSqlNativeTracingTest method testSelectQueryUserThreadSpanNotAffected.
/**
* Tests that tracing of multiple SELECT queries produces separate span tree for each query and does not affect
* user thread {@link MTC#span()} value during execution and after it.
*/
@Test
public void testSelectQueryUserThreadSpanNotAffected() throws Exception {
String prsnTable = createTableAndPopulate(Person.class, PARTITIONED, 1);
String orgTable = createTableAndPopulate(Organization.class, PARTITIONED, 1);
try (FieldsQueryCursor<List<?>> prsnQryCursor = reducer().context().query().querySqlFields(new SqlFieldsQuery("SELECT * FROM " + prsnTable), false);
FieldsQueryCursor<List<?>> orgQryCursor = reducer().context().query().querySqlFields(new SqlFieldsQuery("SELECT * FROM " + orgTable), false)) {
Iterator<List<?>> prsnQryIter = prsnQryCursor.iterator();
Iterator<List<?>> orgQryIter = orgQryCursor.iterator();
while (prsnQryIter.hasNext() && orgQryIter.hasNext()) {
assertEquals(NoopSpan.INSTANCE, MTC.span());
prsnQryIter.next();
assertEquals(NoopSpan.INSTANCE, MTC.span());
orgQryIter.next();
assertEquals(NoopSpan.INSTANCE, MTC.span());
}
}
assertEquals(NoopSpan.INSTANCE, MTC.span());
handler().flush();
checkDroppedSpans();
List<SpanId> rootSpans = findRootSpans(SQL_QRY);
assertEquals(2, rootSpans.size());
for (SpanId rootSpan : rootSpans) checkBasicSelectQuerySpanTree(rootSpan, TEST_TABLE_POPULATION);
}
use of io.opencensus.trace.SpanId in project instrumentation-java by census-instrumentation.
the class CloudTraceFormat method extract.
@Override
public <C> /*>>> extends @NonNull Object*/
SpanContext extract(C carrier, Getter<C> getter) throws SpanContextParseException {
checkNotNull(carrier, "carrier");
checkNotNull(getter, "getter");
try {
String headerStr = getter.get(carrier, HEADER_NAME);
if (headerStr == null || headerStr.length() < MIN_HEADER_SIZE) {
throw new SpanContextParseException("Missing or too short header: " + HEADER_NAME);
}
checkArgument(headerStr.charAt(TRACE_ID_SIZE) == SPAN_ID_DELIMITER, "Invalid TRACE_ID size");
TraceId traceId = TraceId.fromLowerBase16(headerStr.subSequence(0, TRACE_ID_SIZE));
int traceOptionsPos = headerStr.indexOf(TRACE_OPTION_DELIMITER, TRACE_ID_SIZE);
CharSequence spanIdStr = headerStr.subSequence(SPAN_ID_START_POS, traceOptionsPos < 0 ? headerStr.length() : traceOptionsPos);
SpanId spanId = longToSpanId(UnsignedLongs.parseUnsignedLong(spanIdStr.toString(), 10));
TraceOptions traceOptions = OPTIONS_NOT_SAMPLED;
if (traceOptionsPos > 0) {
String traceOptionsStr = headerStr.substring(traceOptionsPos + TRACE_OPTION_DELIMITER_SIZE);
if ((UnsignedInts.parseUnsignedInt(traceOptionsStr, 10) & CLOUD_TRACE_IS_SAMPLED) != 0) {
traceOptions = OPTIONS_SAMPLED;
}
}
return SpanContext.create(traceId, spanId, traceOptions, TRACESTATE_DEFAULT);
} catch (IllegalArgumentException e) {
throw new SpanContextParseException("Invalid input", e);
}
}
use of io.opencensus.trace.SpanId in project instrumentation-java by census-instrumentation.
the class CloudTraceFormatTest method parseWithShortSpanIdAndSamplingShouldSucceed.
@Test
public void parseWithShortSpanIdAndSamplingShouldSucceed() throws SpanContextParseException {
final String spanId = "1";
ByteBuffer buffer = ByteBuffer.allocate(SpanId.SIZE);
buffer.putLong(Long.parseLong(spanId));
SpanId expectedSpanId = SpanId.fromBytes(buffer.array());
parseSuccess(constructHeader(TRACE_ID_BASE16, spanId, SAMPLED), SpanContext.create(TRACE_ID, expectedSpanId, TRACE_OPTIONS_SAMPLED));
}
use of io.opencensus.trace.SpanId in project instrumentation-java by census-instrumentation.
the class SpanBuilderImpl method startSpanInternal.
private Span startSpanInternal(@Nullable SpanContext parentContext, @Nullable Boolean hasRemoteParent, String name, @Nullable Sampler sampler, List<Span> parentLinks, @Nullable Boolean recordEvents, @Nullable Kind kind, @Nullable Span parentSpan) {
TraceParams activeTraceParams = options.traceConfig.getActiveTraceParams();
Random random = options.randomHandler.current();
TraceId traceId;
SpanId spanId = SpanId.generateRandomId(random);
SpanId parentSpanId = null;
// TODO(bdrutu): Handle tracestate correctly not just propagate.
Tracestate tracestate = TRACESTATE_DEFAULT;
if (parentContext == null || !parentContext.isValid()) {
// New root span.
traceId = TraceId.generateRandomId(random);
// This is a root span so no remote or local parent.
hasRemoteParent = null;
} else {
// New child span.
traceId = parentContext.getTraceId();
parentSpanId = parentContext.getSpanId();
tracestate = parentContext.getTracestate();
}
TraceOptions traceOptions = makeSamplingDecision(parentContext, hasRemoteParent, name, sampler, parentLinks, traceId, spanId, activeTraceParams) ? SAMPLED_TRACE_OPTIONS : NOT_SAMPLED_TRACE_OPTIONS;
if (traceOptions.isSampled() || Boolean.TRUE.equals(recordEvents)) {
// Pass the timestamp converter from the parent to ensure that the recorded events are in
// the right order. Implementation uses System.nanoTime() which is monotonically increasing.
TimestampConverter timestampConverter = null;
if (parentSpan instanceof RecordEventsSpanImpl) {
RecordEventsSpanImpl parentRecordEventsSpan = (RecordEventsSpanImpl) parentSpan;
timestampConverter = parentRecordEventsSpan.getTimestampConverter();
parentRecordEventsSpan.addChild();
}
Span span = RecordEventsSpanImpl.startSpan(SpanContext.create(traceId, spanId, traceOptions, tracestate), name, kind, parentSpanId, hasRemoteParent, activeTraceParams, options.startEndHandler, timestampConverter, options.clock);
linkSpans(span, parentLinks);
return span;
} else {
return NoRecordEventsSpanImpl.create(SpanContext.create(traceId, spanId, traceOptions, tracestate));
}
}
use of io.opencensus.trace.SpanId in project instrumentation-java by census-instrumentation.
the class B3Format method extract.
@Override
public <C> /*>>> extends @NonNull Object*/
SpanContext extract(C carrier, Getter<C> getter) throws SpanContextParseException {
checkNotNull(carrier, "carrier");
checkNotNull(getter, "getter");
try {
TraceId traceId;
String traceIdStr = getter.get(carrier, X_B3_TRACE_ID);
if (traceIdStr != null) {
if (traceIdStr.length() == TraceId.SIZE) {
// This is an 8-byte traceID.
traceIdStr = UPPER_TRACE_ID + traceIdStr;
}
traceId = TraceId.fromLowerBase16(traceIdStr);
} else {
throw new SpanContextParseException("Missing X_B3_TRACE_ID.");
}
SpanId spanId;
String spanIdStr = getter.get(carrier, X_B3_SPAN_ID);
if (spanIdStr != null) {
spanId = SpanId.fromLowerBase16(spanIdStr);
} else {
throw new SpanContextParseException("Missing X_B3_SPAN_ID.");
}
TraceOptions traceOptions = TraceOptions.DEFAULT;
if (SAMPLED_VALUE.equals(getter.get(carrier, X_B3_SAMPLED)) || FLAGS_VALUE.equals(getter.get(carrier, X_B3_FLAGS))) {
traceOptions = TraceOptions.builder().setIsSampled(true).build();
}
return SpanContext.create(traceId, spanId, traceOptions, TRACESTATE_DEFAULT);
} catch (IllegalArgumentException e) {
throw new SpanContextParseException("Invalid input.", e);
}
}
Aggregations