起動タイプがFargateのECS上で動かすアプリのCPU使用率やメモリ使用率などは、
Container Insights
を有効にするだけで簡単にCloudWatchに送信することができる。
その一方で、例えば上で動くアプリがJava製の場合にヒープ使用率などのメトリクスをCloudWatchと連携する方法がわからなかったのでやってみた。
なんか、もっと良い方法があれば教えてください。 正直、datadog使って連携しちゃうのが一番てっとりばやいんだろうなとは調べてて思った。
Spring Boot Actuator
まず、上で動かすアプリだが、 Spring Boot
を使う場合は、 actuator
を使うと簡単にメトリクスがとれる。
Spring Boot Actuator
は、本番対応機能ということで本番環境での運用で便利な機能を提供してくれるもので、
ヘルスチェックエンドポイントを公開したり、各種メトリクスを公開することができる。
https://spring.pleiades.io/spring-boot/docs/current/reference/html/production-ready-features.html
CloudWatchと連携する
Spring Boot Actuatorだが、メトリクスの公開先にいろいろと種類があり、datadogやら、prometheusやら選ぶことができる。 その中に、ドキュメントには記載されていないものの、CloudWatch連携があるのだが、Fargateでは上手く動かすことができなかった。 もろもろ設定しているにもかかわらず、ローカルアドレスのメタデータのエンドポイントで自身の情報を得ようとして、 Fargateでは当該エンドポイントにアクセスすることができず失敗してしまうのだ。 EC2だったらいけるのかな、とも思ったのだが、今回はFargateでやりたかったので、 いろいろ調べた結果StatsD連携するのが、もっともよいのではという結論に至った。
StatsD連携する
Spring Boot Actuatorには、StatsD連携するための仕組みが準備されているので、
pom.xml
に以下の依存関係を加えるだけで、簡単に連携することができる。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-statsd</artifactId>
</dependency>
あわせて、送信先の設定を application.properties
に設定しておく。
たぶん、調べる限りはすべてデフォルト設定なので、設定しなくても大丈夫かも。
management.metrics.export.statsd.enabled=true
management.metrics.export.statsd.flavor=telegraf
management.metrics.export.statsd.host=localhost
management.metrics.export.statsd.port=8125
management.metrics.export.statsd.max-packet-length=1400
management.metrics.export.statsd.polling-frequency=10s
management.metrics.export.statsd.publish-unchanged-meters=true
CloudWatchエージェントをSideCarとして動かす
起動タイプFargateの場合は、Spring Bootから送信されるStatsDメトリクスを受信するために、 CloudWatchエージェントをECSタスクのサイドカーとして起動する必要がある。
そのために、まずはCloudWatchエージェントでStatsDメトリクスをあつかえるように
CloudWatchの設定を書く必要がある。
Fargateの場合は、直接設定を書けないので、 SSM
のパラメータで以下の設定をしておく。
{
"metrics":{
"metrics_collected":{
"statsd":{
"service_address":":8125",
"metrics_collection_interval":60,
"metrics_aggregation_interval":300
}
}
}
}
これをパラメータストアに入れておき、サイドカーのCloudWatchエージェントの
環境変数で、こちらを valueFrom
として設定するとよい。
ECSの場合、同じタスクの中のコンテナは、 localhost
でポートを共有しており、
localhost:8125
にメトリクスを送信するようにSpring Boot側で設定をしているので、
ヒープ使用率などのメトリクスをCloudWatchに送信することができる。
Share