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();
}
}
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);
}
}
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;
}
}
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();
}
}
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;
}
}
Aggregations