hubot で毎分URL監視をして Slack に通知する。

Webサイトのステータスをhubotで監視するスクリプトを作ってみました。

毎分0秒にリクエストを投げて、statusCodeが400以上の場合にSlackに通知します。

Slack画面

こんなメッセージが流れます。

external-monitoring.coffee

https://gist.github.com/YuG1224/a006b63da60e762ded6c

# Description:
#   URL external monitoring
#
# Dependencies:
#   "hubot-slack": "^3.3.0"
#   "hubot-slack-attachement": "^1.0.1"
#
# Commands:
#   None

CronJob = require("cron").CronJob
Promise = require("q").Promise
request = require "request"

urls = [
  "https://aaa.example.jp"
  "https://bbb.example.jp"
]

opt =
  method: "HEAD"
  headers:
    "User-Agent": "hubot-external-monitoring"

module.exports = (robot) ->

  getStatusCode = (url) ->
    return new Promise (resolve, reject) ->
      opt.url = url
      request opt, (err, res) ->
        if err then reject err
        else
          resolve
            statusCode: res.statusCode
            url: res.request.uri.href

  sendSlack = (statusCode, url) ->
    data =
      content:
        fallback: "CRITICAL: #{url} statusCode #{statusCode}"
        text: "CRITICAL: <#{url}|#{url}> statusCode #{statusCode}"
        color: "#e84050"
      channel: "alert"
      username: "bot"
      icon_emoji: ":shit:"
    robot.emit "slack.attachment", data

  job = new CronJob
    cronTime: "0 * * * * *"
    onTick: () ->
      for val in urls
        getStatusCode val
          .then (value) ->
            if value.statusCode >= 400
              sendSlack value.statusCode, value.url
          .catch (err) ->
            console.error err
  job.start()

Bodyは必要ないので、HEADメソッドでリクエスト。

通常のアクセスと区別出来るように、User-Agentはhubot-external-monitoringにしておきました。

メッセージは Attachments のフォーマットを使ってちょっとリッチに表現。hubot-slack-attachementのモジュールに依存しています。

$ npm install --save hubot-slack-attachement