我水也

いろんなことに興味をもっています。

RailsのエラーログをAzure Application Insightsに集約する

運用中のWebアプリに問題が発生した際に、エラーログから原因を探ったりすることがありますよね。
その際に、幾つものサーバーのログを確認したりしませんか?結構面倒ですよね。
私は面倒です。

1箇所にまとまっていれば...いちいちサーバーにログインしてログを目grepするのは...

Azureに、Application Insights(PREVIEW)というWebアプリ向けのパフォーマンス監視が出来るものがあります。

今回はRuby on Railsを使いたいのですが、実はMicrosoft純正のgemがあります。
github.com
・・・ですが、これ・・・
> Ruby 1.9.3 is currently supported by this gem.
とあるんですよね。

Ruby 2.0.0以降で使えないかな〜と探していたところ、ありました!
github.com
本家を活用した Ruby 2.0 or later 向けのgemです。ありがたや、ありがたや。

今回はこれを使ってみたいと思います。

利用した環境は次の通りです。

  • Ruby 2.3.0
  • Rails 5.0.0.1
  • appinsights 0.0.5
  • application_insights 0.5.3


まずは、AzureポータルでApplication Insightsの準備

メニューでApplication Insightsを選択し、「+Add」を選びます。
適当なNameを入れ、今回はApplication Typeを「Other (preview)」にします。
あとはそれぞれ適当なものを選び、「Create」。
作成されたら、「Properties」の「INSTRUMENTATION KEY」をメモっておく。


次にRailsプロジェクトに移ります。
Gemfileに以下を追記します

gem 'appinsights'

追記したら、いつも通り。

$ bundle install

あとは設定ファイルを作成したら準備完了です。
config/application_insights.toml

[ai]
  instrumentation_key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
  custom = 4
  properties = 'belong to the context'

# Contracts configuration

  [ai.application]
    ver = '0.5.0'

  [ai.device]
    id = 'hoge'
    os = 'hogehoge'

# Enable/Disable Middlewares

[[middleware]]
  name = 'AppInsights::ExceptionHandling'
  enabled = true

[[middleware]]
  name = 'ApplicationInsights::Rack::TrackRequest'
  enabled = true

  [middleware.initialize]
    instrumentation_key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    buffer_size = 500
    send_interval = 60

この設定ファイルはTOMLという形式を使っています。
TOMLについては、こちらの記事をどうぞ。
qiita.com

あとはアプリを起動して待つだけです。
上記設定では通常のリクエストもApplicationInsightsに登録され、エラー時にも登録されます。

こんな感じになります。
f:id:matcu:20161013222836p:plain

例外発生時にはerror_messageが表示され、詳細はこんな情報が見れます。
f:id:matcu:20161013223010p:plain

backtraceもしっかり表示され調査・分析しやすいです。
サーバー毎にログ確認をする手間が省けますので、是非使ってみてください。