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.util.Collections;
22 import java.util.Set;
23 import java.util.concurrent.ConcurrentHashMap;
24 import java.util.concurrent.TimeUnit;
25
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28 import org.apache.hadoop.hbase.classification.InterfaceAudience;
29 import org.apache.hadoop.hbase.metrics.BaseSourceImpl;
30 import org.apache.hadoop.hbase.metrics.Interns;
31 import org.apache.hadoop.metrics2.MetricsCollector;
32 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
33 import org.apache.hadoop.metrics2.impl.JmxCacheBuster;
34 import org.apache.hadoop.metrics2.lib.MetricsExecutorImpl;
35
36 @InterfaceAudience.Private
37 public class MetricsRegionAggregateSourceImpl extends BaseSourceImpl
38 implements MetricsRegionAggregateSource {
39
40 private static final Log LOG = LogFactory.getLog(MetricsRegionAggregateSourceImpl.class);
41
42 private final MetricsExecutorImpl executor = new MetricsExecutorImpl();
43
44 private final Set<MetricsRegionSource> regionSources =
45 Collections.newSetFromMap(new ConcurrentHashMap<MetricsRegionSource, Boolean>());
46
47 public MetricsRegionAggregateSourceImpl() {
48 this(METRICS_NAME, METRICS_DESCRIPTION, METRICS_CONTEXT, METRICS_JMX_CONTEXT);
49 }
50
51
52 public MetricsRegionAggregateSourceImpl(String metricsName,
53 String metricsDescription,
54 String metricsContext,
55 String metricsJmxContext) {
56 super(metricsName, metricsDescription, metricsContext, metricsJmxContext);
57
58
59 executor.getExecutor().scheduleWithFixedDelay(new Runnable() {
60 public void run() {
61 JmxCacheBuster.clearJmxCache();
62 }
63 }, 5, 5, TimeUnit.MINUTES);
64 }
65
66 @Override
67 public void register(MetricsRegionSource source) {
68 regionSources.add(source);
69 clearCache();
70 }
71
72 @Override
73 public void deregister(MetricsRegionSource toRemove) {
74 try {
75 regionSources.remove(toRemove);
76 } catch (Exception e) {
77
78
79 LOG.info(
80 "Error trying to remove " + toRemove + " from " + this.getClass().getSimpleName(),
81 e);
82 }
83 clearCache();
84 }
85
86 private synchronized void clearCache() {
87 JmxCacheBuster.clearJmxCache();
88 }
89
90
91
92
93
94
95
96
97
98 @Override
99 public void getMetrics(MetricsCollector collector, boolean all) {
100 MetricsRecordBuilder mrb = collector.addRecord(metricsName);
101
102 if (regionSources != null) {
103 for (MetricsRegionSource regionMetricSource : regionSources) {
104 if (regionMetricSource instanceof MetricsRegionSourceImpl) {
105 ((MetricsRegionSourceImpl) regionMetricSource).snapshot(mrb, all);
106 }
107 }
108 mrb.addGauge(Interns.info(NUM_REGIONS, NUMBER_OF_REGIONS_DESC), regionSources.size());
109 metricsRegistry.snapshot(mrb, all);
110 }
111 }
112 }