そーだいなるらくがき帳

そーだいが自由気侭に更新します。

Batchの監視 ~ mkr wrapとhorensoを使いこなす

 帰ってきたMackerel監視シリーズ *1です。 この記事は Mackerel アドベントカレンダー 2019 の14日目です。

qiita.com

 昨日はmattnさんの Mackerel を使って10分でメトリクス監視を始める手順 - Qiita でした。

 それでは14日目は Batchの監視 です。

 MackerelにはBatchの監視をするための仕組みとして mkr のcommandのオプションの mkr wrap があります。 例えば次のようなワンライナーのcommandを実行すると失敗時にCRITICALを飛ばし、次回の成功時に自動的にalertを閉じてくれます。

# cat test.php
#!/usr/bin/php
<?php
// 終了ステータスを1にする
exit(1);

# mkr wrap -a --note="testなのじゃ" -- ./test.php

 -w を指定すればerror時にWARNINGとして通知させることもできます。 細かいoptionについては公式ドキュメントを参考ください。

mackerel.io

f:id:Soudai:20191214192214p:plain

Batchの実行時間が知りたい

 Batchの実行時間はとても大切です。 Batchの突き抜けを防ぐために普段のBatchの実行時間を知っておきたい。 場合によっては突き抜け前にalertを飛ばしたいと思うでしょう。 もちろん、Batchにタイムアウトを設定することはとても正しい実装です。

 しかし既存のBatchには設定されておらず、今から手を入れるのが難しい場合も多いのでは無いでしょうか。 そんな方には下記のブログがおすすめです。

 horensoを使ってMackerelにメトリックとしてBatchの実行時間を投稿しているため、閾値を設定すれば実行時間を元にalertを飛ばすこともできます。

www.yasuhisay.info

 この方法とmkr wrapをあわせ技を使うと失敗した場合はすぐさまalertを飛ばし、実行時間をメトリックに保存することができます。 id:syou6162 さんの mackerel_service_metric_reporter を使わない場合は次のようにします。

#  mkr wrap -w -a --note="testなのじゃ" -- ./horenso -T -r '/usr/bin/php /path/report.php' -- '/path/test.php'

 horensoの-r で指定するreporterは複数指定することもできますから、Mackerelの通知以外にもエラー処理をさせたい場合も合わせて設定できます。 今回は report.php を指定しているようにお好みの言語でreportを書くことができ、下記のようにSTDINにJSON形式で実行開始時間と終了開始時間が入っています。

$json = stream_get_contents(STDIN);
print_r(json_decode($json));
// $stdin から startAt と endAt を取り出せば良い
/**
stdClass Object
(
    [command] => test.php
    [commandArgs] => Array
        (
            [0] => /test.php
        )

    [output] => 2019-12-14T22:39:00.677774+09:00 test

    [stdout] => test

    [stderr] =>
    [exitCode] => 0
    [signaled] =>
    [result] => command exited with code: 0
    [hostname] => ip-172-31-36-184
    [pid] => 10059
    [startAt] => 2019-12-14T22:39:00.60241387+09:00
    [endAt] => 2019-12-14T22:39:00.692605848+09:00
    [systemTime] => 0.023213
    [userTime] => 0.025022
)
**/

 もう少し詳しく知りたい人はこちらの記事を参考ください。

blog.shibayu36.org

 更にMackerelのGraph Annotationを組み合わせれば簡単にBatchがどのくらいDBや実行環境のCPUに負荷をかけているかを知ることができます。

f:id:Soudai:20191214211759p:plain

 Graph Annotationは mkr でも投稿できますし、もちろんAPI経由でも投稿できます。 reporterの中でGraphと合わせてGraph Annotationの投稿もぜひやってみてください。

horenso のreporterの中でMackerelの通知も一緒にすればいいのでは?

 もちろんcheck-apiがあるので、reporterの中で実装すればできます。 そもそもhorensoを挟まずにmkr wrapで直接投稿かreporterとnoticerが設定できると嬉しいですね。

mackerel.io

 本日ご紹介したBatchの監視は既存のBatchの仕組みを変更することなく、cronの実行時にラップするshなどを用意したり、mrk wrap を冒頭部分に追加するだけで初めることができる上に、効果は抜群です! ぜひこの機会にお試しください。

 それでは引き続き、Mackerel アドベントカレンダーをお楽しみください。

qiita.com

参考ブログ

github.com

songmu.jp

追記(2019/12/15)

上記の reporter.php を誰でも使えるように公開した。 他の言語でも同じようにすれば簡単に投稿できます。

soudai.hatenablog.com

*1:# 過去のシリーズ qiita.com