PumaのMetricsを取得したい
PumaのMetricsを取得したい
PumaのConfigをいじりたいけどそもそも変更の結果を確認したいし、Pumaが思っているように動いているか分からない。
そんなことってありますよね?
Motivation
PumaをWeb ServerとしたRailsアプリケーションを運用しているのですが、なぜかSingle Modeで動いているという事がありました。CPUは当然マルチコアになっているのですが、Single ModeなのでCPUが詰まるとそのインスタンスは後続の処理が捌けなくなりスループットが大幅に下がるという問題が存在していました。
実務上問題がなければ良かったのですが、当然そんなことはなく、ECSのタスクが無駄に増えたり減ったりをして、システムが一瞬不安定かするといったことがありました。
(恐らく処理のつまりが連鎖して、全体的に不安定化が起きたと推測しています)
世の中はマルチコアが前提の作りをしているのだからマルチコアで動かしたいなと思っていたら、PumaにCluster Modeというものがあるのを見つけました。Cluster Modeで動かせば良いじゃん、あとは効果測定やリソースの使用状況確認的にもMetrics取っておきたいじゃん!ということでPumaのMetricsを取得する旅が始まりました
Datadog Integration
Pumaには元々Status Server機能があり、それを利用してStatusを取得することが可能になっています。
DatadogにはPumaのIntegrationがあるのですが今回はこれを使わずに、Prometheusを使うことにしました。
理由としてはConfigが比較的少なく済むからです。
世の中にはPumaのPrometheus Exporterがいくつかありますが以下を利用することにしました。
ありがたいことにPumaだけではなく、RailsやSidekiqなどについても取得ができます。
設定方法
基本的には公式のドキュメントに従うだけです。
after_worker_boot do
require 'prometheus_exporter/instrumentation'
# optional check, avoids spinning up and down threads per worker
if !PrometheusExporter::Instrumentation::Puma.started?
PrometheusExporter::Instrumentation::Puma.start
end
end
そしてこのPrometheus Exporterを起動します。
bundle exec prometheus_exporter -b 0.0.0.0 -p 9394
Datadog Agentの設定方法
DatadogのagentにはOpenMetrics形式のデータを取得することが可能な設定があります。OpenMetricsはPrometheus形式のフォーマットをベースに拡張された仕様の事です。DatadogのドキュメントをみるとOpenMetricsはCustom Metrics扱いになります。悲しいね。
おおよそ以下のような設定で事足りるはずです。
instances:
- openmetrics_endpoint: http://localhost:9394/metrics
metrics:
- ruby_puma_.+
headers:
Accept: text/plain
これでPumaのMetricsがDatadogでも見れるようになりました。
まとめ
Cluster Modeにした時のリソース使用を正確に把握したいということからPumaのメトリクスを取得しようとしましたが、わりと簡単に取得ができ良かったです。
Custom Metricsが高くなりそうだったら、普通にIntegrationを変更しようかと思います。
Discussion