Author: tedyu
Date: Fri Sep 30 04:26:48 2011
New Revision: 1177506

URL: http://svn.apache.org/viewvc?rev=1177506&view=rev
Log:
HBASE-4145 Provide metrics for hbase client, add ScanMetrics.java

Added:
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/metrics/
    
hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/metrics/ScanMetrics.java

Added: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/metrics/ScanMetrics.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/metrics/ScanMetrics.java?rev=1177506&view=auto
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/metrics/ScanMetrics.java
 (added)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/client/metrics/ScanMetrics.java
 Fri Sep 30 04:26:48 2011
@@ -0,0 +1,171 @@
+/**
+ * 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.hbase.client.metrics;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.io.Writable;
+import org.apache.hadoop.metrics.util.MetricsBase;
+import org.apache.hadoop.metrics.util.MetricsRegistry;
+import org.apache.hadoop.metrics.util.MetricsTimeVaryingLong;
+
+
+/**
+ * Provides client-side metrics related to scan operations
+ * The data can be passed to mapreduce framework or other systems.
+ * Currently metrics framework won't be able to support the scenario
+ * where multiple scan instances run on the same machine trying to
+ * update the same metric. We use metrics objects in the class,
+ * so that it can be easily switched to metrics framework later when it support
+ * this scenario.
+ * Some of these metrics are general for any client operation such as put
+ * However, there is no need for this. So they are defined under scan operation
+ * for now.
+ */
+public class ScanMetrics implements Writable {
+
+  private static final byte SCANMETRICS_VERSION = (byte)1;
+  private static final Log LOG = LogFactory.getLog(ScanMetrics.class);
+  private MetricsRegistry registry = new MetricsRegistry();
+
+  /**
+   * number of RPC calls
+   */
+  public final MetricsTimeVaryingLong countOfRPCcalls =
+    new MetricsTimeVaryingLong("RPC_CALLS", registry);
+
+  /**
+   * number of remote RPC calls
+   */
+  public final MetricsTimeVaryingLong countOfRemoteRPCcalls =
+    new MetricsTimeVaryingLong("REMOTE_RPC_CALLS", registry);
+
+  /**
+   * sum of milliseconds between sequential next calls
+   */
+  public final MetricsTimeVaryingLong sumOfMillisSecBetweenNexts =
+    new MetricsTimeVaryingLong("MILLIS_BETWEEN_NEXTS", registry);
+
+  /**
+   * number of NotServingRegionException caught
+   */
+  public final MetricsTimeVaryingLong countOfNSRE =
+    new MetricsTimeVaryingLong("NOT_SERVING_REGION_EXCEPTION", registry);
+
+  /**
+   * number of bytes in Result objects from region servers
+   */
+  public final MetricsTimeVaryingLong countOfBytesInResults =
+    new MetricsTimeVaryingLong("BYTES_IN_RESULTS", registry);
+
+  /**
+   * number of bytes in Result objects from remote region servers
+   */
+  public final MetricsTimeVaryingLong countOfBytesInRemoteResults =
+    new MetricsTimeVaryingLong("BYTES_IN_REMOTE_RESULTS", registry);
+
+  /**
+   * number of regions
+   */
+  public final MetricsTimeVaryingLong countOfRegions =
+    new MetricsTimeVaryingLong("REGIONS_SCANNED", registry);
+
+  /**
+   * number of RPC retries
+   */
+  public final MetricsTimeVaryingLong countOfRPCRetries =
+    new MetricsTimeVaryingLong("RPC_RETRIES", registry);
+
+  /**
+   * number of remote RPC retries
+   */
+  public final MetricsTimeVaryingLong countOfRemoteRPCRetries =
+    new MetricsTimeVaryingLong("REMOTE_RPC_RETRIES", registry);
+
+  /**
+   * constructor
+   */
+  public ScanMetrics () {
+  }
+
+  /**
+   * serialize all the MetricsTimeVaryingLong
+   */
+  public void write(DataOutput out) throws IOException {
+    out.writeByte(SCANMETRICS_VERSION);
+    Collection<MetricsBase> mbs = registry.getMetricsList();
+
+    // we only handle MetricsTimeVaryingLong for now.
+    int metricsCount = 0;
+    for (MetricsBase mb : mbs) {
+      if ( mb instanceof MetricsTimeVaryingLong) {
+        metricsCount++;
+      } else {
+        throw new IOException("unsupported metrics type. metrics name: "
+          + mb.getName() + ", metrics description: " + mb.getDescription());
+      }
+    }
+
+    out.writeInt(metricsCount);
+    for (MetricsBase mb : mbs) {
+      out.writeUTF(mb.getName());
+      out.writeLong(((MetricsTimeVaryingLong) mb).getCurrentIntervalValue());
+    }
+  }
+
+  public void readFields(DataInput in) throws IOException {
+    int version = in.readByte();
+    if (version > (int)SCANMETRICS_VERSION) {
+      throw new IOException("version " + version + " not supported");
+    }
+
+    int metricsCount = in.readInt();
+    for (int i=0; i<metricsCount; i++) {
+      String metricsName = in.readUTF();
+      long v = in.readLong();
+      MetricsBase mb = registry.get(metricsName);
+      if ( mb instanceof MetricsTimeVaryingLong) {
+        ((MetricsTimeVaryingLong) mb).inc(v);
+      } else {
+        LOG.warn("unsupported metrics type. metrics name: "
+          + mb.getName() + ", metrics description: " + mb.getDescription());
+      }
+    }
+  }
+
+  public MetricsTimeVaryingLong[] getMetricsTimeVaryingLongArray() {
+    Collection<MetricsBase> mbs = registry.getMetricsList();
+    ArrayList<MetricsTimeVaryingLong> mlv =
+      new ArrayList<MetricsTimeVaryingLong>();
+    for (MetricsBase mb : mbs) {
+      if ( mb instanceof MetricsTimeVaryingLong) {
+        mlv.add((MetricsTimeVaryingLong) mb);
+      }
+    }
+    return mlv.toArray(new MetricsTimeVaryingLong[mlv.size()]);
+  }
+
+}


Reply via email to