HBase监控点过滤收集到OpenTSDB

一般而言,常常采取的方法是配置hbase的监控输出到Ganglia,通过其自带的图表展示相应监控点。但是存在几个问题:

1、region很多过期的监控数据不会消失,导致很多无用监控点;

2、图表系统渲染太慢,监控点多以后不可接受;

3、监控数据存储无法水平扩展,因为是存在本地磁盘文件


通过调研OpenTSDB,发现其可以很好地处理时间序列数据,具有很好的扩展性和查询。具体思路就是对FileSink进行扩展,让其打印输出我们关注的监控点,并格式化为OpenTSDB支持的JSON数据,输出到文件中,通过另外一个Agent将这些监控数据实时入库到OpenTSDB中。



扩展的FileSink打成jar包,放入$HBASE_HOME/lib目录下,同时修改$HBASE_HOME/conf目录中的hadoop-metrics2-hbase.properties文件:

*.sink.file*.class=org.apache.hadoop.metrics2.sink.FileSink
# default sampling period
*.period=10

# Below are some examples of sinks that could be used
# to monitor different hbase daemons.

hbase.sink.file-all.class=org.apache.hadoop.metrics2.sink.FileSink
hbase.sink.file-all.filename=all.metrics


public abstract class JsonFileSink implements MetricsSink {
  private static final String FILENAME_KEY = "filename";
  private PrintWriter writer;
  private Set<String> specialMetrics;

  @Override
  public void init(SubsetConfiguration conf) {
    specialMetrics = buildConsiderableMetrics();
    String filename = conf.getString(FILENAME_KEY);
    try {
      writer = filename == null
          ? new PrintWriter(System.out)
          : new PrintWriter(new FileWriter(new File(filename), true));
    }
    catch (Exception e) {
      throw new MetricsException("Error creating "+ filename, e);
    }
  }

  @Override
  public void putMetrics(MetricsRecord record) {    
    Map<String, String> tags = new HashMap<String, String>();
    for (MetricsTag tag : record.tags()) {
      if (!StringUtils.isEmpty(tag.name()) && ! StringUtils.isEmpty(tag.value())) {
        tags.put(tag.name(), tag.value());
      }      
    }
    for (AbstractMetric metric : record.metrics()) {
      if (specialMetrics.contains(metric.name())) {
        DataPoint dp = new DataPoint();
        dp.setMetric(Joiner.on(".").join(record.context(), record.name(), metric.name()));
        dp.setTimestamp(record.timestamp());
        dp.setTags(tags);
        dp.setValue(metric.value());
        writer.print(dp.toString());
        writer.println();
      }
    }
    
  }
  
  public abstract Set<String> buildConsiderableMetrics();

  @Override
  public void flush() {
    writer.flush();
  }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值