エンジニアリング

Elastic Stackを利用したRuby on Railsアプリとシステムの監視

とちぎRuby会議でRuby on Railsのアプリケーションの監視について話をしてきました。

簡単ですが、紹介です。スライドはこちら。また、デモで使用したアプリケーションはGitHubで公開しています。

アプリケーションの監視のポイント

監視のポイントで紹介したのは、次のような観点です。

  • 死活監視、外形監視
  • ホストやアプリのメトリック
  • ログの収集
  • アプリケーションパフォーマンス監視(APM)

今回作成したデモアプリは参加者のみなさんからの質問を投稿してもらうアプリにです。 実際にセッションを行いながら、疑問を感じた点などについて投稿してもらい、セッションの最後に投稿された質問を元にQAを行う形式です。

Overview of the app

アプリケーションの構成はこのような形です。 フロント(NGINX + Rails)とバックエンド(PostgreSQL)の2台で構成します。 それぞれのサーバーに、MetricbeatFilebeatAuditbeatPacketbeatと、バックエンドにHeartbeat、フロントエンドにAPM Ruby Agentをインストールして、これから説明するそれぞれの監視のためのメトリックとログを収集しました。 また、データ保存、可視化のためにElasticsearch Serviceを使用してセットアップするものを最小限にしています。Elasticsearch Serviceを利用すると、Elastic APM Server、Elasticsearch、Kibanaがクラウド環境でセットアップできます。14日間のトライアルもあるので、監視に興味がある方はトライアルでまずは簡単に触っていただけます。

死活監視、外形監視

監視でまず大事なのは外から見たアプリケーションの状態が正常かどうかです。 Elastic Stackでは、Heartbeatを利用することで、HTTP、TCP、ICMPの監視が手軽に行えるようになっています。 デモでは、以下の監視を設定をしていました(完全なファイルについてはリンク先を参照)。

  • ICMP : 各サーバー
  • HTTP : Railsアプリのあるページ、NGINXのサーバーステータスページ
  • TCP : PostgreSQLの5432ポート
heartbeat.monitors:
  - type: icmp
    schedule: '@every 5s'
    hosts:
      - frontend.{{ domain }}
      - backend.{{ domain }}

  - type: http
    urls: ["https://www.{{ domain }}/about/about"]
    schedule: "@every 10s"
    timeout: 3s
    check.response.status: 200

  - type: http
    urls: ["https://www.{{ domain }}/server-status"]
    schedule: "@every 10s"
    timeout: 3s
    check.response.status: 200

  - type: tcp
    hosts: ["tcp://backend.{{ domain }}:5432"]
    schedule: "@every 10s"
    timeout: 3s
    name: postgresql

Kibanaはこれらのデータを見るためのUptimeというアプリを提供しています。 このアプリを利用することで、簡単にDownしているサーバー、アプリがどれかを見ることが可能です。

Uptime dashboard in Kibana

また、7.2からは問題のあるページ、サーバーのそのほかの監視のポイントのページに遷移することも可能になっています。

ホストやアプリのメトリック

問題のあるサーバーやアプリケーションが判明したら、次に見るのはメトリックという場合が多いです。CPUやメモリなどのリソースの状態です。

Elastic StackではMetricbeatを利用することで、ホストの情報(CPU使用率、メモリ、ファイル、ディスクI/Oなど)を集めて監視に利用できます。また、そのほかにもNGINXやPostgreSQLなどの統計情報(メトリック)も取得できます。 簡単に集めることができるモジュールは公式リファレンスをご覧ください。

ホストの情報に関してはInfrastructure UIを利用して次のような画面で見ることができます。

Host information shown in Kibana

ログの収集

詳細の問題点を知りたい場合はログがやはり有用です。 今回のデモではDBサーバー(PostgreSQL)のプロセスが止まっているという前提でデモを行ないました。 また、Heartbeatによる死活監視の対象にPostgreSQLのポート番号も指定していたのですが、そこは表示しない状態でデモを進めていました。

このような場合、アプリケーションサーバーのログを見ると問題が一目瞭然の場合が多々あります(実際に今回のデモでもコネクションエラーがログに出力されていた)。 ただ、アプリケーションサーバーのログはサーバーやアプリの種類によっては、テキストのログをそのままElastic Stackに取り込むのは得策ではないこともあります。 今回のデモでは、Logrageというライブラリを使用して、Railsに対するリクエストごとに1つのJSONとしてログが出力されるようにして取り込みました。 multilineの機能を使って取り込むことも可能ですが、アプリケーションの開発段階からログのことを検討している場合は今回のようにJSON形式で出力することで、取り込みが簡単になります。 デモでは、Discoverの画面で「application : ruby」というログに絞り込んで実際のアプリのログを見つけ出し、問題を見つける流れを見せました。このapplicationというフィールドはFilebeatの設定でタグを追加してあります。このように対象のログファイルがどこから取得されたかといった情報を付与することで、さらに情報の絞り込みが簡単にできます。

Filtering by Ruby applications

また、アプリケーション以外のログも重要な場合があります。 プロセスの停止や起動、ファイルの改ざん検知やログインのログといった監査用のログを集めるためのAuditbeatがあります。 プロセスが停止している場合、誰がいつ停止したのか?といったことをログから見つけることが可能です。次の画面はpostgresqlのプロセスの起動や停止に関するログをAuditbeatのダッシュボードで表示しています。

Auditbeat dashboard of logs

APM

最後はAPMです。アプリケーション内部の問題を素早く発見するためには、アプリケーション内部に関する情報も重要になります。ここまで紹介してきた、死活監視、メトリック、ログはアプリケーションやシステムを外側から観察するための情報になります。それだけでは、アプリケーションのどのメソッドの処理が遅いのかといった情報を分析するために、デバッグや計測用のログを入れてアプリケーションに入れてデプロイすることが必要です。

そこで活用してもらえるのがElastic APMです。 開発しているアプリケーションにエージェントを仕込むことで、エージェントがアプリケーションを計測して、その計測データをElasticsearchに送信します。

Ruby on Railsで使用する場合は、次のようにエージェントを設定します。 まずは、Gemfileに使用するエージェントのgemを追記します。

# For Elastic APM
gem 'elastic-apm'

あとは、configディレクトリにelastic_apm.ymlというファイルを作成し、接続先の情報を記載します。

server_url: <%= ENV['ELASTIC_APM_SERVER_URL'] %>
secret_token: <%= ENV['ELASTIC_APM_SECRET_TOKEN'] %>

これだけです。あとは、エージェントがRailsのフレームワークのうち、ActionとSQLの呼び出し部分の処理時間を自動で計測してくれるようになります。

Dashboard showing transactions in Kibana

Showing a transaction sample

Drilling down to show span details

また、例外についてもデータを取得するので、ログではなく、これを使用して問題の発見を行うことも可能です。

Viewing errors in Kibana

開発者によっては、フレームワークのメソッドだけではなく、独自で計測処理を入れたくなることもあるでしょう。その場合は、自分で指定することも可能です。

Showing custom instrumentation in Kibana

このように、システム、アプリケーションを多角的に観察、観測できるようにしておくことで、素早く問題を解決することに役立てられます(Observability(可観測性)という新しい言葉が最近使われています(関連するブログはこちら))。 Elastic Stackで計測データを1箇所に集めることで、同じ時間帯のメトリック、ログ、APMデータを手軽に行き来できます。 ぜひ、活用してください。

デモをご覧になりたいという場合は、またどこかのカンファレンスや勉強会で話をする機会があると思いますので、リクエストをいただければと

アプリケーションのパフォーマンスメトリックをElasticsearchに送信して、ログ、死活監視のデータと共にKibanaで可視化可能です。Elastic Stackの最新のバージョンをダウンロードしてインストールするか、Elasticsearch Service の無償トライアルでお試しいただけます。