Amazon ECS のメトリクスデータを、ADOT Collector を使って Prometheus と Garafana で可視化してみた

# はじめに

[前回の記事](https://qiita.com/sugimount-a/items/7c62582972a80deccd7d) では、Amazon ECS のモニタリングを、Container Insights で行う方法を紹介しました。AWS CLI のコマンド 1 個だけで、Container Insights が利用できるので、非常に素早く利用開始できるのが特徴です。

Container Insights でも十分運用が出来ると思いますが、個人的に気になる点があります。Container Insights では、タスク単位の過去のメトリクスが取得出来ない挙動となっています。最新のメトリクスはタスク単位で取得できますが、過去に遡って確認することはできません。とはいえ、サービス単位の過去メトリクスが取得できるので、これで十分と考えることも出来ます。が、個人的にはタスク単位で過去のメトリクスが見たいときがあるので、別の方法を検証してみます。



# Prometheus, Grafana で可視化

ECS には、ADOT Collector (AWS Distro for OpenTelemetry Collector) を利用して、コンテナのメトリクスを収集する仕組みがあります。これを利用すると、タスク単位で過去のメトリクスを取得し、可視化することが出来ます。今回は、ADOT Collector を使って、Prometheus と Grafana のマネージドサービスを利用する方法を整理します。

![image-20221120180235552.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/01b870b8-5af2-cc29-9bf8-d6f52cdbb62a.png)



まずどんな可視化ができるのかを紹介すると、シンプルな可視化の例ですが、次のように ECS Task ごとに Memory や CPU の使用率が取得できます。ECS Task の増減や再作成に合わせて、自動的に可視化ができるので、便利にモニタリングができます。

![image-20221120181028802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0b18cee0-5088-3e1d-1a91-ec4f148ef6f8.png)



「5b59c2643a7e4dba9749b8ad98d86ecb」や「c3b87ca3f42540689ac3f0a00f23843f」の文字列の羅列が見えますが、これは ECS の Task ID です。グラフの中に、黄色と緑の線が見えており、2 つの Task の状況がわかります。

それでは、ADOT Collector を使った構成方法を確認していきましょう！



# Amazon Managed Service for Prometheus

Amazon Managed Service for Prometheus (AMP) は、既に作成している状態です。AMP の詳細画面に Endpoint - remote write URL が表示されています。

![image-20221114003918307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/513bf5a7-04a3-903d-d733-2a274aba0ce2.png)



# ECS Task 定義作成

ECS の Task 定義を作成します。Task 定義の中で、ADOT Collector を有効化する欄があります。Create new task definition を選択します。

![image-20221114004217197.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ac209e35-8bc3-06e9-f42e-2036ba28cde5.png)



適当に名前を入れます。

![image-20221114004358969.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/189d6c02-8875-60c5-5349-4f6aec9f815c.png)



1 個目のコンテナイメージを適当に指定します。中身はなんでも良い、独自アプリケーションの立ち位置のコンテナです。

![image-20221114004500551.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e82101a3-43f0-fd1c-3279-05eeda1b0126.png)



2 個目のコンテナイメージも同様に適当に指定します。

![image-20221114004558002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/47b6f59d-6ac3-f9db-71e0-70e3958a046b.png)



Next を押します。

![image-20221114005131800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/30ddf945-e8e9-9ce3-cdf3-71e0df1cf2b4.png)



Role を指定します。以下のものは、ADOT Collector に関する権限を付与しているロールです。

![image-20221114005231588.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e79ff87d-09bf-ea09-5447-8d397582bf0d.png)



Use log collection の部分はデフォルトのままです。

![image-20221114005508644.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d96e34d4-e132-4c20-1152-7f703cb3f3a2.png)



**ここが、ADOT Collector に関する大事な部分です。以下のように指定することで、ADOT Collector のコンテナが ECS Task 内で起動します。**

- Use trace colelction : on
- **Use metric collection : on**
- **Amazon Managed Service for Prometheus の [Endpoint - remote write URL] を指定**

![image-20221114005532606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/881176b2-ee8e-d63e-9c74-19ea00db739f.png)



Create を押します。

![image-20221114005552785.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5d08e344-f54c-1b8f-947c-f9501b031f4a.png)



Task 定義が作成されました。

- Container に、自動的に `aws-otel-collector` が入っている。これは、AWS Distro for OpenTelemetry Collector のコンテナイメージとなる。

![image-20221114005732198.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7fb306cb-fc9e-febb-8968-2e1d17cec321.png)



# Service の作成

作成した ECS Task を使って、適当に Service を作成します。

![image-20221114005948390.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3c3567ee-03cd-90ad-4b95-04deab60b015.png)



適当に指定して、Deploy します。

![image-20221114010108525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b584047d-b616-682e-e926-f7f035d53cae.png)



Deploy が出来ました。

![image-20221114010621112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/dc80375d-4656-4466-849f-c3495283d31e.png)



# ADOT Collector のログ

CloudWatch Logs に、ADOT Collector に関する Log group があります。

![image-20221114011055870.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8195d4db-fe41-2642-a9e1-42bee52df2f5.png)



適当に選択すると

![image-20221114011129417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/55de1a79-a7ff-e0d7-1d73-49e4242d93c7.png)



いろいろログが出ています。

![image-20221114011151172.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8665a738-f37b-8662-8e60-8c35f3dc6455.png)



# Grafana 権限設定

Amazon Managed Grafana (AMG) は事前に有効化していますが、AMP にアクセスするための権限設定が必要です。

![image-20221114011806370.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2edeacf5-1add-1427-b971-e558bf12d8af.png)



AMP に関して、Enable をします。

![image-20221114011830109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/99f8d841-9507-5d0b-0cbe-3a227cab216b.png)



Updating となります。

一定時間後、Active に変わりました。

![image-20221114011857901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/dc6e1aa1-a6dc-2513-7689-f43330ac4673.png)



# Grafana で可視化

Grafana のページを表示します。

![image-20221114011500871.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d1d95bb5-8998-e0bb-1a60-deeb910fc227.png)



AWS Services を選びます。

![image-20221114011607916.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/34f04bf9-135f-d729-eaef-9e5b2a4f8b32.png)



Prometheus を選択します。

![image-20221114011644588.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/259f0aa3-601f-4478-cecd-85dfd18163d1.png)



Region や、AMP を指定して、Add 1 data source を押します。

![image-20221114012024805.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f3e4f4f5-f26a-0d04-e17d-fe246bb2eea0.png)



Dashboard を開きます。

![image-20221114013346178.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a3473c10-141b-2c59-1bd4-ecfed6cbb6b4.png)



新しい panel を追加します。

![image-20221114013404274.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a9e6f7f0-4237-a4d5-c191-bb2728740eed.png)



データソースを変更して、AMP を選択します。

![image-20221114013528699.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7a5d0878-7f3c-8308-00f5-b215dd202e85.png)



以下の文字列を指定して Aplly を押します。Task ごとに CPU 使用率が取得できています。

```
ecs_task_cpu_utilized
{{aws_ecs_task_id}}
ECS CPU Utilized
```

![image-20221114013848402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6ddf2bce-2a78-4598-fc21-67058639be02.png)



また、2枚目の Add Panel を押します。

![image-20221114015530776.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/29bfecfc-2d95-a7fa-e2c4-8a5fc2a2655b.png)



add

![image-20221114015558231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/28d1a1ae-8f1e-197d-6868-54563208f142.png)



メモリに関するパネルを追加します。

```
ecs_task_memory_utilized
{{aws_ecs_task_id}}
```

![image-20221114015810507.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/51bef640-1f39-43b0-007b-1a6a25cf575d.png)



このように、Memory と CPU に関するメトリクスが正しく取得できました。

![image-20221114015837521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/af8f2ea6-fd58-4edd-a36f-1b20ad8bb081.png)



# 検証を通じてわかったこと

- ECS Task を動的に取得可能！素敵！
- ECS サービス名が、Undefine となっている	
  - https://github.com/aws-observability/aws-otel-collector/issues/939
![image-20221114015208226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/352e0243-9c02-de11-09ba-57acc2d7e5f6.png)
- Amazon Managed Service for Prometheus のメトリクス保存期間は、150 日固定となる。150 日を過ぎると、自動的にメトリクスが削除される。
  - https://docs.aws.amazon.com/ja_jp/prometheus/latest/userguide/AMP-onboard-ingest-metrics.html



# 参考 URL

https://catalog.workshops.aws/observability/ja-JP/amp/ecs