1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.regionserver;
20
21 import java.io.Closeable;
22 import java.io.IOException;
23 import java.util.Map;
24 import java.util.concurrent.ScheduledExecutorService;
25 import java.util.concurrent.ScheduledFuture;
26 import java.util.concurrent.TimeUnit;
27
28 import org.apache.commons.logging.Log;
29 import org.apache.commons.logging.LogFactory;
30 import org.apache.hadoop.hbase.classification.InterfaceAudience;
31 import org.apache.hadoop.hbase.CompatibilitySingletonFactory;
32 import org.apache.hadoop.hbase.HRegionInfo;
33 import org.apache.hadoop.hbase.HTableDescriptor;
34 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
35 import org.apache.hadoop.metrics2.MetricsExecutor;
36
37 @InterfaceAudience.Private
38 public class MetricsRegionWrapperImpl implements MetricsRegionWrapper, Closeable {
39
40 private static final Log LOG = LogFactory.getLog(MetricsRegionWrapperImpl.class);
41
42 public static final int PERIOD = 45;
43 public static final String UNKNOWN = "unknown";
44
45 private final HRegion region;
46 private ScheduledExecutorService executor;
47 private Runnable runnable;
48 private long numStoreFiles;
49 private long memstoreSize;
50 private long storeFileSize;
51 private long maxStoreFileAge;
52 private long minStoreFileAge;
53 private long avgStoreFileAge;
54 private long numReferenceFiles;
55 private long maxFlushQueueSize;
56 private long maxCompactionQueueSize;
57
58 private ScheduledFuture<?> regionMetricsUpdateTask;
59
60 public MetricsRegionWrapperImpl(HRegion region) {
61 this.region = region;
62 this.executor = CompatibilitySingletonFactory.getInstance(MetricsExecutor.class).getExecutor();
63 this.runnable = new HRegionMetricsWrapperRunnable();
64 this.regionMetricsUpdateTask = this.executor.scheduleWithFixedDelay(this.runnable, PERIOD,
65 PERIOD, TimeUnit.SECONDS);
66 }
67
68 @Override
69 public String getTableName() {
70 HTableDescriptor tableDesc = this.region.getTableDesc();
71 if (tableDesc == null) {
72 return UNKNOWN;
73 }
74 return tableDesc.getTableName().getQualifierAsString();
75 }
76
77 @Override
78 public String getNamespace() {
79 HTableDescriptor tableDesc = this.region.getTableDesc();
80 if (tableDesc == null) {
81 return UNKNOWN;
82 }
83 return tableDesc.getTableName().getNamespaceAsString();
84 }
85
86
87 @Override
88 public String getRegionName() {
89 HRegionInfo regionInfo = this.region.getRegionInfo();
90 if (regionInfo == null) {
91 return UNKNOWN;
92 }
93 return regionInfo.getEncodedName();
94 }
95
96 @Override
97 public long getNumStores() {
98 Map<byte[],Store> stores = this.region.stores;
99 if (stores == null) {
100 return 0;
101 }
102 return stores.size();
103 }
104
105 @Override
106 public long getNumStoreFiles() {
107 return numStoreFiles;
108 }
109
110 @Override
111 public long getMemstoreSize() {
112 return memstoreSize;
113 }
114
115 @Override
116 public long getStoreFileSize() {
117 return storeFileSize;
118 }
119
120 @Override
121 public long getReadRequestCount() {
122 return this.region.getReadRequestsCount();
123 }
124
125 @Override
126 public long getWriteRequestCount() {
127 return this.region.getWriteRequestsCount();
128 }
129
130 @Override
131 public long getNumFilesCompacted() {
132 return this.region.compactionNumFilesCompacted.get();
133 }
134
135 @Override
136 public long getNumBytesCompacted() {
137 return this.region.compactionNumBytesCompacted.get();
138 }
139
140 @Override
141 public long getNumCompactionsCompleted() {
142 return this.region.compactionsFinished.get();
143 }
144
145 @Override
146 public long getLastMajorCompactionAge() {
147 long lastMajorCompactionTs = 0L;
148 try {
149 lastMajorCompactionTs = this.region.getOldestHfileTs(true);
150 } catch (IOException ioe) {
151 LOG.error("Could not load HFile info ", ioe);
152 }
153 long now = EnvironmentEdgeManager.currentTime();
154 return now - lastMajorCompactionTs;
155 }
156
157 @Override
158 public long getNumCompactionsFailed() {
159 return this.region.compactionsFailed.get();
160 }
161
162 @Override
163 public long getNumCompactionsQueued() {
164 return this.region.compactionsQueued.get();
165 }
166
167 @Override
168 public long getNumFlushesQueued() {
169 return this.region.flushesQueued.get();
170 }
171
172 @Override
173 public long getMaxCompactionQueueSize() {
174 return maxCompactionQueueSize;
175 }
176
177 @Override
178 public long getMaxFlushQueueSize() {
179 return maxFlushQueueSize;
180 }
181
182 @Override
183 public long getMaxStoreFileAge() {
184 return maxStoreFileAge;
185 }
186
187 @Override
188 public long getMinStoreFileAge() {
189 return minStoreFileAge;
190 }
191
192 @Override
193 public long getAvgStoreFileAge() {
194 return avgStoreFileAge;
195 }
196
197 @Override
198 public long getNumReferenceFiles() {
199 return numReferenceFiles;
200 }
201
202 @Override
203 public int getRegionHashCode() {
204 return this.region.hashCode();
205 }
206
207 public class HRegionMetricsWrapperRunnable implements Runnable {
208
209 @Override
210 public void run() {
211 long tempNumStoreFiles = 0;
212 long tempMemstoreSize = 0;
213 long tempStoreFileSize = 0;
214 long tempMaxStoreFileAge = 0;
215 long tempMinStoreFileAge = Long.MAX_VALUE;
216 long tempNumReferenceFiles = 0;
217 long tempMaxCompactionQueueSize = 0;
218 long tempMaxFlushQueueSize = 0;
219
220 long avgAgeNumerator = 0;
221 long numHFiles = 0;
222 if (region.stores != null) {
223 for (Store store : region.stores.values()) {
224 tempNumStoreFiles += store.getStorefilesCount();
225 tempMemstoreSize += store.getMemStoreSize();
226 tempStoreFileSize += store.getStorefilesSize();
227
228 long storeMaxStoreFileAge = store.getMaxStoreFileAge();
229 tempMaxStoreFileAge = (storeMaxStoreFileAge > tempMaxStoreFileAge) ?
230 storeMaxStoreFileAge : tempMaxStoreFileAge;
231
232 long storeMinStoreFileAge = store.getMinStoreFileAge();
233 tempMinStoreFileAge = (storeMinStoreFileAge < tempMinStoreFileAge) ?
234 storeMinStoreFileAge : tempMinStoreFileAge;
235
236 long storeHFiles = store.getNumHFiles();
237 avgAgeNumerator += store.getAvgStoreFileAge() * storeHFiles;
238 numHFiles += storeHFiles;
239 tempNumReferenceFiles += store.getNumReferenceFiles();
240 }
241 }
242
243 numStoreFiles = tempNumStoreFiles;
244 memstoreSize = tempMemstoreSize;
245 storeFileSize = tempStoreFileSize;
246 maxStoreFileAge = tempMaxStoreFileAge;
247 if (tempMinStoreFileAge != Long.MAX_VALUE) {
248 minStoreFileAge = tempMinStoreFileAge;
249 }
250
251 if (numHFiles != 0) {
252 avgStoreFileAge = avgAgeNumerator / numHFiles;
253 }
254
255 numReferenceFiles = tempNumReferenceFiles;
256 tempMaxCompactionQueueSize = getNumCompactionsQueued();
257 tempMaxFlushQueueSize = getNumFlushesQueued();
258 if (tempMaxCompactionQueueSize > maxCompactionQueueSize) {
259 maxCompactionQueueSize = tempMaxCompactionQueueSize;
260 }
261 if (tempMaxFlushQueueSize > maxFlushQueueSize) {
262 maxFlushQueueSize = tempMaxFlushQueueSize;
263 }
264 }
265 }
266
267 @Override
268 public void close() throws IOException {
269 regionMetricsUpdateTask.cancel(true);
270 }
271
272
273
274
275 @Override
276 public int getReplicaId() {
277 return region.getRegionInfo().getReplicaId();
278 }
279
280 }