※この記事はラクスアドベントカレンダー2日目の記事です
はじめに
こんにちは!
エンジニア3年目のTKDSです!
今回はEKSでOtel Collectorを用いたContainer Insightsメトリクスの取得についてご紹介します。
ぜひ最後まで見ていってください!
Container Insights
Container Insightsを使うとEKSクラスタからnodeやPodなどからCPU、メモリ、ディスク、ネットワークなどさまざまなメトリクスが取得可能です。
※詳しくはAWSのドキュメントをご覧ください。 ※収集されるメトリクスについて知りたい方はこちらのドキュメントを見てください。
Otel Collectorによるメトリクスの収集
色々なメトリクスが取れるContainer Insightメトリクスですが、実はOtel Collectorでも取得することが可能です。
さらに、Otel Colectornにあるprocesserを使うことができるので、不要なメトリクスを落としてCloudWatchに送信することが可能です。
取得する流れは以下の図のようになってます。

まずAWS Container Insights Receiver(awscontainerinsightreceiver)がcollection_intervalに従って、定期的にメトリクスを取得します。
そのメトリクスに対して、processorでfilterを使い不要なメトリクスを落とします。ここで不要なメトリクスを落としておくことでCloudWatchの課金を抑えられます。
最後にexportersでawsemfを使って、埋め込みメトリクスフォーマットというCloudWatch logsにメトリクスを取得するように指示する形式に変換して送信します。
Otel Collectorのマニフェスト例
次に実際に使ってるマニフェストの一部を下記に示します。
このマニフェストでは、 nodeとpodのCPUとメモリを取るようにしてます。
同じことをしたい人はぜひ参考にしてください。
apiVersion: v1 data: collector.yaml: | receivers: awscontainerinsightreceiver: collection_interval: 300s exporters: awsemf: dimension_rollup_option: NoDimensionRollup log_group_name: /aws/containerinsights/{ClusterName}/performance log_stream_name: performance/{NodeName} metric_declarations: - dimensions: - - Namespace - ClusterName metric_name_selectors: - pod_cpu_utilization - pod_memory_utilization - dimensions: - - NodeName - ClusterName metric_name_selectors: - node_cpu_utilization - node_memory_utilization namespace: ContainerInsights parse_json_encoded_attr_values: - Sources - kubernetes resource_to_telemetry_conversion: enabled: true debug: {} processors: batch: {} filter/drop_unused: metrics: metric: - name != "pod_cpu_utilization" and name != "pod_memory_utilization" and name != "node_cpu_utilization" and name != "node_memory_utilization" service: telemetry: logs: encoding: json level: error metrics: readers: - pull: exporter: prometheus: host: 0.0.0.0 port: 8888 pipelines: metrics: exporters: - awsemf processors: - filter/drop_unused - batch receivers: - awscontainerinsightreceiver
CloudWatchでの保存先は以下の部分で指定しています。
自動作成されるので、事前の作成は不要です。
{ClusterName}と{NodeName}は自動で埋めてくれます。
ただ、"{NodeName}"のように書くとエラーで自動で埋めるのが機能しなかったため、適当にperformance/とつけました。
最後のnamespaceで指定した名前で、CloudWatchMetricsのnamespaceが作成されます。
log_group_name: /aws/containerinsights/{ClusterName}/performance
log_stream_name: performance/{NodeName}
namespace: ContainerInsights
この設定で動かすと、CloudWatchに保存されます。
レコードは以下のような形で記録されます。(見せられない部分は伏せてます)
{
"AutoScalingGroupName": "xxxx",
"ClusterName": "xxxx",
"InstanceId": "xxxx",
"InstanceType": "xxxx",
"NodeName": "xxxx",
"Sources": [
"cadvisor",
"/proc",
"pod",
"calculated"
],
"Type": "Node",
"Version": "1",
"_aws": {
"CloudWatchMetrics": [
{
"Namespace": "ContainerInsights",
"Dimensions": [
[
"ClusterName",
"NodeName"
]
],
"Metrics": [
{
"Name": "node_memory_utilization",
"Unit": "Percent",
"StorageResolution": 60
}
]
}
],
"Timestamp": 1764157664000
},
"kubernetes": {
"host": "xxxx"
},
"node_memory_utilization": 31.46575974804524
}
絞り込んだメトリクスだけ取れてるのがわかります。
この形式でロググループに入るとCloudWatch logsが自動でメトリクスに転送してくれます。
CloudWatchのページに行きContainerInsights→指定したDimension→メトリクスを選んで表示してみるとメトリクスを観察することができます。

ちなみにメトリクスとして取り込んだあとはemf形式のログは消しても問題ありません。
まとめ
ここまで読んでいただきありがとうございました!
今回はEKSにおけるContainer InsightsメトリクスのOtel Collectorでの収集についてご紹介しました!
filterでの柔軟なメトリクス削減は需要が高いのではないでしょうか?
ぜひ興味ある方はお試しください!