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.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 }