【技術メモ】Micrometerで取得してCloudWatchに送る
Micrometerで取得してCloudWatchに送る
概要
SpringBootで、Micrometerで取得したメトリクスをCloudWatchに送るメモ。なにしろ、Prometheus連携の記事は大量にあるがCloudWatchはほぼない(需要がないのか?)
公式を見ると、なんとCloudWatchだけドキュメントがない。。。
英語はよくわからないが、作ってくださろうとしているそうなので、公開されたらそちらを参照で。
詳細
前提として、
- Actuatorが入ったSpringBootアプリがあること(過去記事参照)
- AWSアカウントはとっていること(CloudWatchが見れること)
- 検証環境は、Mac Sierra 13.10.6 + Eclipse Oxygen
- SpringBoot 2.1.2
流れ
- CloudWatchにメトリクスを送る用のロールをつくる
- SpringBootにCloudWatch連携ライブラリを追加する
- CloudWatch連携を実装
- CloudWatch連携実行
- ダッシュボードを作る
メトリクスを送る用のロール作成
AWSコンソールのIAMからロールの作成。
- ユーザ名:cloudWatchSubscriber(任意でOK)
- アクセスの種類:プログラムによるアクセス(コンソールは不要)
- アクセス許可の設定:ユーザーをグループに追加
- グループ :cloudWatchAccessGroup(任意でOK)
- アタッチされたポリシー:CloudWatchFullAccess(もっと絞った方がいいかも)
- タグの追加 (オプション):いったんなし
成功したら、アクセスキー ID、シークレットアクセスキーがあとで必要になるので、.csv のダウンロードをしておく。
CloudWatch連携ライブラリの追加
pom.xmlに以下を追加。(Actuatorはすでに入ってる前提。)
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-cloudwatch</artifactId> <version>1.1.2</version> </dependency>
CloudWatch連携を実装
定期実行をどうしようかと思ったけど、とりあえずSpringBootのメインクラスで起動時に呼ぶのがいいか。 (@Scheduledで定期実行させたら、非同期のスレッドが大量にあがってしまった)
private static void monitoringByMicrometer() throws Exception { CloudWatchMeterRegistry registry = new CloudWatchMeterRegistry(config, clock, cloudWatch); // io.micrometer.core.instrument.binder.* に定義されているBinderをBindする new ClassLoaderMetrics().bindTo(registry); new JvmGcMetrics().bindTo(registry); new JvmMemoryMetrics().bindTo(registry); new JvmThreadMetrics().bindTo(registry); IntStream.range(1, 20).forEach(n -> new Thread(sleep).run()); Thread.sleep(60000); }
CloudWatch連携実行
SpringBootアプリ実行時に環境変数を設定
プロジェクト名右クリック > [Run As] > [Run Configurations...] > [Environment]
ダッシュボード作成
AWSコンソールからCloudWatchを選択、右メニューのメトリクスを見ると値が届いている(はず)
メトリクスでアドホックにグラフを作ってみてもいいし
右メニューのダッシュボードからグラフを並べることもできる
ホストが違うのをどうやって出し分けるんだろう・・・