Search in sources :

Example 1 with TraceId

use of io.opencensus.trace.TraceId in project instrumentation-java by census-instrumentation.

the class TraceProtoUtils method toSpanProto.

/**
 * Converts {@link SpanData} to {@link Span} proto.
 *
 * @param spanData the {@code SpanData}.
 * @return proto representation of {@code Span}.
 */
static Span toSpanProto(SpanData spanData) {
    SpanContext spanContext = spanData.getContext();
    TraceId traceId = spanContext.getTraceId();
    SpanId spanId = spanContext.getSpanId();
    Span.Builder spanBuilder = Span.newBuilder().setTraceId(toByteString(traceId.getBytes())).setSpanId(toByteString(spanId.getBytes())).setTracestate(toTracestateProto(spanContext.getTracestate())).setName(toTruncatableStringProto(spanData.getName())).setStartTime(toTimestampProto(spanData.getStartTimestamp())).setAttributes(toAttributesProto(spanData.getAttributes())).setTimeEvents(toTimeEventsProto(spanData.getAnnotations(), spanData.getMessageEvents())).setLinks(toLinksProto(spanData.getLinks()));
    Kind kind = spanData.getKind();
    if (kind != null) {
        spanBuilder.setKind(toSpanKindProto(kind));
    }
    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));
    }
    Integer childSpanCount = spanData.getChildSpanCount();
    if (childSpanCount != null) {
        spanBuilder.setChildSpanCount(UInt32Value.newBuilder().setValue(childSpanCount).build());
    }
    Boolean hasRemoteParent = spanData.getHasRemoteParent();
    if (hasRemoteParent != null) {
        spanBuilder.setSameProcessAsParentSpan(BoolValue.of(!hasRemoteParent));
    }
    SpanId parentSpanId = spanData.getParentSpanId();
    if (parentSpanId != null && parentSpanId.isValid()) {
        spanBuilder.setParentSpanId(toByteString(parentSpanId.getBytes()));
    }
    return spanBuilder.build();
}
Also used : SpanContext(io.opencensus.trace.SpanContext) SpanKind(io.opencensus.proto.trace.v1.Span.SpanKind) Kind(io.opencensus.trace.Span.Kind) TraceId(io.opencensus.trace.TraceId) Span(io.opencensus.proto.trace.v1.Span) Timestamp(io.opencensus.common.Timestamp) SpanId(io.opencensus.trace.SpanId)

Example 2 with TraceId

use of io.opencensus.trace.TraceId in project instrumentation-java by census-instrumentation.

the class BinaryFormatImpl method fromByteArray.

@Override
public SpanContext fromByteArray(byte[] bytes) throws SpanContextParseException {
    checkNotNull(bytes, "bytes");
    if (bytes.length == 0 || bytes[0] != VERSION_ID) {
        throw new SpanContextParseException("Unsupported version.");
    }
    if (bytes.length < REQUIRED_FORMAT_LENGTH) {
        throw new SpanContextParseException("Invalid input: truncated");
    }
    // TODO: the following logic assumes that fields are written in ID order. The spec does not say
    // that. If it decides not to, this logic would need to be more like a loop
    TraceId traceId;
    SpanId spanId;
    TraceOptions traceOptions = TraceOptions.DEFAULT;
    int pos = 1;
    if (bytes[pos] == TRACE_ID_FIELD_ID) {
        traceId = TraceId.fromBytes(bytes, pos + ID_SIZE);
        pos += ID_SIZE + TraceId.SIZE;
    } else {
        // TODO: update the spec to suggest that the trace ID is not actually optional
        throw new SpanContextParseException("Invalid input: expected trace ID at offset " + pos);
    }
    if (bytes[pos] == SPAN_ID_FIELD_ID) {
        spanId = SpanId.fromBytes(bytes, pos + ID_SIZE);
        pos += ID_SIZE + SpanId.SIZE;
    } else {
        // TODO: update the spec to suggest that the span ID is not actually optional.
        throw new SpanContextParseException("Invalid input: expected span ID at offset " + pos);
    }
    // failing.
    if (bytes.length > pos && bytes[pos] == TRACE_OPTION_FIELD_ID) {
        if (bytes.length < ALL_FORMAT_LENGTH) {
            throw new SpanContextParseException("Invalid input: truncated");
        }
        traceOptions = TraceOptions.fromByte(bytes[pos + ID_SIZE]);
    }
    return SpanContext.create(traceId, spanId, traceOptions, TRACESTATE_DEFAULT);
}
Also used : SpanContextParseException(io.opencensus.trace.propagation.SpanContextParseException) TraceId(io.opencensus.trace.TraceId) TraceOptions(io.opencensus.trace.TraceOptions) SpanId(io.opencensus.trace.SpanId)

Example 3 with TraceId

use of io.opencensus.trace.TraceId in project instrumentation-java by census-instrumentation.

the class TraceContextFormat method extract.

@Override
public <C> /*>>> extends @NonNull Object*/
SpanContext extract(C carrier, Getter<C> getter) throws SpanContextParseException {
    checkNotNull(carrier, "carrier");
    checkNotNull(getter, "getter");
    TraceId traceId;
    SpanId spanId;
    TraceOptions traceOptions;
    String traceparent = getter.get(carrier, TRACEPARENT);
    if (traceparent == null) {
        throw new SpanContextParseException("Traceparent not present");
    }
    try {
        // TODO(bdrutu): Do we need to verify that version is hex and that for the version
        // the length is the expected one?
        checkArgument(traceparent.charAt(TRACE_OPTION_OFFSET - 1) == TRACEPARENT_DELIMITER && (traceparent.length() == TRACEPARENT_HEADER_SIZE || (traceparent.length() > TRACEPARENT_HEADER_SIZE && traceparent.charAt(TRACEPARENT_HEADER_SIZE) == TRACEPARENT_DELIMITER)) && traceparent.charAt(SPAN_ID_OFFSET - 1) == TRACEPARENT_DELIMITER && traceparent.charAt(TRACE_OPTION_OFFSET - 1) == TRACEPARENT_DELIMITER, "Missing or malformed TRACEPARENT.");
        traceId = TraceId.fromLowerBase16(traceparent, TRACE_ID_OFFSET);
        spanId = SpanId.fromLowerBase16(traceparent, SPAN_ID_OFFSET);
        traceOptions = TraceOptions.fromLowerBase16(traceparent, TRACE_OPTION_OFFSET);
    } catch (IllegalArgumentException e) {
        throw new SpanContextParseException("Invalid traceparent: " + traceparent, e);
    }
    String tracestate = getter.get(carrier, TRACESTATE);
    try {
        if (tracestate == null || tracestate.isEmpty()) {
            return SpanContext.create(traceId, spanId, traceOptions, TRACESTATE_DEFAULT);
        }
        Tracestate.Builder tracestateBuilder = Tracestate.builder();
        List<String> listMembers = TRACESTATE_ENTRY_DELIMITER_SPLITTER.splitToList(tracestate);
        checkArgument(listMembers.size() <= TRACESTATE_MAX_MEMBERS, "Tracestate has too many elements.");
        // front of the list.
        for (int i = listMembers.size() - 1; i >= 0; i--) {
            String listMember = listMembers.get(i);
            int index = listMember.indexOf(TRACESTATE_KEY_VALUE_DELIMITER);
            checkArgument(index != -1, "Invalid tracestate list-member format.");
            tracestateBuilder.set(listMember.substring(0, index), listMember.substring(index + 1, listMember.length()));
        }
        return SpanContext.create(traceId, spanId, traceOptions, tracestateBuilder.build());
    } catch (IllegalArgumentException e) {
        throw new SpanContextParseException("Invalid tracestate: " + tracestate, e);
    }
}
Also used : SpanContextParseException(io.opencensus.trace.propagation.SpanContextParseException) TraceId(io.opencensus.trace.TraceId) TraceOptions(io.opencensus.trace.TraceOptions) Tracestate(io.opencensus.trace.Tracestate) SpanId(io.opencensus.trace.SpanId)

Example 4 with TraceId

use of io.opencensus.trace.TraceId 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);
    }
}
Also used : SpanContextParseException(io.opencensus.trace.propagation.SpanContextParseException) TraceId(io.opencensus.trace.TraceId) TraceOptions(io.opencensus.trace.TraceOptions) SpanId(io.opencensus.trace.SpanId)

Example 5 with TraceId

use of io.opencensus.trace.TraceId in project instrumentation-java by census-instrumentation.

the class SamplersTest method probabilitySampler_SampleBasedOnTraceId.

@Test
public void probabilitySampler_SampleBasedOnTraceId() {
    final Sampler defaultProbability = Samplers.probabilitySampler(0.0001);
    // This traceId will not be sampled by the ProbabilitySampler because the first 8 bytes as long
    // is not less than probability * Long.MAX_VALUE;
    TraceId notSampledtraceId = TraceId.fromBytes(new byte[] { (byte) 0x8F, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 0, 0, 0, 0, 0, 0, 0, 0 });
    assertThat(defaultProbability.shouldSample(null, false, notSampledtraceId, SpanId.generateRandomId(random), SPAN_NAME, Collections.<Span>emptyList())).isFalse();
    // This traceId will be sampled by the ProbabilitySampler because the first 8 bytes as long
    // is less than probability * Long.MAX_VALUE;
    TraceId sampledtraceId = TraceId.fromBytes(new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 0, 0, 0, 0, 0, 0, 0, 0 });
    assertThat(defaultProbability.shouldSample(null, false, sampledtraceId, SpanId.generateRandomId(random), SPAN_NAME, Collections.<Span>emptyList())).isTrue();
}
Also used : Sampler(io.opencensus.trace.Sampler) TraceId(io.opencensus.trace.TraceId) Test(org.junit.Test)

Aggregations

TraceId (io.opencensus.trace.TraceId)8 SpanId (io.opencensus.trace.SpanId)6 TraceOptions (io.opencensus.trace.TraceOptions)5 SpanContextParseException (io.opencensus.trace.propagation.SpanContextParseException)4 Span (io.opencensus.trace.Span)2 Tracestate (io.opencensus.trace.Tracestate)2 Test (org.junit.Test)2 Timestamp (io.opencensus.common.Timestamp)1 TimestampConverter (io.opencensus.implcore.internal.TimestampConverter)1 Span (io.opencensus.proto.trace.v1.Span)1 SpanKind (io.opencensus.proto.trace.v1.Span.SpanKind)1 Sampler (io.opencensus.trace.Sampler)1 Kind (io.opencensus.trace.Span.Kind)1 SpanContext (io.opencensus.trace.SpanContext)1 TraceParams (io.opencensus.trace.config.TraceParams)1 Random (java.util.Random)1