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 19 package org.apache.hadoop.yarn.server.resourcemanager; 20 21 import static org.apache.hadoop.metrics2.lib.Interns.info; 22 23 import java.util.concurrent.atomic.AtomicBoolean; 24 25 import org.apache.hadoop.classification.InterfaceAudience; 26 import org.apache.hadoop.metrics2.MetricsInfo; 27 import org.apache.hadoop.metrics2.MetricsSystem; 28 import org.apache.hadoop.metrics2.annotation.Metric; 29 import org.apache.hadoop.metrics2.annotation.Metrics; 30 import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; 31 import org.apache.hadoop.metrics2.lib.MetricsRegistry; 32 import org.apache.hadoop.metrics2.lib.MutableGaugeInt; 33 import org.apache.hadoop.metrics2.lib.MutableRate; 34 import com.google.common.annotations.VisibleForTesting; 35 36 @InterfaceAudience.Private 37 @Metrics(context="yarn") 38 public class ClusterMetrics { 39 40 private static AtomicBoolean isInitialized = new AtomicBoolean(false); 41 42 @Metric("# of active NMs") MutableGaugeInt numActiveNMs; 43 @Metric("# of decommissioned NMs") MutableGaugeInt numDecommissionedNMs; 44 @Metric("# of lost NMs") MutableGaugeInt numLostNMs; 45 @Metric("# of unhealthy NMs") MutableGaugeInt numUnhealthyNMs; 46 @Metric("# of Rebooted NMs") MutableGaugeInt numRebootedNMs; 47 @Metric("AM container launch delay") MutableRate aMLaunchDelay; 48 @Metric("AM register delay") MutableRate aMRegisterDelay; 49 50 private static final MetricsInfo RECORD_INFO = info("ClusterMetrics", 51 "Metrics for the Yarn Cluster"); 52 53 private static volatile ClusterMetrics INSTANCE = null; 54 private static MetricsRegistry registry; 55 getMetrics()56 public static ClusterMetrics getMetrics() { 57 if(!isInitialized.get()){ 58 synchronized (ClusterMetrics.class) { 59 if(INSTANCE == null){ 60 INSTANCE = new ClusterMetrics(); 61 registerMetrics(); 62 isInitialized.set(true); 63 } 64 } 65 } 66 return INSTANCE; 67 } 68 registerMetrics()69 private static void registerMetrics() { 70 registry = new MetricsRegistry(RECORD_INFO); 71 registry.tag(RECORD_INFO, "ResourceManager"); 72 MetricsSystem ms = DefaultMetricsSystem.instance(); 73 if (ms != null) { 74 ms.register("ClusterMetrics", "Metrics for the Yarn Cluster", INSTANCE); 75 } 76 } 77 78 @VisibleForTesting destroy()79 synchronized static void destroy() { 80 isInitialized.set(false); 81 INSTANCE = null; 82 } 83 84 //Active Nodemanagers getNumActiveNMs()85 public int getNumActiveNMs() { 86 return numActiveNMs.value(); 87 } 88 89 //Decommisioned NMs getNumDecommisionedNMs()90 public int getNumDecommisionedNMs() { 91 return numDecommissionedNMs.value(); 92 } 93 incrDecommisionedNMs()94 public void incrDecommisionedNMs() { 95 numDecommissionedNMs.incr(); 96 } 97 setDecommisionedNMs(int num)98 public void setDecommisionedNMs(int num) { 99 numDecommissionedNMs.set(num); 100 } 101 decrDecommisionedNMs()102 public void decrDecommisionedNMs() { 103 numDecommissionedNMs.decr(); 104 } 105 106 //Lost NMs getNumLostNMs()107 public int getNumLostNMs() { 108 return numLostNMs.value(); 109 } 110 incrNumLostNMs()111 public void incrNumLostNMs() { 112 numLostNMs.incr(); 113 } 114 decrNumLostNMs()115 public void decrNumLostNMs() { 116 numLostNMs.decr(); 117 } 118 119 //Unhealthy NMs getUnhealthyNMs()120 public int getUnhealthyNMs() { 121 return numUnhealthyNMs.value(); 122 } 123 incrNumUnhealthyNMs()124 public void incrNumUnhealthyNMs() { 125 numUnhealthyNMs.incr(); 126 } 127 decrNumUnhealthyNMs()128 public void decrNumUnhealthyNMs() { 129 numUnhealthyNMs.decr(); 130 } 131 132 //Rebooted NMs getNumRebootedNMs()133 public int getNumRebootedNMs() { 134 return numRebootedNMs.value(); 135 } 136 incrNumRebootedNMs()137 public void incrNumRebootedNMs() { 138 numRebootedNMs.incr(); 139 } 140 decrNumRebootedNMs()141 public void decrNumRebootedNMs() { 142 numRebootedNMs.decr(); 143 } 144 incrNumActiveNodes()145 public void incrNumActiveNodes() { 146 numActiveNMs.incr(); 147 } 148 decrNumActiveNodes()149 public void decrNumActiveNodes() { 150 numActiveNMs.decr(); 151 } 152 addAMLaunchDelay(long delay)153 public void addAMLaunchDelay(long delay) { 154 aMLaunchDelay.add(delay); 155 } 156 addAMRegisterDelay(long delay)157 public void addAMRegisterDelay(long delay) { 158 aMRegisterDelay.add(delay); 159 } 160 161 } 162