/hangout-output-mail

hangout示例. 将告警发通过邮件发送出去

Primary LanguageJava

既然在示例3中,我们已经得到了一些聚合结果,何不更进一步把需要告警的聚合结果通过邮件形式发出来呢?

我们就来写一个mail output plugin. output plugin是最简单的, 只需要继承BaseOutput并实现一个emit方法就好了.

public class Mail extends BaseOutput {
    void emit(Map event) {
        sendmail(event);
    }
}

event已经传过来了, 想怎么处理都行.

话不多说了, 具体可以看代码. 下面的配置是一个示例, 如果一个Url的平均响应时间高于10S就发告警出来. 告警内容是当前这个Url的响应时间.

inputs:
    - Stdin:
        codec: plain

filters:
    - Grok:
        match:
            - '^%{NOTSPACE:url} %{NUMBER:time}'
    - com.example.filter.StatMetric:
        key: url
        value: time
        windowSize: 10
        add_fields:
            metric_type: true

outputs:
    - com.example.output.Mail:
        if:
          - '<#if metric_type?? && metric_type==true>true</#if>'
          - '<#if (stat.mean>=10)>true</#if>'
        mailhost: mail.corp.com
        from_addr: 'xxx@corp.com'
        to_list: ['xxx@corp.com']
        subject: '页面访问响应时间大于10秒'
        login_user: admin
        login_password: "password"
        format: '${url}响应时间大于10秒: 实际响应时间${stat.mean}秒'

多说一句, 如果每个Url的响应时间阈值不一样, 怎么处理好呢? 总不至于写100个if else. 我觉得可以放一个Translate插件, 把每个Url的阈值放在字典里面(字典是可以动态加载的), Translate插件把阈值添加到聚合后的Metric事件中. 最后的mail output的if里面就可以写<#if ((stat.mean-stat.threshold)>0)>true</#if>