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