php-fpm のステータス情報を collectd を使って CloudWatch に連携する | mediba Creator × Engineer Blog

php-fpm のステータス情報を collectd を使って CloudWatch に連携する

こんにちは、インフラストラクチャー部の沼沢です。

前回の nginx に引き続き、collectd を使って php-fpm の情報を CloudWatch に連携する具体例をご紹介したいと思います。

参考: nginx の各種情報を collectd を使って CloudWatch に連携する

前提

pm.status_path の値を CloudWatch に連携

pm.status_path とは、php-fpm のプロセス数などのステータス情報を取得するための設定です。
詳細は PHP: 設定 - Manual をご確認ください。

ローカルから curl http://localhost/www-status を実行して以下のような結果が返ってくる設定ができているものとします。

$ curl http://localhost/www-status
pool:                 www
process manager:      static
start time:           22/Dec/2016:18:32:27 +0900
start since:          406243
accepted conn:        8806
listen queue:         0
max listen queue:     0
listen queue len:     0
idle processes:       4
active processes:     1
total processes:      5
max active processes: 1
max children reached: 0
slow requests:        0

URL を叩いて返ってきたレスポンスから情報を取得したい場合には、curl プラグインを利用します。

Plugin:cURL - collectd Wiki

curl プラグインを利用して、このレスポンスの中から、プロセスに関する4つの項目 (idle, active, total, max active) を CloudWatch に連携していきます。

余談ですが、レスポンスが json や xml の場合には curl_json プラグインcurl_xml プラグイン を利用したほうがスマートに設定できます。
これらはまた別の機会にご紹介したいと思います。

1. プラグインをインストール

curl プラグインを利用する場合、 collectd-curl をインストールします。

$ sudo yum install collectd-curl

2. collectd の設定ファイル (/etc/collectd.conf) に以下の設定をする

  • #LoadPlugin curl のコメントアウトを外す
  • 以下を追記する
<Plugin curl>
  <Page "www">
    URL "http://localhost/www-status"
    <Match>
      Regex "^idle processes: *([0-9]+)"
      DSType "GaugeLast"
      Type "phpfpm_processes"
      Instance "idle"
    </Match>
    <Match>
      Regex "^active processes: *([0-9]+)"
      DSType "GaugeLast"
      Type "phpfpm_processes"
      Instance "active"
    </Match>
    <Match>
      Regex "^total processes: *([0-9]+)"
      DSType "GaugeLast"
      Type "phpfpm_processes"
      Instance "total"
    </Match>
    <Match>
      Regex "^max active processes: *([0-9]+)"
      DSType "GaugeLast"
      Type "phpfpm_processes"
      Instance "max_active"
    </Match>
  </Page>
</Plugin>

上記では、以下をそれぞれ取得するように設定しています。

  • 1つ目の Match: 計測期間内で取れた最後の idle processes の値
  • 2つ目の Match: 計測期間内で取れた最後の active processes の値
  • 3つ目の Match: 計測期間内で取れた最後の total processes の値
  • 4つ目の Match: 計測期間内で取れた最後の max active processes の値

DSType “GaugeLast” は計測期間(デフォルト10秒)内の最後の数値を取得するという意味です。

DSType については以下ご参考まで。
collectd.conf(5) – collectd – The system statistics collection daemon#plugin_tail

3. types.db に Type を追加

Type には、types.db ファイルに定義してあるものしか指定できません。
上記の設定では Type “phpfpm_processes” を指定していますが、phpfpm_processes はデフォルトでは用意されていないため、これを追加する作業を行います。

types.db(5) – collectd – The system statistics collection daemon

types.db ファイルは、デフォルトでは /usr/share/collectd/types.db にあると思いますが、types.db ファイルの場所は設定ファイルで指定することができます。

TypesDB "/usr/share/collectd/types.db"

このファイルに以下を追記します。

phpfpm_processes value:GAUGE:0:65535

4. 設定後、collectd を再起動

$ sudo service collectd restart

5. blocked_metrics に以下のものが追加されていることを確認する

$ cat /opt/collectd-plugins/cloudwatch/config/blocked_metrics
〜略〜
curl-www-phpfpm_processes-idle
curl-www-phpfpm_processes-active
curl-www-phpfpm_processes-total
curl-www-phpfpm_processes-max_active
〜略〜

6. CloudWatch に送る対象として、上記をホワイトリストに追記する

$ sudo sh -c 'echo "curl-www-phpfpm_processes-.*" >> /opt/collectd-plugins/cloudwatch/config/whitelist.conf'

7. 設定後、collectd を再起動

$ sudo service collectd restart

8. blocked_metrics から追加されたものが消えているのを確認する

$ cat /opt/collectd-plugins/cloudwatch/config/blocked_metrics

9. CloudWatch 上でグラフ化されていることを確認する

しばらく待つと CloudWatch に以下の通り php-fpm の メトリクスが追加されます。

Alt text

まとめ

今回は php-fpm のステータス情報を CloudWatch に連携してみましたが、nginx の時も今回も、こうやっていざやってみると設定はとても簡単な印象があります。

collectd の他のプラグインもどんどん使ってみたいと思っていますので、今後も利用して具体例としてどんどん公開していきたいと思います。