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::Collector
と Prometheus::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 の独自クエリ言語を用いて集計することができます。デフォルトで提供されるダッシュボードで即座に確認できるのでとても便利です。
実際に発表した際のスライドはこちら。
まとめ
今回は Prometheus を利用した Rails アプリケーションのモニタリングについてご紹介しました。 Prometheus がどうという話はあまりできませんでしたが、ここまで手軽に準備できるもんかというのは正直びっくりしました。他のツールを利用していない状態でアプリケーションの運用をしている場合には、特に Rails 等であれば簡単に監視を始められるので、導入を検討する価値はあるのではないかと思いました。
現在は比較的安定してサーバを稼働させることが出来ていると思いますが、日頃からこういったメトリクスを見つつ、今後の安定運用につなげていきたいと思います。