前段时间我们公司开始使用“钉钉”作为企业沟通工具。在知道钉钉群还能设置机器人接收定制的通知信息时,我就寻思如何把它和 logstash 结合在一起了。

首先要了解钉钉的“机器人”是如何设置的。文档在此

然后我们使用 logstash 的 http outputthrottle filter 插件。

首先设置 throttle 的条件,以我们的 monit 日志为例,先给 logstash 配置一个 filter 文件:

filter {
  if "monit" in [tags] {
    grok {
      match => { "message" => "\[CST %{SYSLOGTIMESTAMP:[monit][timestamp]}\]%{SPACE}%{LOGLEVEL:[monit][level]}%{SPACE}\:%{SPACE}%{GREEDYDATA:[monit][log]}" }
      remove_field => "message"
    }
    if [monit][level] == "error" {
      throttle {
        before_count => -1 # 最小值
        after_count => 1 # 最大值
        period => 1800 # 统计周期 1800 秒, 这个时间内不再触发同一个条件。
        max_age => 3600 # 最大有效周期 3600 秒
        key => "%{[monit][log]}" # 要统计的字段
        add_tag => "monit-throttle" # 注意:不符合以上条件的才会添加 tag。相应的 output 里要注意。
      }
    }
    date {
      match => [ "[monit][timestamp]", "MMM dd HH:mm:ss", "MMM  d HH:mm:ss" ]
      remove_field => "[monit][timestamp]"
    }
    mutate {
      add_field => { "indexname" => "monit" }
    }
  }
}

然后在 output 里配置:

output {
  if "monit-throttle" not in [tags] and [monit][level] == "error" {
    http {
      url => "{{ dingtalk_webhook_url }}"
      http_method => "post"
      content_type => "application/json; charset=utf-8"
      format => "message"
      message => '{"msgtype":"text","text":{"content":"[Monit] %{[monit][log]}"}}'
    }
  }
}

把 {{ dingtalk_webhook_url }} 替换成你的钉钉机器人 webhook url 即可。

最后我们就得到了这样的告警信息:
Screenshot-2018-4-24----1