Browse Source

MAPREDUCE-4361. Fix detailed metrics for protobuf-based RPC on 0.23 (Jason Lowe via tgraves)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.23@1353580 13f79535-47bb-0310-9956-ffa450edef68
Thomas Graves 13 years ago
parent
commit
1811a9732a

+ 8 - 0
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/Server.java

@@ -270,6 +270,14 @@ public abstract class Server {
     return rpcMetrics;
   }
 
+  /**
+   * Returns a handle to the rpcDetailedMetrics (required in tests)
+   * @return rpc detailed metrics
+   */
+  public RpcDetailedMetrics getRpcDetailedMetrics() {
+    return rpcDetailedMetrics;
+  }
+
   /**
    * Refresh the service authorization ACL for the service handled by this server.
    */

+ 3 - 0
hadoop-mapreduce-project/CHANGES.txt

@@ -249,6 +249,9 @@ Release 0.23.3 - UNRELEASED
 
     MAPREDUCE-4295. RM crashes due to DNS issue (tgraves)
 
+    MAPREDUCE-4361. Fix detailed metrics for protobuf-based RPC on 0.23 
+    (Jason Lowe via tgraves)
+
 Release 0.23.2 - UNRELEASED
 
   INCOMPATIBLE CHANGES

+ 12 - 0
hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/ipc/ProtoOverHadoopRpcEngine.java

@@ -349,7 +349,19 @@ public class ProtoOverHadoopRpcEngine implements RpcEngine {
           .mergeFrom(rpcRequest.getRequestProto()).build();
       Message result;
       try {
+        long startTime = System.currentTimeMillis();
         result = service.callBlockingMethod(methodDescriptor, null, param);
+        int processingTime = (int) (System.currentTimeMillis() - startTime);
+        int qTime = (int) (startTime-receiveTime);
+        if (LOG.isDebugEnabled()) {
+          LOG.debug("Served: " + methodName +
+                    " queueTime= " + qTime +
+                    " procesingTime= " + processingTime);
+        }
+        rpcMetrics.addRpcQueueTime(qTime);
+        rpcMetrics.addRpcProcessingTime(processingTime);
+        rpcDetailedMetrics.addProcessingTime(methodName,
+                                             processingTime);
       } catch (ServiceException e) {
         e.printStackTrace();
         return handleException(e);

+ 13 - 0
hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/TestRPC.java

@@ -18,12 +18,16 @@
 
 package org.apache.hadoop.yarn;
 
+import static org.apache.hadoop.test.MetricsAsserts.getMetrics;
+import static org.apache.hadoop.test.MetricsAsserts.assertCounterGt;
+
 import java.net.InetSocketAddress;
 
 import junit.framework.Assert;
 
 import org.apache.hadoop.ipc.Server;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.metrics2.MetricsRecordBuilder;
 import org.apache.hadoop.net.NetUtils;
 import org.apache.hadoop.yarn.api.ClientRMProtocol;
 import org.apache.hadoop.yarn.api.ContainerManager;
@@ -161,6 +165,15 @@ public class TestRPC {
     }
     Assert.assertTrue(exception);
     
+    //test metrics
+    MetricsRecordBuilder rpcMetrics =
+        getMetrics(server.getRpcMetrics().name());
+    assertCounterGt("RpcQueueTimeNumOps", 0L, rpcMetrics);
+    assertCounterGt("RpcProcessingTimeNumOps", 0L, rpcMetrics);
+    MetricsRecordBuilder rpcDetailedMetrics =
+        getMetrics(server.getRpcDetailedMetrics().name());
+    assertCounterGt("StartContainerNumOps", 0L, rpcDetailedMetrics);
+
     server.stop();
     Assert.assertNotNull(status);
     Assert.assertEquals(ContainerState.RUNNING, status.getState());