RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

Otel Collectorを活用したEKSにおけるContainer Insightsメトリクスの取得とフィルタリング

※この記事はラクスアドベントカレンダー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での柔軟なメトリクス削減は需要が高いのではないでしょうか?
ぜひ興味ある方はお試しください!

Copyright © RAKUS Co., Ltd. All rights reserved.