@@ -9,17 +9,39 @@ import java.util.concurrent.TimeUnit
9
9
10
10
import spark .Logging
11
11
import spark .metrics .sink ._
12
+ import spark .metrics .source ._
12
13
13
- trait AbstractInstrumentation extends Logging {
14
+ private [spark] trait AbstractInstrumentation extends Logging {
14
15
initLogging()
15
16
17
+ // Get MetricRegistry handler
16
18
def registryHandler : MetricRegistry
19
+ // Get the instance name
17
20
def instance : String
18
21
19
22
val confFile = System .getProperty(" spark.metrics.conf.file" , MetricsConfig .DEFAULT_CONFIG_FILE )
20
23
val metricsConfig = new MetricsConfig (confFile)
21
24
22
25
val sinks = new mutable.ArrayBuffer [Sink ]
26
+ val sources = new mutable.ArrayBuffer [Source ]
27
+
28
+ def registerSources () {
29
+ val instConfig = metricsConfig.getInstance(instance)
30
+ val sourceConfigs = MetricsConfig .subProperties(instConfig, AbstractInstrumentation .SOURCE_REGEX )
31
+
32
+ // Register all the sources
33
+ sourceConfigs.foreach { kv =>
34
+ val classPath = kv._2.getProperty(" class" )
35
+ try {
36
+ val source = Class .forName(classPath).getConstructor(classOf [MetricRegistry ])
37
+ .newInstance(registryHandler)
38
+ sources += source.asInstanceOf [Source ]
39
+ } catch {
40
+ case e : Exception => logError(" source class " + classPath + " cannot be instantialized" , e)
41
+ }
42
+ }
43
+ sources.foreach(_.registerSource)
44
+ }
23
45
24
46
def registerSinks () {
25
47
val instConfig = metricsConfig.getInstance(instance)
@@ -33,17 +55,17 @@ trait AbstractInstrumentation extends Logging {
33
55
val classPath = if (AbstractInstrumentation .DEFAULT_SINKS .contains(kv._1)) {
34
56
AbstractInstrumentation .DEFAULT_SINKS (kv._1)
35
57
} else {
58
+ // For non-default sink, a property class should be set and create using reflection
36
59
kv._2.getProperty(" class" )
37
60
}
38
61
try {
39
62
val sink = Class .forName(classPath).getConstructor(classOf [Properties ], classOf [MetricRegistry ])
40
63
.newInstance(kv._2, registryHandler)
41
64
sinks += sink.asInstanceOf [Sink ]
42
65
} catch {
43
- case e : Exception => logError(" class " + classPath + " cannot be instantialize " , e)
66
+ case e : Exception => logError(" sink class " + classPath + " cannot be instantialized " , e)
44
67
}
45
68
}
46
-
47
69
sinks.foreach(_.registerSink)
48
70
}
49
71
@@ -58,6 +80,7 @@ object AbstractInstrumentation {
58
80
" csv" -> " spark.metrics.sink.CsvSink" )
59
81
60
82
val SINK_REGEX = " ^sink\\ .(.+)\\ .(.+)" .r
83
+ val SOURCE_REGEX = " ^source\\ .(.+)\\ .(.+)" .r
61
84
62
85
val timeUnits = Map (
63
86
" millisecond" -> TimeUnit .MILLISECONDS ,
0 commit comments