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
56 private ScheduledFuture<?> regionMetricsUpdateTask;
57
58 public MetricsRegionWrapperImpl(HRegion region) {
59 this.region = region;
60 this.executor = CompatibilitySingletonFactory.getInstance(MetricsExecutor.class).getExecutor();
61 this.runnable = new HRegionMetricsWrapperRunnable();
62 this.regionMetricsUpdateTask = this.executor.scheduleWithFixedDelay(this.runnable, PERIOD,
63 PERIOD, TimeUnit.SECONDS);
64 }
65
66 @Override
67 public String getTableName() {
68 HTableDescriptor tableDesc = this.region.getTableDesc();
69 if (tableDesc == null) {
70 return UNKNOWN;
71 }
72 return tableDesc.getTableName().getQualifierAsString();
73 }
74
75 @Override
76 public String getNamespace() {
77 HTableDescriptor tableDesc = this.region.getTableDesc();
78 if (tableDesc == null) {
79 return UNKNOWN;
80 }
81 return tableDesc.getTableName().getNamespaceAsString();
82 }
83
84
85 @Override
86 public String getRegionName() {
87 HRegionInfo regionInfo = this.region.getRegionInfo();
88 if (regionInfo == null) {
89 return UNKNOWN;
90 }
91 return regionInfo.getEncodedName();
92 }
93
94 @Override
95 public long getNumStores() {
96 Map<byte[],Store> stores = this.region.stores;
97 if (stores == null) {
98 return 0;
99 }
100 return stores.size();
101 }
102
103 @Override
104 public long getNumStoreFiles() {
105 return numStoreFiles;
106 }
107
108 @Override
109 public long getMemstoreSize() {
110 return memstoreSize;
111 }
112
113 @Override
114 public long getStoreFileSize() {
115 return storeFileSize;
116 }
117
118 @Override
119 public long getReadRequestCount() {
120 return this.region.getReadRequestsCount();
121 }
122
123 @Override
124 public long getWriteRequestCount() {
125 return this.region.getWriteRequestsCount();
126 }
127
128 @Override
129 public long getNumFilesCompacted() {
130 return this.region.compactionNumFilesCompacted.get();
131 }
132
133 @Override
134 public long getNumBytesCompacted() {
135 return this.region.compactionNumBytesCompacted.get();
136 }
137
138 @Override
139 public long getNumCompactionsCompleted() {
140 return this.region.compactionsFinished.get();
141 }
142
143 @Override
144 public long getLastMajorCompactionAge() {
145 long lastMajorCompactionTs = 0L;
146 try {
147 lastMajorCompactionTs = this.region.getOldestHfileTs(true);
148 } catch (IOException ioe) {
149 LOG.error("Could not load HFile info ", ioe);
150 }
151 long now = EnvironmentEdgeManager.currentTime();
152 return now - lastMajorCompactionTs;
153 }
154
155 @Override
156 public long getNumCompactionsFailed() {
157 return this.region.compactionsFailed.get();
158 }
159
160 @Override
161 public long getMaxStoreFileAge() {
162 return maxStoreFileAge;
163 }
164
165 @Override
166 public long getMinStoreFileAge() {
167 return minStoreFileAge;
168 }
169
170 @Override
171 public long getAvgStoreFileAge() {
172 return avgStoreFileAge;
173 }
174
175 @Override
176 public long getNumReferenceFiles() {
177 return numReferenceFiles;
178 }
179
180 @Override
181 public int getRegionHashCode() {
182 return this.region.hashCode();
183 }
184
185 public class HRegionMetricsWrapperRunnable implements Runnable {
186
187 @Override
188 public void run() {
189 long tempNumStoreFiles = 0;
190 long tempMemstoreSize = 0;
191 long tempStoreFileSize = 0;
192 long tempMaxStoreFileAge = 0;
193 long tempMinStoreFileAge = Long.MAX_VALUE;
194 long tempNumReferenceFiles = 0;
195
196 long avgAgeNumerator = 0;
197 long numHFiles = 0;
198 if (region.stores != null) {
199 for (Store store : region.stores.values()) {
200 tempNumStoreFiles += store.getStorefilesCount();
201 tempMemstoreSize += store.getMemStoreSize();
202 tempStoreFileSize += store.getStorefilesSize();
203
204 long storeMaxStoreFileAge = store.getMaxStoreFileAge();
205 tempMaxStoreFileAge = (storeMaxStoreFileAge > tempMaxStoreFileAge) ?
206 storeMaxStoreFileAge : tempMaxStoreFileAge;
207
208 long storeMinStoreFileAge = store.getMinStoreFileAge();
209 tempMinStoreFileAge = (storeMinStoreFileAge < tempMinStoreFileAge) ?
210 storeMinStoreFileAge : tempMinStoreFileAge;
211
212 long storeHFiles = store.getNumHFiles();
213 avgAgeNumerator += store.getAvgStoreFileAge() * storeHFiles;
214 numHFiles += storeHFiles;
215 tempNumReferenceFiles += store.getNumReferenceFiles();
216 }
217 }
218
219 numStoreFiles = tempNumStoreFiles;
220 memstoreSize = tempMemstoreSize;
221 storeFileSize = tempStoreFileSize;
222 maxStoreFileAge = tempMaxStoreFileAge;
223 if (tempMinStoreFileAge != Long.MAX_VALUE) {
224 minStoreFileAge = tempMinStoreFileAge;
225 }
226
227 if (numHFiles != 0) {
228 avgStoreFileAge = avgAgeNumerator / numHFiles;
229 }
230
231 numReferenceFiles = tempNumReferenceFiles;
232 }
233 }
234
235 @Override
236 public void close() throws IOException {
237 regionMetricsUpdateTask.cancel(true);
238 }
239
240
241
242
243 @Override
244 public int getReplicaId() {
245 return region.getRegionInfo().getReplicaId();
246 }
247
248 }