With the help of my colleague, we got a little further.
I created a jar from the following source code (see below), but I get a
NoClassDefFoundError when I try to start kafka.
I somehow need to tell Kafka to use my custom reporter.
In my server.properties, I'm trying to tell it to use my custom
reporter:
kafka.metrics.reporters=kafka.metrics.KafkaGraphiteReporter
And the jar file lives in /libs, so I know it's in the class path when
kafka starts (maybe it's not in the correct order in the class path?).
Here is the error from kafka when I try to start it:
java.lang.NoClassDefFoundError:
com/yammer/metrics/reporting/GraphiteReporter
at
kafka.metrics.KafkaGraphiteReporter.init(KafkaGraphiteReporter.java:15)
at
kafka.metrics.KafkaMetricsReporter$$anonfun$startReporters$1.apply(KafkaMetricsReporter.scala:60)
at
kafka.metrics.KafkaMetricsReporter$$anonfun$startReporters$1.apply(KafkaMetricsReporter.scala:58)
at
scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:34)
at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:32)
at
kafka.metrics.KafkaMetricsReporter$.startReporters(KafkaMetricsReporter.scala:58)
at kafka.Kafka$.main(Kafka.scala:36)
at kafka.Kafka.main(Kafka.scala)
Here is the source code. It's not really doing anything at the
moment... I just want kafka to use it when it starts up...
=====================
package kafka.metrics;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import kafka.utils.VerifiableProperties;
import com.yammer.metrics.Metrics;
import com.yammer.metrics.core.Metric;
import com.yammer.metrics.core.MetricName;
import com.yammer.metrics.reporting.GraphiteReporter;
public class KafkaGraphiteReporter implements KafkaMetricsReporter,
Runnable {
public void init(VerifiableProperties arg0) {
GraphiteReporter.enable(1, TimeUnit.MINUTES,
"my.graphite.server.com",
2003);
System.out.println("Graphite init...");
Thread t = new Thread(this);
t.setDaemon(true);
t.setName("graphitebg");
t.start();
}
public void run() {
try {
while(true) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Graphite background thread
executing");
GraphiteReporter.enable(1, TimeUnit.MINUTES,
"my.graphite.server.com",
2003);
Map<MetricName, Metric> allMetrics =
Metrics.defaultRegistry().allMetrics();
for (MetricName key : allMetrics.keySet()) {
System.out.println(key + "=" +
allMetrics.get(key).toString());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
=====================
if you have any thoughts on getting this to work, that would be awesome.
Thanks,
Alex