2019年5月17日金曜日

dkron で結果を Slack に通知してみた

概要

dkron にはジョブの実行結果を通知する仕組みがあります
dkron Pro であれば Processors を使って実現できますが OSS 版には通知用の Processors がありません
OSS 版にも File, Log, Syslog Processors はありますがメールや Slack に通知するための Processors はありません
が、OSS 版でも Slack に通知する機能はあります
Pro 版とのジョブごとに異なるチャネルに通知することができないくらいです

環境

  • Ubuntu 16.04 LTS
  • dkron 1.2.4

ジョブの登録

ジョブは何でも OK です
とりあえず Shell executor を使って定期的にコマンドを実行するジョブを登録します

curl localhost:8080/v1/jobs -XPOST -d '{
  "name": "job1",
  "schedule": "@every 30s",
  "timezone": "Asia/Tokyo",
  "owner": "hawksnowlog",
  "owner_email": "hawksnowlog@gmail.com",
  "disabled": false,
  "tags": {
    "dkron_server": "true:1"
  },
  "concurrency": "allow",
  "executor": "shell",
  "executor_config": {
    "command": "date"
  }
}'

OSS 版の Slack の通知はジョブが成功しても失敗しても通知されます
ちなみに Pro 版の Slack Processor は onSuccess という設定で成功した場合も送信するか失敗した場合だけにするか設定することができます

Slack の設定を有効にする

次に Slack の通知を有効にします
Incomming Webhook の仕組みを使うので URL を事前に取得しておいてください
また設定は管理画面からは行えないので設定ファイルに直接記載します

  • sudo vim /etc/dkron/dkron.yml
webhook-url: https://hooks.slack.com/services/xxxxxxxxxx/xxxxxxxxxx/xxxxxxxxxxxxxxxxxxxx
webhook-payload: "{\"text\":\"A status of {{.JobName}} is {{.Success}}\",\"username\":\"DkronBot\",\"icon_url\":\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2LszE5GtwoK-DGY1onFDSRJ4y6hyphenhyphenTkB3PqKxuHgO9TYJ77RwDdy9Fa9DBOs_bWzkUOUqCg2oah1i5_GEGLs1ZyEoUIFIeRNZ87lwznv94tth9ReNahxhWyRFkMNDAaqoCll-VyvaGYdo/s1600/jarato.png\"}"
webhook-headers:
  - Content-Type:application/json

webhook-url は取得したものに変更してください
webhook-payload は Slack の Incomming Webhook で使える payload がそのまま指定できます
また golang のテンプレートを使うことができます
struct のフィールドが使用可能になっているようです
一覧はコードを直接見るしかありませんが以下が参照可能です
https://github.com/victorcoder/dkron/blob/master/dkron/notifier.go#L69

自分が試した感じだと {{.Report}} を使うと invalid payload になるためうまく通知できません
おそらく JSON のフォーマットに違反した情報が展開されてしまっているためだと思います (p-r 案件かなと)

設定ファイルに Slack の情報を記載したら dkron を再起動しましょう

  • sudo systemctl restart dkron

動作確認

あとは動作確認です
ジョブが失敗したときに Slack に通知がくれば OK です

今回は webhook-payload 内で channel の指定はしていないので通知されるチャネルは Incomming Webhook を作成した際に指定したデフォルトのチャネルになります
dkron.yml は dkron のグローバルな設定になるのですべてのジョブのエラーが通知されてしまいますが、一応こんな感じで Slack の通知を実現することはできました

Tips

dkron のログをチェックする

  • sudo journalctl --no-pager -u dkron.service | less

ログをデバッグ表示にする

  • vim /etc/dkron/dkron.yml
log-level: debug

最後に

OSS 版 dkron で Slack の通知を試してみました
dkron.yml に Incomming Webhook の URL を指定することで実現できますが、すべてのジョブに共通の設定になってしまいます
ちなみに Pro 版では Slack Processor という仕組みが使えます
dkron-processor-slack.yml にチーム単位で Incomming Webhook URL を指定することができ、そのチームをジョブに紐付けることでジョブごとに通知先を切り替えることができるようです
当然ですが OSS 版では使えないので試せませんでした

0 件のコメント:

コメントを投稿