1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.hadoop.hbase.metrics;
22
23
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.ServiceLoader;
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.util.ReflectionUtils;
32
33 import com.google.common.annotations.VisibleForTesting;
34
35 @InterfaceAudience.Private
36 public class MetricRegistriesLoader {
37 private static final Log LOG = LogFactory.getLog(MetricRegistries.class);
38
39 private static final String defaultClass
40 = "org.apache.hadoop.hbase.metrics.impl.MetricRegistriesImpl";
41
42
43
44
45
46
47
48 public static MetricRegistries load() {
49 List<MetricRegistries> availableImplementations = getDefinedImplemantations();
50 return load(availableImplementations);
51 }
52
53
54
55
56
57
58
59 @VisibleForTesting
60 static MetricRegistries load(List<MetricRegistries> availableImplementations) {
61
62 if (availableImplementations.size() == 1) {
63
64 MetricRegistries impl = availableImplementations.get(0);
65 LOG.info("Loaded MetricRegistries " + impl.getClass());
66 return impl;
67 } else if (availableImplementations.isEmpty()) {
68 try {
69 return ReflectionUtils.newInstance((Class<MetricRegistries>)Class.forName(defaultClass));
70 } catch (ClassNotFoundException e) {
71 throw new RuntimeException(e);
72 }
73 } else {
74
75 StringBuilder sb = new StringBuilder();
76 for (MetricRegistries factory : availableImplementations) {
77 if (sb.length() > 0) {
78 sb.append(", ");
79 }
80 sb.append(factory.getClass());
81 }
82 LOG.warn("Found multiple MetricRegistries implementations: " + sb
83 + ". Using first found implementation: " + availableImplementations.get(0));
84 return availableImplementations.get(0);
85 }
86 }
87
88 private static List<MetricRegistries> getDefinedImplemantations() {
89 ServiceLoader<MetricRegistries> loader = ServiceLoader.load(MetricRegistries.class);
90 List<MetricRegistries> availableFactories = new ArrayList<>();
91 for (MetricRegistries impl : loader) {
92 availableFactories.add(impl);
93 }
94 return availableFactories;
95 }
96 }