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

网格计算

开发平台:

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.metrics.util;
  19. import java.util.ArrayList;
  20. import java.util.HashMap;
  21. import java.util.List;
  22. import java.util.Map;
  23. import javax.management.Attribute;
  24. import javax.management.AttributeList;
  25. import javax.management.AttributeNotFoundException;
  26. import javax.management.DynamicMBean;
  27. import javax.management.InvalidAttributeValueException;
  28. import javax.management.MBeanAttributeInfo;
  29. import javax.management.MBeanException;
  30. import javax.management.MBeanInfo;
  31. import javax.management.MBeanOperationInfo;
  32. import javax.management.ReflectionException;
  33. import org.apache.hadoop.metrics.MetricsUtil;
  34. /**
  35.  * This abstract base class facilitates creating dynamic mbeans automatically from
  36.  * metrics. 
  37.  * The metrics constructors registers metrics in a registry. 
  38.  * Different categories of metrics should be in differnt classes with their own
  39.  * registry (as in NameNodeMetrics and DataNodeMetrics).
  40.  * Then the MBean can be created passing the registry to the constructor.
  41.  * The MBean should be then registered using a mbean name (example):
  42.  *  MetricsHolder myMetrics = new MetricsHolder(); // has metrics and registry
  43.  *  MetricsTestMBean theMBean = new MetricsTestMBean(myMetrics.mregistry);
  44.  *  ObjectName mbeanName = MBeanUtil.registerMBean("ServiceFoo",
  45.  *                "TestStatistics", theMBean);
  46.  * 
  47.  *
  48.  */
  49. public abstract class MetricsDynamicMBeanBase implements DynamicMBean {
  50.   private final static String AVG_TIME = "AvgTime";
  51.   private final static String MIN_TIME = "MinTime";
  52.   private final static String MAX_TIME = "MaxTime";
  53.   private final static String NUM_OPS = "NumOps";
  54.   private final static String RESET_ALL_MIN_MAX_OP = "resetAllMinMax";
  55.   private MetricsRegistry metricsRegistry;
  56.   private MBeanInfo mbeanInfo;
  57.   private Map<String, MetricsBase> metricsRateAttributeMod;
  58.   private int numEntriesInRegistry = 0;
  59.   private String mbeanDescription;
  60.   
  61.   protected MetricsDynamicMBeanBase(final MetricsRegistry mr, final String aMBeanDescription) {
  62.     metricsRegistry = mr;
  63.     mbeanDescription = aMBeanDescription;
  64.     createMBeanInfo();
  65.   }
  66.   
  67.   private void updateMbeanInfoIfMetricsListChanged()  {
  68.     if (numEntriesInRegistry != metricsRegistry.size())
  69.       createMBeanInfo();
  70.   }
  71.   
  72.   private void createMBeanInfo() {
  73.     metricsRateAttributeMod = new HashMap<String, MetricsBase>();
  74.     boolean needsMinMaxResetOperation = false;
  75.     List<MBeanAttributeInfo> attributesInfo = new ArrayList<MBeanAttributeInfo>();
  76.     MBeanOperationInfo[] operationsInfo = null;
  77.     numEntriesInRegistry = metricsRegistry.size();
  78.     
  79.     for (MetricsBase o : metricsRegistry.getMetricsList()) {
  80.       if (MetricsTimeVaryingRate.class.isInstance(o)) {
  81.         // For each of the metrics there are 3 different attributes
  82.         attributesInfo.add(new MBeanAttributeInfo(o.getName() + NUM_OPS, "java.lang.Integer",
  83.             o.getDescription(), true, false, false));
  84.         attributesInfo.add(new MBeanAttributeInfo(o.getName() + AVG_TIME, "java.lang.Long",
  85.             o.getDescription(), true, false, false));
  86.         attributesInfo.add(new MBeanAttributeInfo(o.getName() + MIN_TIME, "java.lang.Long",
  87.             o.getDescription(), true, false, false));
  88.         attributesInfo.add(new MBeanAttributeInfo(o.getName() + MAX_TIME, "java.lang.Long",
  89.             o.getDescription(), true, false, false));
  90.         needsMinMaxResetOperation = true;  // the min and max can be reset.
  91.         
  92.         // Note the special attributes (AVG_TIME, MIN_TIME, ..) are derived from metrics 
  93.         // Rather than check for the suffix we store them in a map.
  94.         metricsRateAttributeMod.put(o.getName() + NUM_OPS, o);
  95.         metricsRateAttributeMod.put(o.getName() + AVG_TIME, o);
  96.         metricsRateAttributeMod.put(o.getName() + MIN_TIME, o);
  97.         metricsRateAttributeMod.put(o.getName() + MAX_TIME, o);
  98.         
  99.       }  else if ( MetricsIntValue.class.isInstance(o) || MetricsTimeVaryingInt.class.isInstance(o) ) {
  100.         attributesInfo.add(new MBeanAttributeInfo(o.getName(), "java.lang.Integer",
  101.             o.getDescription(), true, false, false)); 
  102.       } else if ( MetricsLongValue.class.isInstance(o) || MetricsTimeVaryingLong.class.isInstance(o) ) {
  103.         attributesInfo.add(new MBeanAttributeInfo(o.getName(), "java.lang.Long",
  104.             o.getDescription(), true, false, false));     
  105.       } else {
  106.         MetricsUtil.LOG.error("unknown metrics type: " + o.getClass().getName());
  107.       }
  108.       if (needsMinMaxResetOperation) {
  109.         operationsInfo = new MBeanOperationInfo[] {
  110.             new MBeanOperationInfo(RESET_ALL_MIN_MAX_OP, "Reset (zero) All Min Max",
  111.                     null, "void", MBeanOperationInfo.ACTION) };
  112.       }
  113.     }
  114.     MBeanAttributeInfo[] attrArray = new MBeanAttributeInfo[attributesInfo.size()];
  115.     mbeanInfo =  new MBeanInfo(this.getClass().getName(), mbeanDescription, 
  116.         attributesInfo.toArray(attrArray), null, operationsInfo, null);
  117.   }
  118.   
  119.   @Override
  120.   public Object getAttribute(String attributeName) throws AttributeNotFoundException,
  121.       MBeanException, ReflectionException {
  122.     if (attributeName == null || attributeName.equals("")) 
  123.       throw new IllegalArgumentException();
  124.     
  125.     updateMbeanInfoIfMetricsListChanged();
  126.     
  127.     Object o = metricsRateAttributeMod.get(attributeName);
  128.     if (o == null) {
  129.       o = metricsRegistry.get(attributeName);
  130.     }
  131.     if (o == null)
  132.       throw new AttributeNotFoundException();
  133.     
  134.     if (o instanceof MetricsIntValue)
  135.       return ((MetricsIntValue) o).get();
  136.     else if (o instanceof MetricsLongValue)
  137.       return ((MetricsLongValue) o).get();
  138.     else if (o instanceof MetricsTimeVaryingInt)
  139.       return ((MetricsTimeVaryingInt) o).getPreviousIntervalValue();
  140.     else if (o instanceof MetricsTimeVaryingLong)
  141.       return ((MetricsTimeVaryingLong) o).getPreviousIntervalValue();
  142.     else if (o instanceof MetricsTimeVaryingRate) {
  143.       MetricsTimeVaryingRate or = (MetricsTimeVaryingRate) o;
  144.       if (attributeName.endsWith(NUM_OPS))
  145.         return or.getPreviousIntervalNumOps();
  146.       else if (attributeName.endsWith(AVG_TIME))
  147.         return or.getPreviousIntervalAverageTime();
  148.       else if (attributeName.endsWith(MIN_TIME))
  149.         return or.getMinTime();
  150.       else if (attributeName.endsWith(MAX_TIME))
  151.         return or.getMaxTime();
  152.       else {
  153.         MetricsUtil.LOG.error("Unexpected attrubute suffix");
  154.         throw new AttributeNotFoundException();
  155.       }
  156.     } else {
  157.         MetricsUtil.LOG.error("unknown metrics type: " + o.getClass().getName());
  158.         throw new AttributeNotFoundException();
  159.     }
  160.   }
  161.   @Override
  162.   public AttributeList getAttributes(String[] attributeNames) {
  163.     if (attributeNames == null || attributeNames.length == 0) 
  164.       throw new IllegalArgumentException();
  165.     
  166.     updateMbeanInfoIfMetricsListChanged();
  167.     
  168.     AttributeList result = new AttributeList(attributeNames.length);
  169.     for (String iAttributeName : attributeNames) {
  170.       try {
  171.         Object value = getAttribute(iAttributeName);
  172.         result.add(new Attribute(iAttributeName, value));
  173.       } catch (Exception e) {
  174.         continue;
  175.       } 
  176.     }
  177.     return result;
  178.   }
  179.   @Override
  180.   public MBeanInfo getMBeanInfo() {
  181.     return mbeanInfo;
  182.   }
  183.   @Override
  184.   public Object invoke(String actionName, Object[] parms, String[] signature)
  185.       throws MBeanException, ReflectionException {
  186.     
  187.     if (actionName == null || actionName.equals("")) 
  188.       throw new IllegalArgumentException();
  189.     
  190.     
  191.     // Right now we support only one fixed operation (if it applies)
  192.     if (!(actionName.equals(RESET_ALL_MIN_MAX_OP)) || 
  193.         mbeanInfo.getOperations().length != 1) {
  194.       throw new ReflectionException(new NoSuchMethodException(actionName));
  195.     }
  196.     for (MetricsBase m : metricsRegistry.getMetricsList())  {
  197.       if ( MetricsTimeVaryingRate.class.isInstance(m) ) {
  198.         MetricsTimeVaryingRate.class.cast(m).resetMinMax();
  199.       }
  200.     }
  201.     return null;
  202.   }
  203.   @Override
  204.   public void setAttribute(Attribute attribute)
  205.       throws AttributeNotFoundException, InvalidAttributeValueException,
  206.       MBeanException, ReflectionException {
  207.     throw new ReflectionException(new NoSuchMethodException("set" + attribute));
  208.   }
  209.   @Override
  210.   public AttributeList setAttributes(AttributeList attributes) {
  211.     return null;
  212.   }
  213. }