2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 package org
.apache
.hadoop
.hbase
.regionserver
;
20 import org
.apache
.hadoop
.hbase
.CompatibilitySingletonFactory
;
21 import org
.apache
.hadoop
.hbase
.TableName
;
22 import org
.apache
.hadoop
.hbase
.metrics
.Meter
;
23 import org
.apache
.hadoop
.hbase
.metrics
.MetricRegistries
;
24 import org
.apache
.hadoop
.hbase
.metrics
.MetricRegistry
;
25 import org
.apache
.hadoop
.hbase
.metrics
.Timer
;
26 import org
.apache
.hadoop
.conf
.Configuration
;
27 import org
.apache
.yetus
.audience
.InterfaceAudience
;
28 import org
.apache
.yetus
.audience
.InterfaceStability
;
31 * Maintains regionserver statistics and publishes them through the metrics interfaces.
32 * This class has a number of metrics variables that are publicly accessible;
33 * these variables (objects) have methods to update their values. Batch your updates rather than
34 * call on each instance else all threads will do nothing but contend trying to maintain metric
37 @InterfaceStability.Evolving
38 @InterfaceAudience.Private
39 public class MetricsRegionServer
{
40 public static final String RS_ENABLE_TABLE_METRICS_KEY
=
41 "hbase.regionserver.enable.table.latencies";
42 public static final boolean RS_ENABLE_TABLE_METRICS_DEFAULT
= true;
43 public static final String RS_ENABLE_SERVER_QUERY_METER_METRICS_KEY
=
44 "hbase.regionserver.enable.server.query.meter";
45 public static final boolean RS_ENABLE_SERVER_QUERY_METER_METRICS_KEY_DEFAULT
= false;
46 public static final String RS_ENABLE_TABLE_QUERY_METER_METRICS_KEY
=
47 "hbase.regionserver.enable.table.query.meter";
48 public static final boolean RS_ENABLE_TABLE_QUERY_METER_METRICS_KEY_DEFAULT
= false;
50 public static final String SLOW_METRIC_TIME
= "hbase.ipc.slow.metric.time";
51 private final MetricsRegionServerSource serverSource
;
52 private final MetricsRegionServerWrapper regionServerWrapper
;
53 private RegionServerTableMetrics tableMetrics
;
54 private final MetricsTable metricsTable
;
55 private MetricsRegionServerQuotaSource quotaSource
;
56 private final MetricsUserAggregate userAggregate
;
58 private MetricRegistry metricRegistry
;
59 private Timer bulkLoadTimer
;
60 // Incremented once for each call to Scan#nextRaw
61 private Meter serverReadQueryMeter
;
62 // Incremented per write.
63 private Meter serverWriteQueryMeter
;
64 protected long slowMetricTime
;
65 protected static final int DEFAULT_SLOW_METRIC_TIME
= 1000; // milliseconds
67 public MetricsRegionServer(MetricsRegionServerWrapper regionServerWrapper
, Configuration conf
,
68 MetricsTable metricsTable
) {
69 this(regionServerWrapper
,
70 CompatibilitySingletonFactory
.getInstance(MetricsRegionServerSourceFactory
.class)
71 .createServer(regionServerWrapper
), createTableMetrics(conf
), metricsTable
,
72 MetricsUserAggregateFactory
.getMetricsUserAggregate(conf
));
74 // Create hbase-metrics module based metrics. The registry should already be registered by the
75 // MetricsRegionServerSource
76 metricRegistry
= MetricRegistries
.global().get(serverSource
.getMetricRegistryInfo()).get();
78 // create and use metrics from the new hbase-metrics based registry.
79 bulkLoadTimer
= metricRegistry
.timer("Bulkload");
81 slowMetricTime
= conf
.getLong(SLOW_METRIC_TIME
, DEFAULT_SLOW_METRIC_TIME
);
82 quotaSource
= CompatibilitySingletonFactory
.getInstance(MetricsRegionServerQuotaSource
.class);
83 if (conf
.getBoolean(RS_ENABLE_SERVER_QUERY_METER_METRICS_KEY
,
84 RS_ENABLE_SERVER_QUERY_METER_METRICS_KEY_DEFAULT
)) {
85 serverReadQueryMeter
= metricRegistry
.meter("ServerReadQueryPerSecond");
86 serverWriteQueryMeter
= metricRegistry
.meter("ServerWriteQueryPerSecond");
90 MetricsRegionServer(MetricsRegionServerWrapper regionServerWrapper
,
91 MetricsRegionServerSource serverSource
, RegionServerTableMetrics tableMetrics
,
92 MetricsTable metricsTable
, MetricsUserAggregate userAggregate
) {
93 this.regionServerWrapper
= regionServerWrapper
;
94 this.serverSource
= serverSource
;
95 this.tableMetrics
= tableMetrics
;
96 this.metricsTable
= metricsTable
;
97 this.userAggregate
= userAggregate
;
101 * Creates an instance of {@link RegionServerTableMetrics} only if the feature is enabled.
103 static RegionServerTableMetrics
createTableMetrics(Configuration conf
) {
104 if (conf
.getBoolean(RS_ENABLE_TABLE_METRICS_KEY
, RS_ENABLE_TABLE_METRICS_DEFAULT
)) {
105 return new RegionServerTableMetrics(
106 conf
.getBoolean(RS_ENABLE_TABLE_QUERY_METER_METRICS_KEY
,
107 RS_ENABLE_TABLE_QUERY_METER_METRICS_KEY_DEFAULT
));
112 public MetricsRegionServerSource
getMetricsSource() {
116 public MetricsUserAggregate
getMetricsUserAggregate() {
117 return userAggregate
;
120 public MetricsRegionServerWrapper
getRegionServerWrapper() {
121 return regionServerWrapper
;
124 public void updatePutBatch(TableName tn
, long t
) {
125 if (tableMetrics
!= null && tn
!= null) {
126 tableMetrics
.updatePutBatch(tn
, t
);
128 serverSource
.updatePutBatch(t
);
131 public void updatePut(TableName tn
, long t
) {
132 if (tableMetrics
!= null && tn
!= null) {
133 tableMetrics
.updatePut(tn
, t
);
135 if (t
> slowMetricTime
) {
136 serverSource
.incrSlowPut();
138 serverSource
.updatePut(t
);
139 userAggregate
.updatePut(t
);
142 public void updateDelete(TableName tn
, long t
) {
143 if (tableMetrics
!= null && tn
!= null) {
144 tableMetrics
.updateDelete(tn
, t
);
146 if (t
> slowMetricTime
) {
147 serverSource
.incrSlowDelete();
149 serverSource
.updateDelete(t
);
150 userAggregate
.updateDelete(t
);
153 public void updateDeleteBatch(TableName tn
, long t
) {
154 if (tableMetrics
!= null && tn
!= null) {
155 tableMetrics
.updateDeleteBatch(tn
, t
);
157 serverSource
.updateDeleteBatch(t
);
160 public void updateCheckAndDelete(TableName tn
, long t
) {
161 if (tableMetrics
!= null && tn
!= null) {
162 tableMetrics
.updateCheckAndDelete(tn
, t
);
164 serverSource
.updateCheckAndDelete(t
);
167 public void updateCheckAndPut(TableName tn
, long t
) {
168 if (tableMetrics
!= null && tn
!= null) {
169 tableMetrics
.updateCheckAndPut(tn
, t
);
171 serverSource
.updateCheckAndPut(t
);
174 public void updateCheckAndMutate(TableName tn
, long t
) {
175 if (tableMetrics
!= null && tn
!= null) {
176 tableMetrics
.updateCheckAndMutate(tn
, t
);
178 serverSource
.updateCheckAndMutate(t
);
181 public void updateGet(TableName tn
, long t
) {
182 if (tableMetrics
!= null && tn
!= null) {
183 tableMetrics
.updateGet(tn
, t
);
185 if (t
> slowMetricTime
) {
186 serverSource
.incrSlowGet();
188 serverSource
.updateGet(t
);
189 userAggregate
.updateGet(t
);
192 public void updateIncrement(TableName tn
, long t
) {
193 if (tableMetrics
!= null && tn
!= null) {
194 tableMetrics
.updateIncrement(tn
, t
);
196 if (t
> slowMetricTime
) {
197 serverSource
.incrSlowIncrement();
199 serverSource
.updateIncrement(t
);
200 userAggregate
.updateIncrement(t
);
203 public void updateAppend(TableName tn
, long t
) {
204 if (tableMetrics
!= null && tn
!= null) {
205 tableMetrics
.updateAppend(tn
, t
);
207 if (t
> slowMetricTime
) {
208 serverSource
.incrSlowAppend();
210 serverSource
.updateAppend(t
);
211 userAggregate
.updateAppend(t
);
214 public void updateReplay(long t
){
215 serverSource
.updateReplay(t
);
216 userAggregate
.updateReplay(t
);
219 public void updateScanSize(TableName tn
, long scanSize
){
220 if (tableMetrics
!= null && tn
!= null) {
221 tableMetrics
.updateScanSize(tn
, scanSize
);
223 serverSource
.updateScanSize(scanSize
);
226 public void updateScanTime(TableName tn
, long t
) {
227 if (tableMetrics
!= null && tn
!= null) {
228 tableMetrics
.updateScanTime(tn
, t
);
230 serverSource
.updateScanTime(t
);
231 userAggregate
.updateScanTime(t
);
234 public void updateSplitTime(long t
) {
235 serverSource
.updateSplitTime(t
);
238 public void incrSplitRequest() {
239 serverSource
.incrSplitRequest();
242 public void incrSplitSuccess() {
243 serverSource
.incrSplitSuccess();
246 public void updateFlush(String table
, long t
, long memstoreSize
, long fileSize
) {
247 serverSource
.updateFlushTime(t
);
248 serverSource
.updateFlushMemStoreSize(memstoreSize
);
249 serverSource
.updateFlushOutputSize(fileSize
);
252 metricsTable
.updateFlushTime(table
, t
);
253 metricsTable
.updateFlushMemstoreSize(table
, memstoreSize
);
254 metricsTable
.updateFlushOutputSize(table
, fileSize
);
259 public void updateCompaction(String table
, boolean isMajor
, long t
, int inputFileCount
, int outputFileCount
,
260 long inputBytes
, long outputBytes
) {
261 serverSource
.updateCompactionTime(isMajor
, t
);
262 serverSource
.updateCompactionInputFileCount(isMajor
, inputFileCount
);
263 serverSource
.updateCompactionOutputFileCount(isMajor
, outputFileCount
);
264 serverSource
.updateCompactionInputSize(isMajor
, inputBytes
);
265 serverSource
.updateCompactionOutputSize(isMajor
, outputBytes
);
268 metricsTable
.updateCompactionTime(table
, isMajor
, t
);
269 metricsTable
.updateCompactionInputFileCount(table
, isMajor
, inputFileCount
);
270 metricsTable
.updateCompactionOutputFileCount(table
, isMajor
, outputFileCount
);
271 metricsTable
.updateCompactionInputSize(table
, isMajor
, inputBytes
);
272 metricsTable
.updateCompactionOutputSize(table
, isMajor
, outputBytes
);
276 public void updateBulkLoad(long millis
) {
277 this.bulkLoadTimer
.updateMillis(millis
);
281 * @see MetricsRegionServerQuotaSource#incrementNumRegionSizeReportsSent(long)
283 public void incrementNumRegionSizeReportsSent(long numReportsSent
) {
284 quotaSource
.incrementNumRegionSizeReportsSent(numReportsSent
);
288 * @see MetricsRegionServerQuotaSource#incrementRegionSizeReportingChoreTime(long)
290 public void incrementRegionSizeReportingChoreTime(long time
) {
291 quotaSource
.incrementRegionSizeReportingChoreTime(time
);
294 public void updateReadQueryMeter(TableName tn
, long count
) {
295 if (tableMetrics
!= null && tn
!= null) {
296 tableMetrics
.updateTableReadQueryMeter(tn
, count
);
298 if (serverReadQueryMeter
!= null) {
299 serverReadQueryMeter
.mark(count
);
303 public void updateWriteQueryMeter(TableName tn
, long count
) {
304 if (tableMetrics
!= null && tn
!= null) {
305 tableMetrics
.updateTableWriteQueryMeter(tn
, count
);
307 if (serverWriteQueryMeter
!= null) {
308 serverWriteQueryMeter
.mark(count
);
312 public void updateWriteQueryMeter(TableName tn
) {
313 if (tableMetrics
!= null && tn
!= null) {
314 tableMetrics
.updateTableWriteQueryMeter(tn
);
316 if (serverWriteQueryMeter
!= null) {
317 serverWriteQueryMeter
.mark();