├── .gitignore ├── README.md ├── pom.xml └── src └── main └── java └── com └── criteo └── kafka ├── KafkaGangliaMetricsReporter.java ├── KafkaGangliaMetricsReporterMBean.java └── RegexMetricPredicate.java /.gitignore: -------------------------------------------------------------------------------- 1 | /.project 2 | /.classpath 3 | /target/ 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Kafka Ganglia Metrics Reporter 2 | ============================== 3 | 4 | Warning: this repository is not used by Criteo anymore. If you are using it and are interested in taking ownership, let us know by opening an issue. 5 | 6 | This is a simple reporter for kafka using the 7 | [GangliaReporter](http://metrics.codahale.com/manual/ganglia/). It works with 8 | kafka 0.8 beta version. 9 | 10 | Install On Broker 11 | ------------ 12 | 13 | 1. Build the `kafka-ganglia-1.0.0.jar` jar using `mvn package`. 14 | 2. Add `kafka-ganglia-1.0.0.jar` and `metrics-ganglia-2.2.0.jar` to the `libs/` 15 | directory of your kafka broker installation 16 | 3. Configure the broker (see the configuration section below) 17 | 4. Restart the broker 18 | 19 | Configuration 20 | ------------ 21 | 22 | Edit the `server.properties` file of your installation, activate the reporter by setting: 23 | 24 | kafka.metrics.reporters=com.criteo.kafka.KafkaGangliaMetricsReporter[,kafka.metrics.KafkaCSVMetricsReporter[,....]] 25 | kafka.ganglia.metrics.reporter.enabled=true 26 | 27 | Here is a list of default properties used: 28 | 29 | kafka.ganglia.metrics.host=localhost 30 | kafka.ganglia.metrics.port=8649 31 | kafka.ganglia.metrics.group=kafka 32 | # This can be use to exclude some metrics from ganglia 33 | # since kafka has quite a lot of metrics, it is useful 34 | # if you have many topics/partitions. 35 | kafka.ganglia.metrics.exclude.regex= 36 | 37 | Usage As Lib 38 | ----------- 39 | 40 | Simply build the jar and publish it to your maven internal repository (this 41 | package is not published to any public repositories unfortunately). 42 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 4.0.0 7 | com.criteo.kafka 8 | kafka-ganglia 9 | jar 10 | 1.0.0 11 | Kafka metrics output to Ganglia 12 | http://maven.criteo 13 | 14 | 15 | 3.0.4 16 | 17 | 18 | 19 | 20 | org.apache.kafka 21 | kafka_2.10 22 | 0.8.0 23 | 24 | 25 | com.yammer.metrics 26 | metrics-ganglia 27 | 2.2.0 28 | 29 | 30 | 31 | 32 | org.apache.zookeeper 33 | zookeeper 34 | 3.3.4 35 | 36 | 37 | log4j 38 | log4j 39 | 40 | 41 | jline 42 | jline 43 | 44 | 45 | 46 | 47 | org.scala-lang 48 | scala-library 49 | 2.10.7 50 | 51 | 52 | log4j 53 | log4j 54 | 1.2.15 55 | 56 | 57 | javax.jms 58 | jms 59 | 60 | 61 | com.sun.jmx 62 | jmxri 63 | 64 | 65 | com.sun.jdmk 66 | jmxtools 67 | 68 | 69 | 70 | 71 | net.sf.jopt-simple 72 | jopt-simple 73 | 3.2 74 | 75 | 76 | org.slf4j 77 | slf4j-simple 78 | 1.6.4 79 | 80 | 81 | org.scala-lang 82 | scala-compiler 83 | 2.10.7 84 | 85 | 86 | com.101tec 87 | zkclient 88 | 0.3 89 | 90 | 91 | org.xerial.snappy 92 | snappy-java 93 | 1.0.4.1 94 | 95 | 96 | com.yammer.metrics 97 | metrics-core 98 | 2.2.0 99 | 100 | 101 | com.yammer.metrics 102 | metrics-annotation 103 | 2.2.0 104 | 105 | 106 | org.easymock 107 | easymock 108 | 3.0 109 | test 110 | 111 | 112 | junit 113 | junit 114 | 4.11 115 | 116 | 117 | org.scalatest 118 | scalatest_2.9.2 119 | 1.8 120 | test 121 | 122 | 123 | 124 | 125 | 126 | criteo.releases 127 | Criteo Releases 128 | http://maven/content/repositories/criteo.releases 129 | 130 | 131 | criteo.snapshots 132 | Criteo Snapshots 133 | http://maven/content/repositories/criteo.snapshots 134 | 135 | 136 | 137 | 138 | UTF-8 139 | uber 140 | 141 | 142 | 143 | 144 | 145 | org.apache.maven.plugins 146 | maven-compiler-plugin 147 | 148 | 1.6 149 | 1.6 150 | 151 | 152 | 153 | 154 | 155 | org.apache.maven.plugins 156 | maven-eclipse-plugin 157 | 2.9 158 | 159 | true 160 | true 161 | 162 | 163 | 164 | 165 | 166 | org.apache.maven.plugins 167 | maven-source-plugin 168 | 2.2.1 169 | 170 | 171 | attach-sources 172 | 173 | jar 174 | 175 | 176 | 177 | 178 | 179 | org.apache.maven.plugins 180 | maven-javadoc-plugin 181 | 2.9 182 | 183 | 184 | org.umlgraph.doclet.UmlGraphDoc 185 | 186 | org.umlgraph 187 | doclet 188 | 5.1 189 | 190 | -views 191 | true 192 | 193 | 194 | 195 | attach-javadocs 196 | 197 | jar 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | org.apache.maven.plugins 207 | maven-shade-plugin 208 | 2.0 209 | 210 | 211 | package 212 | 213 | shade 214 | 215 | 216 | false 217 | true 218 | ${shaded.name} 219 | 220 | 221 | *:* 222 | 223 | 224 | true 225 | 226 | 227 | *:* 228 | 229 | META-INF/*.SF 230 | META-INF/*.DSA 231 | META-INF/*.RSA 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | org.apache.maven.plugins 243 | maven-jar-plugin 244 | 2.4 245 | 246 | 247 | true 248 | 249 | true 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | -------------------------------------------------------------------------------- /src/main/java/com/criteo/kafka/KafkaGangliaMetricsReporter.java: -------------------------------------------------------------------------------- 1 | package com.criteo.kafka; 2 | 3 | import java.io.IOException; 4 | import java.util.concurrent.TimeUnit; 5 | 6 | import org.apache.log4j.Logger; 7 | 8 | import com.yammer.metrics.Metrics; 9 | import com.yammer.metrics.core.Metric; 10 | import com.yammer.metrics.core.MetricName; 11 | import com.yammer.metrics.core.MetricPredicate; 12 | import com.yammer.metrics.reporting.GangliaReporter; 13 | 14 | import kafka.metrics.KafkaMetricsConfig; 15 | import kafka.metrics.KafkaMetricsReporter; 16 | import kafka.metrics.KafkaMetricsReporterMBean; 17 | import kafka.utils.VerifiableProperties; 18 | 19 | public class KafkaGangliaMetricsReporter implements KafkaMetricsReporter, 20 | KafkaGangliaMetricsReporterMBean { 21 | 22 | static Logger LOG = Logger.getLogger(KafkaGangliaMetricsReporter.class); 23 | static String GANGLIA_DEFAULT_HOST = "localhost"; 24 | static int GANGLIA_DEFAULT_PORT = 8649; 25 | static String GANGLIA_DEFAULT_PREFIX = "kafka"; 26 | 27 | boolean initialized = false; 28 | boolean running = false; 29 | GangliaReporter reporter = null; 30 | String gangliaHost = GANGLIA_DEFAULT_HOST; 31 | int gangliaPort = GANGLIA_DEFAULT_PORT; 32 | String gangliaGroupPrefix = GANGLIA_DEFAULT_PREFIX; 33 | MetricPredicate predicate = MetricPredicate.ALL; 34 | 35 | @Override 36 | public String getMBeanName() { 37 | return "kafka:type=com.criteo.kafka.KafkaGangliaMetricsReporter"; 38 | } 39 | 40 | @Override 41 | public synchronized void startReporter(long pollingPeriodSecs) { 42 | if (initialized && !running) { 43 | reporter.start(pollingPeriodSecs, TimeUnit.SECONDS); 44 | running = true; 45 | LOG.info(String.format("Started Kafka Ganglia metrics reporter with polling period %d seconds", pollingPeriodSecs)); 46 | } 47 | } 48 | 49 | @Override 50 | public synchronized void stopReporter() { 51 | if (initialized && running) { 52 | reporter.shutdown(); 53 | running = false; 54 | LOG.info("Stopped Kafka Ganglia metrics reporter"); 55 | try { 56 | reporter = new GangliaReporter( 57 | Metrics.defaultRegistry(), 58 | gangliaHost, 59 | gangliaPort, 60 | gangliaGroupPrefix, 61 | predicate 62 | ); 63 | } catch (IOException e) { 64 | LOG.error("Unable to initialize GangliaReporter", e); 65 | } 66 | } 67 | } 68 | 69 | @Override 70 | public synchronized void init(VerifiableProperties props) { 71 | if (!initialized) { 72 | KafkaMetricsConfig metricsConfig = new KafkaMetricsConfig(props); 73 | gangliaHost = props.getString("kafka.ganglia.metrics.host", GANGLIA_DEFAULT_HOST); 74 | gangliaPort = props.getInt("kafka.ganglia.metrics.port", GANGLIA_DEFAULT_PORT); 75 | gangliaGroupPrefix = props.getString("kafka.ganglia.metrics.group", GANGLIA_DEFAULT_PREFIX); 76 | String regex = props.getString("kafka.ganglia.metrics.exclude.regex", null); 77 | if (regex != null) { 78 | predicate = new RegexMetricPredicate(regex); 79 | } 80 | try { 81 | reporter = new GangliaReporter( 82 | Metrics.defaultRegistry(), 83 | gangliaHost, 84 | gangliaPort, 85 | gangliaGroupPrefix, 86 | predicate 87 | ); 88 | } catch (IOException e) { 89 | LOG.error("Unable to initialize GangliaReporter", e); 90 | } 91 | if (props.getBoolean("kafka.ganglia.metrics.reporter.enabled", false)) { 92 | initialized = true; 93 | startReporter(metricsConfig.pollingIntervalSecs()); 94 | } 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /src/main/java/com/criteo/kafka/KafkaGangliaMetricsReporterMBean.java: -------------------------------------------------------------------------------- 1 | package com.criteo.kafka; 2 | 3 | import kafka.metrics.KafkaMetricsReporterMBean; 4 | 5 | public interface KafkaGangliaMetricsReporterMBean extends 6 | KafkaMetricsReporterMBean { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/criteo/kafka/RegexMetricPredicate.java: -------------------------------------------------------------------------------- 1 | package com.criteo.kafka; 2 | 3 | import java.util.regex.Pattern; 4 | 5 | import org.apache.log4j.Logger; 6 | 7 | import com.yammer.metrics.core.Metric; 8 | import com.yammer.metrics.core.MetricName; 9 | import com.yammer.metrics.core.MetricPredicate; 10 | 11 | public class RegexMetricPredicate implements MetricPredicate { 12 | 13 | Pattern pattern = null; 14 | //static Logger LOG = Logger.getLogger(RegexMetricPredicate.class); 15 | 16 | public RegexMetricPredicate(String regex) { 17 | pattern = Pattern.compile(regex); 18 | } 19 | 20 | @Override 21 | public boolean matches(MetricName name, Metric metric) { 22 | boolean ok = !pattern.matcher(name.getName()).matches(); 23 | //LOG.info(String.format("name: %s - %s", name.getName(), ok)); 24 | return ok; 25 | } 26 | 27 | } 28 | --------------------------------------------------------------------------------