EC2全体じゃなくて特定のプロセスのメモリ量、可視化したくないですか?
私はしたいです。
サンプル
*/5 * * * * mem=$(ps -C java -O rss | grep RlpMaintenance | gawk '{ count ++; sum += $2 }; END {count --; print sum/1024 ;};');instance_id=$(curl -s -w '\n' http://169.254.169.254/latest/meta-data/instance-id);aws cloudwatch put-metric-data --namespace RlpMaintenance --metric-name RlpMaintenanceMemory --dimension InstanceId=$instance_id --value $mem --unit "Megabytes"
説明
ワンライナーを分割して説明します。
*/5 * * * *
ただのcron式です。お好きにカスタマイズください。
このまま使うと5分間隔です。
mem=$(ps -C java -O rss | grep RlpMaintenance | gawk '{ count ++; sum += $2 }; END {count --; print sum/1024 ;};');
memという変数を定義しています。
さらに細分化して説明します。
ps -C java -O rss
このサンプルではjavaプロセスを対象としています。
この部分だけ発行すると↓のような感じで、立ち上がっているjavaプロセスが全てでてきます。
今回はRlpMaintenanceというプロセスの物理メモリを表示するサンプルとなっておりますので、
この結果を↓で一行にしています。
grep RlpMaintenance
その後、このプロセスが複数立ち上がっていたときのため、↓で集計しています。
gawk '{ count ++; sum += $2 }; END {count --; print sum/1024 ;};');
echo $mem を実行すると、RlpMaintenanceというプロセスの物理メモリを表示することができます。
instance_id=$(curl -s -w '\n' http://169.254.169.254/latest/meta-data/instance-id);
こちらは、稼働しているEC2のインスタンスIDを取得するコマンドになります。
一般的によく利用されてるものですね。
aws cloudwatch put-metric-data --namespace RlpMaintenance --metric-name RlpMaintenanceMemory --dimension InstanceId=$instance_id --value $mem --unit "Megabytes"
上記で定義した2つの変数を利用して、cloudwatchにput-metric-dataします。
Cloudwatchでみてみると
こうなります。
汎用化
*/5 * * * * mem=$(ps -C <プロセス名> -O rss | grep <プロセスを特定する文字列> | gawk '{ count ++; sum += $2 }; END {count --; print sum/1024 ;};');instance_id=$(curl -s -w '\n' http://169.254.169.254/latest/meta-data/instance-id);aws cloudwatch put-metric-data --namespace <カスタム名前空間名> --metric-name <メトリクス名> --dimension InstanceId=$instance_id --value $mem --unit "Megabytes"
<プロセス名> <プロセスを特定する文字列> <カスタム名前空間名> <メトリクス名>
をカスタマイズすれば、何にでも使えるかと思います。
※EC2にCloudwatchが利用できるロールをつける、
かつAWS CLIが利用できることが前提です。