package com.sf.monitor.controllers;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.sf.monitor.Event;
import com.sf.monitor.Resources;
import com.sf.monitor.kafka.KafkaInfos;
import com.sf.monitor.kafka.KafkaStats;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author: sundy
* @since 2015-03-02.
*/
@Controller
@RequestMapping("/kafka")
public class KafkaController {
private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
@Value("${kafka.query.time.offset:PT15m}")
private String timeOffset;
@Value("${kafka.query.flushInterval:10000}")
private String period;
@Value("${timeZoneOffsetHour:0}")
private int timeZoneOffsetHour;
@RequestMapping("/hosts")
public
@ResponseBody
List<KafkaInfos.BrokerInfo> hosts() {
return Resources.kafkaInfos.getCluster();
}
@RequestMapping("/active")
public
@ResponseBody
List<Map<String, String>> active() {
KafkaInfos.ActiveTopics topics = Resources.kafkaInfos.getActiveTopicMap();
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
for (Map.Entry<String, Set<String>> e : topics.topicToConsumer.entrySet()) {
String topic = e.getKey();
Set<String> consumers = e.getValue();
for (String consumer : consumers) {
list.add(ImmutableMap.of("Topic", topic, "Consumer", consumer));
}
}
return list;
}
@RequestMapping("/consumer")
public
@ResponseBody
List<Map<String, String>> consumer() {
return Lists.transform(
Resources.kafkaInfos.getGroups(),
new Function<String, Map<String, String>>() {
@Override
public Map<String, String> apply(String input) {
return ImmutableMap.of("Consumers", input);
}
}
);
}
@RequestMapping("/storm_kafka")
public
@ResponseBody
List<Map<String, String>> stormkafka() {
return Lists.transform(
Resources.kafkaInfos.getStormKafkaClients(),
new Function<KafkaInfos.StormKafkaClientInfo, Map<String, String>>() {
@Override
public Map<String, String> apply(KafkaInfos.StormKafkaClientInfo info) {
return ImmutableMap.of("Topic", info.topic, "ClientId", info.clientId);
}
}
);
}
@RequestMapping("/topic")
public
@ResponseBody
List<Map<String, String>> topic() {
return Lists.transform(
Resources.kafkaInfos.getTopics(),
new Function<String, Map<String, String>>() {
@Override
public Map<String, String> apply(String input) {
return ImmutableMap.of("Topics", input);
}
}
);
}
@RequestMapping("/topic/{topic}")
public String topicDetailHtml(@PathVariable String topic, String consumer, String type, Integer partitionId, Map<String, Object> mp) {
mp.put("topic", topic);
mp.put("consumer", consumer);
mp.put("period", period);
mp.put("timeZoneOffsetHour", timeZoneOffsetHour);
mp.put("type", type);
mp.put("partitionId", partitionId);
return "topic_consumer";
}
@RequestMapping("/detail")
public
@ResponseBody
Map<String, List<Event>> topicDetail(String topic, String consumer, String from, String to, Integer partitionId) {
DateTime fromTime = null;
DateTime toTime = null;
DateTime now = new DateTime();
try {
fromTime = DateTime.parse(from, formatter);
} catch (Exception e) {
fromTime = now;
}
try {
toTime = DateTime.parse(to, formatter);
} catch (Exception e) {
toTime = now;
}
if (from == null || to.equals(from)) {
fromTime = toTime.minus(new Period(timeOffset));
}
partitionId = (partitionId == null) ? -1 : partitionId;
return KafkaStats.getTrendConsumeInfos(consumer, topic, partitionId, fromTime, toTime);
}
@RequestMapping("/consumer_info")
public
@ResponseBody
List<KafkaInfos.PartitionInfo> consumerInfos(final String topic, String consumer) {
return Resources.kafkaInfos.getPartitionInfos(consumer, topic);
}
@RequestMapping("/storm_kafka_consumer_info")
public
@ResponseBody
List<KafkaInfos.PartitionInfo> stormKafkaConsumerInfo(final String clientId) {
return Resources.kafkaInfos.getStormkafkaPartitionInfos(clientId);
}
}