diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSource.java index ec4a34e3bd..ebf1fe39c3 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSource.java @@ -66,6 +66,43 @@ public interface MetricsAssignmentManagerSource extends BaseSource { String OPERATION_COUNT_NAME = "operationCount"; + // Regions State metrics + String REGIONS_STATE_OFFLINE="regionsOffline"; + String REGIONS_STATE_OFFLINE_DESC="Regions with state OFFLINE"; + + String REGIONS_STATE_OPENING="regionsOpening"; + String REGIONS_STATE_OPENING_DESC="Regions with state OPENING"; + + String REGIONS_STATE_OPEN="regionsOpen"; + String REGIONS_STATE_OPEN_DESC="Regions with state OPEN"; + + String REGIONS_STATE_CLOSING="regionsClosing"; + String REGIONS_STATE_CLOSING_DESC="Regions with state CLOSING"; + + String REGIONS_STATE_CLOSED="regionsClosed"; + String REGIONS_STATE_CLOSED_DESC="Regions with state CLOSED"; + + String REGIONS_STATE_SPLITTING="regionsSplitting"; + String REGIONS_STATE_SPLITTING_DESC="Regions with state SPLITTING"; + + String REGIONS_STATE_SPLIT="regionsSplit"; + String REGIONS_STATE_SPLIT_DESC="Regions with state SPLIT"; + + String REGIONS_STATE_FAILED_OPEN="regionsFailedOpen"; + String REGIONS_STATE_FAILED_OPEN_DESC="Regions with state failed open"; + + String REGIONS_STATE_FAILED_CLOSE="regionsFailedClose"; + String REGIONS_STATE_FAILED_CLOSE_DESC="Regions with state failed close"; + + String REGIONS_STATE_MERGING="regionsMerging"; + String REGIONS_STATE_MERGING_DESC="Regions with state merging"; + + String REGIONS_STATE_MERGED="regionsMerged"; + String REGIONS_STATE_MERGED_DESC="Regions with state merged"; + + String REGIONS_STATE_SPLITTING_NEW="regionsSplittingNew"; + String REGIONS_STATE_SPLITTING_NEW_DESC="Regions with state"; + /** * Set the number of regions in transition. * diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentWrapper.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentWrapper.java index 0fd73eb500..f7cff338a9 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentWrapper.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentWrapper.java @@ -1,7 +1,98 @@ -package org.apache.hadoop.hbase.master.balancer; - /** - * Created by chenlong on 2018/5/29. + * 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. */ -public class MetricsAssignmentWrapper { + +package org.apache.hadoop.hbase.master; + +import org.apache.yetus.audience.InterfaceAudience; + +@InterfaceAudience.Private +public interface MetricsAssignmentWrapper { + + /** + * Get the state of offline regions + * + * @return + */ + String getOfflineRegions(); + + /** + * Get the state of opening regions + * @return + */ + String getOpeningRegions(); + + /** + * Get the state of open regions + * @return + */ + String getOpenRegions(); + + /** + * Get the state of closing regions + * @return + */ + String getClosingRegions(); + + /** + * Get the state of closed regions + * @return + */ + String getClosedRegions(); + + /** + * Get the state of splitting regions + * @return + */ + String getSplittingRegions(); + + /** + * Get the state of split regions + * @return + */ + String getSplitRegions(); + + /** + * Get the state of failedopen regions + * @return + */ + String getFailedOpenRegions(); + + /** + * Get the state of failedclose regions + * @return + */ + String getFailedCloseRegions(); + + /** + * Get the state of merging regions + * @return + */ + String getMergingRegions(); + + /** + * Get the state of merged regions + * @return + */ + String getMergedRegions(); + + /** + * Get the state of splittingnew regions + * @return + */ + String getSplittingNewRegions(); } diff --git a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.java b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.java index 52c03bf472..a16e8f265d 100644 --- a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.java +++ b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.java @@ -18,6 +18,9 @@ package org.apache.hadoop.hbase.master; +import org.apache.hadoop.hbase.metrics.Interns; +import org.apache.hadoop.metrics2.MetricsCollector; +import org.apache.hadoop.metrics2.MetricsRecordBuilder; import org.apache.yetus.audience.InterfaceAudience; import org.apache.hadoop.hbase.metrics.BaseSourceImpl; import org.apache.hadoop.hbase.metrics.OperationMetrics; @@ -42,8 +45,11 @@ public class MetricsAssignmentManagerSourceImpl private OperationMetrics splitMetrics; private OperationMetrics mergeMetrics; - public MetricsAssignmentManagerSourceImpl() { + private MetricsAssignmentWrapper metricsAssignmentWrapper; + + public MetricsAssignmentManagerSourceImpl(MetricsAssignmentWrapper metricsAssignmentWrapper) { this(METRICS_NAME, METRICS_DESCRIPTION, METRICS_CONTEXT, METRICS_JMX_CONTEXT); + this.metricsAssignmentWrapper=metricsAssignmentWrapper; } public MetricsAssignmentManagerSourceImpl(String metricsName, @@ -71,6 +77,26 @@ public class MetricsAssignmentManagerSourceImpl mergeMetrics = new OperationMetrics(registry, MERGE_METRIC_PREFIX); } + @Override + public void getMetrics(MetricsCollector metricsCollector, boolean all) { + MetricsRecordBuilder metricsRecordBuilder = metricsCollector.addRecord(metricsName); + if(metricsRecordBuilder!=null){ + metricsRecordBuilder.tag(Interns.info(REGIONS_STATE_OFFLINE,REGIONS_STATE_OFFLINE_DESC),metricsAssignmentWrapper.getOfflineRegions()); + metricsRecordBuilder.tag(Interns.info(REGIONS_STATE_OPENING,REGIONS_STATE_OPENING_DESC),metricsAssignmentWrapper.getOpeningRegions()); + metricsRecordBuilder.tag(Interns.info(REGIONS_STATE_OPEN,REGIONS_STATE_OPEN_DESC),metricsAssignmentWrapper.getOpenRegions()); + metricsRecordBuilder.tag(Interns.info(REGIONS_STATE_CLOSING,REGIONS_STATE_CLOSING_DESC),metricsAssignmentWrapper.getClosingRegions()); + metricsRecordBuilder.tag(Interns.info(REGIONS_STATE_CLOSED,REGIONS_STATE_CLOSED_DESC),metricsAssignmentWrapper.getClosedRegions()); + metricsRecordBuilder.tag(Interns.info(REGIONS_STATE_SPLITTING,REGIONS_STATE_SPLITTING_DESC),metricsAssignmentWrapper.getSplitRegions()); + metricsRecordBuilder.tag(Interns.info(REGIONS_STATE_SPLIT,REGIONS_STATE_SPLIT_DESC),metricsAssignmentWrapper.getSplitRegions()); + metricsRecordBuilder.tag(Interns.info(REGIONS_STATE_FAILED_OPEN,REGIONS_STATE_FAILED_OPEN_DESC),metricsAssignmentWrapper.getFailedOpenRegions()); + metricsRecordBuilder.tag(Interns.info(REGIONS_STATE_FAILED_CLOSE,REGIONS_STATE_FAILED_CLOSE_DESC),metricsAssignmentWrapper.getFailedCloseRegions()); + metricsRecordBuilder.tag(Interns.info(REGIONS_STATE_MERGING,REGIONS_STATE_MERGING_DESC),metricsAssignmentWrapper.getMergingRegions()); + metricsRecordBuilder.tag(Interns.info(REGIONS_STATE_MERGED,REGIONS_STATE_MERGED_DESC),metricsAssignmentWrapper.getMergedRegions()); + metricsRecordBuilder.tag(Interns.info(REGIONS_STATE_SPLITTING_NEW,REGIONS_STATE_SPLITTING_NEW_DESC),metricsAssignmentWrapper.getSplittingNewRegions()); + } + metricsRegistry.snapshot(metricsRecordBuilder, all); + } + @Override public void setRIT(final int ritCount) { ritGauge.set(ritCount); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManager.java index d13ffe9b83..eff4216454 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsAssignmentManager.java @@ -33,10 +33,10 @@ public class MetricsAssignmentManager { private final ProcedureMetrics splitProcMetrics; private final ProcedureMetrics mergeProcMetrics; - public MetricsAssignmentManager() { - assignmentManagerSource = CompatibilitySingletonFactory.getInstance( - MetricsAssignmentManagerSource.class); - + public MetricsAssignmentManager(MetricsAssignmentWrapper metricsAssignmentWrapper) { +// assignmentManagerSource = CompatibilitySingletonFactory.getInstance( +// MetricsAssignmentManagerSource.class); + assignmentManagerSource=new MetricsAssignmentManagerSourceImpl(metricsAssignmentWrapper); assignProcMetrics = convertToProcedureMetrics(assignmentManagerSource.getAssignMetrics()); unassignProcMetrics = convertToProcedureMetrics(assignmentManagerSource.getUnassignMetrics()); splitProcMetrics = convertToProcedureMetrics(assignmentManagerSource.getSplitMetrics()); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java index 1d95041a04..0725f35987 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java @@ -144,6 +144,10 @@ public class AssignmentManager implements ServerListener { "hbase.metrics.rit.stuck.warning.threshold"; private static final int DEFAULT_RIT_STUCK_WARNING_THRESHOLD = 60 * 1000; + /* control the number of region names in each region state */ + public static final String METRIC_MAXNUM_REGIONS_IN_EACH_STATE="hbase.assignment.metric.maxmum.regions.in.each.state"; + private static final int DEFAULT_METRIC_MAXNUM_REGIONS_IN_EACH_STATE = 200; + private final ProcedureEvent metaInitializedEvent = new ProcedureEvent<>("meta initialized"); private final ProcedureEvent metaLoadEvent = new ProcedureEvent<>("meta load"); @@ -176,6 +180,7 @@ public class AssignmentManager implements ServerListener { private final int assignDispatchWaitQueueMaxSize; private final int assignDispatchWaitMillis; private final int assignMaxAttempts; + private final int maxnumRegionInEachState; private final Object checkIfShouldMoveSystemRegionLock = new Object(); @@ -188,7 +193,7 @@ public class AssignmentManager implements ServerListener { public AssignmentManager(final MasterServices master, final RegionStateStore stateStore) { this.master = master; this.regionStateStore = stateStore; - this.metrics = new MetricsAssignmentManager(); + this.metrics = new MetricsAssignmentManager(new MetricsAssignmentWrapperImpl(this)); final Configuration conf = master.getConfiguration(); @@ -208,6 +213,7 @@ public class AssignmentManager implements ServerListener { DEFAULT_RIT_CHORE_INTERVAL_MSEC); this.ritChore = new RegionInTransitionChore(ritChoreInterval); + this.maxnumRegionInEachState=conf.getInt(METRIC_MAXNUM_REGIONS_IN_EACH_STATE,DEFAULT_METRIC_MAXNUM_REGIONS_IN_EACH_STATE); // Used for region related procedure. setRegionNormalizer(master.getRegionNormalizer()); } @@ -289,6 +295,10 @@ public class AssignmentManager implements ServerListener { return assignMaxAttempts; } + protected int getMaxnumRegionInEachState(){ + return maxnumRegionInEachState; + } + /** * Add the listener to the notification list. * @param listener The AssignmentListener to register diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MetricsAssignmentWrapperImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MetricsAssignmentWrapperImpl.java index c3c35e044a..e125e85acb 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MetricsAssignmentWrapperImpl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/MetricsAssignmentWrapperImpl.java @@ -1,7 +1,133 @@ -package org.apache.hadoop.hbase.master.assignment; - /** - * Created by chenlong on 2018/5/29. + * 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. */ -public class MetricsAssignmentWrapperImpl { + +package org.apache.hadoop.hbase.master.assignment; + +import org.apache.commons.lang.StringUtils; +import org.apache.hadoop.hbase.MetaTableAccessor; +import org.apache.hadoop.hbase.master.MetricsAssignmentWrapper; +import org.apache.hadoop.hbase.master.RegionState; +import org.apache.yetus.audience.InterfaceAudience; + +import java.util.LinkedList; +import java.util.List; + +@InterfaceAudience.Private +public class MetricsAssignmentWrapperImpl implements MetricsAssignmentWrapper { + + private AssignmentManager am; + + public MetricsAssignmentWrapperImpl(AssignmentManager am) { + this.am = am; + } + + private String getRegionsListByState(RegionState.State state) { + List regions = new LinkedList(); + RegionStates rstates = this.am.getRegionStates(); + if (rstates == null) { + return ""; + } + List list = rstates.getRegionsInTransition(); + if (list == null || list.isEmpty()) { + return ""; + } + + List metalist = new LinkedList(); + List datalist = new LinkedList(); + + int i = 0; + for (RegionStates.RegionStateNode rsn : list) { + if (rsn.getTable().isSystemTable()) { + metalist.add(rsn); + } else { + datalist.add(rsn); + } + } + datalist.addAll(metalist); + for (RegionStates.RegionStateNode rsn : datalist) { + if (rsn.getState().equals(state)) { + regions.add(String.format("%s_%s_%s", rsn.getTable().getNamespaceAsString(), rsn.getTable().getNameAsString(), rsn.getRegionInfo() == null ? "" : rsn.getRegionInfo().getEncodedName())); + i++; + } + if (i > this.am.getMaxnumRegionInEachState()) { + break; + } + } + return StringUtils.join(regions, ","); + } + + @Override + public String getOfflineRegions() { + return this.getRegionsListByState(RegionState.State.OFFLINE); + } + + @Override + public String getOpeningRegions() { + return this.getRegionsListByState(RegionState.State.OPENING); + } + + @Override + public String getOpenRegions() { + return this.getRegionsListByState(RegionState.State.OPEN); + } + + @Override + public String getClosingRegions() { + return this.getRegionsListByState(RegionState.State.CLOSING); + } + + @Override + public String getClosedRegions() { + return this.getRegionsListByState(RegionState.State.CLOSED); + } + + @Override + public String getSplittingRegions() { + return this.getRegionsListByState(RegionState.State.SPLITTING); + } + + @Override + public String getSplitRegions() { + return this.getRegionsListByState(RegionState.State.SPLIT); + } + + @Override + public String getFailedOpenRegions() { + return this.getRegionsListByState(RegionState.State.FAILED_OPEN); + } + + @Override + public String getFailedCloseRegions() { + return this.getRegionsListByState(RegionState.State.FAILED_CLOSE); + } + + @Override + public String getMergingRegions() { + return this.getRegionsListByState(RegionState.State.MERGING); + } + + @Override + public String getMergedRegions() { + return this.getRegionsListByState(RegionState.State.MERGED); + } + + @Override + public String getSplittingNewRegions() { + return this.getRegionsListByState(RegionState.State.SPLITTING_NEW); + } }