ECS上のSpring Boot ActuatorのメトリクスをCloudWatchに送信する


起動タイプが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に送信することができる。


関連記事