CloudWatch AgentでKonnectのData Planeのメトリクスを取得する

CloudWatch AgentでKonnectのData Planeのメトリクスを取得した時のメモ。
[こちら](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-PrometheusEC2.html)を参考にした。
ただ、CloudWatch Agentを使ったPrometheusのメトリクスの取り込みでは、ヒストグラムの取り込みが[サポートされていない](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/ContainerInsights-Prometheus-metrics-conversion.html)のであまり実用的ではなく、バッドノウハウの共有に近いかも。


## 前提
以下の環境で動作確認した。
- Data PlaneはEC2上にDockerで構築

## 検証手順

まず、Data Plane側でメトリクスが出せるようにStatusAPIを利用する設定を追加してコンテナを起動する。
```bash
docker run -d --restart=always --name konnect-dp \
	：（省略）
	-e "KONG_STATUS_LISTEN=0.0.0.0:8100" \
	-p 8100:8100
```
これでメトリクスが取れるようになる。
```bash
$ curl -s localhost:8100/metrics | head
# HELP kong_control_plane_connected Kong connected to control plane, 0 is unconnected
# TYPE kong_control_plane_connected gauge
kong_control_plane_connected 1
```

次にスクレイプ設定となる`prometheus.yml`を作成する。
```yaml
cat <<EOF > ./konnect-dp-prometheus.yml
global:
  scrape_interval: 1m
  scrape_timeout: 10s
scrape_configs:
  - job_name: 'konnect-dp'
    sample_limit: 10000
    scrape_interval: 15s
    static_configs:
      - targets: ['localhost:8100']
EOF
```

次にAWS側の設定をする。
EC2のロールに`CloudWatchAgentServerPolicy`のポリシーを割り当てる

CloudWatch AgentをEC2にインストールする。
インストール方法は[こちら](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html)を参照。

以下はUbuntuの例。
```bash
wget https://amazoncloudwatch-agent.s3.amazonaws.com/debian/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i amazon-cloudwatch-agent.deb
```

インストール後、自動起動を有効化しておく。
```bash
sudo systemctl enable amazon-cloudwatch-agent
```

CloudWatch Agentの設定ファイルを作成する。
```json
cat <<'EOF' | sudo tee /etc/amazon/amazon-cloudwatch-agent/amazon-cloudwatch-agent.d/konnect-config.json
{
  "agent": {
    "metrics_collection_interval": 60,
    "run_as_user": "root"
  },
   "logs":{
      "metrics_collected":{
         "prometheus":{
            "cluster_name": "konnect-dp",
            "log_group_name": "konnect-dp-logs",
            "prometheus_config_path":"/home/ubuntu/cloudwatch-agent/konnect-dp-prometheus.yml",
            "emf_processor": {
                "metric_declaration_dedup": true,
                "metric_namespace": "KonnectDPMetrics",
                "metric_declaration": [
                  {
                    "source_labels": ["job"],
                    "label_matcher": ".*", 
                    "dimensions": [
                        ["InstanceId"],
                        ["job"] 
                    ],
                    "metric_selectors": [ 
                      ".*"
                    ]
                  }
                ]
            }
        }
      },
      "force_flush_interval": 5 
  }
}
EOF
```

CloudWatch Agentに設定を読み込ませる。
```bash
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/etc/amazon/amazon-cloudwatch-agent/amazon-cloudwatch-agent.d/konnect-config.json
```

CloudWatch Agentを起動する。
```bash
sudo systemctl restart amazon-cloudwatch-agent
```
状態を確認し、Activeの項目が`active (running)`になっていることを確認する。
```bash
sudo systemctl status amazon-cloudwatch-agent
```

CloudWatchを確認する。
カスタム名前空間のところに`metric_namespace`設定したNamespaceが作成されている。
![Pasted image 20250619162814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/af60d413-6223-4d54-8813-a5e63ad276bf.png)

クリックすると取れているメトリクスの一覧が確認できる。
![Pasted image 20250619162945.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/c147ab83-fa2d-4e9e-a574-274bb28549e7.png)

数が少ないように見える。
これは前述の通りCloudWatch Agentを使ったPrometheusのメトリクスの取り込みでは、ヒストグラムの取り込みがサポートされていないためである。
なので、レイテンシ系の確認で利用する`kong_request_latency_ms`などは確認することが出来ない。

取れているものについては以下のような感じで値の推移などを確認できる。
![Pasted image 20250619163342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/70e5f498-2ff3-4778-be34-52bb3e55a2aa.png)

## まとめ
上述のように設定自体はそれほど大変ではないが、ヒストグラムが取れないのであまり実用的ではない。
AWS Distro for OpenTelemetry(ADOT)やAmazon Managed Service for Prometheus(AMP)を使いましょう。