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.HashMap;
24 import java.util.Map;
25 import java.util.concurrent.ScheduledExecutorService;
26 import java.util.concurrent.ScheduledFuture;
27 import java.util.concurrent.TimeUnit;
28
29 import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
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.metrics2.MetricsExecutor;
35
36 @InterfaceAudience.Private
37 public class MetricsRegionWrapperImpl implements MetricsRegionWrapper, Closeable {
38
39 public static final int PERIOD = 45;
40 public static final String UNKNOWN = "unknown";
41
42 private final HRegion region;
43 private ScheduledExecutorService executor;
44 private Runnable runnable;
45 private long numStoreFiles;
46 private long memstoreSize;
47 private long storeFileSize;
48 private Map<String, DescriptiveStatistics> coprocessorTimes;
49 private long maxStoreFileAge;
50 private long minStoreFileAge;
51 private long avgStoreFileAge;
52 private long numReferenceFiles;
53
54 private ScheduledFuture<?> regionMetricsUpdateTask;
55
56 public MetricsRegionWrapperImpl(HRegion region) {
57 this.region = region;
58 this.executor = CompatibilitySingletonFactory.getInstance(MetricsExecutor.class).getExecutor();
59 this.runnable = new HRegionMetricsWrapperRunnable();
60 this.regionMetricsUpdateTask = this.executor.scheduleWithFixedDelay(this.runnable, PERIOD,
61 PERIOD, TimeUnit.SECONDS);
62 this.coprocessorTimes = new HashMap<String, DescriptiveStatistics>();
63 }
64
65 @Override
66 public String getTableName() {
67 HTableDescriptor tableDesc = this.region.getTableDesc();
68 if (tableDesc == null) {
69 return UNKNOWN;
70 }
71 return tableDesc.getTableName().getQualifierAsString();
72 }
73
74 @Override
75 public String getNamespace() {
76 HTableDescriptor tableDesc = this.region.getTableDesc();
77 if (tableDesc == null) {
78 return UNKNOWN;
79 }
80 return tableDesc.getTableName().getNamespaceAsString();
81 }
82
83
84 @Override
85 public String getRegionName() {
86 HRegionInfo regionInfo = this.region.getRegionInfo();
87 if (regionInfo == null) {
88 return UNKNOWN;
89 }
90 return regionInfo.getEncodedName();
91 }
92
93 @Override
94 public long getNumStores() {
95 Map<byte[],Store> stores = this.region.stores;
96 if (stores == null) {
97 return 0;
98 }
99 return stores.size();
100 }
101
102 @Override
103 public long getNumStoreFiles() {
104 return numStoreFiles;
105 }
106
107 @Override
108 public long getMemstoreSize() {
109 return memstoreSize;
110 }
111
112 @Override
113 public long getStoreFileSize() {
114 return storeFileSize;
115 }
116
117 @Override
118 public long getReadRequestCount() {
119 return this.region.getReadRequestsCount();
120 }
121
122 @Override
123 public long getWriteRequestCount() {
124 return this.region.getWriteRequestsCount();
125 }
126
127 @Override
128 public long getNumFilesCompacted() {
129 return this.region.compactionNumFilesCompacted.get();
130 }
131
132 @Override
133 public long getNumBytesCompacted() {
134 return this.region.compactionNumBytesCompacted.get();
135 }
136
137 @Override
138 public long getNumCompactionsCompleted() {
139 return this.region.compactionsFinished.get();
140 }
141
142 @Override
143 public long getMaxStoreFileAge() {
144 return maxStoreFileAge;
145 }
146
147 @Override
148 public long getMinStoreFileAge() {
149 return minStoreFileAge;
150 }
151
152 @Override
153 public long getAvgStoreFileAge() {
154 return avgStoreFileAge;
155 }
156
157 @Override
158 public long getNumReferenceFiles() {
159 return numReferenceFiles;
160 }
161
162 public class HRegionMetricsWrapperRunnable implements Runnable {
163
164 @Override
165 public void run() {
166 long tempNumStoreFiles = 0;
167 long tempMemstoreSize = 0;
168 long tempStoreFileSize = 0;
169 long tempMaxStoreFileAge = 0;
170 long tempMinStoreFileAge = Long.MAX_VALUE;
171 long tempNumReferenceFiles = 0;
172
173 long avgAgeNumerator = 0;
174 long numHFiles = 0;
175 if (region.stores != null) {
176 for (Store store : region.stores.values()) {
177 tempNumStoreFiles += store.getStorefilesCount();
178 tempMemstoreSize += store.getMemStoreSize();
179 tempStoreFileSize += store.getStorefilesSize();
180
181 long storeMaxStoreFileAge = store.getMaxStoreFileAge();
182 tempMaxStoreFileAge = (storeMaxStoreFileAge > tempMaxStoreFileAge) ?
183 storeMaxStoreFileAge : tempMaxStoreFileAge;
184
185 long storeMinStoreFileAge = store.getMinStoreFileAge();
186 tempMinStoreFileAge = (storeMinStoreFileAge < tempMinStoreFileAge) ?
187 storeMinStoreFileAge : tempMinStoreFileAge;
188
189 long storeHFiles = store.getNumHFiles();
190 avgAgeNumerator += store.getAvgStoreFileAge() * storeHFiles;
191 numHFiles += storeHFiles;
192 tempNumReferenceFiles += store.getNumReferenceFiles();
193 }
194 }
195
196 numStoreFiles = tempNumStoreFiles;
197 memstoreSize = tempMemstoreSize;
198 storeFileSize = tempStoreFileSize;
199
200 maxStoreFileAge = tempMaxStoreFileAge;
201 if (tempMinStoreFileAge != Long.MAX_VALUE) {
202 minStoreFileAge = tempMinStoreFileAge;
203 }
204
205 if (numHFiles != 0) {
206 avgStoreFileAge = avgAgeNumerator / numHFiles;
207 }
208
209 numReferenceFiles = tempNumReferenceFiles;
210
211 coprocessorTimes = region.getCoprocessorHost().getCoprocessorExecutionStatistics();
212 }
213 }
214
215 @Override
216 public void close() throws IOException {
217 regionMetricsUpdateTask.cancel(true);
218 }
219
220 @Override
221 public Map<String, DescriptiveStatistics> getCoprocessorExecutionStatistics() {
222 return coprocessorTimes;
223 }
224
225 }