😸

PumaのMetricsを取得したい

2025/01/07に公開

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を取得することが可能になっています。
https://github.com/puma/puma?tab=readme-ov-file#controlstatus-server

DatadogにはPumaのIntegrationがあるのですが今回はこれを使わずに、Prometheusを使うことにしました。
理由としてはConfigが比較的少なく済むからです。

世の中にはPumaのPrometheus Exporterがいくつかありますが以下を利用することにしました。

https://github.com/discourse/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

https://github.com/discourse/prometheus_exporter?tab=readme-ov-file#puma-metrics

そしてこの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

https://docs.datadoghq.com/ja/integrations/openmetrics/

これでPumaのMetricsがDatadogでも見れるようになりました。

まとめ

Cluster Modeにした時のリソース使用を正確に把握したいということからPumaのメトリクスを取得しようとしましたが、わりと簡単に取得ができ良かったです。
Custom Metricsが高くなりそうだったら、普通にIntegrationを変更しようかと思います。

Discussion