HDDS-1152. Add trace information for the client side of the datanode writes

Contributed by Elek, Marton.
This commit is contained in:
Anu Engineer 2019-02-24 15:20:34 -08:00
parent 5c1f946071
commit 3aa0a57ea0
3 changed files with 41 additions and 22 deletions

View File

@ -37,6 +37,9 @@ import org.apache.hadoop.ozone.OzoneConfigKeys;
import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.util.Time; import org.apache.hadoop.util.Time;
import io.opentracing.Scope;
import io.opentracing.util.GlobalTracer;
import org.apache.ratis.thirdparty.io.grpc.ManagedChannel; import org.apache.ratis.thirdparty.io.grpc.ManagedChannel;
import org.apache.ratis.thirdparty.io.grpc.Status; import org.apache.ratis.thirdparty.io.grpc.Status;
import org.apache.ratis.thirdparty.io.grpc.netty.GrpcSslContexts; import org.apache.ratis.thirdparty.io.grpc.netty.GrpcSslContexts;
@ -288,9 +291,11 @@ public class XceiverClientGrpc extends XceiverClientSpi {
public XceiverClientReply sendCommandAsync( public XceiverClientReply sendCommandAsync(
ContainerCommandRequestProto request) ContainerCommandRequestProto request)
throws IOException, ExecutionException, InterruptedException { throws IOException, ExecutionException, InterruptedException {
try (Scope scope = GlobalTracer.get()
.buildSpan("XceiverClientGrpc." + request.getCmdType().name())
.startActive(true)) {
XceiverClientReply asyncReply = XceiverClientReply asyncReply =
sendCommandAsync(request, pipeline.getFirstNode()); sendCommandAsync(request, pipeline.getFirstNode());
// TODO : for now make this API sync in nature as async requests are // TODO : for now make this API sync in nature as async requests are
// served out of order over XceiverClientGrpc. This needs to be fixed // served out of order over XceiverClientGrpc. This needs to be fixed
// if this API is to be used for I/O path. Currently, this is not // if this API is to be used for I/O path. Currently, this is not
@ -300,6 +305,7 @@ public class XceiverClientGrpc extends XceiverClientSpi {
} }
return asyncReply; return asyncReply;
} }
}
private XceiverClientReply sendCommandAsync( private XceiverClientReply sendCommandAsync(
ContainerCommandRequestProto request, DatanodeDetails dn) ContainerCommandRequestProto request, DatanodeDetails dn)

View File

@ -22,6 +22,9 @@ import com.google.common.base.Preconditions;
import org.apache.hadoop.hdds.HddsUtils; import org.apache.hadoop.hdds.HddsUtils;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos; import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
import org.apache.hadoop.hdds.security.x509.SecurityConfig; import org.apache.hadoop.hdds.security.x509.SecurityConfig;
import io.opentracing.Scope;
import io.opentracing.util.GlobalTracer;
import org.apache.ratis.grpc.GrpcTlsConfig; import org.apache.ratis.grpc.GrpcTlsConfig;
import org.apache.ratis.proto.RaftProtos; import org.apache.ratis.proto.RaftProtos;
import org.apache.ratis.protocol.RaftRetryFailureException; import org.apache.ratis.protocol.RaftRetryFailureException;
@ -191,6 +194,9 @@ public final class XceiverClientRatis extends XceiverClientSpi {
private CompletableFuture<RaftClientReply> sendRequestAsync( private CompletableFuture<RaftClientReply> sendRequestAsync(
ContainerCommandRequestProto request) { ContainerCommandRequestProto request) {
try (Scope scope = GlobalTracer.get()
.buildSpan("XceiverClientRatis." + request.getCmdType().name())
.startActive(true)) {
ContainerCommandRequestProto finalPayload = ContainerCommandRequestProto finalPayload =
ContainerCommandRequestProto.newBuilder(request) ContainerCommandRequestProto.newBuilder(request)
.setTraceID(TracingUtil.exportCurrentSpan()) .setTraceID(TracingUtil.exportCurrentSpan())
@ -198,9 +204,11 @@ public final class XceiverClientRatis extends XceiverClientSpi {
boolean isReadOnlyRequest = HddsUtils.isReadOnly(finalPayload); boolean isReadOnlyRequest = HddsUtils.isReadOnly(finalPayload);
ByteString byteString = finalPayload.toByteString(); ByteString byteString = finalPayload.toByteString();
LOG.debug("sendCommandAsync {} {}", isReadOnlyRequest, finalPayload); LOG.debug("sendCommandAsync {} {}", isReadOnlyRequest, finalPayload);
return isReadOnlyRequest ? getClient().sendReadOnlyAsync(() -> byteString) : return isReadOnlyRequest ?
getClient().sendReadOnlyAsync(() -> byteString) :
getClient().sendAsync(() -> byteString); getClient().sendAsync(() -> byteString);
} }
}
// gets the minimum log index replicated to all servers // gets the minimum log index replicated to all servers
@Override @Override

View File

@ -1,3 +1,4 @@
/** /**
* Licensed to the Apache Software Foundation (ASF) under one or more * Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with this * contributor license agreements. See the NOTICE file distributed with this
@ -614,9 +615,13 @@ public final class RandomKeyGenerator implements Callable<Void> {
.update(keyCreationDuration); .update(keyCreationDuration);
keyCreationTime.getAndAdd(keyCreationDuration); keyCreationTime.getAndAdd(keyCreationDuration);
long keyWriteStart = System.nanoTime(); long keyWriteStart = System.nanoTime();
try (Scope writeScope = GlobalTracer.get()
.buildSpan("writeKeyData")
.startActive(true)) {
os.write(keyValue); os.write(keyValue);
os.write(randomValue); os.write(randomValue);
os.close(); os.close();
}
long keyWriteDuration = System.nanoTime() - keyWriteStart; long keyWriteDuration = System.nanoTime() - keyWriteStart;