001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.master;
019
020import java.io.IOException;
021import java.util.AbstractMap.SimpleImmutableEntry;
022import java.util.Collections;
023import java.util.HashMap;
024import java.util.List;
025import java.util.Map;
026import java.util.Map.Entry;
027import org.apache.commons.lang3.StringUtils;
028import org.apache.hadoop.hbase.ServerName;
029import org.apache.hadoop.hbase.TableName;
030import org.apache.hadoop.hbase.client.RegionInfo;
031import org.apache.hadoop.hbase.client.TableDescriptor;
032import org.apache.hadoop.hbase.quotas.QuotaObserverChore;
033import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot;
034import org.apache.hadoop.hbase.util.PairOfSameType;
035import org.apache.hadoop.hbase.zookeeper.ZKWatcher;
036import org.apache.yetus.audience.InterfaceAudience;
037
038/**
039 * Impl for exposing HMaster Information through JMX
040 */
041@InterfaceAudience.Private
042public class MetricsMasterWrapperImpl implements MetricsMasterWrapper {
043
044  private final HMaster master;
045
046  public MetricsMasterWrapperImpl(final HMaster master) {
047    this.master = master;
048  }
049
050  @Override
051  public double getAverageLoad() {
052    return master.getAverageLoad();
053  }
054
055  @Override
056  public long getSplitPlanCount() {
057    if (master.getRegionNormalizerManager() == null) {
058      return 0;
059    }
060    return master.getRegionNormalizerManager().getSplitPlanCount();
061  }
062
063  @Override
064  public long getMergePlanCount() {
065    if (master.getRegionNormalizerManager() == null) {
066      return 0;
067    }
068    return master.getRegionNormalizerManager().getMergePlanCount();
069  }
070
071  @Override
072  public long getMasterInitializationTime() {
073    return master.getMasterFinishedInitializationTime();
074  }
075
076  @Override
077  public String getClusterId() {
078    return master.getClusterId();
079  }
080
081  @Override
082  public String getZookeeperQuorum() {
083    ZKWatcher zk = master.getZooKeeper();
084    if (zk == null) {
085      return "";
086    }
087    return zk.getQuorum();
088  }
089
090  @Override
091  public String[] getCoprocessors() {
092    return master.getMasterCoprocessors();
093  }
094
095  @Override
096  public long getStartTime() {
097    return master.getMasterStartTime();
098  }
099
100  @Override
101  public long getActiveTime() {
102    return master.getMasterActiveTime();
103  }
104
105  @Override
106  public String getRegionServers() {
107    ServerManager serverManager = this.master.getServerManager();
108    if (serverManager == null) {
109      return "";
110    }
111    return StringUtils.join(serverManager.getOnlineServers().keySet(), ";");
112  }
113
114  @Override
115  public int getNumRegionServers() {
116    ServerManager serverManager = this.master.getServerManager();
117    if (serverManager == null) {
118      return 0;
119    }
120    return serverManager.getOnlineServers().size();
121  }
122
123  @Override
124  public String getDeadRegionServers() {
125    ServerManager serverManager = this.master.getServerManager();
126    if (serverManager == null) {
127      return "";
128    }
129    return StringUtils.join(serverManager.getDeadServers().copyServerNames(), ";");
130  }
131
132  @Override
133  public int getNumDeadRegionServers() {
134    ServerManager serverManager = this.master.getServerManager();
135    if (serverManager == null) {
136      return 0;
137    }
138    return serverManager.getDeadServers().size();
139  }
140
141  @Override
142  public boolean isRunning() {
143    return !(master.isStopped() || master.isStopping());
144  }
145
146  @Override
147  public String getDrainingRegionServers() {
148    ServerManager serverManager = this.master.getServerManager();
149    if (serverManager == null) {
150      return "";
151    }
152    return StringUtils.join(serverManager.getDrainingServersList(), ";");
153  }
154
155  @Override
156  public int getNumDrainingRegionServers() {
157    ServerManager serverManager = this.master.getServerManager();
158    if (serverManager == null) {
159      return 0;
160    }
161    return serverManager.getDrainingServersList().size();
162  }
163
164  @Override
165  public String getServerName() {
166    ServerName serverName = master.getServerName();
167    if (serverName == null) {
168      return "";
169    }
170    return serverName.getServerName();
171  }
172
173  @Override
174  public boolean getIsActiveMaster() {
175    return master.isActiveMaster();
176  }
177
178  @Override
179  public long getNumWALFiles() {
180    return master.getNumWALFiles();
181  }
182
183  @Override
184  public Map<String, Entry<Long, Long>> getTableSpaceUtilization() {
185    if (master == null) {
186      return Collections.emptyMap();
187    }
188    QuotaObserverChore quotaChore = master.getQuotaObserverChore();
189    if (quotaChore == null) {
190      return Collections.emptyMap();
191    }
192    Map<TableName, SpaceQuotaSnapshot> tableSnapshots = quotaChore.getTableQuotaSnapshots();
193    Map<String, Entry<Long, Long>> convertedData = new HashMap<>();
194    for (Entry<TableName, SpaceQuotaSnapshot> entry : tableSnapshots.entrySet()) {
195      convertedData.put(entry.getKey().toString(), convertSnapshot(entry.getValue()));
196    }
197    return convertedData;
198  }
199
200  @Override
201  public Map<String, Entry<Long, Long>> getNamespaceSpaceUtilization() {
202    QuotaObserverChore quotaChore = master.getQuotaObserverChore();
203    if (quotaChore == null) {
204      return Collections.emptyMap();
205    }
206    Map<String, SpaceQuotaSnapshot> namespaceSnapshots = quotaChore.getNamespaceQuotaSnapshots();
207    Map<String, Entry<Long, Long>> convertedData = new HashMap<>();
208    for (Entry<String, SpaceQuotaSnapshot> entry : namespaceSnapshots.entrySet()) {
209      convertedData.put(entry.getKey(), convertSnapshot(entry.getValue()));
210    }
211    return convertedData;
212  }
213
214  Entry<Long, Long> convertSnapshot(SpaceQuotaSnapshot snapshot) {
215    return new SimpleImmutableEntry<Long, Long>(snapshot.getUsage(), snapshot.getLimit());
216  }
217
218  @Override
219  public PairOfSameType<Integer> getRegionCounts() {
220    try {
221      if (!master.isInitialized()) {
222        return new PairOfSameType<>(0, 0);
223      }
224      Integer onlineRegionCount = 0;
225      Integer offlineRegionCount = 0;
226
227      List<TableDescriptor> descriptors = master.listTableDescriptors(null, null, null, false);
228
229      for (TableDescriptor htDesc : descriptors) {
230        TableName tableName = htDesc.getTableName();
231        Map<RegionState.State, List<RegionInfo>> tableRegions =
232          master.getAssignmentManager().getRegionStates().getRegionByStateOfTable(tableName);
233        onlineRegionCount += tableRegions.get(RegionState.State.OPEN).size();
234        offlineRegionCount += tableRegions.get(RegionState.State.OFFLINE).size();
235      }
236      return new PairOfSameType<>(onlineRegionCount, offlineRegionCount);
237    } catch (IOException e) {
238      return new PairOfSameType<>(0, 0);
239    }
240  }
241}