heroku logs, 特にhubotのlogをslackに流すと捗る

heroku logs, 特にhubotのlogをslackに流すと捗る。

heroku-logs-slack2

TL;DR

heroku logs -> logentries.com -> hubot -> slack の経路で転送する。slackのインテグレーションにpapertrailapp.com あるので、ちゃんとお金を払うならそっちのほうが良さそう(未確認)。

仕組み

heroku logsを流しこむのに定番ぽいのはpapertrail。freeプランの制限がpapertrailキビシイので、無料じゃないと死ぬ人はlogentries。
papertrail plans
logentries pricing

logentriesはapi経由でlogがダウンロードできる。logをhubotで1分おきに取りに行って、roomにpostしてる。

コード

cron = require('cron').CronJob
LogentriesRetrievingLog = require('logentries-retrieving-log')
accountKey = process.env.HUBOT_LOGENTRIES_STOLLEN_KEY
logAddr = process.env.HUBOT_LOGENTRIES_STOLLEN_ADDR

retriever = new LogentriesRetrievingLog({
  accountKey: accountKey,
  logAddr: logAddr
})
room = process.env.HUBOT_LOGENTRIES_STOLLEN_ROOM
# logentries delays 10-30sec, so get from 2minutes ago to 1minute ago
params = {start: - 2 * 60 * 1000, end: - 1 * 60 * 1000}
noLogs = '...No logs.'

module.exports = (robot) ->
  retrieveLogs = ->
    if !accountKey || !logAddr || !room
      robot.logger.error "env missing " + 
        "HUBOT_LOGENTRIES_STOLLEN_KEY: #{process.env.HUBOT_LOGENTRIES_STOLLEN_KEY} " + 
        "HUBOT_LOGENTRIES_STOLLEN_ADDR: #{process.env.HUBOT_LOGENTRIES_STOLLEN_ADDR} " + 
        "HUBOT_LOGENTRIES_STOLLEN_ROOM: #{process.env.HUBOT_LOGENTRIES_STOLLEN_ROOM}"
      return
    retriever.getLogs params, (err, _, body) ->
      if (err)
        robot.logger.error "logentries error: #{err}, body: #{body}"
        return
      if (!body.trim())
        robot.send {room: room}, noLogs
        return
      robot.send {room: room}, body

  new cron '10 * * * * *', () ->
    retrieveLogs()
  , null, true, "Asia/Tokyo"

実際のhubot script

工夫

brain使って、前回取得以降の〜ってカッチリやるならそうするんだろうけど、適当でよかった。それから、heroku logsがlogentries側に反映されるまで10秒~30秒ぐらいタイムラグあるのでどうしようか考えた。
logentriesのパラメーター指定で、負のミリ秒を設定すると、nミリ秒前からのデータが取得できる、とドキュメントにあった。なので、毎分 2分前~1分前のログを取得することにして、解決!

試行錯誤1

logentriesにwebhookあるので、条件を /.*/ にして、都度ログが来るようにした。ログ1行に1リクエスト来る上に、各リクエストに対してcontextとして直前10行が送られてくる。全行送ってるので、context無駄… あと、1条件ではmax 100req/hourなので、足りなかった。

試行錯誤2

webhookを受けてリクエストを処理、するlogが出る。ので自分自身を検知して無限ループした。うける。

まとめ

ライフチェンジング。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中