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 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    * Get the replica id of this region.
274    */
275   @Override
276   public int getReplicaId() {
277     return region.getRegionInfo().getReplicaId();
278   }
279 
280 }