軽量日記 by adokoy

Mojo::UserAgentを使ってアクティブチェック(外部監視)

表題の通り、cron等で適当にアクティブチェックのプログラムを書き捨てるならMojo::UserAgentが便利ですよというお話。

MojoliciousはPerl標準モジュール以外に依存していないので、サクッとインストールして実行環境を用意することができる(まあディストロのパッケージマネージャでインストールすればたいていのものはストレスなくインストールできますが)

サンプルコード

以下コードは監視対象HTTPサーバへアクセスした後、ステータスコードが200,301以外を返された場合にSlackへ通知する例。

use strict;
use warnings;
use utf8;
use Encode;
use Mojo::UserAgent;

### Slackで通知する場合のapi url
my $slack = 'https://your.slack.channel.example.com/services/A/B/C';
### 監視対象の設定
my $external = [
   {name => 'my site 1', url => 'https://your.site1.example.com/'},
   {name => 'my site 2', url => 'https://your.site2.example.com/'},
];

### 実行
my $ext_ua = Mojo::UserAgent->new;
for(0 .. $#$external){
    my $instance = $external->[$_];
    my $con_error = '';
    my $code = 1000;
    eval{
        $code = $ext_ua->get($instance->{url})->result->code;
    };
    if($@){
        $con_error = $@;
    }
    if($code != 200 and $code != 301){
         my $message = $instance->{name} . ' : ' . $code . ' : ' . "$con_error\n";
         my $tmp_res = $ext_ua->post(
             $slack
             =>
             { 'Content-type' => 'application/json' }
             =>  json => { text => $message }
             )->result;
    }
}

障害の発生と継続

例えばこのコードを10分間隔で実行した場合、監視対象の障害が継続していれば10分間隔でSlack通知が来てしまう。

「新たに発生した時だけ通知」という動作にしたい場合は、例えば、SQLiteをDBにして障害の発生したURLと日時(エポックタイム)を記録するようにして、最後に検知してからの経過秒数 + α > 監視間隔 を満たした場合だけSlack通知するように書けば良い。

SQLiteの簡単なCRUD操作を提供してくれるMojo::SQLiteというラッパーモジュールがあるので使うとよい。

Mojo::SQLite : https://metacpan.org/pod/Mojo::SQLite

が、こちらはMojoliciousと違って依存モジュール満載なので、それが嫌であればストイックにファイル操作でurlとエポック時間を保存するだけの適当なcsvやjsonをストレージにすればよい(と思います)

created by
Toshiaki Yokoda
created at
last modified by
Toshiaki Yokoda
last modified at
2019-12-18 16:53