サーバー監視ツールを作ろう - 3日目「URLモニタリング」

2018年9月20日

テクノロジー プログラミング 特集

サーバー監視で最も重要なのは、そのサーバーが生きているか死んでいるかを即座に判定できるかどうかです。 この時に重要なのが、サーバー遅延とサーバーダウンの切り分けは高速に処理をしようとするとムズイという事実です。 例えば、データベース量が増えてきて、トップページを表示する時に、5秒ぐらいかかっていた場合、レスポンスタイムは最低5秒以上かかってしまうので、5秒以上のレスポンスタイムではエラーを出すようにすると、かなり頻度高くエラーが通知されてしまいます。 もちろん、1分とか3分待つスタイルにしてもいいですが、これはサーバー1台に対してであればいいのですが、複数サーバーを監視する場合、1台に1分もかけてはいけません。 仮に1台あたり30秒maxでセットしたとして、5分足監視にした場合、全ての全てのサーバーが障害した場合を想定すると、10台までのサーバーしか監視できない計算になります。 10秒maxであれば、30台、しかも、たまたまそのタイミングでアクセスが集中していて10秒を超えてしまった場合などを考えると、サーバーがダウンしているわけではないがエラーが出るというしんどい設定になってしまいます。 これを解決するためにサービスレスポンスをちゃんと設計して、5秒でもNGにできるような仕様にできるのが望ましいですね。 ちなみに、Googleの推奨はサーバーレスポンスは200msecですから、Wordpressなどを使うと難しい状況になることは、エンジニアの人であれば、分かるでしょう。

URLリストから一括監視する仕様

今回の監視システムは、テキストファイルでURLの一覧を作って、それぞれのURLに対してレスポンス確認をする処理を行ってみます。 その時に返り値として、下記の内容を返して判定してメッセージを出すようにします。
1. URL 2. レスポンスTime 3. ステータスコード

ソースコード

http://google.com http://yahoo.co.jp https://www.amazon.com http://myntinc.com $ cat url.txt | xargs -i wget --no-cache --no-cookies --no-check-certificate -nv --spider {} --timeout 10 -t 2 2018-09-18 09:06:57 URL: http://www.google.com/ 200 OK 2018-09-18 09:06:57 URL: https://www.yahoo.co.jp/ 200 OK https://www.amazon.com/: リモートファイルが存在していません -- リンクが壊れています!!! 2018-09-18 09:06:58 URL: http://myntinc.com/ 200 OK 事前に用意しておいた、url.txtに監視対象になるURLを改行区切りで記述しておき、1行コマンドを実行すると、URLとステータスコードを返してくます。 帰ってくるフォーマットは、以下の通りです。
1. YYYY-MM-DD 2. HH:II:SS 3. string "URL:" 4. URL 5. Status-Code 6. string *status-code-message
今回実行してみてわかったんですが、リダイレクトがかかるサイトは、リダイレクト先のURLが返ってきます。 さらにamazon.comは、「リンクが壊れています!!!」というメッセージが出てどうやら監視する事ができません。 特殊なサーバー設定をしているのがわかります。 今回はここは深掘りせずに、こういうケースもあるとわかってもらえれば良いレベルです。

ちょっと改良

実際に使うのは難しいのですが、1つのURLだけであれば、下記のようにすると、レスポンス時間が取れるようになります。 サンプルは、jsonで返すようにしてみました。 $ (time wget --no-cache --no-cookies --no-check-certificate -nv --spider http://blog.myntinc.com --timeout 60 -t 2 ) 2>&1 | awk '{if(NR==1){url=$4}if(NR==1){status=$5}if(NR==3){time=$2}} END{print "{\"url\":\""url"\",\"status\":"status",\"time\":\""time"\"}"}' *結果 {"url":"http://blog.myntinc.com/","status":200,"time":"0m0.435s"} timeコマンドとawkを組み合わせて使っているんですが、この組み合わせではxargsとの連携がうまくいかないので、bashなどで作りこむ必要がありますね。 phpなどでもっと簡単な実行ができるかもしれませんが、今回はあえて「ワンラインコマンド」にこだわって作ってみました。 次回は他の監視値を取得してみます。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。