インフラブログ

とあるWEBサイトのインフラを構築運用するメモ

メール以外の方法でもアラートの通知を行う(1)

前に書いた記事がデプロイの話で、WEBサイト環境構築というよりかは運用的な記事でした。今回はさらに脱線してアラートの通知について書きます。

デプロイの設定作業の時に色々参考記事を漁ってたのですが、デプロイ開始、終了を音声で通知したりJenkinsのビルドの結果をライトで通知するという記事もよく目にしました。「メール飛ばすだけではつまらないから自分も真似してみよう」といくつか設定をしています。その時その時のジャストアイデアを盛り込んでいるので、かなり野暮ったくなっていてすみません。

どうやって通知する?

通知手段としては以下の方法を使うことにしています。

  • アラートメール送信する(いつもやってる定番の子)
  • 社内で音、音楽を鳴らす
  • ミラーボールを回す
  • skypeのアラート部屋に通知する
  • 電話する

社内で音を鳴らすというのは、アンプ・スピーカーがつながっているUbuntuマシンが社内にあって、そのマシン上でmp3を再生すれば社内に大音量で鳴り響くという仕組みです。単純にUbuntuにミュージックサーバ?MPDを導入して、曲の再生、停止をコントロールできるようにするだけです。アラート音など単発音を鳴らす場合はmpg321を使います。

なにを通知する?

このようなものを通知しようと考えています。

  • デプロイの開始/終了
  • WEBサイトの50xエラーの多発検知
  • 運営にとっていいことが発生した場合(新規会員登録してくれた時とか)
  • WEBサイトのサービスダウン

デプロイの開始/終了

Capistranoのタスクの中に開始・終了通知タスクを用意しておいて、それぞれのタイミングでフックするようにします。 タスクは、監視サーバに作られたアカウントにメールを送信するというものです。 そして/etc/aliasesを参照してメールボックスにメールが入るのと同時に下記のスクリプトを実行するようにしてます。

skypeに通知する

  • /etc/aliases
systemalert-staging: :include:/home/ec2-user/scripts/alert/alert, alert
  • /home/ec2-user/scripts/alert/alert
"|/home/ec2-user/scripts/alert/alert.sh"
  • /home/ec2-user/scripts/alert/alert.sh
#!/bin/sh
source /home/ec2-user/.bash_profile
ruby /home/ec2-user/scripts/alert/skype.rb
  • /home/ec2-user/scripts/alert/skype.rb(社内のsevabotにPOSTをする)
require "net/http"
require "mail"
require "uri"
require "digest/md5"
mail = Mail.new(STDIN.read)

sevabot_url = "http://社内のUbuntuで動いているsevabotのサーバ/msg/"
chat = "xxx" #Skype alert部屋のhash
shared_secret = "xxxx" # sevabot設定時につけたシークレット
msg = mail.subject.to_s + "\n" + mail.body.to_s 
md5 = Digest::MD5.new.update(chat + msg + shared_secret).to_s #sevabotが認証に使う

uri = URI.parse(sevabot_url)

request = Net::HTTP::Post.new(uri.request_uri)
request.body = URI.encode_www_form("chat" => chat, "msg" => msg , "md5" => md5)

http = Net::HTTP.new(uri.host, uri.port)
http.start do |h|
  response = h.request(request)
end

puts request.body

あとはsevebotさんがPOSTした内容を指定のskype部屋によろしく発言してくれます。

  • sevebot

f:id:ls-la:20140129225345j:plain

開始と同時に社内に音楽を流す

また、社内のUbuntuthunderbirdがメールボックスを常時チェックしていて、メールフィルタ適用時に任意のスクリプトを実行できるプラグインからMPDを再生する(mpc next;mpc playする)スクリプトが叩かれるようにします。 これでMPDが延々とプレイリストの曲を流し続けてくれます。デプロイ終了時も同様に処理するように設定しますが、最後はmpc pauseで曲を止めるようにします。

  • mpd

f:id:ls-la:20140129225343j:plain

WEBサイトの499、50xエラーの多発検知/

監視サーバ上にMongoDBを置き、アクセスログの499,50xのログを収集します。一方で 社内のUbuntuではmongo-tailを起動して監視サーバのMongoDBをtailしてファイルに出力するようにします。また、logmon参考になる記事でtailしたファイルを監視して指定のキーワードを検出した時はアラートの効果音を鳴らします。(mpg321コマンド叩くだけ) 効果音は「ピッ」と短る鳴るようにしてます。ひとつの50xエラーで1回警告音が鳴るので、大量に50xが発生している場合は「ピピピピピピ・・・」と 社内にやかましく鳴りだして、「すぐに復旧しなければ!」とみんなの意識が向くかもしれません。

  • mongo-tailの起動
$/usr/lib64/fluent/ruby/bin/mongo-tail -h 監視サーバのホスト -d DB名 -c コレクション名 
  • logmonの設定 /etc/logmon/logmon.conf
:mongo_tail_log
upstream_staus:504
mpg321 alert_504.mp3

:mongo_tail_log
upstream_staus:500
mpg321 alert_500.mp3

f:id:ls-la:20140129225340j:plain

サービスダウン検知は次の記事にかきます。