読者です 読者をやめる 読者になる 読者になる

uoz 作業日記

様々な作業の記録を共有するブログです。

Mackerel ログ監視で、Elasticbeanstalk worker 環境でのcron定期実行を監視

はてなの監視サービスマカレルはシンプルで俺でも使い方がわかる。
表記のことをやってみた記録です。

Elasticbeanstalk の worker環境

Elasticbeanstalkでは、いわゆるWebサービス用の環境だけじゃなく、なんか裏でcronでまわしときたいような
バックグラウンド処理タスクをやらせる専用環境をつくることもできる。

docs.aws.amazon.com

ワーカー環境を作ったあとは、定期的な処理をつくるのは超簡単。
プロジェクトのルート直下にcronの書式で設定を書いたcron.yamlってファイルを置くだけ。


こんな感じ

version: 1
cron:
  - name: some_task
    schedule: "0,5,10,15,20,25,30,35,40,45,50,55 * * * *"
    url: /some_task
  

このurlってとこに書いたURLに、scheduleのとこに書いたスケジュールでPOSTリクエストがいくようになる。
だから、そのリクエストを受けたら適切な処理が行われるようにしとけばいいだけ。

うちではRailsで受けて処理をしてる。

監視する

その処理の結果も含めて、定期実行がちゃんと出来てることを監視したかったので、Mackerelのログ監視を導入した。

その前に

Mackerel自体の入れ方はこちら。uozias.hatenablog.com

.ebextensionsディレクトリ以下に設定ファイルをいれることで設定する。

手順

まず、ログ監視とかしてくれるマカレルのプラグインを入れる。
設定ファイルがちょっと変わります。


gist.github.com

これが正解なのかわからないけど、3ファイルに分けて順番に実行してもらう。

01-add-sudoer.configでは、マカレルのyumレポジトリを登録するのに必要なのでsudoできるようにする。
02-mackerel.configでは、マカレル本体をインストールすると同時にYumレポジトリを登録
03-mackerel-plugin.configでは、マカレルのcheckプラグインYumで入れ、設定ファイルを作ってマカレルのえ~人とを起動する。



公式のドキュメントではこの辺を見よう
ログ監視をおこなう - Mackerel ヘルプ
チェック監視に公式チェックプラグイン集を使う - Mackerel ヘルプ

設定ファイルについて

ログチェック

ドキュメントに書いてあるが、

[plugin.checks.好きな名前]

から始まる設定でログを監視し、特定の文字列が多かったらアラート出すとかできる。

      [plugin.checks.application_log]
      command = "/usr/local/bin/check-log --file /var/app/current/log/production.log --pattern FATAL"

Gistに書いた上記の設定では、EBでRailsを動かしている時のアプリのログ(/var/app/current/log/production.log)にFATALって言う文字列が含まれる個数をみる
もっと細かく設定できるが、上記だけではFATALがでてきたら問答無用にマカレルのアラートが発生する。

カスタムメトリック

もっと面白いのが、任意のコマンドを実行してその結果を監視項目にすることができるカスタムメトリックだ。

やり方はここに書いてある。
ホストのカスタムメトリックを投稿する - Mackerel ヘルプ

 [plugin.metrics.crawl_cron_number]
      command = ' num=$(tail -n 10 /var/app/current/log/production.log | grep -c /some_task) ; echo "cron_number.some_task	${num}	$(date +%s)" '

Gistに書いた上記の例では、シェルのコマンドを実行してその結果をグラフに表示してる。
/var/app/current/log/production.logの最新10行をとってきて、そのうち/some_taskって文字列が含まれる行数を返す。

これだけでマカレルでグラフがみられる。

f:id:uoz:20151119143621p:plain

rubyスクリプト書いてその結果を受け取るとか、なんでもできるみたいだからいろいろ模索してみたい。