diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java index ab65805b3b85..d545406d531e 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/HddsDispatcher.java @@ -23,9 +23,9 @@ import java.util.Optional; import java.util.Set; -import org.apache.hadoop.hdds.conf.ConfigurationSource; import org.apache.hadoop.hdds.HddsConfigKeys; import org.apache.hadoop.hdds.HddsUtils; +import org.apache.hadoop.hdds.conf.ConfigurationSource; import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos; import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerCommandRequestProto; import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerCommandResponseProto; @@ -33,12 +33,13 @@ import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerDataProto.State; import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerType; import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Result; +import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Type; import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerAction; import org.apache.hadoop.hdds.scm.container.common.helpers.ContainerNotOpenException; import org.apache.hadoop.hdds.scm.container.common.helpers.InvalidContainerStateException; import org.apache.hadoop.hdds.scm.container.common.helpers.StorageContainerException; import org.apache.hadoop.hdds.security.token.TokenVerifier; -import org.apache.hadoop.hdds.tracing.TracingUtil; +import org.apache.hadoop.hdds.server.OzoneProtocolMessageDispatcher; import org.apache.hadoop.hdds.utils.ProtocolMessageMetrics; import org.apache.hadoop.ozone.audit.AuditAction; import org.apache.hadoop.ozone.audit.AuditEventStatus; @@ -60,9 +61,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; -import io.opentracing.Scope; -import io.opentracing.Span; -import io.opentracing.util.GlobalTracer; +import com.google.protobuf.ServiceException; import static org.apache.hadoop.hdds.scm.protocolPB.ContainerCommandResponseBuilders.malformedRequest; import static org.apache.hadoop.hdds.scm.protocolPB.ContainerCommandResponseBuilders.unsupportedRequest; @@ -86,6 +85,8 @@ public class HddsDispatcher implements ContainerDispatcher, Auditor { private final StateContext context; private final float containerCloseThreshold; private final ProtocolMessageMetrics protocolMetrics; + private OzoneProtocolMessageDispatcher dispatcher; private String scmID; private ContainerMetrics metrics; private final TokenVerifier tokenVerifier; @@ -117,7 +118,12 @@ public HddsDispatcher(ConfigurationSource config, ContainerSet contSet, new ProtocolMessageMetrics<>( "HddsDispatcher", "HDDS dispatcher metrics", - ContainerProtos.Type.values()); + Type.values()); + + this.dispatcher = + new OzoneProtocolMessageDispatcher<>("DatanodeClient", + protocolMetrics, + LOG); } @Override @@ -158,16 +164,13 @@ public void buildMissingContainerSetAndValidate( @Override public ContainerCommandResponseProto dispatch( ContainerCommandRequestProto msg, DispatcherContext dispatcherContext) { - String spanName = "HddsDispatcher." + msg.getCmdType().name(); - long startTime = System.nanoTime(); - Span span = TracingUtil - .importAndCreateSpan(spanName, msg.getTraceID()); - try (Scope scope = GlobalTracer.get().activateSpan(span)) { - return dispatchRequest(msg, dispatcherContext); - } finally { - span.finish(); - protocolMetrics - .increment(msg.getCmdType(), System.nanoTime() - startTime); + try { + return dispatcher.processRequest(msg, + req -> dispatchRequest(msg, dispatcherContext), + msg.getCmdType(), + msg.getTraceID()); + } catch (ServiceException ex) { + throw new RuntimeException(ex); } } @@ -189,16 +192,16 @@ private ContainerCommandResponseProto dispatchRequest( ContainerType containerType; ContainerCommandResponseProto responseProto = null; long startTime = System.nanoTime(); - ContainerProtos.Type cmdType = msg.getCmdType(); + Type cmdType = msg.getCmdType(); long containerID = msg.getContainerID(); metrics.incContainerOpsMetrics(cmdType); Container container = getContainer(containerID); boolean isWriteStage = - (cmdType == ContainerProtos.Type.WriteChunk && dispatcherContext != null + (cmdType == Type.WriteChunk && dispatcherContext != null && dispatcherContext.getStage() == DispatcherContext.WriteChunkStage.WRITE_DATA); boolean isWriteCommitStage = - (cmdType == ContainerProtos.Type.WriteChunk && dispatcherContext != null + (cmdType == Type.WriteChunk && dispatcherContext != null && dispatcherContext.getStage() == DispatcherContext.WriteChunkStage.COMMIT_DATA); @@ -213,7 +216,7 @@ private ContainerCommandResponseProto dispatchRequest( // if the command gets executed other than Ratis, the default write stage // is WriteChunkStage.COMBINED boolean isCombinedStage = - cmdType == ContainerProtos.Type.WriteChunk && (dispatcherContext == null + cmdType == Type.WriteChunk && (dispatcherContext == null || dispatcherContext.getStage() == DispatcherContext.WriteChunkStage.COMBINED); Map container2BCSIDMap = null; @@ -243,13 +246,13 @@ private ContainerCommandResponseProto dispatchRequest( return ContainerUtils.logAndReturnError(LOG, sce, msg); } - if (cmdType != ContainerProtos.Type.CreateContainer) { + if (cmdType != Type.CreateContainer) { /** * Create Container should happen only as part of Write_Data phase of * writeChunk. */ if (container == null && ((isWriteStage || isCombinedStage) - || cmdType == ContainerProtos.Type.PutSmallFile)) { + || cmdType == Type.PutSmallFile)) { // If container does not exist, create one for WriteChunk and // PutSmallFile request responseProto = createContainer(msg); @@ -317,7 +320,7 @@ private ContainerCommandResponseProto dispatchRequest( // state here. Result result = responseProto.getResult(); - if (cmdType == ContainerProtos.Type.CreateContainer + if (cmdType == Type.CreateContainer && result == Result.SUCCESS && dispatcherContext != null) { Preconditions.checkNotNull(dispatcherContext.getContainer2BCSIDMap()); container2BCSIDMap.putIfAbsent(containerID, Long.valueOf(0)); @@ -374,9 +377,9 @@ private ContainerCommandResponseProto dispatchRequest( } private void updateBCSID(Container container, - DispatcherContext dispatcherContext, ContainerProtos.Type cmdType) { - if (dispatcherContext != null && (cmdType == ContainerProtos.Type.PutBlock - || cmdType == ContainerProtos.Type.PutSmallFile)) { + DispatcherContext dispatcherContext, Type cmdType) { + if (dispatcherContext != null && (cmdType == Type.PutBlock + || cmdType == Type.PutSmallFile)) { Preconditions.checkNotNull(container); long bcsID = container.getBlockCommitSequenceId(); long containerId = container.getContainerData().getContainerID(); @@ -406,7 +409,7 @@ ContainerCommandResponseProto createContainer( ContainerCommandRequestProto.Builder requestBuilder = ContainerCommandRequestProto.newBuilder() - .setCmdType(ContainerProtos.Type.CreateContainer) + .setCmdType(Type.CreateContainer) .setContainerID(containerRequest.getContainerID()) .setCreateContainer(createRequest.build()) .setPipelineID(containerRequest.getPipelineID()) @@ -448,7 +451,7 @@ public void validateContainerCommand( return; } ContainerType containerType = container.getContainerType(); - ContainerProtos.Type cmdType = msg.getCmdType(); + Type cmdType = msg.getCmdType(); AuditAction action = ContainerCommandRequestPBHelper.getAuditAction(cmdType); EventType eventType = getEventType(msg); diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/protocolPB/StorageContainerDatanodeProtocolServerSideTranslatorPB.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/protocolPB/StorageContainerDatanodeProtocolServerSideTranslatorPB.java index e99cbae9f027..54e7a69ef828 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/protocolPB/StorageContainerDatanodeProtocolServerSideTranslatorPB.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/protocolPB/StorageContainerDatanodeProtocolServerSideTranslatorPB.java @@ -50,7 +50,7 @@ public class StorageContainerDatanodeProtocolServerSideTranslatorPB private final StorageContainerDatanodeProtocol impl; private final OzoneProtocolMessageDispatcher dispatcher; + SCMDatanodeResponse, ProtocolMessageEnum> dispatcher; public StorageContainerDatanodeProtocolServerSideTranslatorPB( StorageContainerDatanodeProtocol impl, diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/OzoneProtocolMessageDispatcher.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/OzoneProtocolMessageDispatcher.java index c239c0d54b91..ba6f15dba6d4 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/OzoneProtocolMessageDispatcher.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/OzoneProtocolMessageDispatcher.java @@ -21,7 +21,6 @@ import org.apache.hadoop.hdds.tracing.TracingUtil; import org.apache.hadoop.hdds.utils.ProtocolMessageMetrics; -import com.google.protobuf.ProtocolMessageEnum; import com.google.protobuf.ServiceException; import io.opentracing.Span; import org.slf4j.Logger; @@ -34,17 +33,17 @@ * It logs the message type/content on DEBUG/TRACING log for insight and create * a new span based on the tracing information. */ -public class OzoneProtocolMessageDispatcher { +public class OzoneProtocolMessageDispatcher { private String serviceName; - private final ProtocolMessageMetrics + private final ProtocolMessageMetrics protocolMessageMetrics; private Logger logger; public OzoneProtocolMessageDispatcher(String serviceName, - ProtocolMessageMetrics protocolMessageMetrics, + ProtocolMessageMetrics protocolMessageMetrics, Logger logger) { this.serviceName = serviceName; this.protocolMessageMetrics = protocolMessageMetrics; @@ -54,7 +53,7 @@ public OzoneProtocolMessageDispatcher(String serviceName, public RESPONSE processRequest( REQUEST request, FunctionWithServiceException methodCall, - ProtocolMessageEnum type, + TYPE type, String traceId) throws ServiceException { Span span = TracingUtil.importAndCreateSpan(type.toString(), traceId); try { diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SCMSecurityProtocolServerSideTranslatorPB.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SCMSecurityProtocolServerSideTranslatorPB.java index 666123e019a2..9388a3323e3e 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SCMSecurityProtocolServerSideTranslatorPB.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/SCMSecurityProtocolServerSideTranslatorPB.java @@ -16,19 +16,14 @@ */ package org.apache.hadoop.hdds.scm.protocol; -import com.google.protobuf.RpcController; -import com.google.protobuf.ServiceException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; +import org.apache.hadoop.hdds.protocol.SCMSecurityProtocol; import org.apache.hadoop.hdds.protocol.proto.SCMSecurityProtocolProtos; import org.apache.hadoop.hdds.protocol.proto.SCMSecurityProtocolProtos.SCMGetCertResponseProto; +import org.apache.hadoop.hdds.protocol.proto.SCMSecurityProtocolProtos.SCMGetCertResponseProto.ResponseCode; import org.apache.hadoop.hdds.protocol.proto.SCMSecurityProtocolProtos.SCMGetCertificateRequestProto; import org.apache.hadoop.hdds.protocol.proto.SCMSecurityProtocolProtos.SCMGetDataNodeCertRequestProto; -import org.apache.hadoop.hdds.protocol.proto.SCMSecurityProtocolProtos.SCMGetCertResponseProto.ResponseCode; -import org.apache.hadoop.hdds.protocol.SCMSecurityProtocol; import org.apache.hadoop.hdds.protocol.proto.SCMSecurityProtocolProtos.SCMGetOMCertRequestProto; import org.apache.hadoop.hdds.protocol.proto.SCMSecurityProtocolProtos.SCMSecurityRequest; import org.apache.hadoop.hdds.protocol.proto.SCMSecurityProtocolProtos.SCMSecurityResponse; @@ -37,6 +32,12 @@ import org.apache.hadoop.hdds.server.OzoneProtocolMessageDispatcher; import org.apache.hadoop.hdds.utils.ProtocolMessageMetrics; +import com.google.protobuf.ProtocolMessageEnum; +import com.google.protobuf.RpcController; +import com.google.protobuf.ServiceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * This class is the server-side translator that forwards requests received on * {@link SCMSecurityProtocolPB} to the {@link @@ -51,7 +52,7 @@ public class SCMSecurityProtocolServerSideTranslatorPB private final SCMSecurityProtocol impl; private OzoneProtocolMessageDispatcher + SCMSecurityResponse, ProtocolMessageEnum> dispatcher; public SCMSecurityProtocolServerSideTranslatorPB(SCMSecurityProtocol impl, diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java index fb07351021d8..a04e168c9980 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java @@ -68,7 +68,7 @@ public final class ScmBlockLocationProtocolServerSideTranslatorPB .getLogger(ScmBlockLocationProtocolServerSideTranslatorPB.class); private final OzoneProtocolMessageDispatcher + SCMBlockLocationResponse, ProtocolMessageEnum> dispatcher; /** diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java index d07cc5635c99..d5496b420e58 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java @@ -26,7 +26,6 @@ import org.apache.hadoop.hdds.annotation.InterfaceAudience; import org.apache.hadoop.hdds.protocol.proto.HddsProtos; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos; -import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.PipelineResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ActivatePipelineRequestProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ActivatePipelineResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ClosePipelineRequestProto; @@ -39,10 +38,10 @@ import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ForceExitSafeModeResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetContainerRequestProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetContainerResponseProto; -import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetContainerWithPipelineRequestProto; -import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetContainerWithPipelineResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetContainerWithPipelineBatchRequestProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetContainerWithPipelineBatchResponseProto; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetContainerWithPipelineRequestProto; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetContainerWithPipelineResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetPipelineRequestProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.GetPipelineResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.InSafeModeRequestProto; @@ -50,10 +49,11 @@ import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ListPipelineRequestProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ListPipelineResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.NodeQueryResponseProto; -import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.SCMCloseContainerRequestProto; -import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.SCMCloseContainerResponseProto; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.PipelineResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ReplicationManagerStatusRequestProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.ReplicationManagerStatusResponseProto; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.SCMCloseContainerRequestProto; +import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.SCMCloseContainerResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.SCMDeleteContainerRequestProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.SCMDeleteContainerResponseProto; import org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.SCMListContainerRequestProto; @@ -79,11 +79,10 @@ import com.google.protobuf.ProtocolMessageEnum; import com.google.protobuf.RpcController; import com.google.protobuf.ServiceException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import static org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.PipelineResponseProto.Error.errorPipelineAlreadyExists; import static org.apache.hadoop.hdds.protocol.proto.StorageContainerLocationProtocolProtos.PipelineResponseProto.Error.success; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * This class is the server-side translator that forwards requests received on @@ -101,7 +100,7 @@ public final class StorageContainerLocationProtocolServerSideTranslatorPB private final StorageContainerLocationProtocol impl; private OzoneProtocolMessageDispatcher + ScmContainerLocationResponse, ProtocolMessageEnum> dispatcher; /** diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightPoint.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightPoint.java index b3c64ae0303d..2789d03bfc44 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightPoint.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightPoint.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -28,11 +29,8 @@ import org.apache.hadoop.hdds.scm.ScmConfigKeys; import org.apache.hadoop.hdds.scm.cli.ContainerOperationClient; import org.apache.hadoop.hdds.scm.client.ScmClient; -import org.apache.hadoop.hdds.server.http.PrometheusMetricsSink; import org.apache.hadoop.ozone.insight.LoggerSource.Level; -import com.google.protobuf.ProtocolMessageEnum; - /** * Default implementation of Insight point logic. */ @@ -42,7 +40,7 @@ public abstract class BaseInsightPoint implements InsightPoint { * List the related metrics. */ @Override - public List getMetrics() { + public List getMetrics(Map filters) { return new ArrayList<>(); } @@ -91,21 +89,35 @@ public Level defaultLevel(boolean verbose) { return verbose ? Level.TRACE : Level.DEBUG; } + public void addProtocolMessageMetrics( + List metrics, + String prefix, + Component.Type type, + Object[] types + ) { + addProtocolMessageMetrics(metrics, prefix, new Component(type), types); + } + /** * Default metrics for any message type based RPC ServerSide translators. */ - public void addProtocolMessageMetrics(List metrics, + public void addProtocolMessageMetrics( + List metrics, String prefix, - Component.Type component, - ProtocolMessageEnum[] types) { + Component component, + Object[] types + ) { MetricGroupDisplay messageTypeCounters = new MetricGroupDisplay(component, "Message type counters"); - for (ProtocolMessageEnum type : types) { + for (Object type : types) { String typeName = type.toString(); - MetricDisplay metricDisplay = new MetricDisplay("Number of " + typeName, - prefix + "_" + PrometheusMetricsSink - .normalizeName(typeName)); + + Map typeFilter = new HashMap<>(); + typeFilter.put("type", typeName); + MetricDisplay metricDisplay = + new MetricDisplay("Number of " + typeName + " calls", + prefix + "_counter", typeFilter); messageTypeCounters.addMetrics(metricDisplay); } metrics.add(messageTypeCounters); diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightSubCommand.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightSubCommand.java index 8101531591c5..73937c5e33f6 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightSubCommand.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/BaseInsightSubCommand.java @@ -25,6 +25,7 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.scm.ScmConfigKeys; import org.apache.hadoop.ozone.insight.Component.Type; +import org.apache.hadoop.ozone.insight.datanode.DatanodeDispatcherInsight; import org.apache.hadoop.ozone.insight.datanode.RatisInsight; import org.apache.hadoop.ozone.insight.om.KeyManagerInsight; import org.apache.hadoop.ozone.insight.om.OmProtocolInsight; @@ -98,6 +99,8 @@ public Map createInsightPoints( insights.put("om.key-manager", new KeyManagerInsight()); insights.put("om.protocol.client", new OmProtocolInsight()); insights.put("datanode.pipeline", new RatisInsight(configuration)); + insights.put("datanode.dispatcher", + new DatanodeDispatcherInsight(configuration)); return insights; } diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/InsightPoint.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/InsightPoint.java index 517ba570913a..e46d675f054e 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/InsightPoint.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/InsightPoint.java @@ -39,7 +39,7 @@ List getRelatedLoggers(boolean verbose, /** * List of the related metrics. */ - List getMetrics(); + List getMetrics(Map filters); /** * List of the configuration classes. @@ -47,7 +47,7 @@ List getRelatedLoggers(boolean verbose, List getConfigurationClasses(); /** - * Decide if the specific log should be displayed or not.. + * Decide if the specific log should be displayed or not. */ boolean filterLog(Map filters, String logLine); diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/MetricGroupDisplay.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/MetricGroupDisplay.java index 08fd60c48bbc..eb7416978e2c 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/MetricGroupDisplay.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/MetricGroupDisplay.java @@ -42,9 +42,9 @@ public class MetricGroupDisplay { */ private String description; - public MetricGroupDisplay(Component component, String description) { + public MetricGroupDisplay(Component component, String metricName) { this.component = component; - this.description = description; + this.description = metricName; } public MetricGroupDisplay(Type componentType, String metricName) { diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/MetricsSubCommand.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/MetricsSubCommand.java index d320c82b1877..44e0b7b7dc00 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/MetricsSubCommand.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/MetricsSubCommand.java @@ -17,25 +17,28 @@ */ package org.apache.hadoop.ozone.insight; -import org.apache.hadoop.hdds.cli.HddsVersionProvider; -import org.apache.hadoop.hdds.conf.OzoneConfiguration; - -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.HttpClientBuilder; -import picocli.CommandLine; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.HashMap; import java.util.List; -import java.util.*; +import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.Callable; import java.util.stream.Collectors; +import org.apache.hadoop.hdds.cli.HddsVersionProvider; +import org.apache.hadoop.hdds.conf.OzoneConfiguration; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.HttpClientBuilder; +import picocli.CommandLine; + /** * Command line interface to show metrics for a specific component. */ @@ -48,6 +51,10 @@ public class MetricsSubCommand extends BaseInsightSubCommand implements Callable { + @CommandLine.Option(names = "-f", description = "Define filters to scope " + + "the output (eg. -f datanode=_1234_datanode_id)") + private Map filters; + @CommandLine.Parameters(description = "Name of the insight point (use list " + "to check the available options)") private String insightName; @@ -59,13 +66,15 @@ public Void call() throws Exception { InsightPoint insight = getInsight(conf, insightName); Set sources = - insight.getMetrics().stream().map(MetricGroupDisplay::getComponent) + insight.getMetrics(filters) + .stream() + .map(MetricGroupDisplay::getComponent) .collect(Collectors.toSet()); Map> metrics = getMetrics(conf, sources); System.out.println( "Metrics for `" + insightName + "` (" + insight.getDescription() + ")"); System.out.println(); - for (MetricGroupDisplay group : insight.getMetrics()) { + for (MetricGroupDisplay group : insight.getMetrics(filters)) { System.out.println(group.getDescription()); System.out.println(); for (MetricDisplay display : group.getMetrics()) { diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/datanode/DatanodeDispatcherInsight.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/datanode/DatanodeDispatcherInsight.java new file mode 100644 index 000000000000..b717349856a4 --- /dev/null +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/datanode/DatanodeDispatcherInsight.java @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.ozone.insight.datanode; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.hadoop.hdds.conf.OzoneConfiguration; +import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos; +import org.apache.hadoop.hdds.server.http.HttpConfig; +import org.apache.hadoop.ozone.OzoneConfigKeys; +import org.apache.hadoop.ozone.container.common.impl.HddsDispatcher; +import org.apache.hadoop.ozone.insight.BaseInsightPoint; +import org.apache.hadoop.ozone.insight.Component; +import org.apache.hadoop.ozone.insight.Component.Type; +import org.apache.hadoop.ozone.insight.InsightPoint; +import org.apache.hadoop.ozone.insight.LoggerSource; +import org.apache.hadoop.ozone.insight.MetricGroupDisplay; + +import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_DATANODE_HTTPS_BIND_PORT_DEFAULT; +import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_DATANODE_HTTP_BIND_PORT_DEFAULT; + +/** + * Insight definition for HddsDispatcher. + */ +public class DatanodeDispatcherInsight extends BaseInsightPoint + implements InsightPoint { + + private static final String DATANODE_FILTER = "datanode"; + + private OzoneConfiguration conf; + + public DatanodeDispatcherInsight( + OzoneConfiguration conf + ) { + this.conf = conf; + } + + public Component getDatanodeFromFilter(Map filters) { + if (filters == null || !filters.containsKey(DATANODE_FILTER)) { + throw new IllegalArgumentException("datanode" + + " filter should be specified (-f " + "datanode" + + "= getRelatedLoggers( + boolean verbose, + Map filters + ) { + List result = new ArrayList<>(); + result.add(new LoggerSource( + getDatanodeFromFilter(filters), + HddsDispatcher.class.getCanonicalName(), + defaultLevel(verbose))); + return result; + } + + @Override + public List getMetrics(Map filters) { + List result = new ArrayList<>(); + + addProtocolMessageMetrics(result, "hdds_dispatcher", + getDatanodeFromFilter(filters), + ContainerProtos.Type.values()); + + return result; + } + + @Override + public String getDescription() { + return "Datanode request dispatcher (after Ratis replication)"; + } + + @Override + public boolean filterLog(Map filters, String logLine) { + return true; + } +} diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/datanode/PipelineComponentUtil.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/datanode/PipelineComponentUtil.java new file mode 100644 index 000000000000..c309d62112dc --- /dev/null +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/datanode/PipelineComponentUtil.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.ozone.insight.datanode; + +import java.io.IOException; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +import org.apache.hadoop.hdds.protocol.DatanodeDetails; +import org.apache.hadoop.hdds.scm.client.ScmClient; +import org.apache.hadoop.hdds.scm.pipeline.Pipeline; +import org.apache.hadoop.ozone.insight.Component; +import org.apache.hadoop.ozone.insight.Component.Type; + +/** + * Utilities to handle pipelines. + */ +public final class PipelineComponentUtil { + + public static final String PIPELINE_FILTER = "pipeline"; + + private PipelineComponentUtil() { + } + + public static String getPipelineIdFromFilters(Map filters) { + if (filters == null || !filters.containsKey(PIPELINE_FILTER)) { + throw new IllegalArgumentException(PIPELINE_FILTER + + " filter should be specified (-f " + PIPELINE_FILTER + + "= func + ) throws IOException { + + Optional pipelineSelection = scmClient.listPipelines() + .stream() + .filter( + pipline -> pipline.getId().getId().toString().equals(pipelineId)) + .findFirst(); + + if (!pipelineSelection.isPresent()) { + throw new IllegalArgumentException("No such multi-node pipeline."); + } + Pipeline pipeline = pipelineSelection.get(); + for (DatanodeDetails datanode : pipeline.getNodes()) { + Component dn = + new Component(Type.DATANODE, datanode.getUuid().toString(), + datanode.getHostName(), 9882); + func.apply(dn); + } + + } +} diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/datanode/RatisInsight.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/datanode/RatisInsight.java index 94f1ddd11954..24238c20726e 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/datanode/RatisInsight.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/datanode/RatisInsight.java @@ -22,24 +22,21 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Optional; import org.apache.hadoop.hdds.conf.OzoneConfiguration; -import org.apache.hadoop.hdds.protocol.DatanodeDetails; import org.apache.hadoop.hdds.scm.client.ScmClient; -import org.apache.hadoop.hdds.scm.pipeline.Pipeline; import org.apache.hadoop.ozone.insight.BaseInsightPoint; -import org.apache.hadoop.ozone.insight.Component; -import org.apache.hadoop.ozone.insight.Component.Type; import org.apache.hadoop.ozone.insight.InsightPoint; import org.apache.hadoop.ozone.insight.LoggerSource; +import static org.apache.hadoop.ozone.insight.datanode.PipelineComponentUtil.getPipelineIdFromFilters; +import static org.apache.hadoop.ozone.insight.datanode.PipelineComponentUtil.withDatanodesFromPipeline; + /** - * Insight definition for datanode/pipline metrics. + * Insight definition for datanode/pipeline metrics. */ public class RatisInsight extends BaseInsightPoint implements InsightPoint { - public static final String PIPELINE_FILTER = "pipeline"; private OzoneConfiguration conf; public RatisInsight(OzoneConfiguration conf) { @@ -49,38 +46,22 @@ public RatisInsight(OzoneConfiguration conf) { @Override public List getRelatedLoggers(boolean verbose, Map filters) { - if (filters == null || !filters.containsKey(PIPELINE_FILTER)) { - throw new IllegalArgumentException(PIPELINE_FILTER - + " filter should be specified (-f " + PIPELINE_FILTER - + "= result = new ArrayList<>(); try (ScmClient scmClient = createScmClient(conf)) { - Optional pipelineSelection = scmClient.listPipelines() - .stream() - .filter( - pipline -> pipline.getId().getId().toString().equals(pipelineId)) - .findFirst(); - - if (!pipelineSelection.isPresent()) { - throw new IllegalArgumentException("No such multi-node pipeline."); - } - Pipeline pipeline = pipelineSelection.get(); - for (DatanodeDetails datanode : pipeline.getNodes()) { - Component dn = - new Component(Type.DATANODE, datanode.getUuid().toString(), - datanode.getHostName(), 9882); - result - .add(new LoggerSource(dn, "org.apache.ratis.server.impl", - defaultLevel(verbose))); - } + withDatanodesFromPipeline(scmClient, + getPipelineIdFromFilters(filters), + dn -> { + result + .add(new LoggerSource(dn, + "org.apache.ratis.server.impl", + defaultLevel(verbose))); + return null; + }); } catch (IOException e) { throw new UncheckedIOException("Can't enumerate required logs", e); } - return result; } diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/om/KeyManagerInsight.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/om/KeyManagerInsight.java index f4aacf7bb0b7..1710de27a94d 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/om/KeyManagerInsight.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/om/KeyManagerInsight.java @@ -34,7 +34,7 @@ public class KeyManagerInsight extends BaseInsightPoint { @Override - public List getMetrics() { + public List getMetrics(Map filters) { List display = new ArrayList<>(); MetricGroupDisplay state = diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/om/OmProtocolInsight.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/om/OmProtocolInsight.java index 8c254309c028..e98818bf1d97 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/om/OmProtocolInsight.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/om/OmProtocolInsight.java @@ -46,7 +46,7 @@ public List getRelatedLoggers(boolean verbose, } @Override - public List getMetrics() { + public List getMetrics(Map filters) { List metrics = new ArrayList<>(); Map filter = new HashMap<>(); diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/NodeManagerInsight.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/NodeManagerInsight.java index c58db4b8bc0c..a6ba5e320926 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/NodeManagerInsight.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/NodeManagerInsight.java @@ -44,7 +44,7 @@ public List getRelatedLoggers(boolean verbose, } @Override - public List getMetrics() { + public List getMetrics(Map filters) { List display = new ArrayList<>(); MetricGroupDisplay nodes = diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ReplicaManagerInsight.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ReplicaManagerInsight.java index f15aad19d005..6d607b702f1d 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ReplicaManagerInsight.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ReplicaManagerInsight.java @@ -42,7 +42,7 @@ public List getRelatedLoggers(boolean verbose, } @Override - public List getMetrics() { + public List getMetrics(Map filters) { List display = new ArrayList<>(); return display; } diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolBlockLocationInsight.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolBlockLocationInsight.java index 1a90b7890833..3aac7539531d 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolBlockLocationInsight.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolBlockLocationInsight.java @@ -50,7 +50,7 @@ public List getRelatedLoggers(boolean verbose, } @Override - public List getMetrics() { + public List getMetrics(Map filters) { List metrics = new ArrayList<>(); Map filter = new HashMap<>(); diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolContainerLocationInsight.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolContainerLocationInsight.java index a57dfd0b64a6..0c8228b06754 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolContainerLocationInsight.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolContainerLocationInsight.java @@ -50,7 +50,7 @@ public List getRelatedLoggers(boolean verbose, } @Override - public List getMetrics() { + public List getMetrics(Map filters) { List metrics = new ArrayList<>(); Map filter = new HashMap<>(); diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolDatanodeInsight.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolDatanodeInsight.java index 58e95c7a381d..117df43f6116 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolDatanodeInsight.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolDatanodeInsight.java @@ -51,7 +51,7 @@ public List getRelatedLoggers(boolean verbose, } @Override - public List getMetrics() { + public List getMetrics(Map filters) { List metrics = new ArrayList<>(); Map filter = new HashMap<>(); diff --git a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolSecurityInsight.java b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolSecurityInsight.java index 5f95ff146967..aed8baf9afa1 100644 --- a/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolSecurityInsight.java +++ b/hadoop-ozone/insight/src/main/java/org/apache/hadoop/ozone/insight/scm/ScmProtocolSecurityInsight.java @@ -50,7 +50,7 @@ public List getRelatedLoggers(boolean verbose, } @Override - public List getMetrics() { + public List getMetrics(Map filters) { List metrics = new ArrayList<>(); Map filter = new HashMap<>(); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java index d64db61dd8b5..73277e0dda76 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerProtocolServerSideTranslatorPB.java @@ -59,8 +59,8 @@ public class OzoneManagerProtocolServerSideTranslatorPB implements private final OzoneManager ozoneManager; private final OzoneManagerDoubleBuffer ozoneManagerDoubleBuffer; private final AtomicLong transactionIndex = new AtomicLong(0L); - private final OzoneProtocolMessageDispatcher - dispatcher; + private final OzoneProtocolMessageDispatcher dispatcher; /** * Constructs an instance of the server handler.