76 lines
1.6 KiB
Java
76 lines
1.6 KiB
Java
/*
|
|
* Copyright The OpenTelemetry Authors
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import io.opentelemetry.api.OpenTelemetry;
|
|
import io.opentelemetry.api.trace.Tracer;
|
|
import java.util.concurrent.Callable;
|
|
import java.util.concurrent.CountDownLatch;
|
|
import java.util.concurrent.ForkJoinTask;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
public class JavaAsyncChild extends ForkJoinTask implements Runnable, Callable {
|
|
private static final Tracer tracer = OpenTelemetry.getGlobalTracer("io.opentelemetry.auto");
|
|
|
|
private final AtomicBoolean blockThread;
|
|
private final boolean doTraceableWork;
|
|
private final CountDownLatch latch = new CountDownLatch(1);
|
|
|
|
public JavaAsyncChild() {
|
|
this(true, false);
|
|
}
|
|
|
|
@Override
|
|
public Object getRawResult() {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
protected void setRawResult(Object value) {}
|
|
|
|
@Override
|
|
protected boolean exec() {
|
|
runImpl();
|
|
return true;
|
|
}
|
|
|
|
public JavaAsyncChild(boolean doTraceableWork, boolean blockThread) {
|
|
this.doTraceableWork = doTraceableWork;
|
|
this.blockThread = new AtomicBoolean(blockThread);
|
|
}
|
|
|
|
public void unblock() {
|
|
blockThread.set(false);
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
runImpl();
|
|
}
|
|
|
|
@Override
|
|
public Object call() {
|
|
runImpl();
|
|
return null;
|
|
}
|
|
|
|
public void waitForCompletion() throws InterruptedException {
|
|
latch.await();
|
|
}
|
|
|
|
private void runImpl() {
|
|
while (blockThread.get()) {
|
|
// busy-wait to block thread
|
|
}
|
|
if (doTraceableWork) {
|
|
asyncChild();
|
|
}
|
|
latch.countDown();
|
|
}
|
|
|
|
private void asyncChild() {
|
|
tracer.spanBuilder("asyncChild").startSpan().end();
|
|
}
|
|
}
|