Search in sources :

Example 11 with Span

use of io.opentelemetry.api.trace.Span in project hbase by apache.

the class RecoverableZooKeeper method setData.

/**
 * setData is NOT an idempotent operation. Retry may cause BadVersion Exception
 * Adding an identifier field into the data to check whether
 * badversion is caused by the result of previous correctly setData
 * @return Stat instance
 */
public Stat setData(String path, byte[] data, int version) throws KeeperException, InterruptedException {
    Span span = TraceUtil.getGlobalTracer().spanBuilder("RecoverableZookeeper.setData").startSpan();
    try (Scope scope = span.makeCurrent()) {
        RetryCounter retryCounter = retryCounterFactory.create();
        byte[] newData = ZKMetadata.appendMetaData(id, data);
        boolean isRetry = false;
        while (true) {
            try {
                return checkZk().setData(path, newData, version);
            } catch (KeeperException e) {
                switch(e.code()) {
                    case CONNECTIONLOSS:
                    case OPERATIONTIMEOUT:
                    case REQUESTTIMEOUT:
                        retryOrThrow(retryCounter, e, "setData");
                        break;
                    case BADVERSION:
                        if (isRetry) {
                            // try to verify whether the previous setData success or not
                            try {
                                Stat stat = new Stat();
                                byte[] revData = checkZk().getData(path, false, stat);
                                if (Bytes.compareTo(revData, newData) == 0) {
                                    // the bad version is caused by previous successful setData
                                    return stat;
                                }
                            } catch (KeeperException keeperException) {
                                // the ZK is not reliable at this moment. just throwing exception
                                throw keeperException;
                            }
                        }
                    // throw other exceptions and verified bad version exceptions
                    default:
                        throw e;
                }
            }
            retryCounter.sleepUntilNextRetry();
            isRetry = true;
        }
    } finally {
        span.end();
    }
}
Also used : Stat(org.apache.zookeeper.data.Stat) Scope(io.opentelemetry.context.Scope) RetryCounter(org.apache.hadoop.hbase.util.RetryCounter) Span(io.opentelemetry.api.trace.Span) KeeperException(org.apache.zookeeper.KeeperException)

Example 12 with Span

use of io.opentelemetry.api.trace.Span in project wildfly by wildfly.

the class OpenTelemetryContainerFilter method filter.

@Override
public void filter(ContainerRequestContext requestContext) {
    if (tracer != null) {
        final boolean remoteContext = requestContext.getHeaders().keySet().stream().anyMatch(k -> W3CTraceContextPropagator.getInstance().fields().contains(k));
        final UriInfo uriInfo = requestContext.getUriInfo();
        final URI requestUri = uriInfo.getRequestUri();
        final String method = requestContext.getMethod();
        final String uri = uriInfo.getPath();
        SpanBuilder spanBuilder = tracer.spanBuilder(method + " " + uri).setSpanKind(SpanKind.SERVER);
        if (remoteContext) {
            spanBuilder.setParent(openTelemetry.getPropagators().getTextMapPropagator().extract(Context.current(), requestContext, new TextMapGetter<ContainerRequestContext>() {

                @Override
                public String get(ContainerRequestContext requestContext, String key) {
                    if (requestContext.getHeaders().containsKey(key)) {
                        return requestContext.getHeaders().get(key).get(0);
                    }
                    return null;
                }

                @Override
                public Iterable<String> keys(ContainerRequestContext requestContext) {
                    return requestContext.getHeaders().keySet();
                }
            }));
        } else {
            spanBuilder.setNoParent();
        }
        Span serverSpan = spanBuilder.startSpan();
        serverSpan.makeCurrent();
        serverSpan.setAttribute(SemanticAttributes.HTTP_METHOD, method);
        serverSpan.setAttribute(SemanticAttributes.HTTP_SCHEME, requestUri.getScheme());
        serverSpan.setAttribute(SemanticAttributes.HTTP_HOST, requestUri.getHost() + ":" + requestUri.getPort());
        serverSpan.setAttribute(SemanticAttributes.HTTP_TARGET, uri);
        requestContext.setProperty(SERVER_SPAN, serverSpan);
    }
}
Also used : SpanBuilder(io.opentelemetry.api.trace.SpanBuilder) TextMapGetter(io.opentelemetry.context.propagation.TextMapGetter) ContainerRequestContext(javax.ws.rs.container.ContainerRequestContext) URI(java.net.URI) Span(io.opentelemetry.api.trace.Span) UriInfo(javax.ws.rs.core.UriInfo)

Example 13 with Span

use of io.opentelemetry.api.trace.Span in project hbase by apache.

the class TraceUtil method tracedFuture.

/**
 * Trace an asynchronous operation for a table.
 */
public static <T> CompletableFuture<T> tracedFuture(Supplier<CompletableFuture<T>> action, Supplier<Span> spanSupplier) {
    Span span = spanSupplier.get();
    try (Scope scope = span.makeCurrent()) {
        CompletableFuture<T> future = action.get();
        endSpan(future, span);
        return future;
    }
}
Also used : Scope(io.opentelemetry.context.Scope) Span(io.opentelemetry.api.trace.Span)

Example 14 with Span

use of io.opentelemetry.api.trace.Span in project hbase by apache.

the class TraceUtil method trace.

public static <T> T trace(Supplier<T> action, String spanName) {
    Span span = createSpan(spanName);
    try (Scope scope = span.makeCurrent()) {
        T ret = action.get();
        span.setStatus(StatusCode.OK);
        return ret;
    } catch (Throwable e) {
        setError(span, e);
        throw e;
    } finally {
        span.end();
    }
}
Also used : Scope(io.opentelemetry.context.Scope) Span(io.opentelemetry.api.trace.Span)

Example 15 with Span

use of io.opentelemetry.api.trace.Span in project hbase by apache.

the class TraceUtil method tracedFuture.

/**
 * Trace an asynchronous operation.
 */
public static <T> CompletableFuture<T> tracedFuture(Supplier<CompletableFuture<T>> action, String spanName) {
    Span span = createSpan(spanName);
    try (Scope scope = span.makeCurrent()) {
        CompletableFuture<T> future = action.get();
        endSpan(future, span);
        return future;
    }
}
Also used : Scope(io.opentelemetry.context.Scope) Span(io.opentelemetry.api.trace.Span)

Aggregations

Span (io.opentelemetry.api.trace.Span)28 Scope (io.opentelemetry.context.Scope)21 IOException (java.io.IOException)7 LinkedBlockingQueue (java.util.concurrent.LinkedBlockingQueue)3 RetryCounter (org.apache.hadoop.hbase.util.RetryCounter)3 KeeperException (org.apache.zookeeper.KeeperException)3 Context (io.opentelemetry.context.Context)2 TextMapGetter (io.opentelemetry.context.propagation.TextMapGetter)2 InetSocketAddress (java.net.InetSocketAddress)2 CompletableFuture (java.util.concurrent.CompletableFuture)2 GET (javax.ws.rs.GET)2 CellScanner (org.apache.hadoop.hbase.CellScanner)2 Result (org.apache.hadoop.hbase.client.Result)2 Table (org.apache.hadoop.hbase.client.Table)2 Message (org.apache.hbase.thirdparty.com.google.protobuf.Message)2 ConsoleReporter (com.codahale.metrics.ConsoleReporter)1 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 OpenTelemetry (io.opentelemetry.api.OpenTelemetry)1 SpanBuilder (io.opentelemetry.api.trace.SpanBuilder)1 StatusCode (io.opentelemetry.api.trace.StatusCode)1