Medley Developer Blog

株式会社メドレーのエンジニア・デザイナーによるブログです

PrometheusでRailsアプリケーションのパフォーマンスが簡単に見れますという発表をしました

こんにちは。エンジニアの宍戸です。先日、社内勉強会「TechLunch」にてPrometheusを使ったアプリケーションのモニタリングについて発表する機会がありましたので、その内容を少しご紹介できればと思います。

Prometheus

先日2.0がリリースされたばかりの統合監視ツールです。監視対象からメトリクスを取得し、その情報をGrafanaと連携してグラフィカルに表示したり、アラートマネージャ機能を利用してメトリクスの状況に応じて通知を作成することなどが可能です。また、PrometheusはPull型のメトリクス収集形式をとっていますが、サービスディスカバリ用の設定を入れることで、対象のサーバ群の増減の度に作業すること無く、監視対象を管理することができるなど、現在のアプリケーション稼働環境にあった運用が可能なものとなっています。(Prometheus自体に関する情報はかなり多くの方が記事を書かれているので、詳細はそちらにお任せしたいと思います🙏)

Prometheusは前職時代にもお世話になっており、そのときにはGoで書かれたサーバのモニタリングに利用していました。当時から便利に利用していたこともあり、弊社のプロダクトはRailsを利用しているため、今回はPrometheusを利用して、Railsアプリケーション自体のパフォーマンスに関するメトリクスを取得してみました。

アプリケーションパフォーマンスのモニタリング

アプリケーション自身のパフォーマンスの情報を定常的にモニタリングしておく事は、潜在的ボトルネックの発見や、アクセス状況の変化、リリース単位でのパフォーマンスの変化(改善/悪化)を早期に発見することに繋がると考えています。

アプリケーションのモニタリングは有料ツールを含めてかなり多くの選択肢があります。NewRelicのAPMは代表的なツールの一つで、実は現時点ではこちらを利用してモニタリングを行っています。またその他様々なツールでも同じようなインサイトを得ることができます。アプリケーションパフォーマンスのモニタリング(マネジメント)ツールについてはこちらに良くまとまっていましたので、合わせて見ていただくと良いかもしれません。

メトリクスについて

Prometheusも様々な機能がありますが、監視対象となるサーバはExporterと表現されます。このExporterに対して、Prometheus Serverがデータを取りに来る格好です。

https://github.com/prometheus/client_rubyというライブラリが公式に提供されています。こちらにあるPrometheus::Middleware::CollectorPrometheus::Middleware::Exporter という2つのRack middlewareを利用することで設定に数行追加するだけで以下に記載した情報をPrometheus Serverから利用する準備が整います。

key 意味
http_server_requests_total アプリケーションの処理したリクエスト総数
http_server_request_duration_seconds_bucket あるエンドポイントの要求処理時間のヒストグラム
http_server_request_duration_seconds_sum 上記の合計値
http_server_request_duration_seconds_count あるエンドポイントへのリクエストの総数
http_server_exceptions_total アプリケーションで発生した例外の合計数

ここで出て来るバケットというのは特定の範囲のデータを格納する領域のようなものです。 ヒストグラムの計算などの際に利用します。

これらを用いて、

  • 直近10分のエンドポイント毎のレイテンシ
    • rate(http_server_request_duration_seconds_sum{path=~"/api.*"}[5m]) / rate(http_server_request_duration_seconds_count{path=~"/api.*"}[5m])
  • APIのエンドポイント毎のステータスコードが200以外となったレスポンスの数
    • sum(http_server_requests_total{job="rack-example", code!~"^2..$", path=~"/api.*"} offset 10m ) by (path)

などをPromQLというPrometheusの独自クエリ言語を用いて集計することができます。デフォルトで提供されるダッシュボードで即座に確認できるのでとても便利です。

実際に発表した際のスライドはこちら。 speakerdeck.com

まとめ

今回はPrometheusを利用したRailsアプリケーションのモニタリングについてご紹介しました。

Prometheusがどうという話はあまりできませんでしたが、ここまで手軽に準備できるもんかというのは正直びっくりしました。他のツールを利用していない状態でアプリケーションの運用をしている場合には、特にRails等であれば簡単に監視を始められるので、導入を検討する価値はあるのではないかと思いました。

現在は比較的安定してサーバを稼働させることが出来ていると思いますが、日頃からこういったメトリクスを見つつ、今後の安定運用につなげていきたいと思います。