[ 
https://issues.apache.org/jira/browse/HBASE-20654?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16493514#comment-16493514
 ] 

liubangchen commented on HBASE-20654:
-------------------------------------

Expose metrics to tag of Hadoop:service=HBase,name=Master,sub=AssignmentManager:
{code:json}
  "beans" : [ {
    "name" : "Hadoop:service=HBase,name=Master,sub=AssignmentManager",
    "modelerType" : "Master,sub=AssignmentManager",
    "tag.regionsOffline" : 
"Namespace_tablename_regionname,Namespace_tablename_regionname",
    "tag.regionsOpening" : "",
    "tag.regionsOpen" : "",
    "tag.regionsClosing" : "",
    "tag.regionsClosed" : "",
    "tag.regionsSplitting" : "",
    "tag.regionsSplit" : "",
    "tag.regionsFailedOpen" : "",
    "tag.regionsFailedClose" : "",
    "tag.regionsMerging" : "",
    "tag.regionsMerged" : "",
    "tag.regionsSplittingNew" : "",
     "ritCount" : 0
  } ]
}
{code}

1. Add metrics tags, add attributes to interface MetricsAssignmentManagerSource

{code:java}
 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";
{code}

2. Modify class MetricsAssignmentManagerSourceImpl
{code:java}
 @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());
  ....
    metricsRegistry.snapshot(metricsRecordBuilder, all);
  }
{code}

3. Add new config is to control the number of region names in each region 
state. How about naming the config:

hbase.assignment.metric.maxmum.regions.in.each.state

4. Get metrics by class MetricsAssignmentWrapperImpl
{code:java}
private String getRegionsListByState(RegionState.State state) {
        List<String> regions = new LinkedList<String>();
        RegionStates rstates = this.am.getRegionStates();
        if (rstates == null) {
            return "";
        }
        List<RegionStates.RegionStateNode> list = 
rstates.getRegionsInTransition();
        if (list == null || list.isEmpty()) {
            return "";
        }

        List<RegionStates.RegionStateNode> metalist = new 
LinkedList<RegionStates.RegionStateNode>();
        List<RegionStates.RegionStateNode> datalist = new 
LinkedList<RegionStates.RegionStateNode>();

        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, ",");
    }
{code}

[~yuzhih...@gmail.com]  Can you give me some suggestions? Let me submit a 
patch. you can help me review it. thanks.

> Expose regions in transition thru JMX
> -------------------------------------
>
>                 Key: HBASE-20654
>                 URL: https://issues.apache.org/jira/browse/HBASE-20654
>             Project: HBase
>          Issue Type: Improvement
>            Reporter: Ted Yu
>            Assignee: liubangchen
>            Priority: Major
>
> Currently only the count of regions in transition is exposed thru JMX.
> Here is a sample snippet of the /jmx output:
> {code}
> {
>   "beans" : [ {
> ...
>   }, {
>     "name" : "Hadoop:service=HBase,name=Master,sub=AssignmentManager",
>     "modelerType" : "Master,sub=AssignmentManager",
>     "tag.Context" : "master",
> ...
>     "ritCount" : 3
> {code}
> It would be desirable to expose region name, state for the regions in 
> transition as well.
> We can place configurable upper bound on the number of entries returned in 
> case there're a lot of regions in transition.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to