CloudWatch Agent の procstat プラグインで exe と pattern に指定するプロセス名・プロセス起動のコマンドラインを確認する方法

2021.11.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

アノテーションの小川です。

CloudWatch Agent の procstat プラグインでプロセスのメトリクスを取得できますが、プロセスのメトリクスを取得できないとのお問い合わせを定期的に頂きます。

このブログでは、procstat プラグインがプロセス名・プロセス起動のコマンドラインをどこで特定しているのか検証した結果を記載しました(検証した環境は Amazon Linux 2 です。)。

この場所からプロセス名を確認すれば確実にメトリクスを取得できると断言はできませんが、メトリクスを取得するためのヒントは得られると考えています。

それでは、まずはプロセス名等を取得する際に使用する exe と pattern の概要について簡単に説明します(pid_file は説明しません。)。

AWS 公式ドキュメントによると、exe と pattern は以下のように記載されています。

exe: 正規表現の照合ルールを使用して、指定した文字列と一致するプロセス名のプロセスを選択します。

pattern: プロセスの起動に使用するコマンドラインでプロセスを選択します。正規表現の照合ルールを使用して指定した文字列と一致するコマンドラインを持つすべてのプロセスが選択されます。

procstat プラグインでプロセスメトリクスを収集する

exe, pattern ともに、指定した正規表現に一致したプロセスを収集します。

両者の違いは、正規表現と比較される「対象」です。

exe は「プロセス名」、pattern は「プロセス起動のコマンドライン」と比較して、一致したプロセスのメトリクスを収集します(一致は部分一致でも可。)

検証したところ、プロセス名などは以下の方法で確認できました(公式ドキュメントに記載されていないため、確実ではありません。)

セクション 正規表現の対象 確認方法
exe プロセス名 ls -ald /proc/{pid}/exe のシンボリックリンク先
pattern プロセス起動のコマンド ps aux の COMMAND

上記の確認方法で、実際にメトリクスを収集できるか試してみます。

実際に Amazon Linux 2 でメトリクスを収集してみる

CloudWatch Agent のバージョンは以下。

sh-4.2$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a status
{
  "status": "running",
  "starttime": "2021-11-09T08:40:05+0000",
  "configstatus": "configured",
  "cwoc_status": "stopped",
  "cwoc_starttime": "",
  "cwoc_configstatus": "not configured",
  "version": "1.247349.0b251399"
}

httpd のプロセスメトリクスを収集します。

ps auxで httpd のプロセス起動のコマンドを確認。

COMMAND は、引数が含まれたコマンドです(man psから)。

sh-4.2$ ps aux | grep "httpd\|COMMAND"
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      2804  0.0  0.9 255452  9672 ?        Ss   06:11   0:00 /usr/sbin/httpd -DFOREGROUND
apache    6315  0.0  0.6 306804  6572 ?        Sl   07:23   0:00 /usr/sbin/httpd -DFOREGROUND
apache    6318  0.0  0.6 536244  6572 ?        Sl   07:23   0:00 /usr/sbin/httpd -DFOREGROUND
apache    6319  0.0  0.6 306804  6572 ?        Sl   07:23   0:00 /usr/sbin/httpd -DFOREGROUND
apache    6321  0.0  0.6 306804  6572 ?        Sl   07:23   0:00 /usr/sbin/httpd -DFOREGROUND
apache    6322  0.0  0.6 306804  6572 ?        Sl   07:23   0:00 /usr/sbin/httpd -DFOREGROUND
ssm-user  7717  0.0  0.0 119420   956 pts/0    S+   07:44   0:00 grep httpd\|COMMAND

/proc/6315/exeからプロセス名を確認(他のプロセスも同様の結果)。

sh-4.2$ sudo ls -ald /proc/6315/exe
lrwxrwxrwx 1 root root 0 Nov  7 07:52 /proc/6315/exe -> /usr/sbin/httpd

上記から
 プロセス名:/usr/sbin/httpd
 プロセス起動のコマンド:/usr/sbin/httpd -DFOREGROUND
となるため、以下の CloudWatch Agent の設定でメトリクスを収集します。

{
    "metrics": {
        "metrics_collected": {
            "procstat": [
                {
                    "exe": "^/usr/sbin/httpd$",
                    "measurement": [
                        "pid_count"
                    ]
                },
                {
                    "pattern": "^/usr/sbin/httpd -DFOREGROUND$",
                    "measurement": [
                        "pid_count"
                    ]
                }
            ]
        }
    }
}

プロセス名・プロセス起動のコマンドが予想と合っているか判別するため、文頭や文末を表す正規表現を使用しています。

設定を反映させると、以下のとおりメトリクスを取得できました。

次は、以下のプロセス php-fpm を収集してみます。

プロセス起動のコマンドを確認。

sh-4.2$ ps aux | grep php
root      2803  0.0  1.5 288880 15724 ?        Ss   06:11   0:00 php-fpm: master process (/etc/php-fpm.conf)
apache    2871  0.0  0.5 288880  5668 ?        S    06:11   0:00 php-fpm: pool www
apache    2872  0.0  0.5 288880  5668 ?        S    06:11   0:00 php-fpm: pool www
apache    2873  0.0  0.5 288880  5668 ?        S    06:11   0:00 php-fpm: pool www
apache    2874  0.0  0.5 288880  5668 ?        S    06:11   0:00 php-fpm: pool www
apache    2875  0.0  0.5 288880  5668 ?        S    06:11   0:00 php-fpm: pool www
ssm-user  9521  0.0  0.0 119420   948 pts/0    S+   08:17   0:00 grep php

プロセス名を確認。

sh-4.2$ sudo ls -ald /proc/2803/exe
lrwxrwxrwx 1 root root 0 Nov  7 06:42 /proc/2803/exe -> /usr/sbin/php-fpm
sh-4.2$ for i in {2871..2875} ; do sudo ls -ald /proc/${i}/exe ; done
lrwxrwxrwx 1 root root 0 Nov  7 06:42 /proc/2871/exe -> /usr/sbin/php-fpm
lrwxrwxrwx 1 root root 0 Nov  7 06:42 /proc/2872/exe -> /usr/sbin/php-fpm
lrwxrwxrwx 1 root root 0 Nov  7 06:42 /proc/2873/exe -> /usr/sbin/php-fpm
lrwxrwxrwx 1 root root 0 Nov  7 06:42 /proc/2874/exe -> /usr/sbin/php-fpm
lrwxrwxrwx 1 root root 0 Nov  7 06:42 /proc/2875/exe -> /usr/sbin/php-fpm

上記から
 プロセス名:usr/sbin/php-fpm
 プロセス起動のコマンド:php-fpm: master process (/etc/php-fpm.conf)php-fpm: pool www
となるため、以下の CloudWatch Agent の設定でメトリクスを収集します。

{
    "metrics": {
        "metrics_collected": {
            "procstat": [
                {
                    "pattern": "^php-fpm: master process \\(/etc/php-fpm.conf\\)$",
                    "measurement": [
                        "pid_count"
                    ]
                },
                {
                    "pattern": "^php-fpm: pool www$",
                    "measurement": [
                        "pid_count"
                    ]
                },
                {
                    "exe": "^/usr/sbin/php-fpm$",
                    "measurement": [
                        "pid_count"
                    ]
                }
            ]
        }
    }
}

以下のとおり、メトリクスを取得できました。

まとめ

【再掲】プロセス名などを確認する方法

セクション 正規表現の対象 確認方法
exe プロセス名 ls -ald /proc/{pid}/exe のシンボリックリンク先
pattern プロセス起動のコマンド ps aux の COMMAND

上記で確認できない場合は、プロセス名は/proc/{pid}/statusの Name や/proc/{pid}/commから、プロセス起動のコマンドは/proc/{pid}/cmdlineからヒントを得られるかもしれません。

httpd

sh-4.2$ cat /proc/2798/status | grep Name
Name:   httpd
sh-4.2$ cat /proc/2798/comm
httpd
sh-4.2$ cat /proc/2798/cmdline
/usr/sbin/httpd-DFOREGROUND

php-fmp

h-4.2$ cat /proc/2794/status | grep Name
Name:   php-fpm
sh-4.2$ cat /proc/2794/comm
php-fpm
sh-4.2$ cat /proc/2794/cmdline
php-fpm: master process (/etc/php-fpm.conf)
sh-4.2$ cat /proc/2856/cmdline
php-fpm: pool www

また、メトリクスを収集できない場合は/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.logでエラーが出力されていないか、/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.tomlで自分が行った設定が反映されているかご確認ください。

設定や CloudWatch のエンドポイントとの通信にも問題ない場合は、 CloudWatch メトリクスに適切な数字が表示されます(正規表現と一致するプロセスがなければ「0」となります。)。

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、さまざまな背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。