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