CloudWatch Agent の procstat プラグインで exe と pattern に指定するプロセス名・プロセス起動のコマンドラインを確認する方法
アノテーションの小川です。
CloudWatch Agent の procstat プラグインでプロセスのメトリクスを取得できますが、プロセスのメトリクスを取得できないとのお問い合わせを定期的に頂きます。
このブログでは、procstat プラグインがプロセス名・プロセス起動のコマンドラインをどこで特定しているのか検証した結果を記載しました(検証した環境は Amazon Linux 2 です。)。
この場所からプロセス名を確認すれば確実にメトリクスを取得できると断言はできませんが、メトリクスを取得するためのヒントは得られると考えています。
それでは、まずはプロセス名等を取得する際に使用する exe と pattern の概要について簡単に説明します(pid_file は説明しません。)。
AWS 公式ドキュメントによると、exe と pattern は以下のように記載されています。
exe: 正規表現の照合ルールを使用して、指定した文字列と一致するプロセス名のプロセスを選択します。
pattern: プロセスの起動に使用するコマンドラインでプロセスを選択します。正規表現の照合ルールを使用して指定した文字列と一致するコマンドラインを持つすべてのプロセスが選択されます。
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サイトをご覧ください。