View Javadoc

1   /**
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
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
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.
17   */
18  package org.apache.hadoop.hbase.regionserver;
19  
20  import org.apache.hadoop.hbase.CompatibilitySingletonFactory;
21  import org.apache.hadoop.hbase.TableName;
22  import org.apache.hadoop.hbase.classification.InterfaceAudience;
23  import org.apache.hadoop.hbase.classification.InterfaceStability;
24  import org.apache.hadoop.hbase.metrics.Meter;
25  import org.apache.hadoop.hbase.metrics.MetricRegistries;
26  import org.apache.hadoop.hbase.metrics.MetricRegistry;
27  import org.apache.hadoop.hbase.metrics.Timer;
28  import org.apache.hadoop.conf.Configuration;
29  
30  /**
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
35   * counters!
36   */
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 = true;
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 = true;
49  
50    private final MetricsRegionServerSource serverSource;
51    private final MetricsRegionServerWrapper regionServerWrapper;
52    private final RegionServerTableMetrics tableMetrics;
53    private final MetricsUserAggregate userAggregate;
54  
55    private MetricRegistry metricRegistry;
56    private Timer bulkLoadTimer;
57    // Incremented once for each call to Scan#nextRaw
58    private Meter serverReadQueryMeter;
59    // Incremented per write.
60    private Meter serverWriteQueryMeter;
61  
62    public MetricsRegionServer(MetricsRegionServerWrapper regionServerWrapper, Configuration conf) {
63      this(regionServerWrapper,
64          CompatibilitySingletonFactory.getInstance(MetricsRegionServerSourceFactory.class)
65              .createServer(regionServerWrapper), createTableMetrics(conf),
66          MetricsUserAggregateFactory.getMetricsUserAggregate(conf));
67  
68      // Create hbase-metrics module based metrics. The registry should already be registered by the
69      // MetricsRegionServerSource
70      metricRegistry = MetricRegistries.global().get(serverSource.getMetricRegistryInfo()).get();
71  
72      // create and use metrics from the new hbase-metrics based registry.
73      bulkLoadTimer = metricRegistry.timer("Bulkload");
74      if (conf.getBoolean(RS_ENABLE_SERVER_QUERY_METER_METRICS_KEY,
75        RS_ENABLE_SERVER_QUERY_METER_METRICS_KEY_DEFAULT)) {
76        serverReadQueryMeter = metricRegistry.meter("ServerReadQueryPerSecond");
77        serverWriteQueryMeter = metricRegistry.meter("ServerWriteQueryPerSecond");
78      }
79    }
80  
81    MetricsRegionServer(MetricsRegionServerWrapper regionServerWrapper,
82        MetricsRegionServerSource serverSource, RegionServerTableMetrics tableMetrics,
83        MetricsUserAggregate userAggregate) {
84      this.regionServerWrapper = regionServerWrapper;
85      this.serverSource = serverSource;
86      this.tableMetrics = tableMetrics;
87      this.userAggregate = userAggregate;
88    }
89  
90    /**
91     * Creates an instance of {@link RegionServerTableMetrics} only if the feature is enabled.
92     */
93    static RegionServerTableMetrics createTableMetrics(Configuration conf) {
94      if (conf.getBoolean(RS_ENABLE_TABLE_METRICS_KEY, RS_ENABLE_TABLE_METRICS_DEFAULT)) {
95        return new RegionServerTableMetrics(
96          conf.getBoolean(RS_ENABLE_TABLE_QUERY_METER_METRICS_KEY,
97            RS_ENABLE_TABLE_QUERY_METER_METRICS_KEY_DEFAULT));
98      }
99      return null;
100   }
101 
102   public MetricsRegionServerSource getMetricsSource() {
103     return serverSource;
104   }
105 
106   public org.apache.hadoop.hbase.regionserver.MetricsUserAggregate getMetricsUserAggregate() {
107     return userAggregate;
108   }
109 
110   public MetricsRegionServerWrapper getRegionServerWrapper() {
111     return regionServerWrapper;
112   }
113 
114   public void updatePutBatch(TableName tn, long t) {
115     if (tableMetrics != null && tn != null) {
116       tableMetrics.updatePutBatch(tn, t);
117     }
118     if (t > 1000) {
119       serverSource.incrSlowPut();
120     }
121     serverSource.updatePutBatch(t);
122   }
123 
124   public void updatePut(TableName tn, long t) {
125     if (tableMetrics != null && tn != null) {
126       tableMetrics.updatePut(tn, t);
127     }
128     serverSource.updatePut(t);
129     userAggregate.updatePut(t);
130   }
131 
132   public void updateDelete(TableName tn, long t) {
133     if (tableMetrics != null && tn != null) {
134       tableMetrics.updateDelete(tn, t);
135     }
136     serverSource.updateDelete(t);
137     userAggregate.updateDelete(t);
138   }
139 
140   public void updateDeleteBatch(TableName tn, long t) {
141     if (tableMetrics != null && tn != null) {
142       tableMetrics.updateDeleteBatch(tn, t);
143     }
144     if (t > 1000) {
145       serverSource.incrSlowDelete();
146     }
147     serverSource.updateDeleteBatch(t);
148   }
149 
150   public void updateCheckAndDelete(TableName tn, long t) {
151     if (tableMetrics != null && tn != null) {
152       tableMetrics.updateCheckAndDelete(tn, t);
153     }
154     serverSource.updateCheckAndDelete(t);
155   }
156 
157   public void updateCheckAndPut(TableName tn, long t) {
158     if (tableMetrics != null && tn != null) {
159       tableMetrics.updateCheckAndPut(tn, t);
160     }
161     serverSource.updateCheckAndPut(t);
162   }
163 
164   public void updateGet(TableName tn, long t) {
165     if (tableMetrics != null && tn != null) {
166       tableMetrics.updateGet(tn, t);
167     }
168     if (t > 1000) {
169       serverSource.incrSlowGet();
170     }
171     serverSource.updateGet(t);
172     userAggregate.updateGet(t);
173   }
174 
175   public void updateIncrement(TableName tn, long t) {
176     if (tableMetrics != null && tn != null) {
177       tableMetrics.updateIncrement(tn, t);
178     }
179     if (t > 1000) {
180       serverSource.incrSlowIncrement();
181     }
182     serverSource.updateIncrement(t);
183     userAggregate.updateIncrement(t);
184   }
185 
186   public void updateAppend(TableName tn, long t) {
187     if (tableMetrics != null && tn != null) {
188       tableMetrics.updateAppend(tn, t);
189     }
190     if (t > 1000) {
191       serverSource.incrSlowAppend();
192     }
193     serverSource.updateAppend(t);
194     userAggregate.updateAppend(t);
195   }
196 
197   public void updateReplay(long t){
198     serverSource.updateReplay(t);
199     userAggregate.updateReplay(t);
200   }
201 
202   public void updateScanSize(TableName tn, long scanSize){
203     if (tableMetrics != null && tn != null) {
204       tableMetrics.updateScanSize(tn, scanSize);
205     }
206     serverSource.updateScanSize(scanSize);
207   }
208 
209   public void updateScanTime(TableName tn, long t) {
210     if (tableMetrics != null && tn != null) {
211       tableMetrics.updateScanTime(tn, t);
212     }
213     serverSource.updateScanTime(t);
214     userAggregate.updateScanTime(t);
215   }
216 
217   public void updateSplitTime(long t) {
218     serverSource.updateSplitTime(t);
219   }
220 
221   public void incrSplitRequest() {
222     serverSource.incrSplitRequest();
223   }
224 
225   public void incrSplitSuccess() {
226     serverSource.incrSplitSuccess();
227   }
228 
229   public void updateFlush(long t, long memstoreSize, long fileSize) {
230     serverSource.updateFlushTime(t);
231     serverSource.updateFlushMemstoreSize(memstoreSize);
232     serverSource.updateFlushOutputSize(fileSize);
233   }
234 
235   public void updateCompaction(boolean isMajor, long t, int inputFileCount, int outputFileCount,
236       long inputBytes, long outputBytes) {
237     serverSource.updateCompactionTime(isMajor, t);
238     serverSource.updateCompactionInputFileCount(isMajor, inputFileCount);
239     serverSource.updateCompactionOutputFileCount(isMajor, outputFileCount);
240     serverSource.updateCompactionInputSize(isMajor, inputBytes);
241     serverSource.updateCompactionOutputSize(isMajor, outputBytes);
242   }
243 
244   public void updateBulkLoad(long millis) {
245     this.bulkLoadTimer.updateMillis(millis);
246   }
247 
248 
249   public void updateReadQueryMeter(TableName tn, long count) {
250     if (tableMetrics != null && tn != null) {
251       tableMetrics.updateTableReadQueryMeter(tn, count);
252     }
253     if (serverReadQueryMeter != null) {
254       serverReadQueryMeter.mark(count);
255     }
256   }
257 
258   public void updateWriteQueryMeter(TableName tn, long count) {
259     if (tableMetrics != null && tn != null) {
260       tableMetrics.updateTableWriteQueryMeter(tn, count);
261     }
262     if (serverWriteQueryMeter != null) {
263       serverWriteQueryMeter.mark(count);
264     }
265   }
266 
267   public void updateWriteQueryMeter(TableName tn) {
268     if (tableMetrics != null && tn != null) {
269       tableMetrics.updateTableWriteQueryMeter(tn);
270     }
271     if (serverWriteQueryMeter != null) {
272       serverWriteQueryMeter.mark();
273     }
274   }
275 }