はじめまして!食べログでサービス開発エンジニアをしている @uribou です。
食べログ Advent Calendar 21日目の記事として、
例外が発生した時に MS Teams へ通知するようにした話をしようと思います。
はじめに
食べログでは、発生した例外を確認出来る社内用のアプリケーションがあります。
エンジニアはそのアプリの画面を常にチェックしており、例外が発生するとすぐに対応出来るようにしています。
しかし、画面を常に開いておかないと例外が発生したのか分からないので、タブなりウィンドウなりで画面を常に開いておかなければいけない状態でした。
画面を開いてなくても、例外が発生したら受動的に通知される仕組みにしたいですよね、、、
そこで、例外が発生したらエンジニアのPCにプッシュ通知するようにしよう!というのが今回の話の始まりでした。
プッシュ通知検討
プッシュ通知といえば Web Push や!ということで、まず始めに Web Push でプッシュ通知することを検討しました。
しかし、今回利用出来るサーバが https に対応しておらず Service Worker が動かせないので、Web Push 案は即頓挫しました、、、
次に Notifications API と WebSocket を利用する案を考えました。
この場合、WebSocket との通信を維持するために画面を開いておく必要がありますが、別タブで開いておけばプッシュ通知されるので、それなりに便利かなと考えました。
が、Chrome 62 から https の画面でしか Notifications API を使ってプッシュ通知出来なくなったので(参考)、Chrome では Notifications API を利用してプッシュ通知することが出来ません。
もう http はオワコンなんだなという気持ちになりました、、、
つらくなって来たので、Qiita::Team でみんな助けてーと叫んだところ、
社内で利用している MS Teams へメッセージを送れば、プッシュ通知出来るんじゃない?という案を頂きました。
最高です。ありがとうございます。
MS Teams へ通知
Microsoft Teams では API が用意されており、POST してメッセージを投稿する機能が用意されています(参考)。
Ruby で書くとこんな感じです。お手軽ですね。
require 'net/http'
require 'json'
def notify!
uri = URI.parse('MSTeamsのAPIのURL')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
req = Net::HTTP::Post.new(uri.request_uri)
req['Content-Type'] = 'application/json'
req.body = body
http.request(req)
end
# MS Teams へ送りつける JSON
def body
end
上記のようなスクリプトを一分毎に cron で実行して、その間発生した例外情報をサマって特定のチャンネルへ POST しています。
リクエストメッセージボディのサイズは制限がかかっているようで、16.8 KB を超えると POST を受け付けなくなったので、ここらで制限しているようです。
今回はメッセージボディが 16.8 KB を超えたら、めっちゃ例外出てる(想像したくないですが、、、)旨だけ通知するようにしました。
チャンネルをフォローすると投稿があった際にプッシュ通知されるようになるので、これで例外が発生したらプッシュ通知出来るようになりました!
ちなみに、MS Teams では POST する JSON 次第で、様々なリッチなメッセージを送信することが出来ます(参考)。
POST 出来るボタンとか生成出来るの凄いですね
さいごに
今回の機能を導入したところ、今までよりも素早く楽に、例外の発生を検知出来るようになりました。
例外が出ているということは、何かしらサービスに不具合が存在している可能性があるということです。
素早く例外を検知し、サービスの不具合をいち早く修正出来るようにすることは、サービス開発を行う上で非常に重要です。
プッシュ通知を実現する方法はいくつもありますが、今回のような非 https 環境で実現したい方は、MS Teams を検討してみるのも良いかもしれませんね
明日の食べログ AdventCalendar 22日目は、@tayu1605 さんによる「【初心者必見】Rubyのメソッド探索備忘録」です。
お楽しみに!