blob: d65b0291366b7def4d7d8bd81b507353f27ec5fa [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.hbase.master;
import java.io.IOException;
import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.yetus.audience.InterfaceAudience;
import org.apache.hadoop.hbase.quotas.QuotaObserverChore;
import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot;
import org.apache.hadoop.hbase.util.PairOfSameType;
import org.apache.hadoop.hbase.zookeeper.ZKWatcher;
/**
* Impl for exposing HMaster Information through JMX
*/
@InterfaceAudience.Private
public class MetricsMasterWrapperImpl implements MetricsMasterWrapper {
private final HMaster master;
public MetricsMasterWrapperImpl(final HMaster master) {
this.master = master;
}
@Override
public double getAverageLoad() {
return master.getAverageLoad();
}
@Override
public long getSplitPlanCount() {
if (master.getRegionNormalizerManager() == null) {
return 0;
}
return master.getRegionNormalizerManager().getSplitPlanCount();
}
@Override
public long getMergePlanCount() {
if (master.getRegionNormalizerManager() == null) {
return 0;
}
return master.getRegionNormalizerManager().getMergePlanCount();
}
@Override
public long getMasterInitializationTime() {
return master.getMasterFinishedInitializationTime();
}
@Override
public String getClusterId() {
return master.getClusterId();
}
@Override
public String getZookeeperQuorum() {
ZKWatcher zk = master.getZooKeeper();
if (zk == null) {
return "";
}
return zk.getQuorum();
}
@Override
public String[] getCoprocessors() {
return master.getMasterCoprocessors();
}
@Override
public long getStartTime() {
return master.getMasterStartTime();
}
@Override
public long getActiveTime() {
return master.getMasterActiveTime();
}
@Override
public String getRegionServers() {
ServerManager serverManager = this.master.getServerManager();
if (serverManager == null) {
return "";
}
return StringUtils.join(serverManager.getOnlineServers().keySet(), ";");
}
@Override
public int getNumRegionServers() {
ServerManager serverManager = this.master.getServerManager();
if (serverManager == null) {
return 0;
}
return serverManager.getOnlineServers().size();
}
@Override
public String getDeadRegionServers() {
ServerManager serverManager = this.master.getServerManager();
if (serverManager == null) {
return "";
}
return StringUtils.join(serverManager.getDeadServers().copyServerNames(), ";");
}
@Override
public int getNumDeadRegionServers() {
ServerManager serverManager = this.master.getServerManager();
if (serverManager == null) {
return 0;
}
return serverManager.getDeadServers().size();
}
@Override public boolean isRunning() {
return !(master.isStopped() || master.isStopping());
}
@Override
public String getDrainingRegionServers() {
ServerManager serverManager = this.master.getServerManager();
if (serverManager == null) {
return "";
}
return StringUtils.join(serverManager.getDrainingServersList() , ";");
}
@Override
public int getNumDrainingRegionServers() {
ServerManager serverManager = this.master.getServerManager();
if (serverManager == null) {
return 0;
}
return serverManager.getDrainingServersList().size();
}
@Override
public String getServerName() {
ServerName serverName = master.getServerName();
if (serverName == null) {
return "";
}
return serverName.getServerName();
}
@Override
public boolean getIsActiveMaster() {
return master.isActiveMaster();
}
@Override
public long getNumWALFiles() {
return master.getNumWALFiles();
}
@Override
public Map<String,Entry<Long,Long>> getTableSpaceUtilization() {
if (master == null) {
return Collections.emptyMap();
}
QuotaObserverChore quotaChore = master.getQuotaObserverChore();
if (quotaChore == null) {
return Collections.emptyMap();
}
Map<TableName,SpaceQuotaSnapshot> tableSnapshots = quotaChore.getTableQuotaSnapshots();
Map<String,Entry<Long,Long>> convertedData = new HashMap<>();
for (Entry<TableName,SpaceQuotaSnapshot> entry : tableSnapshots.entrySet()) {
convertedData.put(entry.getKey().toString(), convertSnapshot(entry.getValue()));
}
return convertedData;
}
@Override
public Map<String,Entry<Long,Long>> getNamespaceSpaceUtilization() {
QuotaObserverChore quotaChore = master.getQuotaObserverChore();
if (quotaChore == null) {
return Collections.emptyMap();
}
Map<String,SpaceQuotaSnapshot> namespaceSnapshots = quotaChore.getNamespaceQuotaSnapshots();
Map<String,Entry<Long,Long>> convertedData = new HashMap<>();
for (Entry<String,SpaceQuotaSnapshot> entry : namespaceSnapshots.entrySet()) {
convertedData.put(entry.getKey(), convertSnapshot(entry.getValue()));
}
return convertedData;
}
Entry<Long,Long> convertSnapshot(SpaceQuotaSnapshot snapshot) {
return new SimpleImmutableEntry<Long,Long>(snapshot.getUsage(), snapshot.getLimit());
}
@Override
public PairOfSameType<Integer> getRegionCounts() {
try {
if (!master.isInitialized()) {
return new PairOfSameType<>(0, 0);
}
Integer onlineRegionCount = 0;
Integer offlineRegionCount = 0;
List<TableDescriptor> descriptors = master.listTableDescriptors(null, null,
null, false);
for (TableDescriptor htDesc : descriptors) {
TableName tableName = htDesc.getTableName();
Map<RegionState.State, List<RegionInfo>> tableRegions =
master.getAssignmentManager().getRegionStates()
.getRegionByStateOfTable(tableName);
onlineRegionCount += tableRegions.get(RegionState.State.OPEN).size();
offlineRegionCount += tableRegions.get(RegionState.State.OFFLINE).size();
}
return new PairOfSameType<>(onlineRegionCount, offlineRegionCount);
} catch (IOException e) {
return new PairOfSameType<>(0, 0);
}
}
}