/** * Converts AppEngine {@code CloudTraceContext} to {@code SpanContext}. * * @param cloudTraceContext the AppEngine {@code CloudTraceContext}. * @return the converted {@code SpanContext}. * @since 0.14 */ public static SpanContext fromCloudTraceContext(CloudTraceContext cloudTraceContext) { checkNotNull(cloudTraceContext, "cloudTraceContext"); try { // Extract the trace ID from the binary protobuf CloudTraceContext#traceId. TraceIdProto traceIdProto = TraceIdProto.parseFrom(cloudTraceContext.getTraceId()); ByteBuffer traceIdBuf = ByteBuffer.allocate(TraceId.SIZE); traceIdBuf.putLong(traceIdProto.getHi()); traceIdBuf.putLong(traceIdProto.getLo()); ByteBuffer spanIdBuf = ByteBuffer.allocate(SpanId.SIZE); spanIdBuf.putLong(cloudTraceContext.getSpanId()); return SpanContext.create( TraceId.fromBytes(traceIdBuf.array()), SpanId.fromBytes(spanIdBuf.array()), TraceOptions.builder().setIsSampled(cloudTraceContext.isTraceEnabled()).build(), TRACESTATE_DEFAULT); } catch (com.google.protobuf.InvalidProtocolBufferException e) { throw new RuntimeException(e); } }
@Test public void traceOptions_ToString() { assertThat(TraceOptions.DEFAULT.toString()).contains("sampled=false"); assertThat(TraceOptions.builder().setIsSampled(true).build().toString()) .contains("sampled=true"); } }
@Test public void isSampled() { assertThat(TraceOptions.DEFAULT.isSampled()).isFalse(); assertThat(TraceOptions.builder().setIsSampled(true).build().isSampled()).isTrue(); }
@Test public void preserveOtherKeyValuePairs() { String log = logWithSpanAndLog4jConfiguration( "%X{traceId} %X{myTestKey} %-5level - %msg", SpanContext.create( TraceId.fromLowerBase16("c95329bb6b7de41afbc51a231c128f97"), SpanId.fromLowerBase16("bf22ea74d38eddad"), TraceOptions.builder().setIsSampled(true).build(), EMPTY_TRACESTATE), new Function<Logger, Void>() { @Override public Void apply(Logger logger) { String key = "myTestKey"; ThreadContext.put(key, "myTestValue"); try { logger.error("message #4"); } finally { ThreadContext.remove(key); } return null; } }); assertThat(log).isEqualTo("c95329bb6b7de41afbc51a231c128f97 myTestValue ERROR - message #4"); }
@Test public void overwriteExistingTracingKey() { String log = logWithSpanAndLog4jConfiguration( TEST_PATTERN, SpanContext.create( TraceId.fromLowerBase16("18e4ae44273a0c44e0c9ea4380792c66"), SpanId.fromLowerBase16("199a7e16daa000a7"), TraceOptions.builder().setIsSampled(true).build(), EMPTY_TRACESTATE), new Function<Logger, Void>() { @Override public Void apply(Logger logger) { ThreadContext.put( OpenCensusTraceContextDataInjector.TRACE_ID_CONTEXT_KEY, "existingTraceId"); try { logger.error("message #5"); } finally { ThreadContext.remove(OpenCensusTraceContextDataInjector.TRACE_ID_CONTEXT_KEY); } return null; } }); assertThat(log) .isEqualTo( "traceId=18e4ae44273a0c44e0c9ea4380792c66 spanId=199a7e16daa000a7 " + "sampled=true ERROR - message #5"); } }
@Test public void spanContext_EqualsAndHashCode() { EqualsTester tester = new EqualsTester(); tester.addEqualityGroup( first, SpanContext.create( TraceId.fromBytes(firstTraceIdBytes), SpanId.fromBytes(firstSpanIdBytes), TraceOptions.DEFAULT), SpanContext.create( TraceId.fromBytes(firstTraceIdBytes), SpanId.fromBytes(firstSpanIdBytes), TraceOptions.builder().setIsSampled(false).build(), firstTracestate)); tester.addEqualityGroup( second, SpanContext.create( TraceId.fromBytes(secondTraceIdBytes), SpanId.fromBytes(secondSpanIdBytes), TraceOptions.builder().setIsSampled(true).build(), secondTracestate)); tester.testEquals(); }
@Test public void addNonSampledSpanToLogEntryWithAllSpans() { String log = logWithSpanAndLog4jConfiguration( TEST_PATTERN, SpanContext.create( TraceId.fromLowerBase16("cd7061dfa9d312cdcc42edab3feab51b"), SpanId.fromLowerBase16("117d42d4c7acd066"), TraceOptions.builder().setIsSampled(false).build(), EMPTY_TRACESTATE), new Function<Logger, Void>() { @Override public Void apply(Logger logger) { logger.info("message #2"); return null; } }); assertThat(log) .isEqualTo( "traceId=cd7061dfa9d312cdcc42edab3feab51b spanId=117d42d4c7acd066 sampled=false INFO " + "- message #2"); }
private static List<Link> sampleLinks() { return Lists.newArrayList( Link.fromSpanContext( SpanContext.create( TraceId.fromBytes( new byte[] {FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, 0}), SpanId.fromBytes(new byte[] {0, 0, 0, 0, 0, 0, 2, 0}), TraceOptions.builder().setIsSampled(false).build(), Tracestate.builder().build()), Link.Type.CHILD_LINKED_SPAN, ImmutableMap.of( "Bool", AttributeValue.booleanAttributeValue(true), "Long", AttributeValue.longAttributeValue(299792458L), "String", AttributeValue.stringAttributeValue( "Man is condemned to be free; because once thrown into the world, " + "he is responsible for everything he does. -- Sartre")))); } }
@Test public void addSampledSpanToLogEntryWithAllSpans() { String log = logWithSpanAndLog4jConfiguration( TEST_PATTERN, SpanContext.create( TraceId.fromLowerBase16("b9718fe3d82d36fce0e6a1ada1c21db0"), SpanId.fromLowerBase16("75159dde8c503fee"), TraceOptions.builder().setIsSampled(true).build(), EMPTY_TRACESTATE), new Function<Logger, Void>() { @Override public Void apply(Logger logger) { logger.warn("message #1"); return null; } }); assertThat(log) .isEqualTo( "traceId=b9718fe3d82d36fce0e6a1ada1c21db0 spanId=75159dde8c503fee " + "sampled=true WARN - message #1"); }
@Test public void enhanceLogEntry_AddSampledSpanToLogEntry() { LogEntry logEntry = getEnhancedLogEntry( new OpenCensusTraceLoggingEnhancer("my-test-project-3"), new TestSpan( SpanContext.create( TraceId.fromLowerBase16("4c6af40c499951eb7de2777ba1e4fefa"), SpanId.fromLowerBase16("de52e84d13dd232d"), TraceOptions.builder().setIsSampled(true).build(), EMPTY_TRACESTATE))); assertTrue(logEntry.getTraceSampled()); assertThat(logEntry.getTrace()) .isEqualTo("projects/my-test-project-3/traces/4c6af40c499951eb7de2777ba1e4fefa"); assertThat(logEntry.getSpanId()).isEqualTo("de52e84d13dd232d"); }
@Test public void enhanceLogEntry_AddNonSampledSpanToLogEntry() { LogEntry logEntry = getEnhancedLogEntry( new OpenCensusTraceLoggingEnhancer("my-test-project-6"), new TestSpan( SpanContext.create( TraceId.fromLowerBase16("72c905c76f99e99974afd84dc053a480"), SpanId.fromLowerBase16("731e102335b7a5a0"), TraceOptions.builder().setIsSampled(false).build(), EMPTY_TRACESTATE))); assertFalse(logEntry.getTraceSampled()); assertThat(logEntry.getTrace()) .isEqualTo("projects/my-test-project-6/traces/72c905c76f99e99974afd84dc053a480"); assertThat(logEntry.getSpanId()).isEqualTo("731e102335b7a5a0"); }
@Before public void setUp() { random = new Random(1234); spanContext = SpanContext.create( TraceId.generateRandomId(random), SpanId.generateRandomId(random), TraceOptions.builder().setIsSampled(true).build()); notSampledSpanContext = SpanContext.create( TraceId.generateRandomId(random), SpanId.generateRandomId(random), TraceOptions.DEFAULT); spanOptions = EnumSet.of(Span.Options.RECORD_EVENTS); }
@Test public void enhanceLogEntry_ConvertNullProjectIdToEmptyString() { LogEntry logEntry = getEnhancedLogEntry( new OpenCensusTraceLoggingEnhancer(null), new TestSpan( SpanContext.create( TraceId.fromLowerBase16("bfb4248a24325a905873a1d43001d9a0"), SpanId.fromLowerBase16("6f23f9afd448e272"), TraceOptions.builder().setIsSampled(true).build(), EMPTY_TRACESTATE))); assertThat(logEntry.getTrace()).isEqualTo("projects//traces/bfb4248a24325a905873a1d43001d9a0"); }
@Test public void propagate_SpanContextTracingEnabled() throws SpanContextParseException { testSpanContextConversion( SpanContext.create(TRACE_ID, SPAN_ID, TraceOptions.builder().setIsSampled(true).build())); }
@Test public void getTraceOptions() { assertThat(first.getTraceOptions()).isEqualTo(TraceOptions.DEFAULT); assertThat(second.getTraceOptions()) .isEqualTo(TraceOptions.builder().setIsSampled(true).build()); }
@Test public void getOptions() { assertThat(TraceOptions.DEFAULT.getOptions()).isEqualTo(0); assertThat(TraceOptions.builder().setIsSampled(false).build().getOptions()).isEqualTo(0); assertThat(TraceOptions.builder().setIsSampled(true).build().getOptions()).isEqualTo(1); assertThat(TraceOptions.builder().setIsSampled(true).setIsSampled(false).build().getOptions()) .isEqualTo(0); assertThat(TraceOptions.fromByte(FIRST_BYTE).getOptions()).isEqualTo(-1); assertThat(TraceOptions.fromByte(SECOND_BYTE).getOptions()).isEqualTo(1); assertThat(TraceOptions.fromByte(THIRD_BYTE).getOptions()).isEqualTo(6); }
@Test public void traceOptions_EqualsAndHashCode() { EqualsTester tester = new EqualsTester(); tester.addEqualityGroup(TraceOptions.DEFAULT); tester.addEqualityGroup( TraceOptions.fromByte(SECOND_BYTE), TraceOptions.builder().setIsSampled(true).build()); tester.addEqualityGroup(TraceOptions.fromByte(FIRST_BYTE)); tester.testEquals(); }
@Test public void builder_FromOptions() { assertThat( TraceOptions.builder(TraceOptions.fromByte(THIRD_BYTE)) .setIsSampled(true) .build() .getOptions()) .isEqualTo(6 | 1); }
@Test public void spanContext_ToString() { assertThat(first.toString()).contains(TraceId.fromBytes(firstTraceIdBytes).toString()); assertThat(first.toString()).contains(SpanId.fromBytes(firstSpanIdBytes).toString()); assertThat(first.toString()).contains(TraceOptions.DEFAULT.toString()); assertThat(second.toString()).contains(TraceId.fromBytes(secondTraceIdBytes).toString()); assertThat(second.toString()).contains(SpanId.fromBytes(secondSpanIdBytes).toString()); assertThat(second.toString()) .contains(TraceOptions.builder().setIsSampled(true).build().toString()); } }
private static SpanContext sampleSpanContext() { return SpanContext.create( TraceId.fromBytes(new byte[] {FF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}), SpanId.fromBytes(new byte[] {0, 0, 0, 0, 0, 0, 1, 0}), TraceOptions.builder().setIsSampled(true).build(), Tracestate.builder().build()); }