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  
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    * Get the replica id of this region.
242    */
243   @Override
244   public int getReplicaId() {
245     return region.getRegionInfo().getReplicaId();
246   }
247 
248 }