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

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

今年の10月頃に、collectd の CloudWatch プラグインが出たのは記憶に新しいです。
新しい collectd の CloudWatch プラグイン | Amazon Web Services ブログ

その後、数々の所謂「試してみたブログ」等もたくさん出回っていますが、あまり具体的な設定の解説をしているものは少ない印象です。
しかも、collectd には日本語のドキュメントは無く、日本語で書かれているブログ等もそう多くはありません。
そのため、深い使い方をするとなると英語のドキュメントを読み解きながら進める必要があり、ここで挫折してしまう方も多いのではないでしょうか。

そんな中、nginx の各種情報について collectd を使って CloudWatch のカスタムメトリクスを作成する機会がありましたので、1つの具体例としてご紹介したいと思います。

前提

stub_status の値を CloudWatch に連携

stub_status とは、コネクション数等を確認する nginx のモジュールです。
詳細は Module ngx_http_stub_status_module をご確認ください。

location /nginx-status {
    stub_status on;
}

上記が /etc/nginx.conf に設定されいてる状態でローカルからこのパスにアクセスすると、以下のような情報が取得できます。

$ curl http://localhost/nginx-status
Active connections: 6
server accepts handled requests
 142929 142929 100818
Reading: 0 Writing: 1 Waiting: 5

これを CloudWatch でグラフ表示していきます。

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

collectd では nginx 専用のプラグインが用意されていますので、そちらを利用します。

$ sudo yum install collectd-nginx

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

  • #LoadPlugin nginx のコメントアウトを外す
  • 以下を追記する
<Plugin nginx>
  URL "http://localhost/nginx-status"
</Plugin>

3. 設定後、collectd を再起動

$ sudo service collectd restart

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

$ cat /opt/collectd-plugins/cloudwatch/config/blocked_metrics
〜略〜
nginx--nginx_connections-active
nginx--connections-accepted
nginx--connections-handled
nginx--nginx_requests-
nginx--nginx_connections-reading
nginx--nginx_connections-writing
nginx--nginx_connections-waiting
〜略〜

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

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

6. 設定後、collectd を再起動

$ sudo service collectd restart

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

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

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

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

Alt text

$request_time の値を CloudWatch に連携

$request_time とは、nginx がリクエストを受け取り、レスポンスを返してからアクセスログに書き込むまでの経過時間のことです。

Module ngx_http_log_module

/etc/nginx.conf に以下のように設定したとします。

〜略〜
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for" '
                '"$request_time"';
〜略〜

上記のように、ログの末尾(※)に $request_time が出力されるように設定した後、nginx を再起動すると設定が反映され、$request_time が記録されるようになります。
(下記の例だと “0.214”)

xxx.xxx.xxx.xxx - - [26/Dec/2016:17:33:31 +0900] "GET / HTTP/1.1" 200 (...中略...) "xxx.xxx.xxx.xxx" "0.214"

この末尾に記録された $request_time を、CloudWatch に連携してみます。

※末尾にした理由は、正規表現でマッチさせやすくするためです。
そのため、後述の正規表現を変更すればどの位置でもマッチさせられるので、実際はどの位置でも問題ありません。

ログファイル等、追記型のファイルから情報を取得したい場合には、tail プラグインを利用します。

Plugin:Tail - collectd Wiki

tail プラグインはデフォルトで組み込まれているため、nginx プラグインのようなインストール作業は不要です。

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

  • #LoadPlugin tail のコメントアウトを外す
  • 以下を追記する(ログファイルの場所は適宜読み換えてください)
<Plugin "tail">
  <File "/var/log/nginx/access.log">
    Instance "nginx"
    <Match>
      Regex "\" \"([0-9.]+)\"$"
      DSType "GaugeAverage"
      Type "response_time"
      Instance "AvgRespTime"
    </Match>
    <Match>
      Regex "\" \"([0-9.]+)\"$"
      DSType "GaugeMin"
      Type "response_time"
      Instance "MinRespTime"
    </Match>
    <Match>
      Regex "\" \"([0-9.]+)\"$"
      DSType "GaugeMax"
      Type "response_time"
      Instance "MaxRespTime"
    </Match>
  </File>
</Plugin>

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

  • 1つ目の Match: 計測期間内の平均値(DSType “GaugeAverage”)
  • 2つ目の Match: 計測期間内の最小値(DSType “GaugeMin”)
  • 3つ目の Match: 計測期間内の最大値(DSType “GaugeMax”)

3つの Match はそれぞれ同じ値をヒットさせる正規表現を書いていますが、DSType を指定することでそれぞれ取得する値の性質を分けています。
計測期間というのは Interval という設定で指定でき、デフォルトでは10秒間隔で計測するようになっています。
つまり、10秒のうちの平均値、最小値、最大値を取得しているということになります。

DSType については以下を参考にいろいろ試してみてください。
collectd.conf(5) – collectd – The system statistics collection daemon#plugin_tail

3. 設定後、collectd を再起動

$ sudo service collectd restart

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

$ cat /opt/collectd-plugins/cloudwatch/config/blocked_metrics
〜略〜
tail-nginx-response_time-AvgRespTime
tail-nginx-response_time-MinRespTime
tail-nginx-response_time-MaxRespTime
〜略〜

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

$ sudo sh -c 'echo "tail-nginx-response_time-.*" >> /opt/collectd-plugins/cloudwatch/config/whitelist.conf'

6. 設定後、collectd を再起動

$ sudo service collectd restart

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

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

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

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

Alt text

まとめ

collectd の CloudWatch プラグインが出たことでカスタムメトリクスがより簡単に追加できるようになっています。

今回は nginx を例に使い方をご紹介させていただきましたが、他のメトリクスを追加する際にはまたブログにしてご紹介できればと思います。