package com.dianping.cosmos.metric; import java.util.Collection; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import backtype.storm.metric.api.IMetricsConsumer; import backtype.storm.task.IErrorReporter; import backtype.storm.task.TopologyContext; import com.dianping.cosmos.monitor.HttpCatClient; import com.dianping.cosmos.util.CatMetricUtil; /** * Listens for all metrics, dumps them to cat * * To use, add this to your topology's configuration: * conf.registerMetricsConsumer(com.dianping.cosmos.metric.CatSpoutMetricsConsumer.class, 1); * * Or edit the storm.yaml config file: * * topology.metrics.consumer.register: * - class: "com.dianping.cosmos.metric.CatSpoutMetricsConsumer" * parallelism.hint: 1 * */ @SuppressWarnings("rawtypes") public class CatMetricsConsumer implements IMetricsConsumer { private static final Logger LOGGER = LoggerFactory.getLogger(CatMetricsConsumer.class); private String stormId; @Override public void prepare(Map stormConf, Object registrationArgument, TopologyContext context, IErrorReporter errorReporter) { stormId = context.getStormId(); } @Override public void handleDataPoints(TaskInfo taskInfo, Collection<DataPoint> dataPoints) { for (DataPoint p : dataPoints) { try{ if(CatMetricUtil.isCatMetric(p.name)){ HttpCatClient.sendMetric(getTopologyName(), CatMetricUtil.getCatMetricKey(p.name), "sum", String.valueOf(p.value)); } } catch(Exception e){ LOGGER.warn("send metirc 2 cat error.", e); } } } private String getTopologyName(){ return StringUtils.substringBefore(stormId, "-"); } @Override public void cleanup() { } public static void main(String[] args){ CatMetricsConsumer c = new CatMetricsConsumer(); c.stormId = "HippoUV_25-15-1410857734"; System.out.println(c.getTopologyName()); } }