//package com.easemob.tsdb.kafka.plugin; // //import com.easemob.tsdb.thrift.models.TSData; //import com.easemob.tsdb.thrift.rpc.Constants; //import com.easemob.tsdb.thrift.rpc.service.TSDBDelegate; //import com.easemob.tsdb.thrift.rpc.service.ThriftMetricsService; //import kafka.consumer.Consumer; //import kafka.consumer.ConsumerConfig; //import kafka.consumer.KafkaStream; //import kafka.javaapi.consumer.ConsumerConnector; //import kafka.message.MessageAndMetadata; //import org.apache.commons.lang3.StringUtils; //import org.apache.thrift.TDeserializer; //import org.slf4j.Logger; //import org.slf4j.LoggerFactory; // //import java.io.Closeable; //import java.io.IOException; //import java.util.HashMap; //import java.util.List; //import java.util.Map; //import java.util.Properties; // ///** // * @author stliu <stliu@apache.org> // * @date 3/11/15 // */ //public class KafkaConsumerGroups implements Closeable, Runnable, Constants { // private final static Logger logger = LoggerFactory.getLogger(KafkaConsumerGroups.class); // private final Map<String, String> configuration; // private ConsumerConnector consumer; // private final String topic; // private final TDeserializer deserializer = new TDeserializer(); // private final ThriftMetricsService metricsService; // private final ConsumerConfig consumerConfig; // private final boolean skipTSDB; // // public KafkaConsumerGroups(TSDBDelegate tsdb) { // this.configuration = tsdb.getConfig().getMap(); // this.topic = configuration.get(PLUGIN_KAFKA_TSDATA_METRICS_TOPIC); // this.metricsService = new ThriftMetricsService(tsdb); // // this.skipTSDB =Boolean.valueOf( configuration.get("em.skip")); // logger.info("skip opentsdb is enabled: {} ", skipTSDB); // // this.consumerConfig = getKafkaConsumerConfig(skipTSDB); // } // // // ConsumerConfig getKafkaConsumerConfig(boolean skipTSDB) { // Properties props = new Properties(); // configuration.keySet().stream().filter(key -> key.startsWith(PLUGIN_KAFKA_PERFIX)).forEach(key -> { // String subKey = key.substring(PLUGIN_KAFKA_PERFIX.length()); // props.setProperty(subKey, configuration.get(key)); // }); // String zkHost = configuration.get(PLUGIN_KAFKA_ZOOKEEPER_HOST); // if (StringUtils.isBlank(zkHost)) { // throw new IllegalArgumentException("required property is missing: " + PLUGIN_KAFKA_ZOOKEEPER_HOST); // } // /*if (zkHost == null || zkHost.isEmpty()) { // logger.warn("no configuration {} provided, using {} from OpenTSDB", PLUGIN_KAFKA_ZOOKEEPER_HOST, OPENTSDB_ZOOKEEPER_HOST); // zkHost = configuration.get(OPENTSDB_ZOOKEEPER_HOST); // }*/ // String groupId = configuration.get(PLUGIN_KAFKA_GROUP_ID); // if (StringUtils.isBlank(groupId)) { // throw new IllegalArgumentException("required property is missing: " + PLUGIN_KAFKA_GROUP_ID); // } // props.put("zookeeper.connect", zkHost); // if (skipTSDB) { // groupId = groupId + "-skip"; // } // props.put("group.id", groupId); // return new ConsumerConfig(props); // } // // @Override // public void close() throws IOException { // if (consumer != null) { // logger.info("Kafka Consumer Group is shutting down"); // consumer.shutdown(); // } // } // // @Override // public void run() { // while (true) { // try { // startStreaming(); // } catch (Exception e) { // logger.error("streaming exception", e); // try { // close(); // } catch (IOException e1) { // logger.error("closing exception", e1); // } // } // } // } // // private void startStreaming() { // consumer = Consumer.createJavaConsumerConnector(consumerConfig); // Map<String, Integer> topicCountMap = new HashMap<>(); // topicCountMap.put(topic, 1); // Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCountMap); // KafkaStream<byte[], byte[]> stream = consumerMap.get(topic).get(0); // for (MessageAndMetadata<byte[], byte[]> messageAndMetadata : stream) { // // TSData tsData = new TSData(); // // try { // deserializer.deserialize(tsData, messageAndMetadata.message()); // logger.debug("persisting TSData metrics : {}, queue size is {}", tsData); // if (skipTSDB) { // logger.debug("skipping persist {} to OpenTSDB", tsData); // } else { // // if (isInvalidMetrics(tsData.getName())) { // logger.warn("invalid format of metrics name {}", tsData.getName()); // continue; // } // // metricsService.putTSData(tsData); // } // logger.debug("persisting TSData metrics to queue done"); // } catch (Exception e) { // logger.error("Failed to put tsdata metrics {}", tsData); // } // } // } // // private boolean isInvalidMetrics(String metrics) { // return metrics.contains("#") || metrics.contains(":"); // } // //}