FSNamesystemMetrics.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:5k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.hdfs.server.namenode.metrics;
  19. import org.apache.commons.logging.Log;
  20. import org.apache.commons.logging.LogFactory;
  21. import org.apache.hadoop.conf.Configuration;
  22. import org.apache.hadoop.hdfs.server.namenode.FSNamesystem;
  23. import org.apache.hadoop.metrics.*;
  24. import org.apache.hadoop.metrics.util.MetricsBase;
  25. import org.apache.hadoop.metrics.util.MetricsIntValue;
  26. import org.apache.hadoop.metrics.util.MetricsLongValue;
  27. import org.apache.hadoop.metrics.util.MetricsRegistry;
  28. /**
  29.  * 
  30.  * This class is for maintaining  the various FSNamesystem status metrics
  31.  * and publishing them through the metrics interfaces.
  32.  * The SNamesystem creates and registers the JMX MBean.
  33.  * <p>
  34.  * This class has a number of metrics variables that are publicly accessible;
  35.  * these variables (objects) have methods to update their values;
  36.  *  for example:
  37.  *  <p> {@link #filesTotal}.set()
  38.  *
  39.  */
  40. public class FSNamesystemMetrics implements Updater {
  41.   private static Log log = LogFactory.getLog(FSNamesystemMetrics.class);
  42.   private final MetricsRecord metricsRecord;
  43.   public MetricsRegistry registry = new MetricsRegistry();
  44.    
  45.   public MetricsIntValue filesTotal = new MetricsIntValue("FilesTotal", registry);
  46.   public MetricsLongValue blocksTotal = new MetricsLongValue("BlocksTotal", registry);
  47.   public MetricsIntValue capacityTotalGB = new MetricsIntValue("CapacityTotalGB", registry);
  48.   public MetricsIntValue capacityUsedGB = new MetricsIntValue("CapacityUsedGB", registry);
  49.   public MetricsIntValue capacityRemainingGB = new MetricsIntValue("CapacityRemainingGB", registry);
  50.   public MetricsIntValue totalLoad = new MetricsIntValue("TotalLoad", registry);
  51.   public MetricsIntValue pendingReplicationBlocks = new MetricsIntValue("PendingReplicationBlocks", registry);
  52.   public MetricsIntValue underReplicatedBlocks = new MetricsIntValue("UnderReplicatedBlocks", registry);
  53.   public MetricsIntValue scheduledReplicationBlocks = new MetricsIntValue("ScheduledReplicationBlocks", registry);
  54.   public MetricsIntValue missingBlocks = new MetricsIntValue("MissingBlocks", registry);    
  55.   public FSNamesystemMetrics(Configuration conf) {
  56.     String sessionId = conf.get("session.id");
  57.      
  58.     // Create a record for FSNamesystem metrics
  59.     MetricsContext metricsContext = MetricsUtil.getContext("dfs");
  60.     metricsRecord = MetricsUtil.createRecord(metricsContext, "FSNamesystem");
  61.     metricsRecord.setTag("sessionId", sessionId);
  62.     metricsContext.registerUpdater(this);
  63.     log.info("Initializing FSNamesystemMetrics using context object:" +
  64.               metricsContext.getClass().getName());
  65.   }
  66.   private int roundBytesToGBytes(long bytes) {
  67.     return Math.round(((float)bytes/(1024 * 1024 * 1024)));
  68.   }
  69.       
  70.   /**
  71.    * Since this object is a registered updater, this method will be called
  72.    * periodically, e.g. every 5 seconds.
  73.    * We set the metrics value within  this function before pushing it out. 
  74.    * FSNamesystem updates its own local variables which are
  75.    * light weight compared to Metrics counters. 
  76.    *
  77.    * Some of the metrics are explicity casted to int. Few metrics collectors
  78.    * do not handle long values. It is safe to cast to int for now as all these
  79.    * values fit in int value.
  80.    * Metrics related to DFS capacity are stored in bytes which do not fit in 
  81.    * int, so they are rounded to GB
  82.    */
  83.   public void doUpdates(MetricsContext unused) {
  84.     /** 
  85.      * ToFix
  86.      * If the metrics counter were instead stored in the metrics objects themselves
  87.      * we could avoid copying the values on each update.
  88.      */
  89.     synchronized (this) {
  90.       FSNamesystem fsNameSystem = FSNamesystem.getFSNamesystem();
  91.       filesTotal.set((int)fsNameSystem.getFilesTotal());
  92.       blocksTotal.set((int)fsNameSystem.getBlocksTotal());
  93.       capacityTotalGB.set(roundBytesToGBytes(fsNameSystem.getCapacityTotal()));
  94.       capacityUsedGB.set(roundBytesToGBytes(fsNameSystem.getCapacityUsed()));
  95.       capacityRemainingGB.set(roundBytesToGBytes(fsNameSystem.
  96.                                                getCapacityRemaining()));
  97.       totalLoad.set(fsNameSystem.getTotalLoad());
  98.       pendingReplicationBlocks.set((int)fsNameSystem.
  99.                                    getPendingReplicationBlocks());
  100.       underReplicatedBlocks.set((int)fsNameSystem.getUnderReplicatedBlocks());
  101.       scheduledReplicationBlocks.set((int)fsNameSystem.
  102.                                       getScheduledReplicationBlocks());
  103.       missingBlocks.set((int)fsNameSystem.getMissingBlocksCount());
  104.       for (MetricsBase m : registry.getMetricsList()) {
  105.         m.pushMetric(metricsRecord);
  106.       }
  107.     }
  108.     metricsRecord.update();
  109.   }
  110. }