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  
19  package org.apache.hadoop.hbase.regionserver;
20  
21  import org.apache.hadoop.hbase.metrics.BaseSourceImpl;
22  import org.apache.hadoop.metrics2.MetricHistogram;
23  import org.apache.hadoop.metrics2.MetricsBuilder;
24  import org.apache.hadoop.metrics2.MetricsRecordBuilder;
25  import org.apache.hadoop.metrics2.lib.MetricMutableCounterLong;
26  
27  /**
28   * Hadoop1 implementation of MetricsRegionServerSource.
29   *
30   * Implements BaseSource through BaseSourceImpl, following the pattern
31   */
32  public class MetricsRegionServerSourceImpl
33      extends BaseSourceImpl implements MetricsRegionServerSource {
34  
35    final MetricsRegionServerWrapper rsWrap;
36    private final MetricHistogram putHisto;
37    private final MetricHistogram deleteHisto;
38    private final MetricHistogram getHisto;
39    private final MetricHistogram incrementHisto;
40    private final MetricHistogram appendHisto;
41    private final MetricHistogram replayHisto;
42    private final MetricHistogram scanNextHisto;
43  
44    private final MetricMutableCounterLong slowPut;
45    private final MetricMutableCounterLong slowDelete;
46    private final MetricMutableCounterLong slowGet;
47    private final MetricMutableCounterLong slowIncrement;
48    private final MetricMutableCounterLong slowAppend;
49    private final MetricMutableCounterLong splitRequest;
50    private final MetricMutableCounterLong splitSuccess;
51  
52    private final MetricHistogram splitTimeHisto;
53    private final MetricHistogram flushTimeHisto;
54  
55    // pause monitor metrics
56    private final MetricMutableCounterLong infoPauseThresholdExceeded;
57    private final MetricMutableCounterLong warnPauseThresholdExceeded;
58    private final MetricHistogram pausesWithGc;
59    private final MetricHistogram pausesWithoutGc;
60  
61    public MetricsRegionServerSourceImpl(MetricsRegionServerWrapper rsWrap) {
62      this(METRICS_NAME, METRICS_DESCRIPTION, METRICS_CONTEXT, METRICS_JMX_CONTEXT, rsWrap);
63    }
64  
65    public MetricsRegionServerSourceImpl(String metricsName,
66                                         String metricsDescription,
67                                         String metricsContext,
68                                         String metricsJmxContext,
69                                         MetricsRegionServerWrapper rsWrap) {
70      super(metricsName, metricsDescription, metricsContext, metricsJmxContext);
71      this.rsWrap = rsWrap;
72  
73      putHisto = getMetricsRegistry().newTimeHistogram(MUTATE_KEY);
74      slowPut = getMetricsRegistry().newCounter(SLOW_MUTATE_KEY, SLOW_MUTATE_DESC, 0l);
75  
76      deleteHisto = getMetricsRegistry().newTimeHistogram(DELETE_KEY);
77      slowDelete = getMetricsRegistry().newCounter(SLOW_DELETE_KEY, SLOW_DELETE_DESC, 0l);
78  
79      getHisto = getMetricsRegistry().newTimeHistogram(GET_KEY);
80      slowGet = getMetricsRegistry().newCounter(SLOW_GET_KEY, SLOW_GET_DESC, 0l);
81  
82      incrementHisto = getMetricsRegistry().newTimeHistogram(INCREMENT_KEY);
83      slowIncrement = getMetricsRegistry().newCounter(SLOW_INCREMENT_KEY, SLOW_INCREMENT_DESC, 0l);
84  
85      appendHisto = getMetricsRegistry().newTimeHistogram(APPEND_KEY);
86      slowAppend = getMetricsRegistry().newCounter(SLOW_APPEND_KEY, SLOW_APPEND_DESC, 0l);
87  
88      replayHisto = getMetricsRegistry().newTimeHistogram(REPLAY_KEY);
89      scanNextHisto = getMetricsRegistry().newTimeHistogram(SCAN_NEXT_KEY);
90  
91      splitTimeHisto = getMetricsRegistry().newTimeHistogram(SPLIT_KEY);
92      flushTimeHisto = getMetricsRegistry().newTimeHistogram(FLUSH_KEY);
93  
94      splitRequest = getMetricsRegistry().newCounter(SPLIT_REQUEST_KEY, SPLIT_REQUEST_DESC, 0l);
95      splitSuccess = getMetricsRegistry().newCounter(SPLIT_SUCCESS_KEY, SPLIT_SUCCESS_DESC, 0l);
96  
97      // pause monitor metrics
98      infoPauseThresholdExceeded = getMetricsRegistry().newCounter(INFO_THRESHOLD_COUNT_KEY,
99        INFO_THRESHOLD_COUNT_DESC, 0L);
100     warnPauseThresholdExceeded = getMetricsRegistry().newCounter(WARN_THRESHOLD_COUNT_KEY,
101       WARN_THRESHOLD_COUNT_DESC, 0L);
102     pausesWithGc = getMetricsRegistry().newTimeHistogram(PAUSE_TIME_WITH_GC_KEY);
103     pausesWithoutGc = getMetricsRegistry().newTimeHistogram(PAUSE_TIME_WITHOUT_GC_KEY);
104   }
105 
106   @Override
107   public void updatePut(long t) {
108     putHisto.add(t);
109   }
110 
111   @Override
112   public void updateDelete(long t) {
113     deleteHisto.add(t);
114   }
115 
116   @Override
117   public void updateGet(long t) {
118     getHisto.add(t);
119   }
120 
121   @Override
122   public void updateIncrement(long t) {
123     incrementHisto.add(t);
124   }
125 
126   @Override
127   public void updateAppend(long t) {
128     appendHisto.add(t);
129   }
130 
131   @Override
132   public void updateReplay(long t) {
133     replayHisto.add(t);
134   }
135 
136   @Override
137   public void updateScannerNext(long scanSize) {
138     scanNextHisto.add(scanSize);
139   }
140 
141   @Override
142   public void incrSlowPut() {
143     slowPut.incr();
144   }
145 
146   @Override
147   public void incrSlowDelete() {
148     slowDelete.incr();
149   }
150 
151   @Override
152   public void incrSlowGet() {
153     slowGet.incr();
154   }
155 
156   @Override
157   public void incrSlowIncrement() {
158     slowIncrement.incr();
159   }
160 
161   @Override
162   public void incrSlowAppend() {
163     slowAppend.incr();
164   }
165 
166   @Override
167   public void incrSplitRequest() {
168     splitRequest.incr();
169   }
170 
171   @Override
172   public void incrSplitSuccess() {
173     splitSuccess.incr();
174   }
175 
176   @Override
177   public void updateSplitTime(long t) {
178     splitTimeHisto.add(t);
179   }
180 
181   @Override
182   public void updateFlushTime(long t) {
183     flushTimeHisto.add(t);
184   }
185 
186   /**
187    * Yes this is a get function that doesn't return anything.  Thanks Hadoop for breaking all
188    * expectations of java programmers.  Instead of returning anything Hadoop metrics expects
189    * getMetrics to push the metrics into the metricsBuilder.
190    *
191    * @param metricsBuilder Builder to accept metrics
192    * @param all            push all or only changed?
193    */
194   @Override
195   public void getMetrics(MetricsBuilder metricsBuilder, boolean all) {
196 
197     MetricsRecordBuilder mrb = metricsBuilder.addRecord(metricsName);
198 
199     // rsWrap can be null because this function is called inside of init.
200     if (rsWrap != null) {
201       mrb.addGauge(REGION_COUNT, REGION_COUNT_DESC, rsWrap.getNumOnlineRegions())
202           .addGauge(STORE_COUNT, STORE_COUNT_DESC, rsWrap.getNumStores())
203           .addGauge(HLOGFILE_COUNT, HLOGFILE_COUNT_DESC, rsWrap.getNumHLogFiles())
204           .addGauge(HLOGFILE_SIZE, HLOGFILE_SIZE_DESC, rsWrap.getHLogFileSize())
205           .addGauge(STOREFILE_COUNT, STOREFILE_COUNT_DESC, rsWrap.getNumStoreFiles())
206           .addGauge(MEMSTORE_SIZE, MEMSTORE_SIZE_DESC, rsWrap.getMemstoreSize())
207           .addGauge(STOREFILE_SIZE, STOREFILE_SIZE_DESC, rsWrap.getStoreFileSize())
208           .addGauge(MAX_STORE_FILE_AGE, MAX_STORE_FILE_AGE_DESC, rsWrap.getMaxStoreFileAge())
209           .addGauge(MIN_STORE_FILE_AGE, MIN_STORE_FILE_AGE_DESC, rsWrap.getMinStoreFileAge())
210           .addGauge(AVG_STORE_FILE_AGE, AVG_STORE_FILE_AGE_DESC, rsWrap.getAvgStoreFileAge())
211           .addGauge(NUM_REFERENCE_FILES, NUM_REFERENCE_FILES_DESC, rsWrap.getNumReferenceFiles())
212           .addGauge(RS_START_TIME_NAME, RS_START_TIME_DESC, rsWrap.getStartCode())
213           .addGauge(AVERAGE_REGION_SIZE, AVERAGE_REGION_SIZE_DESC, rsWrap.getAverageRegionSize())
214           .addCounter(TOTAL_REQUEST_COUNT, TOTAL_REQUEST_COUNT_DESC, rsWrap.getTotalRequestCount())
215           .addCounter(READ_REQUEST_COUNT, READ_REQUEST_COUNT_DESC, rsWrap.getReadRequestsCount())
216           .addCounter(WRITE_REQUEST_COUNT, WRITE_REQUEST_COUNT_DESC, rsWrap.getWriteRequestsCount())
217           .addCounter(CHECK_MUTATE_FAILED_COUNT,
218               CHECK_MUTATE_FAILED_COUNT_DESC,
219               rsWrap.getCheckAndMutateChecksFailed())
220           .addCounter(CHECK_MUTATE_PASSED_COUNT,
221               CHECK_MUTATE_PASSED_COUNT_DESC,
222               rsWrap.getCheckAndMutateChecksPassed())
223           .addGauge(STOREFILE_INDEX_SIZE, STOREFILE_INDEX_SIZE_DESC, rsWrap.getStoreFileIndexSize())
224           .addGauge(STATIC_INDEX_SIZE, STATIC_INDEX_SIZE_DESC, rsWrap.getTotalStaticIndexSize())
225           .addGauge(STATIC_BLOOM_SIZE, STATIC_BLOOM_SIZE_DESC, rsWrap.getTotalStaticBloomSize())
226           .addGauge(NUMBER_OF_MUTATIONS_WITHOUT_WAL,
227               NUMBER_OF_MUTATIONS_WITHOUT_WAL_DESC,
228               rsWrap.getNumMutationsWithoutWAL())
229           .addGauge(DATA_SIZE_WITHOUT_WAL,
230               DATA_SIZE_WITHOUT_WAL_DESC,
231               rsWrap.getDataInMemoryWithoutWAL())
232           .addGauge(PERCENT_FILES_LOCAL, PERCENT_FILES_LOCAL_DESC, rsWrap.getPercentFileLocal())
233           .addGauge(COMPACTION_QUEUE_LENGTH,
234               COMPACTION_QUEUE_LENGTH_DESC,
235               rsWrap.getCompactionQueueSize())
236           .addGauge(LARGE_COMPACTION_QUEUE_LENGTH,
237               COMPACTION_QUEUE_LENGTH_DESC,
238               rsWrap.getLargeCompactionQueueSize())
239           .addGauge(SMALL_COMPACTION_QUEUE_LENGTH,
240               COMPACTION_QUEUE_LENGTH_DESC,
241               rsWrap.getSmallCompactionQueueSize())
242           .addGauge(FLUSH_QUEUE_LENGTH, FLUSH_QUEUE_LENGTH_DESC, rsWrap.getFlushQueueSize())
243           .addGauge(BLOCK_CACHE_FREE_SIZE, BLOCK_CACHE_FREE_DESC, rsWrap.getBlockCacheFreeSize())
244           .addGauge(BLOCK_CACHE_COUNT, BLOCK_CACHE_COUNT_DESC, rsWrap.getBlockCacheCount())
245           .addGauge(BLOCK_CACHE_SIZE, BLOCK_CACHE_SIZE_DESC, rsWrap.getBlockCacheSize())
246           .addCounter(BLOCK_CACHE_HIT_COUNT,
247               BLOCK_CACHE_HIT_COUNT_DESC,
248               rsWrap.getBlockCacheHitCount())
249           .addCounter(BLOCK_CACHE_MISS_COUNT,
250               BLOCK_COUNT_MISS_COUNT_DESC,
251               rsWrap.getBlockCacheMissCount())
252           .addCounter(BLOCK_CACHE_EVICTION_COUNT,
253               BLOCK_CACHE_EVICTION_COUNT_DESC,
254               rsWrap.getBlockCacheEvictedCount())
255           .addGauge(BLOCK_CACHE_HIT_PERCENT,
256               BLOCK_CACHE_HIT_PERCENT_DESC,
257               rsWrap.getBlockCacheHitPercent())
258           .addGauge(BLOCK_CACHE_EXPRESS_HIT_PERCENT,
259               BLOCK_CACHE_EXPRESS_HIT_PERCENT_DESC,
260               rsWrap.getBlockCacheHitCachingPercent())
261           .addCounter(BLOCK_CACHE_FAILED_INSERTION_COUNT,
262               BLOCK_CACHE_FAILED_INSERTION_COUNT_DESC,rsWrap.getBlockCacheFailedInsertions())
263           .addCounter(BLOCK_CACHE_DATA_MISS_COUNT, "", rsWrap.getDataMissCount())
264           .addCounter(BLOCK_CACHE_LEAF_INDEX_MISS_COUNT, "", rsWrap.getLeafIndexMissCount())
265           .addCounter(BLOCK_CACHE_BLOOM_CHUNK_MISS_COUNT, "", rsWrap.getBloomChunkMissCount())
266           .addCounter(BLOCK_CACHE_META_MISS_COUNT, "", rsWrap.getMetaMissCount())
267           .addCounter(BLOCK_CACHE_ROOT_INDEX_MISS_COUNT, "", rsWrap.getRootIndexMissCount())
268           .addCounter(BLOCK_CACHE_INTERMEDIATE_INDEX_MISS_COUNT, "",
269               rsWrap.getIntermediateIndexMissCount())
270           .addCounter(BLOCK_CACHE_FILE_INFO_MISS_COUNT, "", rsWrap.getFileInfoMissCount())
271           .addCounter(BLOCK_CACHE_GENERAL_BLOOM_META_MISS_COUNT, "",
272               rsWrap.getGeneralBloomMetaMissCount())
273           .addCounter(BLOCK_CACHE_DELETE_FAMILY_BLOOM_MISS_COUNT, "",
274               rsWrap.getDeleteFamilyBloomMissCount())
275           .addCounter(BLOCK_CACHE_TRAILER_MISS_COUNT, "", rsWrap.getTrailerMissCount())
276           .addCounter(BLOCK_CACHE_DATA_HIT_COUNT, "", rsWrap.getDataHitCount())
277           .addCounter(BLOCK_CACHE_LEAF_INDEX_HIT_COUNT, "", rsWrap.getLeafIndexHitCount())
278           .addCounter(BLOCK_CACHE_BLOOM_CHUNK_HIT_COUNT, "", rsWrap.getBloomChunkHitCount())
279           .addCounter(BLOCK_CACHE_META_HIT_COUNT, "", rsWrap.getMetaHitCount())
280           .addCounter(BLOCK_CACHE_ROOT_INDEX_HIT_COUNT, "", rsWrap.getRootIndexHitCount())
281           .addCounter(BLOCK_CACHE_INTERMEDIATE_INDEX_HIT_COUNT, "",
282               rsWrap.getIntermediateIndexHitCount())
283           .addCounter(BLOCK_CACHE_FILE_INFO_HIT_COUNT, "", rsWrap.getFileInfoHitCount())
284           .addCounter(BLOCK_CACHE_GENERAL_BLOOM_META_HIT_COUNT, "",
285               rsWrap.getGeneralBloomMetaHitCount())
286           .addCounter(BLOCK_CACHE_DELETE_FAMILY_BLOOM_HIT_COUNT, "",
287               rsWrap.getDeleteFamilyBloomHitCount())
288           .addCounter(BLOCK_CACHE_TRAILER_HIT_COUNT, "", rsWrap.getTrailerHitCount())
289           .addCounter(UPDATES_BLOCKED_TIME, UPDATES_BLOCKED_DESC, rsWrap.getUpdatesBlockedTime())
290           .addCounter(FLUSHED_CELLS, FLUSHED_CELLS_DESC, rsWrap.getFlushedCellsCount())
291           .addCounter(COMPACTED_CELLS, COMPACTED_CELLS_DESC, rsWrap.getCompactedCellsCount())
292           .addCounter(MAJOR_COMPACTED_CELLS, MAJOR_COMPACTED_CELLS_DESC,
293               rsWrap.getMajorCompactedCellsCount())
294           .addCounter(FLUSHED_CELLS_SIZE, FLUSHED_CELLS_SIZE_DESC, rsWrap.getFlushedCellsSize())
295           .addCounter(COMPACTED_CELLS_SIZE, COMPACTED_CELLS_SIZE_DESC,
296               rsWrap.getCompactedCellsSize())
297           .addCounter(MAJOR_COMPACTED_CELLS_SIZE, MAJOR_COMPACTED_CELLS_SIZE_DESC,
298               rsWrap.getMajorCompactedCellsSize())
299 
300           .addCounter(BLOCKED_REQUESTS_COUNT, BLOCKED_REQUESTS_COUNT_DESC,
301               rsWrap.getBlockedRequestsCount())
302 
303           .tag(ZOOKEEPER_QUORUM_NAME, ZOOKEEPER_QUORUM_DESC, rsWrap.getZookeeperQuorum())
304           .tag(SERVER_NAME_NAME, SERVER_NAME_DESC, rsWrap.getServerName())
305           .tag(CLUSTER_ID_NAME, CLUSTER_ID_DESC, rsWrap.getClusterId());
306     }
307 
308     metricsRegistry.snapshot(mrb, all);
309   }
310 
311   @Override
312   public void incInfoThresholdExceeded(int count) {
313     infoPauseThresholdExceeded.incr(count);
314   }
315 
316   @Override
317   public void incWarnThresholdExceeded(int count) {
318     warnPauseThresholdExceeded.incr(count);
319   }
320 
321   @Override
322   public void updatePauseTimeWithGc(long t) {
323     pausesWithGc.add(t);
324   }
325 
326   @Override
327   public void updatePauseTimeWithoutGc(long t) {
328     pausesWithoutGc.add(t);
329   }
330 }