1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.trace;
19
20 import java.io.IOException;
21 import java.util.Collection;
22 import java.util.HashSet;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26 import org.apache.hadoop.conf.Configuration;
27 import org.apache.hadoop.hbase.classification.InterfaceAudience;
28 import org.apache.htrace.SpanReceiver;
29 import org.apache.htrace.SpanReceiverBuilder;
30 import org.apache.htrace.Trace;
31
32
33
34
35
36
37 @InterfaceAudience.Private
38 public class SpanReceiverHost {
39 public static final String SPAN_RECEIVERS_CONF_KEY = "hbase.trace.spanreceiver.classes";
40 private static final Log LOG = LogFactory.getLog(SpanReceiverHost.class);
41 private Collection<SpanReceiver> receivers;
42 private Configuration conf;
43 private boolean closed = false;
44
45 @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="SE_BAD_FIELD")
46 private static enum SingletonHolder {
47 INSTANCE;
48 Object lock = new Object();
49 SpanReceiverHost host = null;
50 }
51
52 public static SpanReceiverHost getInstance(Configuration conf) {
53 synchronized (SingletonHolder.INSTANCE.lock) {
54 if (SingletonHolder.INSTANCE.host != null) {
55 return SingletonHolder.INSTANCE.host;
56 }
57
58 SpanReceiverHost host = new SpanReceiverHost(conf);
59 host.loadSpanReceivers();
60 SingletonHolder.INSTANCE.host = host;
61 return SingletonHolder.INSTANCE.host;
62 }
63
64 }
65
66 SpanReceiverHost(Configuration conf) {
67 receivers = new HashSet<SpanReceiver>();
68 this.conf = conf;
69 }
70
71
72
73
74
75
76 public void loadSpanReceivers() {
77 String[] receiverNames = conf.getStrings(SPAN_RECEIVERS_CONF_KEY);
78 if (receiverNames == null || receiverNames.length == 0) {
79 return;
80 }
81
82 SpanReceiverBuilder builder = new SpanReceiverBuilder(new HBaseHTraceConfiguration(conf));
83 for (String className : receiverNames) {
84 className = className.trim();
85
86 SpanReceiver receiver = builder.spanReceiverClass(className).build();
87 if (receiver != null) {
88 receivers.add(receiver);
89 LOG.info("SpanReceiver " + className + " was loaded successfully.");
90 }
91 }
92 for (SpanReceiver rcvr : receivers) {
93 Trace.addReceiver(rcvr);
94 }
95 }
96
97
98
99
100 public synchronized void closeReceivers() {
101 if (closed) return;
102 closed = true;
103 for (SpanReceiver rcvr : receivers) {
104 try {
105 rcvr.close();
106 } catch (IOException e) {
107 LOG.warn("Unable to close SpanReceiver correctly: " + e.getMessage(), e);
108 }
109 }
110 }
111 }