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