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 private static enum SingletonHolder {
46 INSTANCE;
47 Object lock = new Object();
48 SpanReceiverHost host = null;
49 }
50
51 public static SpanReceiverHost getInstance(Configuration conf) {
52 synchronized (SingletonHolder.INSTANCE.lock) {
53 if (SingletonHolder.INSTANCE.host != null) {
54 return SingletonHolder.INSTANCE.host;
55 }
56
57 SpanReceiverHost host = new SpanReceiverHost(conf);
58 host.loadSpanReceivers();
59 SingletonHolder.INSTANCE.host = host;
60 return SingletonHolder.INSTANCE.host;
61 }
62
63 }
64
65 SpanReceiverHost(Configuration conf) {
66 receivers = new HashSet<SpanReceiver>();
67 this.conf = conf;
68 }
69
70
71
72
73
74
75 public void loadSpanReceivers() {
76 String[] receiverNames = conf.getStrings(SPAN_RECEIVERS_CONF_KEY);
77 if (receiverNames == null || receiverNames.length == 0) {
78 return;
79 }
80
81 SpanReceiverBuilder builder = new SpanReceiverBuilder(new HBaseHTraceConfiguration(conf));
82 for (String className : receiverNames) {
83 className = className.trim();
84
85 SpanReceiver receiver = builder.spanReceiverClass(className).build();
86 if (receiver != null) {
87 receivers.add(receiver);
88 LOG.info("SpanReceiver " + className + " was loaded successfully.");
89 }
90 }
91 for (SpanReceiver rcvr : receivers) {
92 Trace.addReceiver(rcvr);
93 }
94 }
95
96
97
98
99 public synchronized void closeReceivers() {
100 if (closed) return;
101 closed = true;
102 for (SpanReceiver rcvr : receivers) {
103 try {
104 rcvr.close();
105 } catch (IOException e) {
106 LOG.warn("Unable to close SpanReceiver correctly: " + e.getMessage(), e);
107 }
108 }
109 }
110 }