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    public MetricsRegionServerSourceImpl(MetricsRegionServerWrapper rsWrap) {
56      this(METRICS_NAME, METRICS_DESCRIPTION, METRICS_CONTEXT, METRICS_JMX_CONTEXT, rsWrap);
57    }
58  
59    public MetricsRegionServerSourceImpl(String metricsName,
60                                         String metricsDescription,
61                                         String metricsContext,
62                                         String metricsJmxContext,
63                                         MetricsRegionServerWrapper rsWrap) {
64      super(metricsName, metricsDescription, metricsContext, metricsJmxContext);
65      this.rsWrap = rsWrap;
66  
67      putHisto = getMetricsRegistry().newTimeHistogram(MUTATE_KEY);
68      slowPut = getMetricsRegistry().newCounter(SLOW_MUTATE_KEY, SLOW_MUTATE_DESC, 0l);
69  
70      deleteHisto = getMetricsRegistry().newTimeHistogram(DELETE_KEY);
71      slowDelete = getMetricsRegistry().newCounter(SLOW_DELETE_KEY, SLOW_DELETE_DESC, 0l);
72  
73      getHisto = getMetricsRegistry().newTimeHistogram(GET_KEY);
74      slowGet = getMetricsRegistry().newCounter(SLOW_GET_KEY, SLOW_GET_DESC, 0l);
75  
76      incrementHisto = getMetricsRegistry().newTimeHistogram(INCREMENT_KEY);
77      slowIncrement = getMetricsRegistry().newCounter(SLOW_INCREMENT_KEY, SLOW_INCREMENT_DESC, 0l);
78  
79      appendHisto = getMetricsRegistry().newTimeHistogram(APPEND_KEY);
80      slowAppend = getMetricsRegistry().newCounter(SLOW_APPEND_KEY, SLOW_APPEND_DESC, 0l);
81  
82      replayHisto = getMetricsRegistry().newTimeHistogram(REPLAY_KEY);
83      scanNextHisto = getMetricsRegistry().newTimeHistogram(SCAN_NEXT_KEY);
84  
85      splitTimeHisto = getMetricsRegistry().newTimeHistogram(SPLIT_KEY);
86      flushTimeHisto = getMetricsRegistry().newTimeHistogram(FLUSH_KEY);
87  
88      splitRequest = getMetricsRegistry().newCounter(SPLIT_REQUEST_KEY, SPLIT_REQUEST_DESC, 0l);
89      splitSuccess = getMetricsRegistry().newCounter(SPLIT_SUCCESS_KEY, SPLIT_SUCCESS_DESC, 0l);
90    }
91  
92    @Override
93    public void updatePut(long t) {
94      putHisto.add(t);
95    }
96  
97    @Override
98    public void updateDelete(long t) {
99      deleteHisto.add(t);
100   }
101 
102   @Override
103   public void updateGet(long t) {
104     getHisto.add(t);
105   }
106 
107   @Override
108   public void updateIncrement(long t) {
109     incrementHisto.add(t);
110   }
111 
112   @Override
113   public void updateAppend(long t) {
114     appendHisto.add(t);
115   }
116 
117   @Override
118   public void updateReplay(long t) {
119     replayHisto.add(t);
120   }
121 
122   @Override
123   public void updateScannerNext(long scanSize) {
124     scanNextHisto.add(scanSize);
125   }
126 
127   @Override
128   public void incrSlowPut() {
129     slowPut.incr();
130   }
131 
132   @Override
133   public void incrSlowDelete() {
134     slowDelete.incr();
135   }
136 
137   @Override
138   public void incrSlowGet() {
139     slowGet.incr();
140   }
141 
142   @Override
143   public void incrSlowIncrement() {
144     slowIncrement.incr();
145   }
146 
147   @Override
148   public void incrSlowAppend() {
149     slowAppend.incr();
150   }
151 
152   @Override
153   public void incrSplitRequest() {
154     splitRequest.incr();
155   }
156 
157   @Override
158   public void incrSplitSuccess() {
159     splitSuccess.incr();
160   }
161 
162   @Override
163   public void updateSplitTime(long t) {
164     splitTimeHisto.add(t);
165   }
166 
167   @Override
168   public void updateFlushTime(long t) {
169     flushTimeHisto.add(t);
170   }
171 
172   /**
173    * Yes this is a get function that doesn't return anything.  Thanks Hadoop for breaking all
174    * expectations of java programmers.  Instead of returning anything Hadoop metrics expects
175    * getMetrics to push the metrics into the metricsBuilder.
176    *
177    * @param metricsBuilder Builder to accept metrics
178    * @param all            push all or only changed?
179    */
180   @Override
181   public void getMetrics(MetricsBuilder metricsBuilder, boolean all) {
182 
183     MetricsRecordBuilder mrb = metricsBuilder.addRecord(metricsName);
184 
185     // rsWrap can be null because this function is called inside of init.
186     if (rsWrap != null) {
187       mrb.addGauge(REGION_COUNT, REGION_COUNT_DESC, rsWrap.getNumOnlineRegions())
188           .addGauge(STORE_COUNT, STORE_COUNT_DESC, rsWrap.getNumStores())
189           .addGauge(HLOGFILE_COUNT, HLOGFILE_COUNT_DESC, rsWrap.getNumHLogFiles())
190           .addGauge(HLOGFILE_SIZE, HLOGFILE_SIZE_DESC, rsWrap.getHLogFileSize())
191           .addGauge(STOREFILE_COUNT, STOREFILE_COUNT_DESC, rsWrap.getNumStoreFiles())
192           .addGauge(MEMSTORE_SIZE, MEMSTORE_SIZE_DESC, rsWrap.getMemstoreSize())
193           .addGauge(STOREFILE_SIZE, STOREFILE_SIZE_DESC, rsWrap.getStoreFileSize())
194           .addGauge(MAX_STORE_FILE_AGE, MAX_STORE_FILE_AGE_DESC, rsWrap.getMaxStoreFileAge())
195           .addGauge(MIN_STORE_FILE_AGE, MIN_STORE_FILE_AGE_DESC, rsWrap.getMinStoreFileAge())
196           .addGauge(AVG_STORE_FILE_AGE, AVG_STORE_FILE_AGE_DESC, rsWrap.getAvgStoreFileAge())
197           .addGauge(NUM_REFERENCE_FILES, NUM_REFERENCE_FILES_DESC, rsWrap.getNumReferenceFiles())
198           .addGauge(RS_START_TIME_NAME, RS_START_TIME_DESC, rsWrap.getStartCode())
199           .addCounter(TOTAL_REQUEST_COUNT, TOTAL_REQUEST_COUNT_DESC, rsWrap.getTotalRequestCount())
200           .addCounter(READ_REQUEST_COUNT, READ_REQUEST_COUNT_DESC, rsWrap.getReadRequestsCount())
201           .addCounter(WRITE_REQUEST_COUNT, WRITE_REQUEST_COUNT_DESC, rsWrap.getWriteRequestsCount())
202           .addCounter(CHECK_MUTATE_FAILED_COUNT,
203               CHECK_MUTATE_FAILED_COUNT_DESC,
204               rsWrap.getCheckAndMutateChecksFailed())
205           .addCounter(CHECK_MUTATE_PASSED_COUNT,
206               CHECK_MUTATE_PASSED_COUNT_DESC,
207               rsWrap.getCheckAndMutateChecksPassed())
208           .addGauge(STOREFILE_INDEX_SIZE, STOREFILE_INDEX_SIZE_DESC, rsWrap.getStoreFileIndexSize())
209           .addGauge(STATIC_INDEX_SIZE, STATIC_INDEX_SIZE_DESC, rsWrap.getTotalStaticIndexSize())
210           .addGauge(STATIC_BLOOM_SIZE, STATIC_BLOOM_SIZE_DESC, rsWrap.getTotalStaticBloomSize())
211           .addGauge(NUMBER_OF_MUTATIONS_WITHOUT_WAL,
212               NUMBER_OF_MUTATIONS_WITHOUT_WAL_DESC,
213               rsWrap.getNumMutationsWithoutWAL())
214           .addGauge(DATA_SIZE_WITHOUT_WAL,
215               DATA_SIZE_WITHOUT_WAL_DESC,
216               rsWrap.getDataInMemoryWithoutWAL())
217           .addGauge(PERCENT_FILES_LOCAL, PERCENT_FILES_LOCAL_DESC, rsWrap.getPercentFileLocal())
218           .addGauge(COMPACTION_QUEUE_LENGTH,
219               COMPACTION_QUEUE_LENGTH_DESC,
220               rsWrap.getCompactionQueueSize())
221           .addGauge(LARGE_COMPACTION_QUEUE_LENGTH,
222               COMPACTION_QUEUE_LENGTH_DESC,
223               rsWrap.getLargeCompactionQueueSize())
224           .addGauge(SMALL_COMPACTION_QUEUE_LENGTH,
225               COMPACTION_QUEUE_LENGTH_DESC,
226               rsWrap.getSmallCompactionQueueSize())
227           .addGauge(FLUSH_QUEUE_LENGTH, FLUSH_QUEUE_LENGTH_DESC, rsWrap.getFlushQueueSize())
228           .addGauge(BLOCK_CACHE_FREE_SIZE, BLOCK_CACHE_FREE_DESC, rsWrap.getBlockCacheFreeSize())
229           .addGauge(BLOCK_CACHE_COUNT, BLOCK_CACHE_COUNT_DESC, rsWrap.getBlockCacheCount())
230           .addGauge(BLOCK_CACHE_SIZE, BLOCK_CACHE_SIZE_DESC, rsWrap.getBlockCacheSize())
231           .addCounter(BLOCK_CACHE_HIT_COUNT,
232               BLOCK_CACHE_HIT_COUNT_DESC,
233               rsWrap.getBlockCacheHitCount())
234           .addCounter(BLOCK_CACHE_MISS_COUNT,
235               BLOCK_COUNT_MISS_COUNT_DESC,
236               rsWrap.getBlockCacheMissCount())
237           .addCounter(BLOCK_CACHE_EVICTION_COUNT,
238               BLOCK_CACHE_EVICTION_COUNT_DESC,
239               rsWrap.getBlockCacheEvictedCount())
240           .addGauge(BLOCK_CACHE_HIT_PERCENT,
241               BLOCK_CACHE_HIT_PERCENT_DESC,
242               rsWrap.getBlockCacheHitPercent())
243           .addGauge(BLOCK_CACHE_EXPRESS_HIT_PERCENT,
244               BLOCK_CACHE_EXPRESS_HIT_PERCENT_DESC,
245               rsWrap.getBlockCacheHitCachingPercent())
246           .addCounter(BLOCK_CACHE_FAILED_INSERTION_COUNT,
247               BLOCK_CACHE_FAILED_INSERTION_COUNT_DESC,rsWrap.getBlockCacheFailedInsertions())
248           .addCounter(UPDATES_BLOCKED_TIME, UPDATES_BLOCKED_DESC, rsWrap.getUpdatesBlockedTime())
249           .addCounter(FLUSHED_CELLS, FLUSHED_CELLS_DESC, rsWrap.getFlushedCellsCount())
250           .addCounter(COMPACTED_CELLS, COMPACTED_CELLS_DESC, rsWrap.getCompactedCellsCount())
251           .addCounter(MAJOR_COMPACTED_CELLS, MAJOR_COMPACTED_CELLS_DESC,
252               rsWrap.getMajorCompactedCellsCount())
253           .addCounter(FLUSHED_CELLS_SIZE, FLUSHED_CELLS_SIZE_DESC, rsWrap.getFlushedCellsSize())
254           .addCounter(COMPACTED_CELLS_SIZE, COMPACTED_CELLS_SIZE_DESC,
255               rsWrap.getCompactedCellsSize())
256           .addCounter(MAJOR_COMPACTED_CELLS_SIZE, MAJOR_COMPACTED_CELLS_SIZE_DESC,
257               rsWrap.getMajorCompactedCellsSize())
258 
259           .addCounter(BLOCKED_REQUESTS_COUNT, BLOCKED_REQUESTS_COUNT_DESC,
260               rsWrap.getBlockedRequestsCount())
261 
262           .tag(ZOOKEEPER_QUORUM_NAME, ZOOKEEPER_QUORUM_DESC, rsWrap.getZookeeperQuorum())
263           .tag(SERVER_NAME_NAME, SERVER_NAME_DESC, rsWrap.getServerName())
264           .tag(CLUSTER_ID_NAME, CLUSTER_ID_DESC, rsWrap.getClusterId());
265     }
266 
267     metricsRegistry.snapshot(mrb, all);
268   }
269 
270 
271 }