001/**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one
004 * or more contributor license agreements.  See the NOTICE file
005 * distributed with this work for additional information
006 * regarding copyright ownership.  The ASF licenses this file
007 * to you under the Apache License, Version 2.0 (the
008 * "License"); you may not use this file except in compliance
009 * with the License.  You may obtain a copy of the License at
010 *
011 *     http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 */
019
020package org.apache.hadoop.hbase;
021
022import edu.umd.cs.findbugs.annotations.Nullable;
023import java.util.List;
024import java.util.Map;
025import org.apache.hadoop.hbase.client.RegionInfo;
026import org.apache.hadoop.hbase.master.RegionState;
027import org.apache.yetus.audience.InterfaceAudience;
028
029/**
030 * Metrics information on the HBase cluster.
031 * <p>
032 * <tt>ClusterMetrics</tt> provides clients with information such as:
033 * <ul>
034 * <li>The count and names of region servers in the cluster.</li>
035 * <li>The count and names of dead region servers in the cluster.</li>
036 * <li>The name of the active master for the cluster.</li>
037 * <li>The name(s) of the backup master(s) for the cluster, if they exist.</li>
038 * <li>The average cluster load.</li>
039 * <li>The number of regions deployed on the cluster.</li>
040 * <li>The number of requests since last report.</li>
041 * <li>Detailed region server loading and resource usage information,
042 *  per server and per region.</li>
043 * <li>Regions in transition at master</li>
044 * <li>The unique cluster ID</li>
045 * </ul>
046 * <tt>{@link Option}</tt> provides a way to get desired ClusterStatus information.
047 * The following codes will get all the cluster information.
048 * <pre>
049 * {@code
050 * // Original version still works
051 * Admin admin = connection.getAdmin();
052 * ClusterMetrics metrics = admin.getClusterStatus();
053 * // or below, a new version which has the same effects
054 * ClusterMetrics metrics = admin.getClusterStatus(EnumSet.allOf(Option.class));
055 * }
056 * </pre>
057 * If information about live servers is the only wanted.
058 * then codes in the following way:
059 * <pre>
060 * {@code
061 * Admin admin = connection.getAdmin();
062 * ClusterMetrics metrics = admin.getClusterStatus(EnumSet.of(Option.LIVE_SERVERS));
063 * }
064 * </pre>
065 */
066@InterfaceAudience.Public
067public interface ClusterMetrics {
068
069  /**
070   * @return the HBase version string as reported by the HMaster
071   */
072  @Nullable
073  String getHBaseVersion();
074
075  /**
076   * @return the names of region servers on the dead list
077   */
078  List<ServerName> getDeadServerNames();
079
080  /**
081   * @return the names of region servers on the live list
082   */
083  Map<ServerName, ServerMetrics> getLiveServerMetrics();
084
085  /**
086   * @return the number of regions deployed on the cluster
087   */
088  default int getRegionCount() {
089    return getLiveServerMetrics().entrySet().stream()
090        .mapToInt(v -> v.getValue().getRegionMetrics().size()).sum();
091  }
092
093  /**
094   * @return the number of requests since last report
095   */
096  default long getRequestCount() {
097    return getLiveServerMetrics().entrySet().stream()
098        .flatMap(v -> v.getValue().getRegionMetrics().values().stream())
099        .mapToLong(RegionMetrics::getRequestCount).sum();
100  }
101
102  /**
103   * Returns detailed information about the current master {@link ServerName}.
104   * @return current master information if it exists
105   */
106  @Nullable
107  ServerName getMasterName();
108
109  /**
110   * @return the names of backup masters
111   */
112  List<ServerName> getBackupMasterNames();
113
114  @InterfaceAudience.Private
115  List<RegionState> getRegionStatesInTransition();
116
117  @Nullable
118  String getClusterId();
119
120  List<String> getMasterCoprocessorNames();
121
122  default long getLastMajorCompactionTimestamp(TableName table) {
123    return getLiveServerMetrics().values().stream()
124        .flatMap(s -> s.getRegionMetrics().values().stream())
125        .filter(r -> RegionInfo.getTable(r.getRegionName()).equals(table))
126        .mapToLong(RegionMetrics::getLastMajorCompactionTimestamp).min().orElse(0);
127  }
128
129  default long getLastMajorCompactionTimestamp(byte[] regionName) {
130    return getLiveServerMetrics().values().stream()
131        .filter(s -> s.getRegionMetrics().containsKey(regionName))
132        .findAny()
133        .map(s -> s.getRegionMetrics().get(regionName).getLastMajorCompactionTimestamp())
134        .orElse(0L);
135  }
136
137  @Nullable
138  Boolean getBalancerOn();
139
140  int getMasterInfoPort();
141
142  List<ServerName> getServersName();
143
144  /**
145   * @return the average cluster load
146   */
147  default double getAverageLoad() {
148    int serverSize = getLiveServerMetrics().size();
149    if (serverSize == 0) {
150      return 0;
151    }
152    return (double)getRegionCount() / (double)serverSize;
153  }
154
155  /**
156   * Kinds of ClusterMetrics
157   */
158  enum Option {
159    /**
160     * metrics about hbase version
161     */
162    HBASE_VERSION,
163    /**
164     * metrics about cluster id
165     */
166    CLUSTER_ID,
167    /**
168     * metrics about balancer is on or not
169     */
170    BALANCER_ON,
171    /**
172     * metrics about live region servers
173     */
174    LIVE_SERVERS,
175    /**
176     * metrics about dead region servers
177     */
178    DEAD_SERVERS,
179    /**
180     * metrics about master name
181     */
182    MASTER,
183    /**
184     * metrics about backup masters name
185     */
186    BACKUP_MASTERS,
187    /**
188     * metrics about master coprocessors
189     */
190    MASTER_COPROCESSORS,
191    /**
192     * metrics about regions in transition
193     */
194    REGIONS_IN_TRANSITION,
195    /**
196     * metrics info port
197     */
198    MASTER_INFO_PORT,
199    /**
200     * metrics about live region servers name
201     */
202    SERVERS_NAME
203  }
204}