Start building Kafka connections.

This commit is contained in:
Deklan Dieterly 2014-03-12 10:22:35 -06:00
parent d4a86831bd
commit 52cc7e63fd
10 changed files with 97 additions and 39 deletions

View File

@ -84,7 +84,6 @@
<groupId>storm</groupId> <groupId>storm</groupId>
<artifactId>storm</artifactId> <artifactId>storm</artifactId>
<version>0.9.0.1</version> <version>0.9.0.1</version>
<scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.hpcloud</groupId> <groupId>com.hpcloud</groupId>
@ -116,6 +115,11 @@
<artifactId>mon-streaming</artifactId> <artifactId>mon-streaming</artifactId>
<version>${mon.common.version}</version> <version>${mon.common.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.hpcloud</groupId>
<artifactId>mon-kafka</artifactId>
<version>${mon.common.version}</version>
</dependency>
<dependency> <dependency>
<groupId>io.dropwizard</groupId> <groupId>io.dropwizard</groupId>
<artifactId>dropwizard-db</artifactId> <artifactId>dropwizard-db</artifactId>

View File

@ -0,0 +1,8 @@
package com.hpcloud.mon;
import com.hpcloud.configuration.KafkaConsumerConfiguration;
public class EventSpoutConfig {
public KafkaConsumerConfiguration kafkaConsumerConfiguration;
}

View File

@ -1,5 +0,0 @@
package com.hpcloud.mon;
public class KafkaConsumerConfiguration {
}

View File

@ -0,0 +1,8 @@
package com.hpcloud.mon;
import com.hpcloud.configuration.*;
public class MetricSpoutConfig {
public KafkaConsumerConfiguration kafkaConsumerConfiguration;
}

View File

@ -1,5 +1,6 @@
package com.hpcloud.mon; package com.hpcloud.mon;
import com.hpcloud.configuration.KafkaConsumerConfiguration;
import io.dropwizard.db.DataSourceFactory; import io.dropwizard.db.DataSourceFactory;
import java.util.Set; import java.util.Set;
@ -23,8 +24,8 @@ public class ThresholdingConfiguration {
/** Total number of acker threads across the cluster. */ /** Total number of acker threads across the cluster. */
@NotNull public Integer numAckerThreads = 12; @NotNull public Integer numAckerThreads = 12;
@NotNull public Integer maasMetricSpoutThreads = 6; @NotNull public Integer metricSpoutThreads = 6;
@NotNull public Integer maasMetricSpoutTasks = 6; @NotNull public Integer metricSpoutTasks = 6;
@NotNull public Integer eventSpoutThreads = 3; @NotNull public Integer eventSpoutThreads = 3;
@NotNull public Integer eventSpoutTasks = 3; @NotNull public Integer eventSpoutTasks = 3;
@ -44,10 +45,10 @@ public class ThresholdingConfiguration {
/** Namespaces for which metrics are received sporadically. */ /** Namespaces for which metrics are received sporadically. */
@NotNull public Set<String> sporadicMetricNamespaces; @NotNull public Set<String> sporadicMetricNamespaces;
/** Configuration for the spout that receives MaaS metrics from the external exchange. */ /** Configuration for the spout that receives metrics from the external exchange. */
@Valid @NotNull public KafkaConsumerConfiguration maasMetricSpout; @Valid @NotNull public MetricSpoutConfig metricSpoutConfig;
/** Configuration for the spout that receives MaaS events from the external exchange. */ /** Configuration for the spout that receives MaaS events from the external exchange. */
@Valid @NotNull public KafkaConsumerConfiguration eventSpout; @Valid @NotNull public EventSpoutConfig eventSpoutConfig;
/** Configuration for publishing to the alerts exchange on the external server. */ /** Configuration for publishing to the alerts exchange on the external server. */
@NotEmpty public String alertsExchange = "alerts"; @NotEmpty public String alertsExchange = "alerts";

View File

@ -17,7 +17,7 @@ import com.hpcloud.mon.infrastructure.thresholding.MetricAggregationBolt;
import com.hpcloud.mon.infrastructure.thresholding.MetricFilteringBolt; import com.hpcloud.mon.infrastructure.thresholding.MetricFilteringBolt;
import com.hpcloud.mon.infrastructure.thresholding.MetricSpout; import com.hpcloud.mon.infrastructure.thresholding.MetricSpout;
import com.hpcloud.mon.infrastructure.thresholding.deserializer.MaasEventDeserializer; import com.hpcloud.mon.infrastructure.thresholding.deserializer.MaasEventDeserializer;
import com.hpcloud.mon.infrastructure.thresholding.deserializer.MaasMetricDeserializer; import com.hpcloud.mon.infrastructure.thresholding.deserializer.MetricDeserializer;
import com.hpcloud.util.Injector; import com.hpcloud.util.Injector;
/** /**
@ -29,7 +29,7 @@ public class TopologyModule extends AbstractModule {
private final ThresholdingConfiguration config; private final ThresholdingConfiguration config;
private Config stormConfig; private Config stormConfig;
private IRichSpout collectdMetricSpout; private IRichSpout collectdMetricSpout;
private IRichSpout maasMetricSpout; private IRichSpout metricSpout;
private IRichSpout eventSpout; private IRichSpout eventSpout;
public TopologyModule(ThresholdingConfiguration config) { public TopologyModule(ThresholdingConfiguration config) {
@ -37,11 +37,11 @@ public class TopologyModule extends AbstractModule {
} }
public TopologyModule(ThresholdingConfiguration threshConfig, Config stormConfig, public TopologyModule(ThresholdingConfiguration threshConfig, Config stormConfig,
IRichSpout collectdMetricSpout, IRichSpout maasMetricSpout, IRichSpout eventSpout) { IRichSpout collectdMetricSpout, IRichSpout metricSpout, IRichSpout eventSpout) {
this(threshConfig); this(threshConfig);
this.stormConfig = stormConfig; this.stormConfig = stormConfig;
this.collectdMetricSpout = collectdMetricSpout; this.collectdMetricSpout = collectdMetricSpout;
this.maasMetricSpout = maasMetricSpout; this.metricSpout = metricSpout;
this.eventSpout = eventSpout; this.eventSpout = eventSpout;
} }
@ -63,16 +63,16 @@ public class TopologyModule extends AbstractModule {
} }
@Provides @Provides
@Named("maas-metrics") @Named("metrics")
IRichSpout maasMetricSpout() { IRichSpout metricSpout() {
return maasMetricSpout == null ? new MetricSpout(config.maasMetricSpout, return metricSpout == null ? new MetricSpout(config.metricSpoutConfig,
new MaasMetricDeserializer()) : maasMetricSpout; new MetricDeserializer()) : metricSpout;
} }
@Provides @Provides
@Named("event") @Named("event")
IRichSpout eventSpout() { IRichSpout eventSpout() {
return eventSpout == null ? new EventSpout(config.eventSpout, new MaasEventDeserializer()) return eventSpout == null ? new EventSpout(config.eventSpoutConfig, new MaasEventDeserializer())
: eventSpout; : eventSpout;
} }
@ -80,11 +80,11 @@ public class TopologyModule extends AbstractModule {
StormTopology topology() { StormTopology topology() {
TopologyBuilder builder = new TopologyBuilder(); TopologyBuilder builder = new TopologyBuilder();
// Receives MaaS Metrics // Receives metrics
builder.setSpout("maas-metrics-spout", Injector.getInstance(IRichSpout.class, "maas-metrics"), builder.setSpout("metrics-spout", Injector.getInstance(IRichSpout.class, "metrics"),
config.maasMetricSpoutThreads).setNumTasks(config.maasMetricSpoutTasks); config.metricSpoutThreads).setNumTasks(config.metricSpoutTasks);
// Receives MaaS events // Receives events
builder.setSpout("event-spout", Injector.getInstance(IRichSpout.class, "event"), builder.setSpout("event-spout", Injector.getInstance(IRichSpout.class, "event"),
config.eventSpoutThreads).setNumTasks(config.eventSpoutTasks); config.eventSpoutThreads).setNumTasks(config.eventSpoutTasks);
@ -96,7 +96,7 @@ public class TopologyModule extends AbstractModule {
// Metrics / Event -> Filtering // Metrics / Event -> Filtering
builder.setBolt("filtering-bolt", new MetricFilteringBolt(config.database), builder.setBolt("filtering-bolt", new MetricFilteringBolt(config.database),
config.filteringBoltThreads) config.filteringBoltThreads)
.shuffleGrouping("maas-metrics-spout") .shuffleGrouping("metrics-spout")
.allGrouping("event-bolt", EventProcessingBolt.METRIC_SUB_ALARM_EVENT_STREAM_ID) .allGrouping("event-bolt", EventProcessingBolt.METRIC_SUB_ALARM_EVENT_STREAM_ID)
.allGrouping("event-bolt", EventProcessingBolt.METRIC_ALARM_EVENT_STREAM_ID) .allGrouping("event-bolt", EventProcessingBolt.METRIC_ALARM_EVENT_STREAM_ID)
.setNumTasks(config.filteringBoltTasks); .setNumTasks(config.filteringBoltTasks);

View File

@ -7,14 +7,15 @@ import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichSpout; import backtype.storm.topology.base.BaseRichSpout;
import com.hpcloud.mon.KafkaConsumerConfiguration; import com.hpcloud.configuration.KafkaConsumerConfiguration;
import com.hpcloud.mon.EventSpoutConfig;
import com.hpcloud.mon.infrastructure.thresholding.deserializer.MaasEventDeserializer; import com.hpcloud.mon.infrastructure.thresholding.deserializer.MaasEventDeserializer;
public class EventSpout extends BaseRichSpout { public class EventSpout extends BaseRichSpout {
private static final long serialVersionUID = 8457340455857276878L; private static final long serialVersionUID = 8457340455857276878L;
public EventSpout(KafkaConsumerConfiguration eventSpout, MaasEventDeserializer maasEventDeserializer) { public EventSpout(EventSpoutConfig eventSpout, MaasEventDeserializer maasEventDeserializer) {
// TODO Auto-generated constructor stub // TODO Auto-generated constructor stub
} }

View File

@ -1,32 +1,73 @@
package com.hpcloud.mon.infrastructure.thresholding; package com.hpcloud.mon.infrastructure.thresholding;
import java.util.Map;
import com.hpcloud.mon.KafkaConsumerConfiguration;
import com.hpcloud.mon.infrastructure.thresholding.deserializer.MaasMetricDeserializer;
import backtype.storm.spout.SpoutOutputCollector; import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext; import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichSpout; import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields; import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Values;
import com.hpcloud.configuration.KafkaConsumerProperties;
import com.hpcloud.mon.MetricSpoutConfig;
import com.hpcloud.mon.common.model.metric.Metric;
import com.hpcloud.mon.common.model.metric.MetricDefinition;
import com.hpcloud.mon.common.model.metric.MetricEnvelope;
import com.hpcloud.mon.common.model.metric.MetricEnvelopes;
import com.hpcloud.mon.infrastructure.thresholding.deserializer.MetricDeserializer;
import kafka.consumer.Consumer;
import kafka.consumer.ConsumerConfig;
import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;
import kafka.javaapi.consumer.ConsumerConnector;
import java.util.*;
public class MetricSpout extends BaseRichSpout { public class MetricSpout extends BaseRichSpout {
private static final long serialVersionUID = 744004533863562119L; private static final long serialVersionUID = 744004533863562119L;
public MetricSpout(KafkaConsumerConfiguration maasMetricSpout, MaasMetricDeserializer maasMetricDeserializer) { private final MetricSpoutConfig metricSpoutConfig;
// TODO Auto-generated constructor stub private final MetricDeserializer metricDeserializer;
private final ConsumerConnector consumerConnector;
private List<KafkaStream<byte[], byte[]>> streams = null;
private SpoutOutputCollector collector;
public MetricSpout(MetricSpoutConfig metricSpoutConfig, MetricDeserializer metricDeserializer) {
this.metricSpoutConfig = metricSpoutConfig;
this.metricDeserializer = metricDeserializer;
Properties kafkaProperties = KafkaConsumerProperties.createKafkaProperties(metricSpoutConfig.kafkaConsumerConfiguration);
ConsumerConfig consumerConfig = new ConsumerConfig(kafkaProperties);
this.consumerConnector = Consumer.createJavaConsumerConnector(consumerConfig);
}
@Override
public void activate() {
if (streams == null) {
Map<String, Integer> topicCountMap = new HashMap<>();
topicCountMap.put(metricSpoutConfig.kafkaConsumerConfiguration.getTopic(), new Integer(1));
Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumerConnector.createMessageStreams(topicCountMap);
streams = consumerMap.get(metricSpoutConfig.kafkaConsumerConfiguration.getTopic());
}
} }
@Override @Override
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
this.collector = collector;
} }
@Override @Override
public void nextTuple() { public void nextTuple() {
ConsumerIterator<byte[], byte[]> it = streams.get(0).iterator();
if (it.hasNext()) {
MetricEnvelope metricEnvelope = MetricEnvelopes.fromJson(it.next().message());
collector.emit(new Values(metricEnvelope.metric.definition(), metricEnvelope.metric));
}
} }
@Override @Override

View File

@ -20,7 +20,7 @@ import com.hpcloud.streaming.storm.TupleDeserializer;
* *
* @author Jonathan Halterman * @author Jonathan Halterman
*/ */
public class MaasMetricDeserializer implements TupleDeserializer, Serializable { public class MetricDeserializer implements TupleDeserializer, Serializable {
private static final long serialVersionUID = 4021288586913323048L; private static final long serialVersionUID = 4021288586913323048L;
private static final Fields FIELDS = new Fields("metricDefinition", "metric"); private static final Fields FIELDS = new Fields("metricDefinition", "metric");

View File

@ -15,8 +15,8 @@ import com.hpcloud.mon.common.model.metric.Metrics;
* @author Jonathan Halterman * @author Jonathan Halterman
*/ */
@Test @Test
public class MaasMetricDeserializerTest { public class MetricDeserializerTest {
private MaasMetricDeserializer deserializer = new MaasMetricDeserializer(); private MetricDeserializer deserializer = new MetricDeserializer();
public void shouldDeserialize() { public void shouldDeserialize() {
Metric metric = new Metric("bob", null, 123, 5.0); Metric metric = new Metric("bob", null, 123, 5.0);