

# Container Insights에서 수집한 지표
<a name="Container-Insights-metrics"></a>

Container Insights에서는 Amazon ECS 및 Amazon ECS의 AWS Fargate에 대한 하나의 지표 세트와 Amazon EKS, Amazon EKS의 AWS Fargate, RedHat OpenShift on AWS(ROSA) 및 Kubernetes에 대한 다른 세트를 수집합니다.

컨테이너 작업이 일정 시간 동안 실행될 때까지는 지표가 표시되지 않습니다.

**Topics**
+ [향상된 관찰성 지표를 갖춘 Amazon ECS Container Insights](Container-Insights-enhanced-observability-metrics-ECS.md)
+ [Amazon ECS Container Insights 지표](Container-Insights-metrics-ECS.md)
+ [Amazon EKS 및 향상된 관찰성 지표를 갖춘 Kubernetes Container Insights](Container-Insights-metrics-enhanced-EKS.md)
+ [Amazon EKS 및 Kubernetes Container Insights 지표](Container-Insights-metrics-EKS.md)
+ [Container Insights 성능 로그 참조](Container-Insights-reference.md)
+ [Container Insights Prometheus 지표 모니터링](ContainerInsights-Prometheus.md)
+ [Application Insights와 통합](container-insights-appinsights.md)
+ [Container Insights 내에서 Amazon ECS 수명 주기 이벤트 보기](container-insights-ECS-lifecycle-events.md)
+ [Container Insights 문제 해결](ContainerInsights-troubleshooting.md)
+ [자체 CloudWatch 에이전트 Docker 이미지 구축](ContainerInsights-build-docker-image.md)
+ [컨테이너에 다른 CloudWatch 에이전트 기능 배포](ContainerInsights-other-agent-features.md)

# 향상된 관찰성 지표를 갖춘 Amazon ECS Container Insights
<a name="Container-Insights-enhanced-observability-metrics-ECS"></a>

향상된 관찰성을 갖춘 Container Insights는 다음 기능을 제공하여 컨테이너화된 워크로드에 대한 심층적인 가시성을 제공합니다.
+ 작업 및 컨테이너 수준 모두에서 보다 높은 지표 세분화
+ 모니터링 및 문제 해결 기능 개선
+ CloudWatch Logs와 통합으로 지원되는 기능:
  + 로그 항목에 지표 이상 연관
  + 더 빠른 근본 원인 분석 수행
  + 복잡한 컨테이너 문제의 해결 시간 단축

**사용 사례**

향상된 관찰성을 갖춘 Container Insights는 표준 Container Insights의 기능을 확장합니다. 다음 사용 사례를 지원합니다.
+ **태스크 수준 문제 해결** - 태스크 수준에서 성능 병목 현상을 식별합니다. 태스크 수준 지표를 분석하고 예약된 리소스와 비교하여 태스크에 충분한 처리 용량이 있는지 확인합니다.
+ **컨테이너 수준 리소스 최적화** - 예약 수준 대비 사용률을 추적하여 리소스가 제한되거나 과다 프로비저닝된 컨테이너 식별 
+ **컨테이너 상태 평가** - 재시작 수 및 상태 전환을 모니터링하여 개입이 필요한 불안정한 컨테이너 감지 
+ **애플리케이션 성능 모니터링** - 애플리케이션이 서로 통신하는 방식을 추적하고, 리소스 사용 패턴을 모니터링하며, 데이터 스토리지 성능 최적화
+ **작업 모니터링** - 배포를 모니터링하고, 블루 또는 그린 배포에 대한 태스크 세트를 추적하며, 서비스 지표를 통해 플랫폼 상태 유지

Amazon ECS 지표에 대한 자세한 내용은 [Amazon ECS 서비스 사용률 지표 사용 사례](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service_utilization-metrics-explanation.html), 향상된 관찰성을 갖춘 Container Insights에 대한 자세한 내용은 [향상된 관찰성 지표를 갖춘 Amazon ECS Container Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-enhanced-observability-metrics-ECS.html)를 참조하세요.

또한 Container Insights는 모든 태스크의 데이터를 평균화하여 클러스터, 서비스 및 대몬 전반의 통계도 표시합니다. 이를 통해 서비스 및 대몬 상태를 더 개략적으로 파악할 수 있으므로 환경 모니터링과 용량 계획에 모두 유용합니다.

**참고**  
Amazon ECS 관리형 대몬 지표는 서비스 지표와 동일한 `ECS/ContainerInsights` 네임스페이스와 `ServiceName` 차원을 사용합니다. 대몬 지표의 경우 `ServiceName` 차원 값은 `daemon:daemon-name` 형식을 사용합니다. 예를 들어 `my-daemon` 대몬에서 `ServiceName` 차원 값이 `daemon:my-daemon`입니다. `ServiceName` 차원을 포함하는 아래 표의 모든 지표는 관리형 대몬에도 적용됩니다.

아래 표에는 향상된 관찰성을 갖춘 Container Insights가 Amazon ECS에 대해 수집하는 지표 및 측정기준이 나와 있습니다. 이러한 지표는 `ECS/ContainerInsights` 네임스페이스에 있습니다. 자세한 내용은 [Metrics](cloudwatch_concepts.md#Metric) 섹션을 참조하세요.

콘솔에 Container Insights 지표가 표시되지 않는 경우, 향상된 관찰성을 갖춘 Container Insights 설정을 완료했는지 확인합니다. 향상된 관찰성을 갖춘 Container Insights 설정이 완료되기 전에는 지표가 표시되지 않습니다. 자세한 내용은 [향상된 관찰 기능을 갖춘 Container Insights 설정](deploy-container-insights-ECS-cluster.md#set-container-insights-ECS-cluster-enhanced) 섹션을 참조하세요.

아래의 지표는 모든 시작 유형에 사용 가능합니다.


| 지표 이름 | 측정 기준 | 설명 | 
| --- | --- | --- | 
|  `ContainerInstanceCount`  |  `ClusterName`  |  클러스터에 등록된 Amazon ECS 에이전트를 실행하는 EC2 인스턴스의 수입니다. 이 지표는 클러스터에서 Amazon ECS 작업을 실행하는 컨테이너 인스턴스에 대해서만 수집됩니다. Amazon ECS 작업이 없는 빈 컨테이너 인스턴스에 대해서는 수집되지 않습니다. 단위: 수  | 
|  `ContainerCpuUtilized`  |  `ClusterName` `ContainerName`, `TaskId`, `ServiceName`, `ClusterName` `ContainerName`, `TaskDefinitionFamily`, `ClusterName`, `TaskId` `TaskDefinitionFamily`, `ClusterName`, `ContainerName` `ServiceName`, `ClusterName`, `ContainerName`  |  사용 중인 측정기준 세트로 지정된 리소스의 컨테이너에서 사용하는 CPU 단위입니다. 관리형 대몬에도 적용됩니다. 단위: 없음  | 
|  `ContainerCpuReserved`  |  `ClusterName` `ContainerName`, `TaskId`, `ServiceName`, `ClusterName` `ContainerName`, `TaskDefinitionFamily`, `ClusterName`, `TaskId` `TaskDefinitionFamily`, `ClusterName`, `ContainerName` `ServiceName`, `ClusterName`, `ContainerName`  |  사용 중인 측정기준 세트에서 지정한 리소스의 컨테이너에서 예약된 CPU 단위입니다. 이 지표는 작업 또는 모든 컨테이너 수준과 같이 작업 정의에 정의된 CPU 예약을 기반으로 수집됩니다. 작업 정의에 지정되지 않은 경우 인스턴스 CPU 예약이 사용됩니다. 관리형 대몬에도 적용됩니다. 단위: 없음  | 
|  `ContainerCpuUtilization`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`   | 사용 중인 측정기준 세트로 지정된 리소스의 컨테이너에서 사용 중인 총 CPU 단위의 비율입니다. 단위: 퍼센트 | 
|  `ContainerMemoryUtilized`  |  `ClusterName` `ContainerName`, `TaskId`, `ServiceName`, `ClusterName` `ContainerName`, `TaskDefinitionFamily`, `ClusterName`, `TaskId` `TaskDefinitionFamily`, `ClusterName`, `ContainerName` `ServiceName`, `ClusterName`, `ContainerName`  |  사용 중인 측정기준 세트로 지정된 리소스의 컨테이너에서 사용 중인 메모리입니다. 관리형 대몬에도 적용됩니다. 단위: 메가바이트  | 
|  `ContainerMemoryReserved`  |  `ClusterName` `ContainerName`, `TaskId`, `ServiceName`, `ClusterName` `ContainerName`, `TaskDefinitionFamily`, `ClusterName`, `TaskId` `TaskDefinitionFamily`, `ClusterName`, `ContainerName` `ServiceName`, `ClusterName`, `ContainerName`  |  사용 중인 측정기준 세트에서 지정한 리소스의 컨테이너에서 예약된 메모리입니다. 이 지표는 작업 또는 모든 컨테이너 수준과 같이 작업 정의에 정의된 메모리 예약을 기반으로 수집됩니다. 작업 정의에 지정되지 않은 경우 인스턴스 메모리 예약이 사용됩니다. 관리형 대몬에도 적용됩니다. 단위: 메가바이트  | 
|  `ContainerMemoryUtilization`  |  `ClusterName` `ContainerName`, `TaskId`, `ServiceName`, `ClusterName` `ContainerName`, `TaskDefinitionFamily`, `ClusterName`, `TaskId` `TaskDefinitionFamily`, `ClusterName`, `ContainerName` `ServiceName`, `ClusterName`, `ContainerName`  | 사용 중인 측정기준 세트로 지정된 리소스의 컨테이너에서 사용 중인 총 메모리 비율입니다. 관리형 대몬에도 적용됩니다. 단위: 퍼센트 | 
|  `ContainerNetworkRxBytes`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`  |  사용 중인 측정기준에서 지정한 컨테이너에서 수신된 바이트의 숫자입니다. 이 지표는 Docker 런타임에서 가져옵니다. 이 지표는 `awsvpc` 또는 `bridge` 네트워크 모드를 사용하는 태스크의 컨테이너에 대해서만 제공됩니다. 관리형 대몬에도 적용됩니다. 단위: 바이트/초  | 
|  `ContainerNetworkTxBytes`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`  |  사용 중인 측정기준에서 지정한 컨테이너에서 전송된 바이트의 숫자입니다. 이 지표는 Docker 런타임에서 가져옵니다. 이 지표는 `awsvpc` 또는 `bridge` 네트워크 모드를 사용하는 태스크의 컨테이너에 대해서만 제공됩니다. 관리형 대몬에도 적용됩니다. 단위: 바이트/초  | 
|  `ContainerStorageReadBytes`  |  `ClusterName` `ClusterName`, `ServiceName`, `ContainerName` `ClusterName`, `TaskDefinitionFamily`, `ContainerName` `ClusterName`, `ServiceName`, `TaskId`, `ContainerName` `ClusterName`, `TaskDefinitionFamily`, `TaskId`, `ContainerName`  |  사용 중인 측정기준에서 지정한 리소스의 컨테이너에 있는 스토리지에서 읽힌 바이트의 숫자입니다. 스토리지 디바이스의 읽기 바이트는 여기에 포함되지 않습니다. 이 지표는 Docker 런타임에서 가져옵니다. 관리형 대몬에도 적용됩니다. 단위: 바이트  | 
|  `ContainerStorageWriteBytes`  |  `ClusterName` `ClusterName`, `ServiceName`, `ContainerName` `ClusterName`, `TaskDefinitionFamily`, `ContainerName` `ClusterName`, `ServiceName`, `TaskId`, `ContainerName` `ClusterName`, `TaskDefinitionFamily`, `TaskId`, `ContainerName`  |  사용 중인 측정기준에서 지정한 컨테이너의 스토리지에서 쓰여진 바이트의 숫자입니다. 이 지표는 Docker 런타임에서 가져옵니다. 관리형 대몬에도 적용됩니다. 단위: 바이트  | 
|  `CpuUtilized`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`   |  사용 중인 측정기준 세트로 지정된 리소스의 작업에서 사용하는 CPU 단위입니다. 관리형 대몬에도 적용됩니다. 단위: 없음  | 
|  `CpuReserved`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`  |  사용 중인 측정기준 세트에서 지정한 리소스의 작업에서 예약된 CPU 단위입니다. 이 지표는 작업 또는 모든 컨테이너 수준과 같이 작업 정의에 정의된 CPU 예약을 기반으로 수집됩니다. 작업 정의에 지정되지 않은 경우 인스턴스 CPU 예약이 사용됩니다. 관리형 대몬에도 적용됩니다. 단위: 없음  | 
|  `DeploymentCount`  |  `ServiceName`, `ClusterName`  |  Amazon ECS 서비스의 배포 수입니다. 단위: 수  | 
|  `DesiredTaskCount`  |  `ServiceName`, `ClusterName`  |  Amazon ECS 서비스에 대해 원하는 태스크 수입니다. 단위: 수  | 
|  `EBSFilesystemSize`  |  `ClusterName` ,`TaskDefinitionFamily`, `VolumeName` `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName`  |  사용 중인 차원으로 지정된 리소스에 할당된 Amazon EBS 파일 시스템 스토리지의 총량(GB) 이 지표는 플랫폼 버전 `1.4.0`을(를) 사용하는 Fargate에서 실행되는 Amazon ECS 인프라 또는 컨테이너 에이전트 버전 `1.79.0` 이상을 사용하는 Amazon EC2 인스턴스에서 실행되는 작업에만 사용할 수 있습니다. 관리형 대몬에도 적용됩니다. 단위: 기가바이트(GB)  | 
|  `EBSFilesystemUtilized`  |  `ClusterName` ,`TaskDefinitionFamily`, `VolumeName` `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName`  |  사용 중인 차원으로 지정된 리소스에서 사용하는 Amazon EBS 파일 시스템 스토리지의 총량(GB) 이 지표는 플랫폼 버전 `1.4.0`을(를) 사용하는 Fargate에서 실행되는 Amazon ECS 인프라 또는 컨테이너 에이전트 버전 `1.79.0` 이상을 사용하는 Amazon EC2 인스턴스에서 실행되는 작업에만 사용할 수 있습니다. Fargate에서 실행되는 작업의 경우 Fargate는 Fargate만 사용하는 디스크 공간을 예약합니다. Fargate가 사용하는 공간에는 비용이 들지 않지만 `df`와 같은 도구를 사용하면 이 추가 스토리지를 확인할 수 있습니다. 관리형 대몬에도 적용됩니다. 단위: 기가바이트(GB)  | 
|  `TaskEBSFilesystemUtilization`  |  `TaskDefinitionFamily`, `ClusterName` `ClusterName`, `ServiceName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `TaskDefinitionFamily`, `ClusterName`, `TaskId`  |  사용 중인 차원으로 지정된 태스크에서 사용 중인 Amazon EBS 파일 시스템 스토리지의 백분율. 이 지표는 플랫폼 버전 `1.4.0`을(를) 사용하는 Fargate에서 실행되는 Amazon ECS 인프라 또는 컨테이너 에이전트 버전 `1.79.0` 이상을 사용하는 Amazon EC2 인스턴스에서 실행되는 작업에만 사용할 수 있습니다. 관리형 대몬에도 적용됩니다. 단위: 퍼센트  | 
|  EphemeralStorageReserved [1](#ci-enhanced-metrics-ecs-storage-fargate-note)  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`  |  사용 중인 차원으로 지정된 리소스의 임시 스토리지에서 예약된 바이트 수입니다. 임시 스토리지는 컨테이너 루트 파일 시스템과 컨테이너 이미지 및 작업 정의에 정의된 모든 바인드 마운트 호스트 볼륨에 사용됩니다. 임시 스토리지의 양은 실행 중인 작업에서 변경할 수 없습니다. 이 지표는 Fargate Linux 플랫폼 버전 1.4.0 이상에서 실행되는 작업에만 사용할 수 있습니다. 관리형 대몬에도 적용됩니다. 단위: 기가바이트(GB)  | 
|  EphemeralStorageUtilized [1](Container-Insights-metrics-ECS.md#ci-metrics-ecs-storage-fargate-note)  |  `ClusterName` `ClusterName`, `TaskDefinitionFamily` `ClusterName`, `ServiceName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`  |  사용 중인 차원으로 지정된 리소스의 임시 스토리지에서 사용된 바이트 수입니다. 임시 스토리지는 컨테이너 루트 파일 시스템과 컨테이너 이미지 및 작업 정의에 정의된 모든 바인드 마운트 호스트 볼륨에 사용됩니다. 임시 스토리지의 양은 실행 중인 작업에서 변경할 수 없습니다. 이 지표는 Fargate Linux 플랫폼 버전 1.4.0 이상에서 실행되는 작업에만 사용할 수 있습니다. 관리형 대몬에도 적용됩니다. 단위: 기가바이트(GB)  | 
|  `MemoryUtilized`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`  |  사용 중인 측정기준 세트로 지정된 리소스의 작업에서 사용 중인 메모리입니다. 관리형 대몬에도 적용됩니다. 단위: 메가바이트  | 
|  `MemoryReserved`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`  |  사용 중인 측정기준 세트에서 지정한 리소스의 작업에서 예약된 메모리입니다. 이 지표는 작업 또는 모든 컨테이너 수준과 같이 작업 정의에 정의된 메모리 예약을 기반으로 수집됩니다. 작업 정의에 지정되지 않은 경우 인스턴스 메모리 예약이 사용됩니다. 관리형 대몬에도 적용됩니다. 단위: 메가바이트  | 
|  `NetworkRxBytes`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`  |  사용중인 측정기준에서 지정한 리소스에서 수신된 바이트의 숫자입니다. 이 지표는 Docker 런타임에서 가져옵니다. 이 지표는 `awsvpc` 또는 `bridge` 네트워크 모드를 사용하는 태스크의 컨테이너에 대해서만 제공됩니다. 관리형 대몬에도 적용됩니다. 단위: 바이트/초  | 
|  `NetworkTxBytes`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`  |  사용중인 측정기준에서 지정한 리소스에서 전송된 바이트의 숫자입니다. 이 지표는 Docker 런타임에서 가져옵니다. 이 지표는 `awsvpc` 또는 `bridge` 네트워크 모드를 사용하는 태스크의 컨테이너에 대해서만 제공됩니다. 관리형 대몬에도 적용됩니다. 단위: 바이트/초  | 
|  `PendingTaskCount`  |  `ServiceName`, `ClusterName`  |  현재 `PENDING` 상태인 작업의 숫자입니다. 단위: 수  | 
|  `RunningTaskCount`  |  `ServiceName`, `ClusterName`  |  현재 `RUNNING` 상태인 작업의 숫자입니다. 단위: 수  | 
|  `RestartCount`  |  `ClusterName` `ClusterName`, `ServiceName` `ClusterName`, `TaskDefinitionFamily` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId` `ClusterName`, `ServiceName`, `ContainerName` `ClusterName`, `ServiceName`, `TaskId`, `ContainerName` `TaskDefinitionFamily`, `ClusterName`, `ContainerName` `TaskDefinitionFamily`, `ClusterName`, `TaskId`, `ContainerName`  |  Amazon ECS 태스크에서 컨테이너가 다시 시작된 횟수입니다. 이 지표는 재시작 정책이 활성화된 컨테이너의 경우에만 수집됩니다. 관리형 대몬에도 적용됩니다. 단위: 수  | 
|  `UnHealthyContainerHealthStatus`  |  `ClusterName` `ClusterName`, `ServiceName`, `ContainerName` `ClusterName`, `TaskDefinitionFamily`, `ContainerName` `ClusterName`, `ServiceName`, `TaskId`, `ContainerName` `ClusterName`, `TaskDefinitionFamily`, `TaskId`, `ContainerName`  |  컨테이너 상태 확인 상태에 기반한 비정상 컨테이너 수. 상태 확인에서 비정상 상태가 반환되면 컨테이너는 비정상으로 간주됩니다. 이 지표는 태스크 정의에 상태 확인이 구성된 컨테이너에 대해서만 수집됩니다. 지표 값은 컨테이너 상태가 `UNHEALTHY`인 경우 1, 상태가 `HEALTHY`인 경우 0입니다. 단위: 수  | 
|  `ServiceCount`  |  `ClusterName`  |  클러스터의 서비스 숫자입니다. 단위: 수  | 
|  `StorageReadBytes`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`  |  사용 중인 측정기준에서 지정한 리소스의 인스턴스에 있는 스토리지에서 읽힌 바이트의 숫자입니다. 스토리지 디바이스의 읽기 바이트는 여기에 포함되지 않습니다. 이 지표는 Docker 런타임에서 가져옵니다. 관리형 대몬에도 적용됩니다. 단위: 바이트  | 
|  `StorageWriteBytes`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`  |  사용 중인 측정기준에서 지정한 리소스의 스토리지에서 쓰여진 바이트의 숫자입니다. 이 지표는 Docker 런타임에서 가져옵니다. 관리형 대몬에도 적용됩니다. 단위: 바이트  | 
|  `TaskCount`  |  `ClusterName`  |  클러스터에서 실행 중인 태스크의 수입니다. 단위: 수  | 
|  `TaskCpuUtilization`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`   |  태스크에서 사용 중인 총 CPU 유닛의 백분율입니다. 관리형 대몬에도 적용됩니다. 단위: 퍼센트  | 
|  `TaskEphemeralStorageUtilization`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`   |  태스크에서 사용 중인 임시 스토리지의 총 백분율입니다. 관리형 대몬에도 적용됩니다. 단위: 퍼센트  | 
|  `TaskMemoryUtilization`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName` `ClusterName`, `ServiceName`, `TaskId` `ClusterName`, `TaskDefinitionFamily`, `TaskId`   |  태스크에서 사용 중인 메모리의 총 백분율입니다. 관리형 대몬에도 적용됩니다. 단위: 퍼센트  | 
|  `TaskSetCount`  |  `ServiceName`, `ClusterName`  |  서비스의 작업 세트 숫자입니다. 단위: 수  | 

**참고**  
`EphemeralStorageReserved` 및 `EphemeralStorageUtilized` 지표는 Fargate Linux 플랫폼 버전 1.4.0 이상에서 실행되는 작업에만 사용할 수 있습니다.  
Fargate는 디스크 공간을 예약합니다. Fargate에서만 사용됩니다. 이에 대한 요금은 청구되지 않습니다. 이러한 지표에는 표시되지 않습니다. 그러나 `df` 등의 다른 도구에서는 이 추가 스토리지를 볼 수 있습니다.

다음 지표는 [CloudWatch 에이전트를 배포하여 Amazon ECS의 EC2 인스턴스 수준 지표 수집](deploy-container-insights-ECS-instancelevel.md)의 단계를 완료하고 EC2 시작 유형을 사용하는 경우 사용 가능합니다.


| 지표 이름 | 측정 기준 | 설명 | 
| --- | --- | --- | 
|  `instance_cpu_limit`  |  `ClusterName`  |  클러스터의 단일 EC2 인스턴스에 할당할 수 있는 최대 CPU 단위 수입니다. 단위: 없음  | 
|  `instance_cpu_reserved_capacity`  |  `ClusterName` `InstanceId`, `ContainerInstanceId`, `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 현재 예약 중인 CPU의 비율입니다. 단위: 퍼센트  | 
|  `instance_cpu_usage_total`  |  `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 사용 중인 CPU 단위 수입니다. 단위: 없음  | 
|  `instance_cpu_utilization`  |  `ClusterName` `InstanceId`, `ContainerInstanceId`, `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 사용 중인 CPU 단위의 총 비율입니다. 단위: 퍼센트  | 
|  `instance_filesystem_utilization`  |  `ClusterName` `InstanceId`, `ContainerInstanceId`, `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 사용 중인 파일 시스템 용량의 총 비율입니다. 단위: 퍼센트  | 
|  `instance_memory_limit`  |  `ClusterName`  |  이 클러스터의 단일 EC2 인스턴스에 할당할 수 있는 최대 메모리 양(바이트)입니다. 단위: 바이트  | 
|  `instance_memory_reserved_capacity`  |  `ClusterName` `InstanceId`, `ContainerInstanceId`, `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 현재 예약 중인 메모리의 비율입니다. 단위: 퍼센트  | 
|  `instance_memory_utilization`  |  `ClusterName` `InstanceId`, `ContainerInstanceId`, `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 사용 중인 메모리의 총 비율입니다.  애플리케이션에 Java ZGC 가비지 수집기를 사용하는 경우에는 이 지표가 부정확할 수 있습니다.  단위: 퍼센트  | 
|  `instance_memory_working_set`  |  `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 사용 중인 메모리의 양(바이트)입니다.  애플리케이션에 Java ZGC 가비지 수집기를 사용하는 경우에는 이 지표가 부정확할 수 있습니다.  단위: 바이트  | 
|  `instance_network_total_bytes`  |  `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 네트워크를 통해 전송 및 수신된 초당 총 바이트 수입니다. 단위: 바이트/초  | 
|  `instance_number_of_running_tasks`  |  `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 실행 중인 작업 수입니다. 단위: 수  | 

# Amazon ECS Container Insights 지표
<a name="Container-Insights-metrics-ECS"></a>

Container Insights 지표는 추가 네트워크, 스토리지 및 임시 스토리지 지표를 제공합니다. 이러한 지표는 표준 Amazon ECS 지표보다 더 많은 정보를 제공합니다. Container Insights는 CloudWatch Logs와 통합됩니다. 문제를 더 쉽게 해결할 수 있도록 지표 변경 내용을 로그 항목과 연관시킬 수 있습니다. 또한 Container Insights는 모든 태스크의 데이터를 평균화하여 클러스터, 서비스 및 대몬 전반의 통계도 표시합니다. 이를 통해 서비스 및 대몬 상태를 더 개략적으로 파악할 수 있으므로 환경 모니터링과 용량 계획에 모두 유용합니다.

**사용 사례**
+ **문제 식별 및 문제 해결** - 태스크 상태 전환 패턴을 분석하여 실패한 배포를 추적하고 이를 통해여 장애 지점을 신속하게 식별할 수 있습니다. 태스크 시작 시퀀스 및 초기화 동작에 대한 포괄적인 검사를 통해 구성 문제 진단
+ **클러스터 및 서비스 수준 상태 평가** - 클러스터 전반의 평균 태스크 성능을 표시합니다. 이 접근 방식은 이상치를 조정하여 클러스터 및 서비스 상태에 대한 보다 안정적인 보기를 제공합니다. 극단적인 값이 오해의 소지가 있는 일반 서비스 모니터링에 이러한 인사이트 사용 
+ **서비스 가용성 문제** - 실행 중인 태스크 수 지표를 모니터링하여 배포 실패를 감지합니다. 서비스 이벤트 로그를 성능 지표와 연관시켜 인프라 영향을 파악합니다. 태스크 재시작 패턴을 추적하여 불안정한 서비스 또는 인프라 문제 식별
+ **평균 부하에 대한 용량 계획** - 일반적인 태스크 동작 패턴을 기반으로 리소스 요구 사항을 결정하고, 효과적인 장기 계획을 지원하는 일관된 지표를 제공하며, 단기 스파이크가 용량 결정에 미치는 영향을 줄이는 데 도움이 됨
+ **추가 지표 제공** - 벤딩 지표에서 사용할 수 없는 추가 네트워크, 스토리지 및 임시 스토리지 지표 수집

Amazon ECS 지표에 대한 자세한 내용은 [Amazon ECS 서비스 사용률 지표 사용 사례](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service_utilization-metrics-explanation.html), 향상된 관찰성을 갖춘 Container Insights에 대한 자세한 내용은 [향상된 관찰성 지표를 갖춘 Amazon ECS Container Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-enhanced-observability-metrics-ECS.html)를 참조하세요.

**참고**  
Amazon ECS 관리형 대몬 지표는 서비스 지표와 동일한 `ECS/ContainerInsights` 네임스페이스와 `ServiceName` 차원을 사용합니다. 대몬 지표의 경우 `ServiceName` 차원 값은 `daemon:daemon-name` 형식을 사용합니다. 예를 들어 `my-daemon` 대몬에서 `ServiceName` 차원 값이 `daemon:my-daemon`입니다. `ServiceName` 차원을 포함하는 아래 표의 모든 지표는 관리형 대몬에도 적용됩니다.

아래 표에는 Container Insights가 Amazon ECS용으로 수집하는 지표 및 측정기준이 나와 있습니다. 이러한 지표는 `ECS/ContainerInsights` 네임스페이스에 있습니다. 자세한 내용은 [Metrics](cloudwatch_concepts.md#Metric) 섹션을 참조하세요.

콘솔에 Container Insights 지표가 보이지 않는 경우, Container Insights 설정을 완료했는지 확인합니다. Container Insights 설정이 완료되기 전에는 지표가 나타나지 않습니다. 자세한 내용은 [Container Insights 설정](deploy-container-insights.md) 섹션을 참조하세요.

다음 지표는 [Amazon ECS에서 Container Insights 설정](deploy-container-insights-ECS-cluster.md)의 단계를 완료하면 사용할 수 있습니다.


| 지표 이름 | 측정 기준 | 설명 | 
| --- | --- | --- | 
|  `ContainerInstanceCount`  |  `ClusterName`  |  클러스터에 등록된 Amazon ECS 에이전트를 실행하는 EC2 인스턴스의 수입니다. 이 지표는 클러스터에서 Amazon ECS 작업을 실행하는 컨테이너 인스턴스에 대해서만 수집됩니다. Amazon ECS 작업이 없는 빈 컨테이너 인스턴스에 대해서는 수집되지 않습니다. 단위: 수  | 
|  `CpuUtilized`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName`  |  사용 중인 측정기준 세트로 지정된 리소스의 작업에서 사용하는 CPU 단위입니다. 관리형 대몬에도 적용됩니다. 단위: 없음  | 
|  `CpuReserved`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName`  |  사용 중인 측정기준 세트에서 지정한 리소스의 작업에서 예약된 CPU 단위입니다. 이 지표는 작업 또는 모든 컨테이너 수준과 같이 작업 정의에 정의된 CPU 예약을 기반으로 수집됩니다. 작업 정의에 지정되지 않은 경우 인스턴스 CPU 예약이 사용됩니다. 관리형 대몬에도 적용됩니다. 단위: 없음  | 
|  `DeploymentCount`  |  `ServiceName`, `ClusterName`  |  Amazon ECS 서비스의 배포 수입니다. 단위: 수  | 
|  `DesiredTaskCount`  |  `ServiceName`, `ClusterName`  |  Amazon ECS 서비스에 대해 원하는 태스크 수입니다. 단위: 수  | 
|  `EBSFilesystemSize`  |  `VolumeName`, `TaskDefinitionFamily`, `ClusterName` `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName`  |  사용 중인 차원으로 지정된 리소스에 할당된 Amazon EBS 파일 시스템 스토리지의 총량(GB) 이 지표는 플랫폼 버전 `1.4.0`을(를) 사용하는 Fargate에서 실행되는 Amazon ECS 인프라 또는 컨테이너 에이전트 버전 `1.79.0` 이상을 사용하는 Amazon EC2 인스턴스에서 실행되는 작업에만 사용할 수 있습니다. 관리형 대몬에도 적용됩니다. 단위: 기가바이트(GB)  | 
|  `EBSFilesystemUtilized`  |  `VolumeName`, `TaskDefinitionFamily`, `ClusterName` `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName`  |  사용 중인 차원으로 지정된 리소스에서 사용하는 Amazon EBS 파일 시스템 스토리지의 총량(GB) 이 지표는 플랫폼 버전 `1.4.0`을(를) 사용하는 Fargate에서 실행되는 Amazon ECS 인프라 또는 컨테이너 에이전트 버전 `1.79.0` 이상을 사용하는 Amazon EC2 인스턴스에서 실행되는 작업에만 사용할 수 있습니다. Fargate에서 실행되는 작업의 경우 Fargate는 Fargate만 사용하는 디스크 공간을 예약합니다. Fargate가 사용하는 공간에는 비용이 들지 않지만 `df`와 같은 도구를 사용하면 이 추가 스토리지를 확인할 수 있습니다. 관리형 대몬에도 적용됩니다. 단위: 기가바이트(GB)  | 
|  EphemeralStorageReserved [1](#ci-metrics-ecs-storage-fargate-note)  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName`  |  사용 중인 차원으로 지정된 리소스의 임시 스토리지에서 예약된 바이트 수입니다. 임시 스토리지는 컨테이너 루트 파일 시스템과 컨테이너 이미지 및 작업 정의에 정의된 모든 바인드 마운트 호스트 볼륨에 사용됩니다. 임시 스토리지의 양은 실행 중인 작업에서 변경할 수 없습니다. 이 지표는 Fargate Linux 플랫폼 버전 1.4.0 이상에서 실행되는 작업에만 사용할 수 있습니다. 관리형 대몬에도 적용됩니다. 단위: 기가바이트(GB)  | 
|  EphemeralStorageUtilized [1](#ci-metrics-ecs-storage-fargate-note)  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName`  |  사용 중인 차원으로 지정된 리소스의 임시 스토리지에서 사용된 바이트 수입니다. 임시 스토리지는 컨테이너 루트 파일 시스템과 컨테이너 이미지 및 작업 정의에 정의된 모든 바인드 마운트 호스트 볼륨에 사용됩니다. 임시 스토리지의 양은 실행 중인 작업에서 변경할 수 없습니다. 이 지표는 Fargate Linux 플랫폼 버전 1.4.0 이상에서 실행되는 작업에만 사용할 수 있습니다. 관리형 대몬에도 적용됩니다. 단위: 기가바이트(GB)  | 
|  `InstanceOSFilesystemUtilization`  |  `CapacityProviderName`, `ClusterName`, `ContainerInstanceId`, `EC2InstanceId` `ClusterName`  |  OS 볼륨에 사용된 총 디스크 공간 비율.  | 
|  `InstanceDataFilesystemUtilization`  |  `CapacityProviderName`, `ClusterName`, `ContainerInstanceId`, `EC2InstanceId` `ClusterName`  |  데이터 볼륨에 사용된 총 디스크 공간 비율.  | 
|  `MemoryUtilized`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName`  |  사용 중인 측정기준 세트로 지정된 리소스의 작업에서 사용 중인 메모리입니다.  애플리케이션에 Java ZGC 가비지 수집기를 사용하는 경우에는 이 지표가 부정확할 수 있습니다. `MemoryUtilized` 및 `MemoryReserved`는 "메가바이트"로 표시되지만 실제 단위는 MiB(메비바이트)입니다.  관리형 대몬에도 적용됩니다. 단위: 메가바이트  | 
|  `MemoryReserved`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName`  |  사용 중인 측정기준 세트에서 지정한 리소스의 작업에서 예약된 메모리입니다. 이 지표는 작업 또는 모든 컨테이너 수준과 같이 작업 정의에 정의된 메모리 예약을 기반으로 수집됩니다. 작업 정의에 지정되지 않은 경우 인스턴스 메모리 예약이 사용됩니다. 관리형 대몬에도 적용됩니다. 단위: 메가바이트  `MemoryUtilized` 및 `MemoryReserved`는 "메가바이트"로 표시되지만 실제 단위는 MiB(메비바이트)입니다.   | 
|  `NetworkRxBytes`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName`  |  사용중인 측정기준에서 지정한 리소스에서 수신된 바이트의 숫자입니다. 이 지표는 Docker 런타임에서 가져옵니다. 이 지표는 `awsvpc` 또는 `bridge` 네트워크 모드를 사용하는 태스크의 컨테이너에 대해서만 제공됩니다. 관리형 대몬에도 적용됩니다. 단위: 바이트/초  | 
|  `NetworkTxBytes`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName`  |  사용중인 측정기준에서 지정한 리소스에서 전송된 바이트의 숫자입니다. 이 지표는 Docker 런타임에서 가져옵니다. 이 지표는 `awsvpc` 또는 `bridge` 네트워크 모드를 사용하는 태스크의 컨테이너에 대해서만 제공됩니다. 관리형 대몬에도 적용됩니다. 단위: 바이트/초  | 
|  `PendingTaskCount`  |  `ServiceName`, `ClusterName`  |  현재 `PENDING` 상태인 작업의 숫자입니다. 단위: 수  | 
|  `RunningTaskCount`  |  `ServiceName`, `ClusterName`  |  현재 `RUNNING` 상태인 작업의 숫자입니다. 단위: 수  | 
|  `RestartCount`  |  `ClusterName` `ClusterName`, `ServiceName` `ClusterName`, `TaskDefinitionFamily`  |  Amazon ECS 태스크에서 컨테이너가 다시 시작된 횟수입니다. 이 지표는 재시작 정책이 활성화된 컨테이너의 경우에만 수집됩니다. 관리형 대몬에도 적용됩니다. 단위: 수  | 
|  `ServiceCount`  |  `ClusterName`  |  클러스터의 서비스 숫자입니다. 단위: 수  | 
|  `StorageReadBytes`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName`  |  사용 중인 측정기준에서 지정한 리소스의 인스턴스에 있는 스토리지에서 읽힌 바이트의 숫자입니다. 스토리지 디바이스의 읽기 바이트는 여기에 포함되지 않습니다. 이 지표는 Docker 런타임에서 가져옵니다. 관리형 대몬에도 적용됩니다. 단위: 바이트  | 
|  `StorageWriteBytes`  |  `TaskDefinitionFamily`, `ClusterName` `ServiceName`, `ClusterName` `ClusterName`  |  사용 중인 측정기준에서 지정한 리소스의 스토리지에서 쓰여진 바이트의 숫자입니다. 이 지표는 Docker 런타임에서 가져옵니다. 관리형 대몬에도 적용됩니다. 단위: 바이트  | 
|  `TaskCount`  |  `ClusterName`  |  클러스터에서 실행 중인 태스크의 수입니다. 단위: 수  | 
|  `TaskSetCount`  |  `ServiceName`, `ClusterName`  |  서비스의 작업 세트 숫자입니다. 단위: 수  | 

**참고**  
`EphemeralStorageReserved` 및 `EphemeralStorageUtilized` 지표는 Fargate Linux 플랫폼 버전 1.4.0 이상에서 실행되는 작업에만 사용할 수 있습니다.  
Fargate는 디스크 공간을 예약합니다. Fargate에서만 사용됩니다. 이에 대한 요금은 청구되지 않습니다. 이러한 지표에는 표시되지 않습니다. 그러나 `df` 등의 다른 도구에서는 이 추가 스토리지를 볼 수 있습니다.

다음 지표는 [CloudWatch 에이전트를 배포하여 Amazon ECS의 EC2 인스턴스 수준 지표 수집](deploy-container-insights-ECS-instancelevel.md)의 단계를 완료하면 사용할 수 있습니다.


| 지표 이름 | 측정 기준 | 설명 | 
| --- | --- | --- | 
|  `instance_cpu_limit`  |  `ClusterName`  |  클러스터의 단일 EC2 인스턴스에 할당할 수 있는 최대 CPU 단위 수입니다. 단위: 없음  | 
|  `instance_cpu_reserved_capacity`  |  `ClusterName` `InstanceId`, `ContainerInstanceId`, `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 현재 예약 중인 CPU의 비율입니다. 단위: 퍼센트  | 
|  `instance_cpu_usage_total`  |  `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 사용 중인 CPU 단위 수입니다. 단위: 없음  | 
|  `instance_cpu_utilization`  |  `ClusterName` `InstanceId`, `ContainerInstanceId`, `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 사용 중인 CPU 단위의 총 비율입니다. 단위: 퍼센트  | 
|  `instance_filesystem_utilization`  |  `ClusterName` `InstanceId`, `ContainerInstanceId`, `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 사용 중인 파일 시스템 용량의 총 비율입니다. 단위: 퍼센트  | 
|  `instance_memory_limit`  |  `ClusterName`  |  이 클러스터의 단일 EC2 인스턴스에 할당할 수 있는 최대 메모리 양(바이트)입니다. 단위: 바이트  | 
|  `instance_memory_reserved_capacity`  |  `ClusterName` `InstanceId`, `ContainerInstanceId`, `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 현재 예약 중인 메모리의 비율입니다. 단위: 퍼센트  | 
|  `instance_memory_utilization`  |  `ClusterName` `InstanceId`, `ContainerInstanceId`, `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 사용 중인 메모리의 총 비율입니다.  애플리케이션에 Java ZGC 가비지 수집기를 사용하는 경우에는 이 지표가 부정확할 수 있습니다.  단위: 퍼센트  | 
|  `instance_memory_working_set`  |  `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 사용 중인 메모리의 양(바이트)입니다.  애플리케이션에 Java ZGC 가비지 수집기를 사용하는 경우에는 이 지표가 부정확할 수 있습니다.  단위: 바이트  | 
|  `instance_network_total_bytes`  |  `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 네트워크를 통해 전송 및 수신된 초당 총 바이트 수입니다. 단위: 바이트/초  | 
|  `instance_number_of_running_tasks`  |  `ClusterName`  |  클러스터의 단일 EC2 인스턴스에서 실행 중인 작업 수입니다. 단위: 수  | 

# Amazon EKS 및 향상된 관찰성 지표를 갖춘 Kubernetes Container Insights
<a name="Container-Insights-metrics-enhanced-EKS"></a>

아래 표에는 향상된 관찰성을 갖춘 Container Insights가 Amazon EKS 및 쿠버네티스용으로 수집하는 지표 및 측정 기준이 나와 있습니다. 이러한 지표는 `ContainerInsights` 네임스페이스에 있습니다. 자세한 내용은 [Metrics](cloudwatch_concepts.md#Metric) 섹션을 참조하세요.

콘솔에 향상된 관찰성을 갖춘 Container Insights 지표가 표시되지 않는 경우, 향상된 관찰성을 갖춘 Container Insights 설정을 완료했는지 확인합니다. 향상된 관찰성을 갖춘 Container Insights 설정이 완료되기 전에는 지표가 표시되지 않습니다. 자세한 내용은 [Container Insights 설정](deploy-container-insights.md) 섹션을 참조하세요.

Amazon EKS 추가 기능 버전 1.5.0 이상 또는 CloudWatch 에이전트 버전 1.300035.0을 사용 중인 경우 다음 표에 나열된 대부분의 지표가 Linux와 Windows 노드 모두에 대해 수집됩니다. 표의 **지표 이름** 열을 참조하여 Windows에서 수집되지 않는 지표를 확인하세요.

클러스터 및 서비스 수준에서 집계된 지표를 제공하는 이전 버전의 Container Insights를 사용할 경우, 지표에 대한 요금이 사용자 지정 지표로 청구됩니다. Amazon EKS의 향상된 관찰 기능을 갖춘 Container Insights를 사용하면 Container Insights 지표는 저장된 지표나 수집된 로그별로 요금이 부과되는 대신 관찰당 요금이 부과됩니다. CloudWatch 요금에 대한 자세한 내용은 [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/)을 참조하세요.

**참고**  
Windows에서는 호스트 프로세스 컨테이너에 대해 `pod_network_rx_bytes` 및 `pod_network_tx_bytes` 등의 네트워크 지표는 수집되지 않습니다.  
RedHat OpenShift onAWS (ROSA) 클러스터에서는 `node_diskio_io_serviced_total` 및 `node_diskio_io_service_bytes_total`과 같은 디스크 입출력 지표가 수집되지 않습니다.


| 지표 이름 | 측정 기준 | 설명 | 
| --- | --- | --- | 
|  `cluster_failed_node_count`  |  `ClusterName`  |  클러스터의 실패한 작업자 노드의 숫자입니다. **‘노드 조건’ 문제를 겪고 있는 경우 노드가 실패한 것으로 간주됩니다. 자세한 내용은 Kubernetes 설명서에서 [조건](https://kubernetes.io/docs/concepts/architecture/nodes/#condition)을 참조하세요.  | 
|  `cluster_node_count`  |  `ClusterName`  |  클러스터의 작업자 노드의 총 숫자입니다.  | 
|  `namespace_number_of_running_pods`  |  `Namespace` `ClusterName` `ClusterName`  |  사용 중인 측정기준에서 지정한 리소스의 네임스페이스당 실행 중인 Pod 숫자입니다.  | 
|  `node_cpu_limit`  |  `ClusterName`  `ClusterName`, `InstanceId`, `NodeName`   |  클러스터에서 단일 노드에 할당할 수 있는 최대 CPU 단위 숫자입니다.  | 
|  `node_cpu_reserved_capacity`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  kubelet, kube-proxy, Docker 등 노드 구성 요소에 예약된 CPU 단위의 비율입니다. 공식: `node_cpu_request / node_cpu_limit`  `node_cpu_request`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `node_cpu_usage_total`  |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`  |  클러스터의 노드에서 사용 중인 CPU 단위의 숫자입니다.  | 
|  `node_cpu_utilization`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  클러스터의 노드에서 사용 중인 CPU 단위의 총 백분율입니다. 공식: `node_cpu_usage_total / node_cpu_limit`  | 
|  `node_filesystem_utilization`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  클러스터에서 노드에 사용하는 파일 시스템 용량의 총 백분율입니다. 공식: `node_filesystem_usage / node_filesystem_capacity`  `node_filesystem_usage` 및 `node_filesystem_capacity`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `node_memory_limit`  |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  클러스터에서 단일 노드로 할당될 수 있는 최대 메모리의 양(바이트)입니다.  | 
|  `node_filesystem_inodes`  Windows에서는 제공되지 않습니다.  |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  노드의 총 아이노드(사용 및 미사용) 수입니다.  | 
|  `node_filesystem_inodes_free` Windows에서는 제공되지 않습니다.  |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  노드의 미사용 아이노드 수입니다.  | 
|  `node_gpu_limit` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`  |  노드에서 사용 가능한 총 GPU 수.  | 
|  `node_gpu_usage_total` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`  |  노드에서 실행 중인 포드가 사용하는 GPU 수.  | 
|  `node_gpu_reserved_capacity` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`  | 
|  `node_memory_reserved_capacity`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  클러스터의 노드에서 현재 사용 중인 메모리의 비율입니다. 공식: `node_memory_request / node_memory_limit`  `node_memory_request`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `node_memory_utilization`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  한 개 또는 여러 개의 노드에서 현재 사용 중인 메모리의 비율입니다. 노드 메모리 사용량을 노드 메모리 제한으로 나눈 백분율입니다. 공식: `node_memory_working_set / node_memory_limit`입니다.  | 
|  `node_memory_working_set`  |  `ClusterName`  `ClusterName`, `InstanceId`, `NodeName`   |  클러스터의 노드 작업 세트에서 사용하는 메모리의 양(바이트)입니다.  | 
|  `node_network_total_bytes`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  클러스터에서 노드당 네트워크를 통해 전송 및 수신된 초당 바이트의 합계 수치입니다. 공식: `node_network_rx_bytes + node_network_tx_bytes`  `node_network_rx_bytes` 및 `node_network_tx_bytes`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `node_number_of_running_containers`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  클러스터에서 노드당 실행 중인 컨테이너의 숫자입니다.  | 
|  `node_number_of_running_pods`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  클러스터에서 노드당 실행 중인 Pod 숫자입니다.  | 
|  `node_status_allocatable_pods`   |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  할당 가능한 리소스를 기준으로 노드에 할당할 수 있는 포드 수이며 이는 시스템 대몬(daemon) 예약 및 하드 제거 임곗값을 고려한 후 노드 용량의 나머지 부분으로 정의됩니다.  | 
|  `node_status_capacity_pods`  |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  용량에 따라 노드에 할당할 수 있는 포드 수입니다.  | 
|  `node_status_condition_ready`   |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  노드 상태 조건 `Ready`가 Amazon EC2 노드에 대해 참인지 여부를 나타냅니다.  | 
|  `node_status_condition_memory_pressure`   |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  노드 상태 조건 `MemoryPressure`이 참인지 여부를 나타냅니다.  | 
|  `node_status_condition_pid_pressure`   |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  노드 상태 조건 `PIDPressure`이 참인지 여부를 나타냅니다.  | 
|  `node_status_condition_disk_pressure`   |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  노드 상태 조건 `OutOfDisk`이 참인지 여부를 나타냅니다.  | 
|  `node_status_condition_unknown`   |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  노드 상태 조건 중 알 수 없는 상태가 있는지 여부를 나타냅니다.  | 
|  `node_interface_network_rx_dropped`  |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  노드의 네트워크 인터페이스에서 수신한 후 삭제한 패킷 수입니다.  | 
|  `node_interface_network_tx_dropped`  |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  전송될 예정이었으나 노드의 네트워크 인터페이스에서 삭제된 패킷 수입니다.  | 
|  `node_diskio_io_service_bytes_total`  Windows 또는 ROSA 클러스터에서는 사용할 수 없습니다.  |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  노드의 모든 I/O 작업에서 전송된 총 바이트 수입니다.  | 
|  `node_diskio_io_serviced_total` Windows 또는 ROSA 클러스터에서는 사용할 수 없습니다.  |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`   |  노드의 총 I/O 작업 횟수입니다.  | 
|  `pod_cpu_reserved_capacity`  |  `PodName`, `Namespace`, `ClusterName` `ClusterName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  `ClusterName`, `Namespace`, `Service`   |  클러스터에서 Pod별로 예약된 CPU 용량입니다. 공식: `pod_cpu_request / node_cpu_limit`  `pod_cpu_request`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `pod_cpu_utilization`  |  `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName` `Service`, `Namespace`, `ClusterName` `ClusterName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`   |  Pod에서 사용 중인 CPU 단위의 비율입니다. 공식: `pod_cpu_usage_total / node_cpu_limit`  | 
|  `pod_cpu_utilization_over_pod_limit`  |  `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName` `Service`, `Namespace`, `ClusterName` `ClusterName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`   |  포드 제한을 기준으로 포드에서 사용 중인 CPU 단위의 백분율입니다. 공식: `pod_cpu_usage_total / pod_cpu_limit`  | 
|  `pod_memory_reserved_capacity`  |  `PodName`, `Namespace`, `ClusterName` `ClusterName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  `ClusterName`, `Namespace`, `Service`   |  포드에 예약된 메모리의 비율입니다. 공식: `pod_memory_request / node_memory_limit`  `pod_memory_request`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `pod_memory_utilization`  |  `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName` `Service`, `Namespace`, `ClusterName` `ClusterName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`   |  한 개 또는 여러 개의 Pod에서 현재 사용 중인 메모리의 비율입니다. 공식: `pod_memory_working_set / node_memory_limit`  | 
|  `pod_memory_utilization_over_pod_limit`  |  `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName` `Service`, `Namespace`, `ClusterName` `ClusterName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`   |  포드 제한을 기준으로 포드에서 사용 중인 메모리의 백분율입니다. 포드의 컨테이너에 메모리 제한이 정의되지 않은 경우 이 지표는 표시되지 않습니다. 공식: `pod_memory_working_set / pod_memory_limit`  | 
|  `pod_network_rx_bytes`  |  `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName` `Service`, `Namespace`, `ClusterName` `ClusterName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`   |  Pod에서 네트워크를 통해 수신 중인 초당 바이트 수입니다. 공식: `sum(pod_interface_network_rx_bytes)`  `pod_interface_network_rx_bytes`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `pod_network_tx_bytes`  |  `PodName`, `Namespace`, `ClusterName` `Namespace,` `ClusterName` `Service`, `Namespace`, `ClusterName` `ClusterName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`   |  Pod에서 네트워크를 통해 전송 중인 초당 바이트 수입니다. 공식: `sum(pod_interface_network_tx_bytes)`  `pod_interface_network_tx_bytes`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `pod_cpu_request`   |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드에 대한 CPU 요청입니다. 공식: `sum(container_cpu_request)`  `pod_cpu_request`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `pod_memory_request`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드에 대한 메모리 요청량입니다. 공식: `sum(container_memory_request)`  `pod_memory_request`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `pod_cpu_limit`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드의 컨테이너에 대해 정의된 CPU 한도입니다. 포드의 컨테이너에 CPU 제한이 정의되지 않은 경우 이 지표는 표시되지 않습니다. 공식: `sum(container_cpu_limit)`  `pod_cpu_limit`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `pod_memory_limit`   |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드의 컨테이너에 대해 정의된 메모리 한도입니다. 포드의 컨테이너에 메모리 제한이 정의되지 않은 경우 이 지표는 표시되지 않습니다. 공식: `sum(container_memory_limit)`  `pod_cpu_limit`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `pod_status_failed`   |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드의 모든 컨테이너가 종료되었으며, 하나 이상의 컨테이너가 0이 아닌 상태로 종료되었거나 시스템에 의해 종료되었음을 나타냅니다.  | 
|  `pod_status_ready`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드의 모든 컨테이너가 `ContainerReady` 조건에 도달하여 준비가 완료되었음을 나타냅니다.  | 
|  `pod_status_running`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드의 모든 컨테이너가 실행 중임을 나타냅니다.  | 
|  `pod_status_scheduled`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드가 노드에 예약되었음을 나타냅니다.  | 
|  `pod_status_unknown`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드의 상태를 가져올 수 없음을 나타냅니다.  | 
|  `pod_status_pending`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  클러스터에서 포드를 수락했지만 하나 이상의 컨테이너가 아직 준비되지 않았음을 나타냅니다.  | 
|  `pod_status_succeeded`   |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드의 모든 컨테이너가 성공적으로 종료되었으며 다시 시작되지 않음을 나타냅니다.  | 
|  `pod_number_of_containers`   |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드 사양에 정의된 컨테이너 수를 보고합니다.  | 
|  `pod_number_of_running_containers`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  현재 `Running` 상태에 있는 포드 내 컨테이너 수를 보고합니다.  | 
|  `pod_container_status_terminated`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드에서 `Terminated` 상태에 있는 컨테이너 수를 보고합니다.  | 
|  `pod_container_status_running`   |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드에서 `Running` 상태에 있는 컨테이너 수를 보고합니다.  | 
|  `pod_container_status_waiting`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드에서 `Waiting` 상태에 있는 컨테이너 수를 보고합니다.  | 
|  `pod_container_status_waiting_reason_crash_loop_back_off`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  컨테이너가 반복적으로 시작에 실패하는 `CrashLoopBackOff` 오류로 인해 보류 중인 포드의 컨테이너 수를 보고합니다.  | 
|  `pod_container_status_waiting_reason_create_container_config_error`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  사유 `CreateContainerConfigError`로 보류 중인 포드의 컨테이너 수를 보고합니다. 이는 컨테이너 구성을 생성하는 동안 오류가 발생했기 때문입니다.  | 
|  `pod_container_status_waiting_reason_create_container_error`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  컨테이너 생성 중 발생한 오류 때문에 사유 `CreateContainerError`로 보류 중인 포드의 컨테이너 수를 보고합니다.  | 
|  `pod_container_status_waiting_reason_image_pull_error`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  `ErrImagePull`, `ImagePullBackOff` 또는 `InvalidImageName` 때문에 보류 중인 포드의 컨테이너 수를 보고합니다. 이러한 상황은 컨테이너 이미지를 가져오는 중 오류로 인해 발생합니다.  | 
|  `pod_container_status_waiting_reason_start_error`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  컨테이너 시작 중 발생한 오류 때문에 사유 `StartError`로 보류 중인 포드의 컨테이너 수를 보고합니다.  | 
|  `pod_container_status_terminated_reason_oom_killed`   |  `ContainerName`, `FullPodName`, `PodName`, `Namespace`, `ClusterName` `ContainerName`, `PodName`, `Namespace`, `ClusterName` `ClusterName`  |  메모리 제한을 초과하여 포드가 종료되었음을 나타냅니다. 이 지표 는이 문제가 발생한 경우에만 표시됩니다.  | 
|  `pod_interface_network_rx_dropped`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  포드의 네트워크 인터페이스에서 수신된 후 삭제된 패킷 수입니다.  | 
|  `pod_interface_network_tx_dropped`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  |  전송될 예정이었으나 포드에서 삭제된 패킷 수입니다.  | 
| `pod_memory_working_set` |  `ClusterName` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  | 포드에서 현재 사용 중인 메모리(바이트). | 
| `pod_cpu_usage_total` |  `ClusterName` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName`  | 포드에서 사용되는 CPU 단위 수. | 
|  `container_cpu_utilization`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName`, `ContainerName` `PodName`, `Namespace`, `ClusterName`, `ContainerName`, `FullPodName`  |  컨테이너에서 사용 중인 CPU 단위의 비율입니다. 공식: `container_cpu_usage_total / node_cpu_limit`  `container_cpu_utilization`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `container_cpu_utilization_over_container_limit`   |  `ClusterName` `PodName`, `Namespace`, `ClusterName`, `ContainerName` `PodName`, `Namespace`, `ClusterName`, `ContainerName`, `FullPodName`  |  컨테이너 제한을 기준으로 컨테이너에서 사용 중인 CPU 단위의 비율입니다. 컨테이너에 CPU 제한이 정의되지 않은 경우 이 지표는 표시되지 않습니다. 공식: `container_cpu_usage_total / container_cpu_limit`  `container_cpu_utilization_over_container_limit`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `container_memory_utilization`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName`, `ContainerName` `PodName`, `Namespace`, `ClusterName`, `ContainerName`, `FullPodName`  |  컨테이너에서 사용 중인 메모리 단위의 비율입니다. 공식: `container_memory_working_set / node_memory_limit`  `container_memory_utilization`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `container_memory_utilization_over_container_limit`    |  `ClusterName` `PodName`, `Namespace`, `ClusterName`, `ContainerName` `PodName`, `Namespace`, `ClusterName`, `ContainerName`, `FullPodName`  |  컨테이너 제한을 기준으로 컨테이너에서 사용 중인 메모리 단위의 비율입니다. 컨테이너에 메모리 제한이 정의되지 않은 경우 이 지표는 표시되지 않습니다. 공식: `container_memory_working_set / container_memory_limit`  `container_memory_utilization_over_container_limit`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `container_memory_failures_total`  Windows에서는 제공되지 않습니다.  |  `ClusterName` `PodName`, `Namespace`, `ClusterName`, `ContainerName` `PodName`, `Namespace`, `ClusterName`, `ContainerName`, `FullPodName`  |  컨테이너에서 발생한 메모리 할당 실패 횟수입니다.  | 
|  `pod_number_of_container_restarts`  |  PodName, `Namespace`, `ClusterName`   |  Pod의 컨테이너 재시작 총 횟수입니다.  | 
|  `service_number_of_running_pods`  |  서비스, `Namespace`, `ClusterName`  `ClusterName`  |  클러스터에서 단일 또는 복수의 서비스를 실행하는 Pod의 숫자입니다.  | 
|  `replicas_desired`   |  `ClusterName` `PodName`, `Namespace`, `ClusterName`  |  워크로드 사양에 정의된 워크로드에 필요한 포드 수입니다.  | 
|  `replicas_ready`   |  `ClusterName` `PodName`, `Namespace`, `ClusterName`  |  준비 상태에 도달한 워크로드의 포드 수입니다.  | 
|  `status_replicas_available`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName`  |  워크로드에 사용할 수 있는 포드 수입니다. 워크로드 사양에 정의된 대로 `minReadySeconds` 준비가 되면 포드를 사용할 수 있습니다.  | 
|  `status_replicas_unavailable`  |  `ClusterName` `PodName`, `Namespace`, `ClusterName`  |  사용할 수 없는 워크로드의 포드 수입니다. 워크로드 사양에 정의된 대로 `minReadySeconds` 준비가 되면 포드를 사용할 수 있습니다. 이 기준을 충족하지 않으면 포드를 사용할 수 없습니다.  | 
|  `apiserver_storage_objects`  |  `ClusterName` `ClusterName`, `resource`  |  마지막 확인 당시 etcd에 저장된 객체 수입니다.  | 
|  `apiserver_storage_db_total_size_in_bytes`  |  `ClusterName` `ClusterName`, `endpoint`  |  물리적으로 할당된 스토리지 데이터베이스 파일의 총 크기(바이트)입니다. 이 지표는 실험용이며 Kubernetes의 향후 릴리스에서 변경될 수도 있습니다. 단위: 바이트 유용한 통계: 합계, 평균, 최소, 최대  | 
|  `apiserver_request_total`  |  `ClusterName` `ClusterName`, `code`, `verb`  |  Kubernetes API 서버에 대한 총 API 요청 수입니다.  | 
|  `apiserver_request_duration_seconds`  |  `ClusterName` `ClusterName`, `verb`  |  Kubernetes API 서버에 대한 API 요청의 응답 지연 시간입니다.  | 
|  `apiserver_admission_controller_admission_duration_seconds`  |  `ClusterName` `ClusterName`, `operation`  |  승인 컨트롤러 지연 시간(초)입니다. 승인 컨트롤러는 Kubernetes API 서버에 대한 요청을 가로채는 코드입니다.  | 
|  `rest_client_request_duration_seconds`   |  `ClusterName` `ClusterName`, `operation`  |  Kubernetes API 서버를 호출하는 클라이언트가 경험한 응답 지연 시간입니다. 이 지표는 실험용이며 Kubernetes의 향후 릴리스에서 변경될 수 있습니다.  | 
|  `rest_client_requests_total`   |  `ClusterName` `ClusterName`, `code`, `method`  |  클라이언트가 Kubernetes API 서버에 요청한 총 API 요청 수입니다. 이 지표는 실험용이며 Kubernetes의 향후 릴리스에서 변경될 수 있습니다.  | 
|  `etcd_request_duration_seconds`   |  `ClusterName` `ClusterName`, `operation`  |  Etcd에 대한 API 호출의 응답 지연 시간입니다. 이 지표는 실험용이며 Kubernetes의 향후 릴리스에서 변경될 수 있습니다.  | 
|  `apiserver_storage_size_bytes`   |  `ClusterName` `ClusterName`, `endpoint`  |  물리적으로 할당된 스토리지 데이터베이스 파일의 크기(바이트)입니다. 이 지표는 실험용이며 Kubernetes의 향후 릴리스에서 변경될 수 있습니다.  | 
|  `apiserver_longrunning_requests`  |  `ClusterName` `ClusterName`, `resource`  |  Kubernetes API 서버에 대한 활성 장기 실행 요청 수입니다.  | 
|  `apiserver_current_inflight_requests`  |  `ClusterName` `ClusterName`, `request_kind`  |  Kubernetes API 서버에서 처리 중인 요청 수입니다.  | 
|  `apiserver_admission_webhook_admission_duration_seconds`  |  `ClusterName` `ClusterName`, `name`  |  승인 웹후크 지연 시간(초)입니다. 승인 웹후크는 승인 요청을 수신하고 이를 이용해 무언가를 수행하는 HTTP 콜백입니다.  | 
|  `apiserver_admission_step_admission_duration_seconds`   |  `ClusterName` `ClusterName`, `operation`  |  승인 하위 단계 지연 시간(초)입니다.  | 
|  `apiserver_requested_deprecated_apis`   |  `ClusterName` `ClusterName`, `group`  |  Kubernetes API 서버에서 더 이상 사용되지 않는 API에 대한 요청 수입니다.  | 
|  `apiserver_request_total_5xx`  |  `ClusterName` `ClusterName`, `code`, `verb`  |  Kubernetes API 서버에 대한 요청 중 5XX HTTP 응답 코드로 응답한 요청 수입니다.  | 
|  `apiserver_storage_list_duration_seconds`   |  `ClusterName` `ClusterName`, `resource`  |  Etc의 객체를 나열하는 응답 지연 시간. 이 지표는 실험용이며 Kubernetes의 향후 릴리스에서 변경될 수 있습니다.  | 
|  `apiserver_flowcontrol_request_concurrency_limit`   |  `ClusterName` `ClusterName`, `priority_level`  |  API 우선순위 및 공정성 하위 시스템에서 현재 실행 중인 요청이 사용하는 스레드 수.  | 
|  `apiserver_flowcontrol_rejected_requests_total`   |  `ClusterName` `ClusterName`, `reason`  |  API 우선순위 및 공정성 하위 시스템에서 거부한 요청 수입니다. 이 지표는 실험용이며 Kubernetes의 향후 릴리스에서 변경될 수 있습니다.  | 
|  `apiserver_current_inqueue_requests`   |  `ClusterName` `ClusterName`, `request_kind`  |  Kubernetes API 서버에서 대기열에 있는 요청 수입니다. 이 지표는 실험용이며 Kubernetes의 향후 릴리스에서 변경될 수 있습니다.  | 

## NVIDIA GPU 지표
<a name="Container-Insights-metrics-EKS-GPU"></a>

Amazon EKS의 향상된 관찰성을 사용하여 CloudWatch 에이전트 버전 `1.300034.0`부터 Container Insights는 기본적으로 EKS 워크로드에서 NVIDIA GPU 지표를 수집합니다. CloudWatch 에이전트를 설치할 때는 CloudWatch Observability EKS 추가 기능 버전 `v1.3.0-eksbuild.1` 이상을 사용해야 합니다. 자세한 내용은 [Amazon CloudWatch Observability EKS 추가 기능 또는 헬름 차트를 사용하여 CloudWatch 에이전트 설치](install-CloudWatch-Observability-EKS-addon.md) 섹션을 참조하세요. 이렇게 수집된 NVIDIA GPU 지표는 이 섹션의 표에 나열되어 있습니다.

Container Insights로 NVIDIA GPU 지표를 수집하려면 다음 사전 요구 사항을 충족해야 합니다.
+ Amazon CloudWatch Observability EKS 추가 기능 버전 `v1.3.0-eksbuild.1` 이상을 사용하여 Amazon EKS의 향상된 관찰 기능을 갖춘 Container Insights를 사용해야 합니다.
+ [쿠버네티스용 NVIDIA 디바이스 플러그인을 클러스터에 설치해야 합니다](https://github.com/NVIDIA/k8s-device-plugin).
+ [NVIDIA 컨테이너 툴킷](https://github.com/NVIDIA/nvidia-container-toolkit)은 클러스터의 노드에 설치해야 합니다. 예를 들어 Amazon EKS 최적화된 가속화 AMI는 필수 구성 요소로 구축됩니다.

CloudWatch 에이전트 구성 파일 처음의 `accelerated_compute_metrics` 옵션을 `false`로 설정하여 NVIDIA GPU 지표 수집을 옵트아웃할 수 있습니다. 자세한 내용과 옵트아웃 예시는 [(선택 사항) 추가 구성](install-CloudWatch-Observability-EKS-addon.md#install-CloudWatch-Observability-EKS-addon-configuration) 단원을 참조하십시오.


| 지표 이름 | 측정 기준 | 설명 | 
| --- | --- | --- | 
|  `container_gpu_memory_total` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `GpuDevice`  |  컨테이너에 할당된 GPU의 총 프레임 버퍼 바이트 규모.  | 
|  `container_gpu_memory_used` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `GpuDevice`  |  컨테이너에 할당된 GPU에서 사용된 프레임 버퍼의 바이트.  | 
|  `container_gpu_memory_utilization` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `GpuDevice`  |  컨테이너에 할당된 GPU의 프레임 버퍼 사용률.  | 
|  `container_gpu_power_draw` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `GpuDevice`  |  컨테이너에 할당된 GPU의 전력 와트 사용량.  | 
|  `container_gpu_temperature` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `GpuDevice`  |  컨테이너에 할당된 GPU의 섭씨 온도.  | 
|  `container_gpu_utilization` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `GpuDevice`  |  컨테이너에 할당된 GPU의 활용률.  | 
|  `container_gpu_tensor_core_utilization` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `GpuDevice`  |  컨테이너에 할당된 GPU의 텐서 코어 사용률.  | 
|  `node_gpu_memory_total` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `InstanceType`, `NodeName`, `GpuDevice`  |  노드에 할당된 GPU의 총 프레임 버퍼 바이트 규모.  | 
|  `node_gpu_memory_used` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `InstanceType`, `NodeName`, `GpuDevice`  |  노드에 할당된 GPU에서 사용된 프레임 버퍼의 바이트.  | 
|  `node_gpu_memory_utilization` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `InstanceType`, `NodeName`, `GpuDevice`  |  노드에 할당된 GPU의 프레임 버퍼 사용률.  | 
|  `node_gpu_power_draw` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `InstanceType`, `NodeName`, `GpuDevice`  |  노드에 할당된 GPU의 전력 와트 사용량.  | 
|  `node_gpu_temperature` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `InstanceType`, `NodeName`, `GpuDevice`  |  노드에 할당된 GPU의 섭씨 온도.  | 
|  `node_gpu_utilization` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `InstanceType`, `NodeName`, `GpuDevice`  |  노드에 할당된 GPU의 활용률.  | 
|  `node_gpu_tensor_core_utilization` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `InstanceType`, `NodeName`, `GpuDevice`  |  노드에 할당된 GPU의 텐서 코어 사용률.  | 
|  `pod_gpu_memory_total` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`. `GpuDevice`  |  포드에 할당된 GPU의 총 프레임 버퍼 바이트 규모.  | 
|  `pod_gpu_memory_used` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`. `GpuDevice`  |  포드에 할당된 GPU에서 사용된 프레임 버퍼의 바이트.  | 
|  `pod_gpu_memory_utilization` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`. `GpuDevice`  |  포드에 할당된 GPU의 프레임 버퍼 사용률.  | 
|  `pod_gpu_power_draw` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`. `GpuDevice`  |  포드에 할당된 GPU의 전력 와트 사용량.  | 
|  `pod_gpu_temperature` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`. `GpuDevice`  |  포드에 할당된 GPU 온도(섭씨).  | 
|  `pod_gpu_utilization` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `GpuDevice`  |  포드에 할당된 GPU의 활용률.  | 
|  `pod_gpu_tensor_core_utilization` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `GpuDevice`  |  포드에 할당된 GPU의 텐서 코어 사용률.  | 

### 세부적인 GPU 모니터링
<a name="Container-Insights-detailed-GPU-monitoring"></a>

CloudWatch 에이전트 `1.300062.0` 버전부터 Amazon EKS에 대해 향상된 관찰성 기능이 포함되는 Container Insights는 1분 미만의 수집 간격으로 세부 GPU 모니터링을 지원합니다. 이를 통해 일반적인 수집 간격으로는 완전히 누락될 수 있는 단기 기계 학습 추론 워크로드의 모니터링 격차를 해결할 수 있습니다. CloudWatch 에이전트를 설치할 때는 CloudWatch Observability EKS 추가 기능 버전 `v4.7.0-eksbuild.1` 이상을 사용해야 합니다. 자세한 내용은 [Amazon CloudWatch Observability EKS 추가 기능 또는 헬름 차트를 사용하여 CloudWatch 에이전트 설치](install-CloudWatch-Observability-EKS-addon.md) 섹션을 참조하세요.

기본적으로 GPU 지표는 60초 간격으로 수집됩니다. 세부 모니터링이 활성화된 상태에서는 CloudWatch 에이전트가 1분 미만의 간격(최소 1초)으로 GPU 지표를 수집하지만, 지표는 여전히 1분 간격으로 CloudWatch에 수집됩니다. 그러나 각각의 1분 내에서 1분 미만 데이터 포인트의 통계 집계(예: 최소, 최대, 백분위수(예: p90))를 쿼리할 수 있으므로, 정확한 GPU 사용률 데이터가 제공되고 리소스가 한층 더 최적화됩니다.

#### 구성
<a name="Container-Insights-detailed-GPU-monitoring-configuration"></a>

자세한 GPU 모니터링을 활성화하려면 다음 예제와 같이 `kubernetes` 섹션에 `accelerated_compute_gpu_metrics_collection_interval` 파라미터를 포함하도록 CloudWatch 에이전트 구성을 업데이트하세요.

```
{  
    "logs": {  
        "metrics_collected": {  
            "kubernetes": {  
                "cluster_name": "MyCluster",  
                "enhanced_container_insights": true,  
                "accelerated_compute_metrics": true,  
                "accelerated_compute_gpu_metrics_collection_interval": 1  
            }  
        }  
    }  
}
```

`accelerated_compute_gpu_metrics_collection_interval` 파라미터는 초 단위로 값을 수락하며, 최소값은 1초입니다. 이 값을 `1`로 설정하면 1초라는 수집 간격이 활성화됩니다. 이 파라미터를 지정하지 않으면 60초 간격이 기본값으로 사용됩니다.

전체 구성 지침은 [클러스터 지표를 수집하도록 CloudWatch 에이전트 설정](Container-Insights-setup-metrics.md) 섹션을 참조하세요.

## AWS Trainium 및 AWS Inferentia의 AWS Neuron 지표
<a name="Container-Insights-metrics-EKS-Neuron"></a>

CloudWatch 에이전트의 `1.300036.0` 버전부터 Amazon EKS의 향상된 관찰 기능을 갖춘 Container Insights는 기본적으로 AWS Trainium 및 AWS Inferentia 액셀러레이터로부터 가속화된 컴퓨팅 지표를 수집합니다. CloudWatch 에이전트를 설치할 때는 CloudWatch Observability EKS 추가 기능 버전 `v1.5.0-eksbuild.1` 이상을 사용해야 합니다. 추가 기능에 대한 자세한 내용은 [Amazon CloudWatch Observability EKS 추가 기능 또는 헬름 차트를 사용하여 CloudWatch 에이전트 설치](install-CloudWatch-Observability-EKS-addon.md) 섹션을 참조하세요. AWS Trainium에 대한 자세한 내용은 [AWS Trainium](https://aws.amazon.com/machine-learning/trainium/)을 참조하세요. AWS Inferentia에 대한 자세한 내용은 [AWS Inferentia](https://aws.amazon.com/machine-learning/inferentia/)를 참조하세요.

Container Insights로 AWS Neuron 지표를 수집하려면 다음 사전 조건을 충족해야 합니다.
+ Amazon CloudWatch Observability EKS 추가 기능 버전 `v1.5.0-eksbuild.1` 이상을 사용하여 Amazon EKS의 향상된 관찰 기능을 갖춘 Container Insights를 사용해야 합니다.
+ [Neuron 드라이버](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/general/setup/neuron-setup/pytorch/neuronx/ubuntu/torch-neuronx-ubuntu22.html#setup-torch-neuronx-ubuntu22)는 클러스터의 노드에 설치해야 합니다.
+ [Neuron 디바이스 플러그인](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/kubernetes-getting-started.html)은 클러스터에 설치해야 합니다. 예를 들어 Amazon EKS 최적화된 가속화 AMI는 필수 구성 요소로 구축됩니다.

이렇게 수집된 지표는 이 섹션의 표에 나열되어 있습니다. 지표는 AWS Trainium, AWS Inferentia, AWS Inferentia2에 대해 수집됩니다.

CloudWatch 에이전트는 [Neuron 모니터](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/tools/neuron-sys-tools/neuron-monitor-user-guide.html)에서 이러한 지표를 수집하고 필요한 Kubernetes 리소스 상관 관계를 수행하여 포드 및 컨테이너 수준에서 지표를 제공합니다.


| 지표 이름 | 측정 기준 | 설명 | 
| --- | --- | --- | 
|  `container_neuroncore_utilization` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NeuronDevice`, `NeuronCore`  |  컨테이너에 할당된 NeuronCore의 캡처된 기간 동안의 NeuronCore 사용률. 단위: 퍼센트  | 
|  `container_neuroncore_memory_usage_constants` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NeuronDevice`, `NeuronCore`  |  NeuronCore의 교육 도중 컨테이너에 할당된 상수(또는 추론 중 가중치)에 사용되는 디바이스 메모리의 양입니다. 단위: 바이트  | 
|  `container_neuroncore_memory_usage_model_code` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NeuronDevice`, `NeuronCore`  |  컨테이너에 할당된 NeuronCore가 모델의 실행 코드에 사용하는 디바이스 메모리의 양입니다. 단위: 바이트  | 
|  `container_neuroncore_memory_usage_model_shared_scratchpad` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NeuronDevice`, `NeuronCore`  |  컨테이너에 할당된 NeuronCore가 모델의 공유되는 스크래치패드에 사용하는 디바이스 메모리의 양입니다. 이 메모리 영역은 모델용입니다. 단위: 바이트  | 
|  `container_neuroncore_memory_usage_runtime_memory` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NeuronDevice`, `NeuronCore`  |  컨테이너에 할당된 NeuronCore에서 Neuron 런타임에 사용하는 디바이스 메모리의 양입니다. 단위: 바이트  | 
|  `container_neuroncore_memory_usage_tensors` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NeuronDevice`, `NeuronCore`  |  컨테이너에 할당된 NeuronCore에서 텐서에 사용하는 디바이스 메모리의 양입니다. 단위: 바이트  | 
|  `container_neuroncore_memory_usage_total` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NeuronDevice`, `NeuronCore`  |  컨테이너에 할당된 NeuronCore에서 사용하는 총 메모리의 양입니다. 단위: 바이트  | 
|  `container_neurondevice_hw_ecc_events_total` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NeuronDevice`  |  노드에 있는 Neuron 디바이스의 온칩 SRAM 및 디바이스 메모리에 대해 수정 및 수정되지 않은 ECC 이벤트의 수입니다. 단위: 수  | 
|  `pod_neuroncore_utilization` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NeuronDevice`, `NeuronCore`  |  포드에 할당된 NeuronCore의 캡처된 기간 동안의 NeuronCore 사용률. 단위: 퍼센트  | 
|  `pod_neuroncore_memory_usage_constants` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NeuronDevice`, `NeuronCore`  |  NeuronCore의 교육 도중 포드에 할당된 상수(또는 추론 중 가중치)에 사용되는 디바이스 메모리의 양입니다. 단위: 바이트  | 
|  `pod_neuroncore_memory_usage_model_code` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NeuronDevice`, `NeuronCore`  |  포드에 할당된 NeuronCore가 모델의 실행 코드에 사용하는 디바이스 메모리의 양입니다. 단위: 바이트  | 
|  `pod_neuroncore_memory_usage_model_shared_scratchpad` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NeuronDevice`, `NeuronCore`  |  포드에 할당된 NeuronCore가 모델의 공유되는 스크래치패드에 사용하는 디바이스 메모리의 양입니다. 이 메모리 영역은 모델용입니다. 단위: 바이트  | 
|  `pod_neuroncore_memory_usage_runtime_memory` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NeuronDevice`, `NeuronCore`  |  포드에 할당된 NeuronCore에서 Neuron 런타임에 사용하는 디바이스 메모리의 양입니다. 단위: 바이트  | 
|  `pod_neuroncore_memory_usage_tensors` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NeuronDevice`, `NeuronCore`  |  포드에 할당된 NeuronCore에서 텐서에 사용하는 디바이스 메모리의 양입니다. 단위: 바이트  | 
|  `pod_neuroncore_memory_usage_total` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NeuronDevice`, `NeuronCore`  |  포드에 할당된 NeuronCore에서 사용하는 총 메모리의 양입니다. 단위: 바이트  | 
|  `pod_neurondevice_hw_ecc_events_total` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NeuronDevice`  |  포드에 할당된 Neuron 디바이스의 온칩 SRAM 및 디바이스 메모리에 대해 수정 및 수정되지 않은 ECC 이벤트의 수입니다. 단위: 바이트  | 
|  `node_neuroncore_utilization` |  `ClusterName` `ClusterName`, `UltraServer` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceType`, `InstanceId`, `NodeName`, `NeuronDevice`, `NeuronCore`  |  노드에 할당된 NeuronCore의 캡처된 기간 동안의 NeuronCore 사용률. 단위: 퍼센트  | 
|  `node_neuroncore_memory_usage_constants` |  `ClusterName` `ClusterName`, `UltraServer` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceType`, `InstanceId`, `NodeName`, `NeuronDevice`, `NeuronCore`  |  NeuronCore의 교육 도중 노드에 할당된 상수(또는 추론 중 가중치)에 사용되는 디바이스 메모리의 양입니다. 단위: 바이트  | 
|  `node_neuroncore_memory_usage_model_code` |  `ClusterName` `ClusterName`, `UltraServer` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceType`, `InstanceId`, `NodeName`, `NeuronDevice`, `NeuronCore`  |  노드에 할당된 NeuronCore가 모델의 실행 코드에 사용하는 디바이스 메모리의 양입니다. 단위: 바이트  | 
|  `node_neuroncore_memory_usage_model_shared_scratchpad` |  `ClusterName` `ClusterName`, `UltraServer` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceType`, `InstanceId`, `NodeName`, `NeuronDevice`, `NeuronCore`  |  노드에 할당된 NeuronCore가 모델의 공유되는 스크래치패드에 사용하는 디바이스 메모리의 양입니다. 이 메모리 영역은 모델용입니다. 단위: 바이트  | 
|  `node_neuroncore_memory_usage_runtime_memory` |  `ClusterName` `ClusterName`, `UltraServer` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceType`, `InstanceId`, `NodeName`, `NeuronDevice`, `NeuronCore`  |  노드에 할당된 NeuronCore에서 Neuron 런타임에 사용하는 디바이스 메모리의 양입니다. 단위: 바이트  | 
|  `node_neuroncore_memory_usage_tensors` |  `ClusterName` `ClusterName`, `UltraServer` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceType`, `InstanceId`, `NodeName`, `NeuronDevice`, `NeuronCore`  |  노드에 할당된 NeuronCore에서 텐서에 사용하는 디바이스 메모리의 양입니다. 단위: 바이트  | 
|  `node_neuroncore_memory_usage_total` |  `ClusterName` `ClusterName`, `UltraServer` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceType`, `InstanceId`, `NodeName`, `NeuronDevice`, `NeuronCore`  |  노드에 할당된 NeuronCore에서 사용하는 총 메모리의 양입니다. 단위: 바이트  | 
|  `node_neuron_execution_errors_total` |  `ClusterName` `ClusterName`, `UltraServer` `ClusterName`, `InstanceId`, `NodeName`  |  노드의 총 실행 오류 수입니다. 이 값은 CloudWatch 에이전트에서 `generic`, `numerical`, `transient`, `model`, `runtime`, `hardware` 유형의 오류를 집계하여 계산됩니다. 단위: 수  | 
|  `node_neurondevice_runtime_memory_used_bytes` |  `ClusterName` `ClusterName`, `UltraServer` `ClusterName`, `InstanceId`, `NodeName`  |  노드의 Neuron 디바이스 메모리 사용량(바이트)의 총합입니다. 단위: 바이트  | 
| `node_neuron_execution_latency` |  `ClusterName` `ClusterName`, `UltraServer` `ClusterName`, `InstanceId`, `NodeName`  |  Neuron 런타임으로 측정한 노드에서의 실행 지연 시간(초)입니다. 단위: 초  | 
| `node_neurondevice_hw_ecc_events_total` |  `ClusterName` `ClusterName`, `UltraServer` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `NodeName`, `NeuronDevice`  |  노드에 있는 Neuron 디바이스의 온칩 SRAM 및 디바이스 메모리에 대해 수정 및 수정되지 않은 ECC 이벤트의 수입니다. 단위: 수  | 

## AWS Elastic Fabric Adapter(EFA) 지표
<a name="Container-Insights-metrics-EFA"></a>

CloudWatch 에이전트 `1.300037.0` 버전부터 Amazon EKS의 향상된 관찰 기능을 갖춘 Container Insights 는 Linux 인스턴스의 Amazon EKS 클러스터로부터 AWS Elastic Fabric Adapter(EFA) 지표를 수집합니다. CloudWatch 에이전트를 설치할 때는 CloudWatch Observability EKS 추가 기능 버전 `v1.5.2-eksbuild.1` 이상을 사용해야 합니다. 추가 기능에 대한 자세한 내용은 [Amazon CloudWatch Observability EKS 추가 기능 또는 헬름 차트를 사용하여 CloudWatch 에이전트 설치](install-CloudWatch-Observability-EKS-addon.md) 섹션을 참조하세요. AWS Elastic Fabric Adapter에 대한 자세한 내용은 [Elastic Fabric Adapter](https://aws.amazon.com/hpc/efa/)를 참조하세요.

Container Insights로 AWS Elastic Fabric Adapter 지표를 수집하려면 다음 사전 조건을 충족해야 합니다.
+ Amazon CloudWatch Observability EKS 추가 기능 버전 `v1.5.2-eksbuild.1` 이상을 사용하여 Amazon EKS의 향상된 관찰 기능을 갖춘 Container Insights를 사용해야 합니다.
+ EFA 디바이스 플러그인은 클러스터에 설치해야 합니다. 자세한 내용은 GitHub의 [aws-efa-k8s-device-plugin](https://github.com/aws/eks-charts/tree/master/stable/aws-efa-k8s-device-plugin)을 참조하세요.

수집된 지표 목록은 다음 표에 나와 있습니다.


| 지표 이름 | 측정 기준 | 설명 | 
| --- | --- | --- | 
|  `container_efa_rx_bytes` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NetworkInterfaceId`   |  컨테이너에 할당된 EFA 디바이스에서 수신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `container_efa_tx_bytes` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NetworkInterfaceId`   |  컨테이너에 할당된 EFA 디바이스에서 송신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `container_efa_rx_dropped` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NetworkInterfaceId`   |  컨테이너에 할당된 EFA 디바이스에서 수신 후 삭제된 패킷 수입니다. 단위: 개수/초  | 
|  `container_efa_rdma_read_bytes` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NetworkInterfaceId`   |  컨테이너에 할당된 EFA 디바이스에서 원격 직접 메모리 액세스 읽기 작업을 사용하여 수신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `container_efa_rdma_write_bytes` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NetworkInterfaceId`   |  컨테이너에 할당된 EFA 디바이스에서 원격 직접 메모리 액세스 읽기 작업을 사용하여 송신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `container_efa_rdma_write_recv_bytes` |  `ClusterName` `ClusterName`, `Namespace`, `PodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `ContainerName`, `NetworkInterfaceId`   |  컨테이너에 할당된 EFA 디바이스에서 원격 직접 메모리 액세스 쓰기 작업 도중 수신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `pod_efa_rx_bytes` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NetworkInterfaceId`  |  포드에 할당된 EFA 디바이스에서 수신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `pod_efa_tx_bytes` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NetworkInterfaceId`  |  포드에 할당된 EFA 디바이스에서 송신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `pod_efa_rx_dropped` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NetworkInterfaceId`  |  포드에 할당된 EFA 디바이스에서 수신 후 삭제된 패킷 수입니다. 단위: 개수/초  | 
|  `pod_efa_rdma_read_bytes` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NetworkInterfaceId`  |  포드에 할당된 EFA 디바이스에서 원격 직접 메모리 액세스 읽기 작업을 사용하여 수신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `pod_efa_rdma_write_bytes` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NetworkInterfaceId`  |  포드에 할당된 EFA 디바이스에서 원격 직접 메모리 액세스 읽기 작업을 사용하여 송신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `pod_efa_rdma_write_recv_bytes` |  `ClusterName` `ClusterName`, `Namespace` `ClusterName`, `Namespace`, `Service` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName` `ClusterName`, `Namespace`, `PodName`, `FullPodName`, `NetworkInterfaceId`  |  포드에 할당된 EFA 디바이스에서 원격 직접 메모리 액세스 쓰기 작업 도중 수신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `node_efa_rx_bytes` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `InstanceType`, `NodeName`, `NetworkInterfaceId`  |  노드에 할당된 EFA 디바이스에서 수신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `node_efa_tx_bytes` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `InstanceType`, `NodeName`, `NetworkInterfaceId`  |  노드에 할당된 EFA 디바이스에서 송신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `node_efa_rx_dropped` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `InstanceType`, `NodeName`, `NetworkInterfaceId`  |  노드에 할당된 EFA 디바이스에서 수신 후 삭제된 패킷 수입니다. 단위: 개수/초  | 
|  `node_efa_rdma_read_bytes` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `InstanceType`, `NodeName`, `NetworkInterfaceId`  |  노드에 할당된 EFA 디바이스에서 원격 직접 메모리 액세스 읽기 작업을 사용하여 수신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `node_efa_rdma_write_bytes` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `InstanceType`, `NodeName`, `NetworkInterfaceId`  |  포드에 할당된 EFA 디바이스에서 원격 직접 메모리 액세스 읽기 작업을 사용하여 송신하는 초당 바이트 수입니다. 단위: 바이트/초  | 
|  `node_efa_rdma_write_recv_bytes` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName` `ClusterName`, `InstanceId`, `InstanceType`, `NodeName`, `NetworkInterfaceId`  |  노드에 할당된 EFA 디바이스에서 원격 직접 메모리 액세스 쓰기 작업 도중 수신하는 초당 바이트 수입니다. 단위: 바이트/초  | 

## Amazon SageMaker AI HyperPod 지표
<a name="Container-Insights-metrics-Sagemaker-HyperPod"></a>

CloudWatch Observability EKS 애드온의 버전 `v2.0.1-eksbuild.1`부터 Amazon EKS에 대한 향상된 관찰성을 갖춘 Container Insights는 Amazon EKS 클러스터에서 Amazon SageMaker AI HyperPod 지표를 자동으로 수집합니다. 추가 기능에 대한 자세한 내용은 [Amazon CloudWatch Observability EKS 추가 기능 또는 헬름 차트를 사용하여 CloudWatch 에이전트 설치](install-CloudWatch-Observability-EKS-addon.md) 섹션을 참조하세요. Amazon SageMaker AI HyperPod에 대한 자세한 내용은 [Amazon SageMaker AI HyperPod](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-eks.html)를 참조하세요.

수집된 지표 목록은 다음 표에 나와 있습니다.


| 지표 이름 | 측정 기준 | 설명 | 
| --- | --- | --- | 
|  `hyperpod_node_health_status_unschedulable` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`  |  Amazon SageMaker AI HyperPod에 의해 노드가 `Unschedulable`로 레이블이 지정되었는지를 나타냅니다. 이는 노드가 심층 상태 확인을 실행 중이며 워크로드 실행에 사용할 수 없음을 의미합니다. 단위: 수  | 
|  `hyperpod_node_health_status_schedulable` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`  |  Amazon SageMaker AI HyperPod에 의해 노드가 `Schedulable`로 레이블이 지정되었는지를 나타냅니다. 이는 노드가 기본 상태 확인 또는 심층 상태 확인을 통과했으며 워크로드 실행에 사용할 수 있음을 의미합니다. 단위: 수  | 
|  `hyperpod_node_health_status_unschedulable_pending_replacement` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`  |  HyperPod에 의해 노드가 `UnschedulablePendingReplacement`로 레이블이 지정되었는지를 나타냅니다. 이는 노드가 심층 상태 확인 또는 상태 모니터링 에이전트 확인에 실패했으며 교체가 필요함을 의미합니다. 자동 노드 복구가 활성화된 경우 Amazon SageMaker AI HyperPod에 의해 노드가 자동으로 교체됩니다. 단위: 수  | 
|  `hyperpod_node_health_status_unschedulable_pending_reboot` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`  |  Amazon SageMaker AI HyperPod에 의해 노드가 `UnschedulablePendingReboot`로 레이블이 지정되었는지를 나타냅니다. 이는 노드가 심층 상태 확인을 실행 중이며 재부팅이 필요함을 의미합니다. 자동 노드 복구가 활성화된 경우 Amazon SageMaker AI HyperPod에 의해 노드가 자동으로 재부팅됩니다. 단위: 수  | 

## Amazon EBS NVMe 드라이버 지표
<a name="Container-Insights-metrics-EBS"></a>

CloudWatch 에이전트 ` 1.300056.0` 버전부터 Amazon EKS의 향상된 관찰성을 갖춘 Container Insights는 Linux 인스턴스의 Amazon EKS 클러스터로부터 Amazon EBS NVMe 드라이버 지표를 수집합니다. CloudWatch 에이전트를 설치할 때는 CloudWatch Observability Amazon EKS 추가 기능 버전 `4.1.0` 이상을 사용해야 합니다. 추가 기능에 대한 자세한 내용은 [Amazon CloudWatch Observability EKS 추가 기능 또는 헬름 차트를 사용하여 CloudWatch 에이전트 설치](install-CloudWatch-Observability-EKS-addon.md) 섹션을 참조하세요. Amazon EBS에 대한 자세한 내용은 [Amazon EBS 세부 성능 통계](https://docs.aws.amazon.com/ebs/latest/userguide/nvme-detailed-performance-stats.html)를 참조하세요.

Container Insights로 Amazon EBS NVMe 드라이버 지표를 수집하려면 다음 사전 요구 사항을 충족해야 합니다.
+ CloudWatch Observability Amazon EKS 추가 기능 버전 `4.1.0` 이상을 사용하여 Amazon EKS의 향상된 관찰성을 갖춘 Container Insights를 사용해야 합니다.
+ 지표가 활성화된 클러스터에 EBS CSI 드라이버 `1.42.0` 추가 기능 또는 헬름 차트를 설치해야 합니다.
  + Amazon EBS CSI 드라이버 추가 기능을 사용할 때 지표를 활성화하려면 추가 기능을 생성하거나 업데이트할 때 다음 옵션을 사용합니다. `--configuration-values '{ "node": { "enableMetrics": true } }'` 
  + 헬름 차트를 사용하는 경우 지표를 활성화하려면 추가 기능을 생성하거나 업데이트할 때 다음 옵션을 사용합니다. `--set node.enableMetrics=true` 

수집된 지표 목록은 다음 표에 나와 있습니다.


| 지표 이름 | 측정 기준 | 설명 | 
| --- | --- | --- | 
|  `node_diskio_ebs_total_read_ops` |  `ClusterName` `ClusterName`, `NodeName`, `InstanceId` `ClusterName`, `NodeName`, `InstanceId` `VolumeId`  | 완료된 총 읽기 작업 수입니다. | 
|  `node_diskio_ebs_total_write_ops` |  `ClusterName` `ClusterName`, `NodeName`, `InstanceId` `ClusterName`, `NodeName`, `InstanceId` `VolumeId`  | 완료된 총 쓰기 작업 수입니다. | 
|  `node_diskio_ebs_total_read_bytes` |  `ClusterName` `ClusterName`, `NodeName`, `InstanceId` `ClusterName`, `NodeName`, `InstanceId` `VolumeId`  | 전송된 총 읽기 바이트 수입니다. | 
|  `node_diskio_ebs_total_write_bytes` |  `ClusterName` `ClusterName`, `NodeName`, `InstanceId` `ClusterName`, `NodeName`, `InstanceId` `VolumeId`  | 전송된 총 쓰기 바이트 수입니다. | 
|  `node_diskio_ebs_total_read_time` |  `ClusterName` `ClusterName`, `NodeName`, `InstanceId` `ClusterName`, `NodeName`, `InstanceId` `VolumeId`  | 모든 완료된 읽기 작업에 소요된 총 시간(밀리초)입니다. | 
|  `node_diskio_ebs_total_write_time` |  `ClusterName` `ClusterName`, `NodeName`, `InstanceId` `ClusterName`, `NodeName`, `InstanceId` `VolumeId`  | 모든 완료된 쓰기 작업에 소요된 총 시간(마이크로초)입니다. | 
|  `node_diskio_ebs_volume_performance_exceeded_iops` |  `ClusterName` `ClusterName`, `NodeName`, `InstanceId` `ClusterName`, `NodeName`, `InstanceId` `VolumeId`  | IOPS 수요가 볼륨의 프로비저닝된 IOPS 성능을 초과한 총 시간(마이크로초)입니다. | 
|  `node_diskio_ebs_volume_performance_exceeded_tp` |  `ClusterName` `ClusterName`, `NodeName`, `InstanceId` `ClusterName`, `NodeName`, `InstanceId` `VolumeId`  | 처리량 수요가 볼륨의 프로비저닝된 처리량 성능을 초과한 총 시간(마이크로초)입니다. | 
|  `node_diskio_ebs_ec2_instance_performance_exceeded_iops` |  `ClusterName` `ClusterName`, `NodeName`, `InstanceId` `ClusterName`, `NodeName`, `InstanceId` `VolumeId`  | EBS 볼륨이 연결된 Amazon EC2 인스턴스의 최대 IOPS 성능을 초과한 총 시간(마이크로초)입니다. | 
|  `node_diskio_ebs_ec2_instance_performance_exceeded_tp` |  `ClusterName` `ClusterName`, `NodeName`, `InstanceId` `ClusterName`, `NodeName`, `InstanceId` `VolumeId`  | EBS 볼륨이 연결된 Amazon EC2 인스턴스의 최대 처리량 성능을 초과한 총 시간(마이크로초)입니다. | 
|  `node_diskio_ebs_volume_queue_length` |  `ClusterName` `ClusterName`, `NodeName`, `InstanceId` `ClusterName`, `NodeName`, `InstanceId` `VolumeId`  | 완료되기를 기다리는 읽기 및 쓰기 작업의 수입니다. | 

# Amazon EKS 및 Kubernetes Container Insights 지표
<a name="Container-Insights-metrics-EKS"></a>

아래 표에는 Container Insights가 Amazon EKS 및 쿠버네티스용으로 수집하는 지표 및 측정 기준이 나와 있습니다. 이러한 지표는 `ContainerInsights` 네임스페이스에 있습니다. 자세한 내용은 [Metrics](cloudwatch_concepts.md#Metric) 섹션을 참조하세요.

콘솔에 Container Insights 지표가 보이지 않는 경우, Container Insights 설정을 완료했는지 확인합니다. Container Insights 설정이 완료되기 전에는 지표가 나타나지 않습니다. 자세한 내용은 [Container Insights 설정](deploy-container-insights.md) 섹션을 참조하세요.


| 지표 이름 | 측정 기준 | 설명 | 
| --- | --- | --- | 
|  `cluster_failed_node_count`  |  `ClusterName`  |  클러스터의 실패한 작업자 노드의 숫자입니다. **‘노드 조건’ 문제를 겪고 있는 경우 노드가 실패한 것으로 간주됩니다. 자세한 내용은 Kubernetes 설명서에서 [조건](https://kubernetes.io/docs/concepts/architecture/nodes/#condition)을 참조하세요.  | 
|  `cluster_node_count`  |  `ClusterName`  |  클러스터의 작업자 노드의 총 숫자입니다.  | 
|  `namespace_number_of_running_pods`  |  `Namespace` `ClusterName` `ClusterName`  |  사용 중인 측정기준에서 지정한 리소스의 네임스페이스당 실행 중인 Pod 숫자입니다.  | 
|  `node_cpu_limit`  |  `ClusterName`   |  클러스터에서 단일 노드에 할당할 수 있는 최대 CPU 단위 숫자입니다.  | 
|  `node_cpu_reserved_capacity`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  kubelet, kube-proxy, Docker 등 노드 구성 요소에 예약된 CPU 단위의 비율입니다. 공식: `node_cpu_request / node_cpu_limit`  `node_cpu_request`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `node_cpu_usage_total`  |  `ClusterName`  |  클러스터의 노드에서 사용 중인 CPU 단위의 숫자입니다.  | 
|  `node_cpu_utilization`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  클러스터의 노드에서 사용 중인 CPU 단위의 총 백분율입니다. 공식: `node_cpu_usage_total / node_cpu_limit`  | 
|  `node_gpu_limit` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`  |  노드에서 사용 가능한 총 GPU 수.  | 
|  `node_gpu_usage_total` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`  |  노드에서 실행 중인 포드가 사용하는 GPU 수.  | 
|  `node_gpu_reserved_capacity` |  `ClusterName` `ClusterName`, `InstanceId`, `NodeName`  |  노드에서 현재 예약된 GPU의 백분율. 수식은 `node_gpu_request / node_gpu_limit`입니다.  `node_gpu_request`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `node_filesystem_utilization`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  클러스터에서 노드에 사용하는 파일 시스템 용량의 총 백분율입니다. 공식: `node_filesystem_usage / node_filesystem_capacity`  `node_filesystem_usage` 및 `node_filesystem_capacity`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `node_memory_limit`  |  `ClusterName`  |  클러스터에서 단일 노드로 할당될 수 있는 최대 메모리의 양(바이트)입니다.  | 
|  `node_memory_reserved_capacity`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  클러스터의 노드에서 현재 사용 중인 메모리의 비율입니다. 공식: `node_memory_request / node_memory_limit`  `node_memory_request`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `node_memory_utilization`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  한 개 또는 여러 개의 노드에서 현재 사용 중인 메모리의 비율입니다. 노드 메모리 사용량을 노드 메모리 제한으로 나눈 백분율입니다. 공식: `node_memory_working_set / node_memory_limit`입니다.  | 
|  `node_memory_working_set`  |  `ClusterName`   |  클러스터의 노드 작업 세트에서 사용하는 메모리의 양(바이트)입니다.  | 
|  `node_network_total_bytes`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  클러스터에서 노드당 네트워크를 통해 전송 및 수신된 초당 바이트의 합계 수치입니다. 공식: `node_network_rx_bytes + node_network_tx_bytes`  `node_network_rx_bytes` 및 `node_network_tx_bytes`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `node_number_of_running_containers`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  클러스터에서 노드당 실행 중인 컨테이너의 숫자입니다.  | 
|  `node_number_of_running_pods`  |  `NodeName`, `ClusterName`, `InstanceId` `ClusterName`  |  클러스터에서 노드당 실행 중인 Pod 숫자입니다.  | 
|  `pod_cpu_reserved_capacity`  |  `PodName`, `Namespace`, `ClusterName` `ClusterName`  |  클러스터에서 Pod별로 예약된 CPU 용량입니다. 공식: `pod_cpu_request / node_cpu_limit`  `pod_cpu_request`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `pod_cpu_utilization`  |  `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName` `Service`, `Namespace`, `ClusterName` `ClusterName`  |  Pod에서 사용 중인 CPU 단위의 비율입니다. 공식: `pod_cpu_usage_total / node_cpu_limit`  | 
|  `pod_cpu_utilization_over_pod_limit`  |  `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName` `Service`, `Namespace`, `ClusterName` `ClusterName`  |  포드 제한을 기준으로 포드에서 사용 중인 CPU 단위의 백분율입니다. 공식: `pod_cpu_usage_total / pod_cpu_limit`  | 
|  `pod_gpu_request` |  `ClusterName` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `FullPodName`, `Namespace`, `PodName`  |  포드에 대한 GPU 요청. 이 값은 항상 `pod_gpu_limit`와 같아야 합니다.  | 
|  `pod_gpu_limit` |  `ClusterName` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `FullPodName`, `Namespace`, `PodName`  |  노드의 포드에 할당할 수 있는 최대 GPU 수.  | 
|  `pod_gpu_usage_total` |  `ClusterName` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `FullPodName`, `Namespace`, `PodName`  |  포드에 할당되는 GPU 수.  | 
|  `pod_gpu_reserved_capacity` |  `ClusterName` `ClusterName`, `Namespace`, `PodName` `ClusterName`, `FullPodName`, `Namespace`, `PodName`  |  포드에 대해 현재 예약된 GPU의 백분율. 수식은 pod\$1gpu\$1request / node\$1gpu\$1reserved\$1capacity입니다.  | 
|  `pod_memory_reserved_capacity`  |  `PodName`, `Namespace`, `ClusterName` `ClusterName`  |  포드에 예약된 메모리의 비율입니다. 공식: `pod_memory_request / node_memory_limit`  `pod_memory_request`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `pod_memory_utilization`  |  `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName` `Service`, `Namespace`, `ClusterName` `ClusterName`  |  한 개 또는 여러 개의 Pod에서 현재 사용 중인 메모리의 비율입니다. 공식: `pod_memory_working_set / node_memory_limit`  | 
|  `pod_memory_utilization_over_pod_limit`  |  `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName` `Service`, `Namespace`, `ClusterName` `ClusterName`  |  포드 제한을 기준으로 포드에서 사용 중인 메모리의 백분율입니다. 포드의 컨테이너에 메모리 제한이 정의되지 않은 경우 이 지표는 표시되지 않습니다. 공식: `pod_memory_working_set / pod_memory_limit`  | 
|  `pod_network_rx_bytes`  |  `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName` `Service`, `Namespace`, `ClusterName` `ClusterName`  |  Pod에서 네트워크를 통해 수신 중인 초당 바이트 수입니다. 공식: `sum(pod_interface_network_rx_bytes)`  `pod_interface_network_rx_bytes`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `pod_network_tx_bytes`  |  `PodName`, `Namespace`, `ClusterName` `Namespace`, `ClusterName` `Service`, `Namespace`, `ClusterName` `ClusterName`  |  Pod에서 네트워크를 통해 전송 중인 초당 바이트 수입니다. 공식: `sum(pod_interface_network_tx_bytes)`  `pod_interface_network_tx_bytes`는 지표로 직접 보고되지는 않지만 성능 로그 이벤트의 필드입니다. 자세한 내용은 [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md) 섹션을 참조하세요.   | 
|  `pod_number_of_container_restarts`  |  `PodName`, `Namespace`, `ClusterName`  |  Pod의 컨테이너 재시작 총 횟수입니다.  | 
|  `service_number_of_running_pods`  |  `Service`, `Namespace`, `ClusterName` `ClusterName`  |  클러스터에서 단일 또는 복수의 서비스를 실행하는 Pod의 숫자입니다.  | 

## Kueue 지표
<a name="Container-Insights-metrics-Kueue"></a>

CloudWatch Observability EKS 추가 기능의 `v2.4.0-eksbuild.1` 버전부터는 Container Insights for Amazon EKS는 Amazon EKS 클러스터에서 Kueue 지표를 자동으로 수집합니다. 추가 기능에 대한 자세한 내용은 [Amazon CloudWatch Observability EKS 추가 기능 또는 헬름 차트를 사용하여 CloudWatch 에이전트 설치](install-CloudWatch-Observability-EKS-addon.md) 섹션을 참조하세요.

지표 활성화에 대한 자세한 내용을 보려면 [Kueue 지표 활성화](install-CloudWatch-Observability-EKS-addon.md#enable-Kueue-metrics) 섹션을 참조하여 지표를 활성화합니다.

Kueue 지표 목록은 다음 표에 나와 있습니다. 이러한 지표는 다음 CloudWatch의 `ContainerInsights/Prometheus` 네임스페이스에 게시됩니다. 이러한 지표 중 일부는 다음과 같은 차원을 사용합니다.
+ `ClusterQueue`는 ClusterQueue의 이름입니다.
+ `Status`의 가능한 값은 `active` 및 `inadmissible`입니다.
+ `Reason`의 가능한 값은 `Preempted`, `PodsReadyTimeout`, `AdmissionCheck`, `ClusterQueueStopped`, `InactiveWorkload`입니다.
+ `Flavor`는 참조된 flavor입니다.
+ `Resource`는 `cpu`, `memory`, `gpu` 등과 같은 클러스터 컴퓨터 리소스를 참조합니다.


| 지표 이름 | 측정 기준 | 설명 | 
| --- | --- | --- | 
|  `kueue_pending_workloads` |  `ClusterName`, `ClusterQueue`, `Status` `ClusterName`, `ClusterQueue` `ClusterName`, `Status` `ClusterName`  |  보류 중인 워크로드 수입니다.  | 
|  `kueue_evicted_workloads_total` |  `ClusterName`, `ClusterQueue`, `Reason` `ClusterName`, `ClusterQueue` `ClusterName`, `Reason` `ClusterName`  |  제거된 총 워크로드의 수입니다.  | 
|  `kueue_admitted_active_workloads` |  `ClusterName`, `ClusterQueue` `ClusterName`  |  활성(일시 중지되지 않고 완료되지 않음) 상태인 허용된 워크로드 수입니다.  | 
|  `kueue_cluster_queue_resource_usage` |  `ClusterName`, `ClusterQueue`, `Resource`, `Flavor` `ClusterName`, `ClusterQueue`, `Resource` `ClusterName`, `ClusterQueue`, `Flavor` `ClusterName`, `ClusterQueue` `ClusterName`  |  ClusterQueue의 총 리소스 사용량을 보고합니다.  | 
|  `kueue_cluster_queue_nominal_quota` |  `ClusterName`, `ClusterQueue`, `Resource`, `Flavor` `ClusterName`, `ClusterQueue`, `Resource` `ClusterName`, `ClusterQueue`, `Flavor` `ClusterName`, `ClusterQueue` `ClusterName`  |  ClusterQueue의 리소스 할당량을 보고합니다.  | 

# Container Insights 성능 로그 참조
<a name="Container-Insights-reference"></a>

이 단원에는 Container Insights가 성능 로그 이벤트를 사용하여 지표를 수집하는 방법에 관한 참조 정보가 포함되어 있습니다. 컨테이너 인사이트를 배포하면 성능 로그 이벤트에 대한 로그 그룹이 자동으로 생성됩니다. 이 로그 그룹을 직접 생성할 필요는 없습니다.

**Topics**
+ [Amazon ECS의 Container Insights 성능 로그 이벤트](Container-Insights-reference-performance-logs-ECS.md)
+ [Amazon EKS 및 Kubernetes의 Container Insights 성능 로그 이벤트](Container-Insights-reference-performance-logs-EKS.md)
+ [Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드](Container-Insights-reference-performance-entries-EKS.md)

# Amazon ECS의 Container Insights 성능 로그 이벤트
<a name="Container-Insights-reference-performance-logs-ECS"></a>

다음은 Container Insights가 Amazon ECS에서 수집하는 성능 로그 이벤트의 예입니다.

이러한 로그는 CloudWatch Logs의 `/aws/ecs/containerinsights/CLUSTER_NAME/performance`라는 로그 그룹에 있습니다. 해당 로그 그룹 내에서 각 컨테이너 인스턴스에는 `AgentTelemetry-CONTAINER_INSTANCE_ID`라는 로그 스트림이 있습니다.

`{ $.Type = "Container" }`와 같은 쿼리를 사용하여 이러한 로그를 쿼리하면 모든 컨테이너 로그 이벤트를 볼 수 있습니다.

**유형: 컨테이너**

```
{
	"Version":"0",
	"Type":"Container",
	"ContainerName":"sleep",
	"TaskId":"7ac4dfba69214411b4783a3b8189c9ba",
	"TaskDefinitionFamily":"sleep360",
	"TaskDefinitionRevision":"1",
	"ContainerInstanceId":"0d7650e6dec34c1a9200f72098071e8f",
	"EC2InstanceId":"i-0c470579dbcdbd2f3",
	"ClusterName":"MyCluster",
	"Image":"busybox",
	"ContainerKnownStatus":"RUNNING",
	"Timestamp":1623963900000,
	"CpuUtilized":0.0,
	"CpuReserved":10.0,
	"MemoryUtilized":0,
	"MemoryReserved":10,
	"StorageReadBytes":0,
	"StorageWriteBytes":0,
	"NetworkRxBytes":0,
	"NetworkRxDropped":0,
	"NetworkRxErrors":0,
	"NetworkRxPackets":14,
	"NetworkTxBytes":0,
	"NetworkTxDropped":0,
	"NetworkTxErrors":0,
	"NetworkTxPackets":0
}
```

**유형: 작업**

`StorageReadBytes` 및 `StorageWriteBytes`의 단위가 바이트/초인 경우에도 값은 각 스토리지에서의 누적 읽기 및 쓰기 바이트 수를 나타냅니다.

```
{
    "Version": "0",
    "Type": "Task",
    "TaskId": "7ac4dfba69214411b4783a3b8189c9ba",
    "TaskDefinitionFamily": "sleep360",
    "TaskDefinitionRevision": "1",
    "ContainerInstanceId": "0d7650e6dec34c1a9200f72098071e8f",
    "EC2InstanceId": "i-0c470579dbcdbd2f3",
    "ClusterName": "MyCluster",
    "AccountID": "637146863587",
    "Region": "us-west-2",
    "AvailabilityZone": "us-west-2b",
    "KnownStatus": "RUNNING",
    "LaunchType": "EC2",
    "PullStartedAt": 1623963608201,
    "PullStoppedAt": 1623963610065,
    "CreatedAt": 1623963607094,
    "StartedAt": 1623963610382,
    "Timestamp": 1623963900000,
    "CpuUtilized": 0.0,
    "CpuReserved": 10.0,
    "MemoryUtilized": 0,
    "MemoryReserved": 10,
    "StorageReadBytes": 0,
    "StorageWriteBytes": 0,
    "NetworkRxBytes": 0,
    "NetworkRxDropped": 0,
    "NetworkRxErrors": 0,
    "NetworkRxPackets": 14,
    "NetworkTxBytes": 0,
    "NetworkTxDropped": 0,
    "NetworkTxErrors": 0,
    "NetworkTxPackets": 0,
    "EBSFilesystemUtilized": 10,
    "EBSFilesystemSize": 20,
    "CloudWatchMetrics": [
        {
            "Namespace": "ECS/ContainerInsights",
            "Metrics": [
                {
                    "Name": "CpuUtilized",
                    "Unit": "None"
                },
                {
                    "Name": "CpuReserved",
                    "Unit": "None"
                },
                {
                    "Name": "MemoryUtilized",
                    "Unit": "Megabytes"
                },
                {
                    "Name": "MemoryReserved",
                    "Unit": "Megabytes"
                },
                {
                    "Name": "StorageReadBytes",
                    "Unit": "Bytes/Second"
                },
                {
                    "Name": "StorageWriteBytes",
                    "Unit": "Bytes/Second"
                },
                {
                    "Name": "NetworkRxBytes",
                    "Unit": "Bytes/Second"
                },
                {
                    "Name": "NetworkTxBytes",
                    "Unit": "Bytes/Second"
                },
                {
                    "Name": "EBSFilesystemSize",
                    "Unit": "Gigabytes"
                },
                {
                    "Name": "EBSFilesystemUtilzed",
                    "Unit": "Gigabytes"
                }
            ],
            "Dimensions": [
                ["ClusterName"],
                [
                    "ClusterName",
                    "TaskDefinitionFamily"
                ]
            ]
        }
    ]
}
```

**유형: 서비스**

```
{   
    "Version": "0",
    "Type": "Service",
    "ServiceName": "myCIService",
    "ClusterName": "myCICluster",
    "Timestamp": 1561586460000,
    "DesiredTaskCount": 2,
    "RunningTaskCount": 2,
    "PendingTaskCount": 0,
    "DeploymentCount": 1,
    "TaskSetCount": 0,
    "CloudWatchMetrics": [
        {
            "Namespace": "ECS/ContainerInsights",
            "Metrics": [
                {
                    "Name": "DesiredTaskCount",
                    "Unit": "Count"
                },
                {
                    "Name": "RunningTaskCount",
                    "Unit": "Count"
                },
                {
                    "Name": "PendingTaskCount",
                    "Unit": "Count"
                },
                {
                    "Name": "DeploymentCount",
                    "Unit": "Count"
                },
                {
                    "Name": "TaskSetCount",
                    "Unit": "Count"
                }
            ],
            "Dimensions": [
                [
                    "ServiceName",
                    "ClusterName"
                ]
            ]
        }
    ]
}
```

**유형: 볼륨**

```
{
    "Version": "0",
    "Type": "Volume",
    "TaskDefinitionFamily": "myCITaskDef",
    "TaskId": "7ac4dfba69214411b4783a3b8189c9ba",
    "ClusterName": "myCICluster",
    "ServiceName": "myCIService",
    "VolumeId": "vol-1233436545ff708cb",
    "InstanceId": "i-0c470579dbcdbd2f3",
    "LaunchType": "EC2",
    "VolumeName": "MyVolumeName",
    "EBSFilesystemUtilized": 10,
    "EBSFilesystemSize": 20,
    "CloudWatchMetrics": [
        {
            "Namespace": "ECS/ContainerInsights",
            "Metrics": [
                {
                    "Name": "EBSFilesystemSize",
                    "Unit": "Gigabytes"
                },
                {
                    "Name": "EBSFilesystemUtilzed",
                    "Unit": "Gigabytes"
                }
            ],
            "Dimensions": [
                ["ClusterName"],
                [
                    "VolumeName",
                    "TaskDefinitionFamily",
                    "ClusterName"
                ],
                [
                    "ServiceName",
                    "ClusterName"
                ]
            ]
        }
    ]
}
```

**유형: 클러스터**

```
{
    "Version": "0",
    "Type": "Cluster",
    "ClusterName": "myCICluster",
    "Timestamp": 1561587300000,
    "TaskCount": 5,
    "ContainerInstanceCount": 5,
    "ServiceCount": 2,
    "CloudWatchMetrics": [
        {
            "Namespace": "ECS/ContainerInsights",
            "Metrics": [
                {
                    "Name": "TaskCount",
                    "Unit": "Count"
                },
                {
                    "Name": "ContainerInstanceCount",
                    "Unit": "Count"
                },
                {
                    "Name": "ServiceCount",
                    "Unit": "Count"
                }
            ],
            "Dimensions": [
                [
                    "ClusterName"
                ]
            ]
        }
    ]
}
```

# Amazon EKS 및 Kubernetes의 Container Insights 성능 로그 이벤트
<a name="Container-Insights-reference-performance-logs-EKS"></a>

다음은 Container Insights가 Amazon EKS 및 Kubernetes 클러스터에서 수집하는 성능 로그 이벤트의 예입니다.

**유형: 노드**

```
{
  "AutoScalingGroupName": "eksctl-myCICluster-nodegroup-standard-workers-NodeGroup-1174PV2WHZAYU",
  "CloudWatchMetrics": [
    {
      "Metrics": [
        {
          "Unit": "Percent",
          "Name": "node_cpu_utilization"
        },
        {
          "Unit": "Percent",
          "Name": "node_memory_utilization"
        },
        {
          "Unit": "Bytes/Second",
          "Name": "node_network_total_bytes"
        },
        {
          "Unit": "Percent",
          "Name": "node_cpu_reserved_capacity"
        },
        {
          "Unit": "Percent",
          "Name": "node_memory_reserved_capacity"
        },
        {
          "Unit": "Count",
          "Name": "node_number_of_running_pods"
        },
        {
          "Unit": "Count",
          "Name": "node_number_of_running_containers"
        }
      ],
      "Dimensions": [
        [
          "NodeName",
          "InstanceId",
          "ClusterName"
        ]
      ],
      "Namespace": "ContainerInsights"
    },
    {
      "Metrics": [
        {
          "Unit": "Percent",
          "Name": "node_cpu_utilization"
        },
        {
          "Unit": "Percent",
          "Name": "node_memory_utilization"
        },
        {
          "Unit": "Bytes/Second",
          "Name": "node_network_total_bytes"
        },
        {
          "Unit": "Percent",
          "Name": "node_cpu_reserved_capacity"
        },
        {
          "Unit": "Percent",
          "Name": "node_memory_reserved_capacity"
        },
        {
          "Unit": "Count",
          "Name": "node_number_of_running_pods"
        },
        {
          "Unit": "Count",
          "Name": "node_number_of_running_containers"
        },
        {
          "Name": "node_cpu_usage_total"
        },
        {
          "Name": "node_cpu_limit"
        },
        {
          "Unit": "Bytes",
          "Name": "node_memory_working_set"
        },
        {
          "Unit": "Bytes",
          "Name": "node_memory_limit"
        }
      ],
      "Dimensions": [
        [
          "ClusterName"
        ]
      ],
      "Namespace": "ContainerInsights"
    }
  ],
  "ClusterName": "myCICluster",
  "InstanceId": "i-1234567890123456",
  "InstanceType": "t3.xlarge",
  "NodeName": "ip-192-0-2-0.us-west-2.compute.internal",
  "Sources": [
    "cadvisor",
    "/proc",
    "pod",
    "calculated"
  ],
  "Timestamp": "1567096682364",
  "Type": "Node",
  "Version": "0",
  "kubernetes": {
    "host": "ip-192-168-75-26.us-west-2.compute.internal"
  },
  "node_cpu_limit": 4000,
  "node_cpu_request": 1130,
  "node_cpu_reserved_capacity": 28.249999999999996,
  "node_cpu_usage_system": 33.794636630852764,
  "node_cpu_usage_total": 136.47852169244098,
  "node_cpu_usage_user": 71.67075111567326,
  "node_cpu_utilization": 3.4119630423110245,
  "node_memory_cache": 3103297536,
  "node_memory_failcnt": 0,
  "node_memory_hierarchical_pgfault": 0,
  "node_memory_hierarchical_pgmajfault": 0,
  "node_memory_limit": 16624865280,
  "node_memory_mapped_file": 406646784,
  "node_memory_max_usage": 4230746112,
  "node_memory_pgfault": 0,
  "node_memory_pgmajfault": 0,
  "node_memory_request": 1115684864,
  "node_memory_reserved_capacity": 6.7109407818311055,
  "node_memory_rss": 798146560,
  "node_memory_swap": 0,
  "node_memory_usage": 3901444096,
  "node_memory_utilization": 6.601302600149552,
  "node_memory_working_set": 1097457664,
  "node_network_rx_bytes": 35918.392817386324,
  "node_network_rx_dropped": 0,
  "node_network_rx_errors": 0,
  "node_network_rx_packets": 157.67565245448117,
  "node_network_total_bytes": 68264.20276554905,
  "node_network_tx_bytes": 32345.80994816272,
  "node_network_tx_dropped": 0,
  "node_network_tx_errors": 0,
  "node_network_tx_packets": 154.21455923431654,
  "node_number_of_running_containers": 16,
  "node_number_of_running_pods": 13
}
```

**유형: NodeFS**

```
{
  "AutoScalingGroupName": "eksctl-myCICluster-nodegroup-standard-workers-NodeGroup-1174PV2WHZAYU",
  "CloudWatchMetrics": [
    {
      "Metrics": [
        {
          "Unit": "Percent",
          "Name": "node_filesystem_utilization"
        }
      ],
      "Dimensions": [
        [
          "NodeName",
          "InstanceId",
          "ClusterName"
        ],
        [
          "ClusterName"
        ]
      ],
      "Namespace": "ContainerInsights"
    }
  ],
  "ClusterName": "myCICluster",
  "EBSVolumeId": "aws://us-west-2b/vol-0a53108976d4a2fda",
  "InstanceId": "i-1234567890123456",
  "InstanceType": "t3.xlarge",
  "NodeName": "ip-192-0-2-0.us-west-2.compute.internal",
  "Sources": [
    "cadvisor",
    "calculated"
  ],
  "Timestamp": "1567097939726",
  "Type": "NodeFS",
  "Version": "0",
  "device": "/dev/nvme0n1p1",
  "fstype": "vfs",
  "kubernetes": {
    "host": "ip-192-168-75-26.us-west-2.compute.internal"
  },
  "node_filesystem_available": 17298395136,
  "node_filesystem_capacity": 21462233088,
  "node_filesystem_inodes": 10484720,
  "node_filesystem_inodes_free": 10367158,
  "node_filesystem_usage": 4163837952,
  "node_filesystem_utilization": 19.400767547940255
}
```

**유형: NodeDiskIO**

```
{
  "AutoScalingGroupName": "eksctl-myCICluster-nodegroup-standard-workers-NodeGroup-1174PV2WHZAYU",
  "ClusterName": "myCICluster",
  "EBSVolumeId": "aws://us-west-2b/vol-0a53108976d4a2fda",
  "InstanceId": "i-1234567890123456",
  "InstanceType": "t3.xlarge",
  "NodeName": "ip-192-0-2-0.us-west-2.compute.internal",
  "Sources": [
    "cadvisor"
  ],
  "Timestamp": "1567096928131",
  "Type": "NodeDiskIO",
  "Version": "0",
  "device": "/dev/nvme0n1",
  "kubernetes": {
    "host": "ip-192-168-75-26.us-west-2.compute.internal"
  },
  "node_diskio_io_service_bytes_async": 9750.505814277016,
  "node_diskio_io_service_bytes_read": 0,
  "node_diskio_io_service_bytes_sync": 230.6174506688036,
  "node_diskio_io_service_bytes_total": 9981.123264945818,
  "node_diskio_io_service_bytes_write": 9981.123264945818,
  "node_diskio_io_serviced_async": 1.153087253344018,
  "node_diskio_io_serviced_read": 0,
  "node_diskio_io_serviced_sync": 0.03603397666700056,
  "node_diskio_io_serviced_total": 1.1891212300110185,
  "node_diskio_io_serviced_write": 1.1891212300110185
}
```

**유형: NodeNet**

```
{
  "AutoScalingGroupName": "eksctl-myCICluster-nodegroup-standard-workers-NodeGroup-1174PV2WHZAYU",
  "ClusterName": "myCICluster",
  "InstanceId": "i-1234567890123456",
  "InstanceType": "t3.xlarge",
  "NodeName": "ip-192-0-2-0.us-west-2.compute.internal",
  "Sources": [
    "cadvisor",
    "calculated"
  ],
  "Timestamp": "1567096928131",
  "Type": "NodeNet",
  "Version": "0",
  "interface": "eni972f6bfa9a0",
  "kubernetes": {
    "host": "ip-192-168-75-26.us-west-2.compute.internal"
  },
  "node_interface_network_rx_bytes": 3163.008420864309,
  "node_interface_network_rx_dropped": 0,
  "node_interface_network_rx_errors": 0,
  "node_interface_network_rx_packets": 16.575629266820258,
  "node_interface_network_total_bytes": 3518.3935157426017,
  "node_interface_network_tx_bytes": 355.385094878293,
  "node_interface_network_tx_dropped": 0,
  "node_interface_network_tx_errors": 0,
  "node_interface_network_tx_packets": 3.9997714100370625
}
```

**유형: Pod**

```
{
  "AutoScalingGroupName": "eksctl-myCICluster-nodegroup-standard-workers-NodeGroup-1174PV2WHZAYU",
  "CloudWatchMetrics": [
    {
      "Metrics": [
        {
          "Unit": "Percent",
          "Name": "pod_cpu_utilization"
        },
        {
          "Unit": "Percent",
          "Name": "pod_memory_utilization"
        },
        {
          "Unit": "Bytes/Second",
          "Name": "pod_network_rx_bytes"
        },
        {
          "Unit": "Bytes/Second",
          "Name": "pod_network_tx_bytes"
        },
        {
          "Unit": "Percent",
          "Name": "pod_cpu_utilization_over_pod_limit"
        },
        {
          "Unit": "Percent",
          "Name": "pod_memory_utilization_over_pod_limit"
        }
      ],
      "Dimensions": [
        [
          "PodName",
          "Namespace",
          "ClusterName"
        ],
        [
          "Service",
          "Namespace",
          "ClusterName"
        ],
        [
          "Namespace",
          "ClusterName"
        ],
        [
          "ClusterName"
        ]
      ],
      "Namespace": "ContainerInsights"
    },
    {
      "Metrics": [
        {
          "Unit": "Percent",
          "Name": "pod_cpu_reserved_capacity"
        },
        {
          "Unit": "Percent",
          "Name": "pod_memory_reserved_capacity"
        }
      ],
      "Dimensions": [
        [
          "PodName",
          "Namespace",
          "ClusterName"
        ],
        [
          "ClusterName"
        ]
      ],
      "Namespace": "ContainerInsights"
    },
    {
      "Metrics": [
        {
          "Unit": "Count",
          "Name": "pod_number_of_container_restarts"
        }
      ],
      "Dimensions": [
        [
          "PodName",
          "Namespace",
          "ClusterName"
        ]
      ],
      "Namespace": "ContainerInsights"
    }
  ],
  "ClusterName": "myCICluster",
  "InstanceId": "i-1234567890123456",
  "InstanceType": "t3.xlarge",
  "Namespace": "amazon-cloudwatch",
  "NodeName": "ip-192-0-2-0.us-west-2.compute.internal",
  "PodName": "cloudwatch-agent-statsd",
  "Service": "cloudwatch-agent-statsd",
  "Sources": [
    "cadvisor",
    "pod",
    "calculated"
  ],
  "Timestamp": "1567097351092",
  "Type": "Pod",
  "Version": "0",
  "kubernetes": {
    "host": "ip-192-168-75-26.us-west-2.compute.internal",
    "labels": {
      "app": "cloudwatch-agent-statsd",
      "pod-template-hash": "df44f855f"
    },
    "namespace_name": "amazon-cloudwatch",
    "pod_id": "2f4ff5ac-c813-11e9-a31d-06e9dde32928",
    "pod_name": "cloudwatch-agent-statsd-df44f855f-ts4q2",
    "pod_owners": [
      {
        "owner_kind": "Deployment",
        "owner_name": "cloudwatch-agent-statsd"
      }
    ],
    "service_name": "cloudwatch-agent-statsd"
  },
  "pod_cpu_limit": 200,
  "pod_cpu_request": 200,
  "pod_cpu_reserved_capacity": 5,
  "pod_cpu_usage_system": 1.4504841104992765,
  "pod_cpu_usage_total": 5.817016867430125,
  "pod_cpu_usage_user": 1.1281543081661038,
  "pod_cpu_utilization": 0.14542542168575312,
  "pod_cpu_utilization_over_pod_limit": 2.9085084337150624,
  "pod_memory_cache": 8192,
  "pod_memory_failcnt": 0,
  "pod_memory_hierarchical_pgfault": 0,
  "pod_memory_hierarchical_pgmajfault": 0,
  "pod_memory_limit": 104857600,
  "pod_memory_mapped_file": 0,
  "pod_memory_max_usage": 25268224,
  "pod_memory_pgfault": 0,
  "pod_memory_pgmajfault": 0,
  "pod_memory_request": 104857600,
  "pod_memory_reserved_capacity": 0.6307275170893897,
  "pod_memory_rss": 22777856,
  "pod_memory_swap": 0,
  "pod_memory_usage": 25141248,
  "pod_memory_utilization": 0.10988455961791709,
  "pod_memory_utilization_over_pod_limit": 17.421875,
  "pod_memory_working_set": 18268160,
  "pod_network_rx_bytes": 9880.697124714186,
  "pod_network_rx_dropped": 0,
  "pod_network_rx_errors": 0,
  "pod_network_rx_packets": 107.80005532263283,
  "pod_network_total_bytes": 10158.829201483635,
  "pod_network_tx_bytes": 278.13207676944796,
  "pod_network_tx_dropped": 0,
  "pod_network_tx_errors": 0,
  "pod_network_tx_packets": 1.146027574644318,
  "pod_number_of_container_restarts": 0,
  "pod_number_of_containers": 1,
  "pod_number_of_running_containers": 1,
  "pod_status": "Running"
}
```

**유형: PodNet**

```
{
  "AutoScalingGroupName": "eksctl-myCICluster-nodegroup-standard-workers-NodeGroup-1174PV2WHZAYU",
  "ClusterName": "myCICluster",
  "InstanceId": "i-1234567890123456",
  "InstanceType": "t3.xlarge",
  "Namespace": "amazon-cloudwatch",
  "NodeName": "ip-192-0-2-0.us-west-2.compute.internal",
  "PodName": "cloudwatch-agent-statsd",
  "Service": "cloudwatch-agent-statsd",
  "Sources": [
    "cadvisor",
    "calculated"
  ],
  "Timestamp": "1567097351092",
  "Type": "PodNet",
  "Version": "0",
  "interface": "eth0",
  "kubernetes": {
    "host": "ip-192-168-75-26.us-west-2.compute.internal",
    "labels": {
      "app": "cloudwatch-agent-statsd",
      "pod-template-hash": "df44f855f"
    },
    "namespace_name": "amazon-cloudwatch",
    "pod_id": "2f4ff5ac-c813-11e9-a31d-06e9dde32928",
    "pod_name": "cloudwatch-agent-statsd-df44f855f-ts4q2",
    "pod_owners": [
      {
        "owner_kind": "Deployment",
        "owner_name": "cloudwatch-agent-statsd"
      }
    ],
    "service_name": "cloudwatch-agent-statsd"
  },
  "pod_interface_network_rx_bytes": 9880.697124714186,
  "pod_interface_network_rx_dropped": 0,
  "pod_interface_network_rx_errors": 0,
  "pod_interface_network_rx_packets": 107.80005532263283,
  "pod_interface_network_total_bytes": 10158.829201483635,
  "pod_interface_network_tx_bytes": 278.13207676944796,
  "pod_interface_network_tx_dropped": 0,
  "pod_interface_network_tx_errors": 0,
  "pod_interface_network_tx_packets": 1.146027574644318
}
```

**유형: 컨테이너**

```
{
  "AutoScalingGroupName": "eksctl-myCICluster-nodegroup-standard-workers-NodeGroup-sample",
  "ClusterName": "myCICluster",
  "InstanceId": "i-1234567890123456",
  "InstanceType": "t3.xlarge",
  "Namespace": "amazon-cloudwatch",
  "NodeName": "ip-192-0-2-0.us-west-2.compute.internal",
  "PodName": "cloudwatch-agent-statsd",
  "Service": "cloudwatch-agent-statsd",
  "Sources": [
    "cadvisor",
    "pod",
    "calculated"
  ],
  "Timestamp": "1567097399912",
  "Type": "Container",
  "Version": "0",
  "container_cpu_limit": 200,
  "container_cpu_request": 200,
  "container_cpu_usage_system": 1.87958283771964,
  "container_cpu_usage_total": 6.159993652997942,
  "container_cpu_usage_user": 1.6707403001952357,
  "container_cpu_utilization": 0.15399984132494854,
  "container_memory_cache": 8192,
  "container_memory_failcnt": 0,
  "container_memory_hierarchical_pgfault": 0,
  "container_memory_hierarchical_pgmajfault": 0,
  "container_memory_limit": 104857600,
  "container_memory_mapped_file": 0,
  "container_memory_max_usage": 24580096,
  "container_memory_pgfault": 0,
  "container_memory_pgmajfault": 0,
  "container_memory_request": 104857600,
  "container_memory_rss": 22736896,
  "container_memory_swap": 0,
  "container_memory_usage": 24453120,
  "container_memory_utilization": 0.10574541028701798,
  "container_memory_working_set": 17580032,
  "container_status": "Running",
  "kubernetes": {
    "container_name": "cloudwatch-agent",
    "docker": {
      "container_id": "8967b6b37da239dfad197c9fdea3e5dfd35a8a759ec86e2e4c3f7b401e232706"
    },
    "host": "ip-192-168-75-26.us-west-2.compute.internal",
    "labels": {
      "app": "cloudwatch-agent-statsd",
      "pod-template-hash": "df44f855f"
    },
    "namespace_name": "amazon-cloudwatch",
    "pod_id": "2f4ff5ac-c813-11e9-a31d-06e9dde32928",
    "pod_name": "cloudwatch-agent-statsd-df44f855f-ts4q2",
    "pod_owners": [
      {
        "owner_kind": "Deployment",
        "owner_name": "cloudwatch-agent-statsd"
      }
    ],
    "service_name": "cloudwatch-agent-statsd"
  },
  "number_of_container_restarts": 0
}
```

**유형: ContainerFS**

```
{
  "AutoScalingGroupName": "eksctl-myCICluster-nodegroup-standard-workers-NodeGroup-1174PV2WHZAYU",
  "ClusterName": "myCICluster",
  "EBSVolumeId": "aws://us-west-2b/vol-0a53108976d4a2fda",
  "InstanceId": "i-1234567890123456",
  "InstanceType": "t3.xlarge",
  "Namespace": "amazon-cloudwatch",
  "NodeName": "ip-192-0-2-0.us-west-2.compute.internal",
  "PodName": "cloudwatch-agent-statsd",
  "Service": "cloudwatch-agent-statsd",
  "Sources": [
    "cadvisor",
    "calculated"
  ],
  "Timestamp": "1567097399912",
  "Type": "ContainerFS",
  "Version": "0",

  "device": "/dev/nvme0n1p1",
  "fstype": "vfs",
  "kubernetes": {
    "container_name": "cloudwatch-agent",
    "docker": {
      "container_id": "8967b6b37da239dfad197c9fdea3e5dfd35a8a759ec86e2e4c3f7b401e232706"
    },
    "host": "ip-192-168-75-26.us-west-2.compute.internal",
    "labels": {
      "app": "cloudwatch-agent-statsd",
      "pod-template-hash": "df44f855f"
    },
    "namespace_name": "amazon-cloudwatch",
    "pod_id": "2f4ff5ac-c813-11e9-a31d-06e9dde32928",
    "pod_name": "cloudwatch-agent-statsd-df44f855f-ts4q2",
    "pod_owners": [
      {
        "owner_kind": "Deployment",
        "owner_name": "cloudwatch-agent-statsd"
      }
    ],
    "service_name": "cloudwatch-agent-statsd"
  }
}
```

**유형: 클러스터**

```
{
  "CloudWatchMetrics": [
    {
      "Metrics": [
        {
          "Unit": "Count",
          "Name": "cluster_node_count"
        },
        {
          "Unit": "Count",
          "Name": "cluster_failed_node_count"
        }
      ],
      "Dimensions": [
        [
          "ClusterName"
        ]
      ],
      "Namespace": "ContainerInsights"
    }
  ],
  "ClusterName": "myCICluster",
  "Sources": [
    "apiserver"
  ],
  "Timestamp": "1567097534160",
  "Type": "Cluster",
  "Version": "0",
  "cluster_failed_node_count": 0,
  "cluster_node_count": 3
}
```

**유형: ClusterService**

```
{
  "CloudWatchMetrics": [
    {
      "Metrics": [
        {
          "Unit": "Count",
          "Name": "service_number_of_running_pods"
        }
      ],
      "Dimensions": [
        [
          "Service",
          "Namespace",
          "ClusterName"
        ],
        [
          "ClusterName"
        ]
      ],
      "Namespace": "ContainerInsights"
    }
  ],
  "ClusterName": "myCICluster",
  "Namespace": "amazon-cloudwatch",
  "Service": "cloudwatch-agent-statsd",
  "Sources": [
    "apiserver"
  ],
  "Timestamp": "1567097534160",
  "Type": "ClusterService",
  "Version": "0",
  "kubernetes": {
    "namespace_name": "amazon-cloudwatch",
    "service_name": "cloudwatch-agent-statsd"
  },
  "service_number_of_running_pods": 1
}
```

**유형: ClusterNamespace**

```
{
  "CloudWatchMetrics": [
    {
      "Metrics": [
        {
          "Unit": "Count",
          "Name": "namespace_number_of_running_pods"
        }
      ],
      "Dimensions": [
        [
          "Namespace",
          "ClusterName"
        ],
        [
          "ClusterName"
        ]
      ],
      "Namespace": "ContainerInsights"
    }
  ],
  "ClusterName": "myCICluster",
  "Namespace": "amazon-cloudwatch",
  "Sources": [
    "apiserver"
  ],
  "Timestamp": "1567097594160",
  "Type": "ClusterNamespace",
  "Version": "0",
  "kubernetes": {
    "namespace_name": "amazon-cloudwatch"
  },
  "namespace_number_of_running_pods": 7
}
```

# Amazon EKS 및 Kubernetes에 대한 성능 로그 이벤트의 관련 필드
<a name="Container-Insights-reference-performance-entries-EKS"></a>

Amazon EKS 및 Kubernetes의 경우 컨테이너화된 CloudWatch 에이전트가 데이터를 성능 로그 이벤트로 내보냅니다. 이를 통해 CloudWatch는 카디널리티가 높은 데이터를 수집하고 저장할 수 있습니다. CloudWatch는 성능 로그 이벤트의 데이터를 사용하여 세분화된 세부 정보를 잃지 않고도 클러스터, 노드 및 포드 수준에서 집계된 CloudWatch 지표를 생성합니다.

다음 표에는 이러한 성능 로그 이벤트에서 Container Insights 지표 데이터의 수집과 관련된 필드가 나와 있습니다. CloudWatch Logs Insights를 사용해 이러한 필드 중 어떤 것에 대해서든 쿼리를 수행하여 데이터를 수집하거나 문제를 조사할 수 있습니다. 자세한 내용은 [CloudWatch Logs Insights를 사용한 로그 데이터 분석](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html) 단원을 참조하세요.


| Type | 로그 필드 | 소스 | 공식 또는 참고 | 
| --- | --- | --- | --- | 
|  포드 |  `pod_cpu_utilization`  |  계산 완료  |  공식: `pod_cpu_usage_total / node_cpu_limit`  | 
|  포드 |  `pod_cpu_usage_total` `pod_cpu_usage_total`는 밀리코어 단위로 보고됩니다.  |  cadvisor  |   | 
|  포드 |  `pod_cpu_limit`  |  계산 완료  |  공식: `sum(container_cpu_limit)`  `sum(container_cpu_limit)`에는 이미 완료된 포드가 포함되어 있습니다. Pod의 어떤 컨테이너에도 CPU 한도가 정의되어 있지 않은 경우에는 로그 이벤트에 이 필드가 나타나지 않습니다. 여기에는 [ init 컨테이너](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/#resources)가 포함되어 있습니다.  | 
|  포드 |  `pod_cpu_request`  |  계산 완료  |  공식: `sum(container_cpu_request)` `container_cpu_request`이 설정되어 있지 않을 수도 있습니다. 설정된 것만 합계에 포함됩니다.  | 
|  포드 |  `pod_cpu_utilization_over_pod_limit`  |  계산 완료  |  공식: `pod_cpu_usage_total / pod_cpu_limit`  | 
|  포드 |  `pod_cpu_reserved_capacity`  |  계산 완료  |  공식: `pod_cpu_request / node_cpu_limit`  | 
|  포드 |  `pod_memory_utilization`  |  계산 완료  |  공식: `pod_memory_working_set / node_memory_limit` 노드 메모리 제한에 대한 포드 메모리 사용량의 백분율입니다.  | 
|  포드 |  `pod_memory_working_set`  |  cadvisor  |   | 
|  포드 |  `pod_memory_limit`  |  계산 완료  |  공식: `sum(container_memory_limit)` Pod의 어떤 컨테이너에도 메모리 한도가 정의되어 있지 않은 경우에는 로그 이벤트에 이 필드가 나타나지 않습니다. 여기에는 [ init 컨테이너](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/#resources)가 포함되어 있습니다.  | 
|  포드 |  `pod_memory_request`  |  계산 완료  |  공식: `sum(container_memory_request)` `container_memory_request`이 설정되어 있지 않을 수도 있습니다. 설정된 것만 합계에 포함됩니다.  | 
|  포드 |  `pod_memory_utilization_over_pod_limit`  |  계산 완료  |  공식: `pod_memory_working_set / pod_memory_limit` Pod의 어떤 컨테이너에도 메모리 한도가 정의되어 있지 않은 경우에는 로그 이벤트에 이 필드가 나타나지 않습니다. 여기에는 [ init 컨테이너](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/#resources)가 포함되어 있습니다.  | 
|  포드 |  `pod_memory_reserved_capacity`  |  계산 완료  |  공식: `pod_memory_request / node_memory_limit`  | 
|  포드 |  `pod_network_tx_bytes`  |  계산 완료  |  공식: `sum(pod_interface_network_tx_bytes)` 이 데이터는 Pod별로 모든 네트워크 인스턴스에서 사용할 수 있습니다. CloudWatch 에이전트는 합계를 계산하고 지표 추출 규칙을 추가합니다.  | 
|  포드 |  `pod_network_rx_bytes`  |  계산 완료  |  공식: `sum(pod_interface_network_rx_bytes)`  | 
|  포드 |  `pod_network_total_bytes`  |  계산 완료  |  공식: `pod_network_rx_bytes + pod_network_tx_bytes`  | 
|  PodNet |  `pod_interface_network_rx_bytes`  |  cadvisor  | 이 데이터는 Pod 네트워크 인터페이스에 대한 초당 네트워크 rx 바이트입니다.  | 
|  PodNet |  `pod_interface_network_tx_bytes`  |  cadvisor  | 이 데이터는 Pod 네트워크 인터페이스에 대한 초당 네트워크 tx 바이트입니다. | 
|  컨테이너 |  `container_cpu_usage_total`  |  cadvisor  |   | 
|  컨테이너 |  `container_cpu_limit`  |  cadvisor  |  설정되어 있지 않을 수도 있습니다. 설정이 되지 않은 경우에는 표시되지 않습니다. | 
|  컨테이너 |  `container_cpu_request`  |  cadvisor  |  설정되어 있지 않을 수도 있습니다. 설정이 되지 않은 경우에는 표시되지 않습니다. | 
|  컨테이너 |  `container_memory_working_set`  |  cadvisor  |   | 
|  컨테이너 |  `container_memory_limit`  |  pod  |  설정되어 있지 않을 수도 있습니다. 설정이 되지 않은 경우에는 표시되지 않습니다. | 
|  컨테이너 |  `container_memory_request`  |  pod  |  설정되어 있지 않을 수도 있습니다. 설정이 되지 않은 경우에는 표시되지 않습니다. | 
|  노드 |  `node_cpu_utilization`  |  계산 완료  |  공식: `node_cpu_usage_total / node_cpu_limit`  | 
|  노드 |  `node_cpu_usage_total`  |  cadvisor  |   | 
|  노드 |  `node_cpu_limit`  |  /proc  |   | 
|  노드 |  `node_cpu_request`  |  계산 완료  | 공식: `sum(pod_cpu_request)` cronjobs의 경우 `node_cpu_request`에는 완성된 포드의 요청이 포함되어 있습니다. 이로 인해 `node_cpu_reserved_capacity`의 값이 높아질 수 있습니다.  | 
|  노드 |  `node_cpu_reserved_capacity`  |  계산 완료  | 공식: `node_cpu_request / node_cpu_limit`  | 
|  노드 |  `node_memory_utilization`  |  계산 완료  | 공식: `node_memory_working_set / node_memory_limit`  | 
|  노드 |  `node_memory_working_set`  |  cadvisor  |   | 
|  노드 |  `node_memory_limit`  |  /proc  |   | 
|  노드 |  `node_memory_request`  |  계산 완료  |  공식: `sum(pod_memory_request)`  | 
|  노드 |  `node_memory_reserved_capacity`  |  계산 완료  | 공식: `node_memory_request / node_memory_limit`  | 
|  노드 |  `node_network_rx_bytes`  |  계산 완료  | 공식: `sum(node_interface_network_rx_bytes)`  | 
|  노드 |  `node_network_tx_bytes`  |  계산 완료  | 공식: `sum(node_interface_network_tx_bytes)`  | 
|  노드 |  `node_network_total_bytes`  |  계산 완료  | 공식: `node_network_rx_bytes + node_network_tx_bytes`  | 
|  노드 |  `node_number_of_running_pods`  |  Pod 목록  |   | 
|  노드 |  `node_number_of_running_containers`  |  Pod 목록  |   | 
|  NodeNet |  `node_interface_network_rx_bytes`  |  cadvisor  |  이 데이터는 작업자 노드 네트워크 인터페이스에 대한 초당 네트워크 rx 바이트입니다.  | 
|  NodeNet |  `node_interface_network_tx_bytes`  |  cadvisor  |  이 데이터는 작업자 노드 네트워크 인터페이스에 대한 초당 네트워크 tx 바이트입니다.  | 
|  NodeFS |  `node_filesystem_capacity`  |  cadvisor  |   | 
|  NodeFS |  `node_filesystem_usage`  |  cadvisor  |   | 
|  NodeFS |  `node_filesystem_utilization`  |  계산 완료  |  공식: `node_filesystem_usage / node_filesystem_capacity` 이 데이터는 디스크 이름별로 사용할 수 있습니다.  | 
|  클러스터 |  `cluster_failed_node_count`  |  API 서버  |   | 
|  클러스터 |  `cluster_node_count`  |  API 서버  |   | 
|  서비스 |  `service_number_of_running_pods`  |  API 서버  |   | 
|  `Namespace` |  `namespace_number_of_running_pods`  |  API 서버  |   | 

## 지표 계산 예
<a name="Container-Insights-calculation-examples"></a>

이 섹션에는 앞의 표에서 몇몇 값들이 어떻게 계산되었는지를 보여주는 예제가 포함되어 있습니다.

클러스터가 다음 상태에 있다고 가정해 보겠습니다.

```
Node1
   node_cpu_limit = 4
   node_cpu_usage_total = 3
   
   Pod1
     pod_cpu_usage_total = 2
     
     Container1
        container_cpu_limit = 1
        container_cpu_request = 1
        container_cpu_usage_total = 0.8
        
     Container2
        container_cpu_limit = null
        container_cpu_request = null
        container_cpu_usage_total = 1.2
        
   Pod2
     pod_cpu_usage_total = 0.4
     
     Container3
        container_cpu_limit = 1
        container_cpu_request = 0.5
        container_cpu_usage_total = 0.4
        
Node2
   node_cpu_limit = 8
   node_cpu_usage_total = 1.5
   
   Pod3
     pod_cpu_usage_total = 1
     
     Container4
        container_cpu_limit = 2
        container_cpu_request = 2
        container_cpu_usage_total = 1
```

다음 표에는 이 데이터를 사용하여 Pod CPU 지표를 계산하는 방법이 나와 있습니다.


| 지표 | 공식 | Pod1 | Pod2 | Pod3 | 
| --- | --- | --- | --- | --- | 
|  `pod_cpu_utilization` |  `pod_cpu_usage_total / node_cpu_limit`  |  2 / 4 = 50%  |  0.4 / 4 = 10%  |  1 / 8 = 12.5%  | 
|  `pod_cpu_utilization_over_pod_limit` |  `pod_cpu_usage_total / sum(container_cpu_limit)`  |  `Container2`에 대한 CPU 한도가 정의되어 있지 않기 때문에 해당 사항 없음  |  0.4 / 1 = 40%  |  1 / 2 = 50%  | 
|  `pod_cpu_reserved_capacity` |  `sum(container_cpu_request) / node_cpu_limit`  |  (1 \$1 0) / 4 = 25%  |  0.5 / 4 = 12.5%  |  2 / 8 = 25%  | 

다음 표에는 이 데이터를 사용하여 노드 CPU 지표를 계산하는 방법이 나와 있습니다.


| 지표 | 공식 | 노드 1 | 노드 2 | 
| --- | --- | --- | --- | 
|  `node_cpu_utilization` |  `node_cpu_usage_total / node_cpu_limit`  |  3 / 4 = 75%  |  1.5 / 8 = 18.75%  | 
|  `node_cpu_reserved_capacity` |  `sum(pod_cpu_request) / node_cpu_limit`  |  1.5 / 4 = 37.5%  |  2 / 8 = 25%  | 

# Container Insights Prometheus 지표 모니터링
<a name="ContainerInsights-Prometheus"></a>

Prometheus에 대한 CloudWatch Container Insights 모니터링은 컨테이너화된 시스템 및 워크로드에서 Prometheus 지표 검색을 자동화합니다. Prometheus는 오픈 소스 시스템 모니터링 및 알림 도구 키트입니다. 자세한 내용은 Prometheus 설명서의 [Prometheus란 무엇입니까?](https://prometheus.io/docs/introduction/overview/)를 참조하세요..

Prometheus 지표 검색은 Amazon EC2 인스턴스에서 실행되는 [Amazon Elastic Container Service](https://aws.amazon.com/ecs/), [Amazon Elastic Kubernetes Service](https://aws.amazon.com/eks/) 및 [Kubernetes](https://aws.amazon.com/kubernetes/) 클러스터에 대해 지원됩니다. Prometheus 카운터, 게이지 및 요약 지표 유형이 수집됩니다.

Amazon ECS 및 Amazon EKS 클러스터의 경우 EC2 및 Fargate 시작 유형이 모두 지원됩니다. Container Insights는 여러 워크로드에서 지표를 자동으로 수집합니다. 어느 워크로드에서든 지표를 수집하도록 Container Insights를 구성할 수 있습니다.

Prometheus를 오픈 소스 및 개방형 표준 방법으로 채택하여 CloudWatch에서 사용자 지정 지표를 수집할 수 있습니다. Prometheus가 지원되는 CloudWatch 에이전트는 Prometheus 지표를 검색 및 수집하여 애플리케이션 성능 저하 및 장애에 대한 모니터링, 문제 해결 및 경보를 더 빠르게 수행합니다. 이를 통해 관측 기능을 향상시키는 데 필요한 모니터링 도구의 수도 줄어듭니다.

Container Insight Prometheus 지원에는 수집, 저장 및 분석을 포함한 지표 및 로그의 종량제가 포함됩니다. 자세한 내용은 [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/)을 참조하세요.

**일부 워크로드에 대해 사전 구축된 대시보드**

Container Insights Prometheus 솔루션에는 이 단원에 나열된 인기 있는 워크로드에 대해 사전 구축된 대시보드가 ​​포함되어 있습니다. 이러한 워크로드에 대한 샘플 구성은 [(선택 사항) Prometheus 지표 테스트를 위한 컨테이너화된 Amazon ECS 워크로드 샘플 설정](ContainerInsights-Prometheus-Sample-Workloads-ECS.md) 및 [(선택 사항) Prometheus 지표 테스트를 위한 컨테이너화된 Amazon EKS 워크로드 샘플 설정](ContainerInsights-Prometheus-Sample-Workloads.md) 단원을 참조하세요.

또한 에이전트 구성 파일을 편집하여 다른 컨테이너화된 서비스 및 애플리케이션에서 Prometheus 지표를 수집하도록 Container Insights를 구성할 수도 있습니다.

Amazon EC2 인스턴스에서 실행되는 Amazon EKS 클러스터 및 Kubernetes 클러스터용으로 사전 구축된 대시보드가 ​​있는 워크로드:
+ AWS App Mesh
+ NGINX
+ Memcached
+ Java/JMX
+ HAProxy

Amazon ECS 클러스터용으로 사전 구축된 대시보드가 ​​있는 워크로드:
+ AWS App Mesh
+ Java/JMX
+ NGINX
+ NGINX Plus

# Amazon ECS 클러스터에서 Prometheus 지표 수집 설정 및 구성
<a name="ContainerInsights-Prometheus-Setup-ECS"></a>

Amazon ECS 클러스터에서 Prometheus 지표를 수집하려면 CloudWatch 에이전트를 수집기로 사용하거나 AWS Distro for OpenTelemetry Collector를 사용하면 됩니다. AWS Distro for OpenTelemetry Collector 사용에 대한 자세한 내용은 [https://aws-otel.github.io/docs/getting-started/container-insights/ecs-prometheus](https://aws-otel.github.io/docs/getting-started/container-insights/ecs-prometheus)를 참조하세요.

다음 단원에서는 CloudWatch 에이전트를 수집기로 사용하여 Prometheus 지표를 검색하는 방법을 설명합니다. Amazon ECS를 실행 중인 클러스터에 Prometheus 모니터링이 포함된 CloudWatch 에이전트를 설치하고, 선택적으로 추가 대상을 스크레이프하도록 에이전트를 구성할 수 있습니다. 또한 이 단원에서는 Prometheus 모니터링을 통해 테스트하는 데 사용할 샘플 워크로드를 설정하기 위한 선택적 튜토리얼도 제공합니다.

Amazon ECS의 Container Insights는 Prometheus 지표에 대한 다음 시작 유형 및 네트워크 모드 조합을 지원합니다.


| Amazon ECS 시작 유형 | 지원되는 네트워크 모드 | 
| --- | --- | 
|  EC2(Linux)  |  브리지, 호스트, awsvpc  | 
|  Fargate  |  awsvpc  | 

**VPC 보안 그룹 요구 사항**

Prometheus 워크로드의 보안 그룹 수신 규칙은 프라이빗 IP로 Prometheus 지표를 스크레이프하기 위해 CloudWatch 에이전트에 대한 Prometheus 포트를 열어야 합니다.

CloudWatch 에이전트의 보안 그룹 송신 규칙은 CloudWatch 에이전트가 프라이빗 IP로 Prometheus 워크로드의 포트에 연결할 수 있도록 허용해야 합니다.

**Topics**
+ [Amazon ECS 클러스터에 Prometheus 지표 수집과 함께 CloudWatch 에이전트 설치](ContainerInsights-Prometheus-install-ECS.md)
+ [추가 Prometheus 소스 스크레이핑 및 해당 지표 가져오기](ContainerInsights-Prometheus-Setup-configure-ECS.md)
+ [(선택 사항) Prometheus 지표 테스트를 위한 컨테이너화된 Amazon ECS 워크로드 샘플 설정](ContainerInsights-Prometheus-Sample-Workloads-ECS.md)

# Amazon ECS 클러스터에 Prometheus 지표 수집과 함께 CloudWatch 에이전트 설치
<a name="ContainerInsights-Prometheus-install-ECS"></a>

이 단원에서는 Amazon ECS를 실행 중인 클러스터에서 Prometheus 모니터링이 포함된 CloudWatch 에이전트를 설정하는 방법을 설명합니다. 이렇게 에이전트를 설정하면 에이전트가 해당 클러스터에서 실행 중인 다음 워크로드에 대한 지표를 자동으로 스크레이프하고 가져옵니다.
+ AWS App Mesh
+ Java/JMX

추가 Prometheus 워크로드 및 소스에서 지표를 스크레이프하고 가져오도록 에이전트를 구성할 수도 있습니다.

## IAM 역할 설정
<a name="ContainerInsights-Prometheus-Setup-ECS-IAM"></a>

CloudWatch 에이전트 태스크 정의의 두 IAM 역할이 필요합니다. Container Insights가 이러한 역할을 자동으로 생성하도록 CloudFormation 스택에서 **CreateIAMRoles=True**를 지정하면 올바른 권한을 가진 역할이 생성됩니다. 역할을 직접 생성하거나 기존 역할을 사용하려는 경우 다음 역할 및 권한이 필요합니다.
+ **CloudWatch 에이전트 ECS 태스크 역할** - CloudWatch 에이전트 컨테이너는 이 역할을 사용합니다. 여기에는 **CloudWatchAgentServerPolicy** 정책 및 다음과 같은 읽기 전용 권한을 포함하는 고객 관리형 정책이 포함되어야 합니다.
  + `ec2:DescribeInstances`
  + `ecs:ListTasks`
  + `ecs:ListServices`
  + `ecs:DescribeContainerInstances`
  + `ecs:DescribeServices`
  + `ecs:DescribeTasks`
  + `ecs:DescribeTaskDefinition`
+ **CloudWatch 에이전트 ECS 태스크 실행 역할** - Amazon ECS가 컨테이너를 시작하고 실행하는 데 필요한 역할입니다. 태스크 실행 역할에 **AmazonSSMReadOnlyAccess**, **AmazonECSTaskExecutionRolePolicy** 및 **CloudWatchAgentServerPolicy** 정책이 연결되어 있는지 확인합니다. Amazon ECS에서 사용할 더 민감한 데이터를 저장하려는 경우 [민감한 데이터 지정](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html) 단원을 참조하세요.

## CloudFormation을 사용하여 Prometheus 모니터링이 포함된 CloudWatch 에이전트 설치
<a name="ContainerInsights-Prometheus-Setup-ECS-CFN"></a>

AWS CloudFormation을 사용하여 Amazon ECS 클러스터에 대해 Prometheus 모니터링이 포함된 CloudWatch 에이전트를 설치합니다. 다음 목록에는 CloudFormation 템플릿에서 사용할 파라미터가 나와 있습니다.
+ **ECSClusterName** - 대상 Amazon ECS 클러스터를 지정합니다.
+ **CreateIAMRoles** - Amazon ECS 태스크 역할 및 Amazon ECS 태스크 실행 역할의 새 역할을 생성하려면 **True**를 지정합니다. 기존 역할을 재사용하려면 **False**를 지정합니다.
+ **TaskRoleName** - **CreateIAMRoles**에서 **True**를 지정한 경우 이 파라미터는 새 Amazon ECS 태스크 역할에 사용할 이름을 지정합니다. **CreateIAMRoles**에서 **False**를 지정한 경우 이 파라미터는 Amazon ECS 태스크 역할로 사용할 기존 역할을 지정합니다.
+ **ExecutionRoleName** - **CreateIAMRoles**에서 **True**를 지정한 경우 이 파라미터는 새 Amazon ECS 태스크 실행 역할에 사용할 이름을 지정합니다. **CreateIAMRoles**에서 **False**를 지정한 경우 이 파라미터는 Amazon ECS 태스크 실행 역할로 사용할 기존 역할을 지정합니다.
+ **ECSNetworkMode** - EC2 시작 유형을 사용하는 경우 여기에서 네트워크 모드를 지정합니다. **bridge** 또는 **host**여야 합니다.
+ **ECSLaunchType** - **fargate** 또는 **EC2**를 지정합니다.
+ **SecurityGroupID** - **ECSNetworkMode**가 **awsvpc**인 경우 여기에서 보안 그룹 ID를 지정합니다.
+ **SubnetID** - **ECSNetworkMode**가 **awsvpc**인 경우 여기에서 서브넷 ID를 지정합니다.

### 샘플 명령
<a name="ContainerInsights-Prometheus-Setup-ECS-CFNcommands"></a>

이 단원에는 다양한 시나리오에서 Prometheus 모니터링과 함께 Container Insights를 설치하기 위한 샘플 CloudFormation 명령이 포함되어 있습니다.

**브리지 네트워크 모드에서 Amazon ECS 클러스터의 CloudFormation 스택 생성**

```
export AWS_PROFILE=your_aws_config_profile_eg_default
export AWS_DEFAULT_REGION=your_aws_region_eg_ap-southeast-1
export ECS_CLUSTER_NAME=your_ec2_ecs_cluster_name
export ECS_NETWORK_MODE=bridge
export CREATE_IAM_ROLES=True
export ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
export ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name

curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml

aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
    --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                 ParameterKey=CreateIAMRoles,ParameterValue=${CREATE_IAM_ROLES} \
                 ParameterKey=ECSNetworkMode,ParameterValue=${ECS_NETWORK_MODE} \
                 ParameterKey=TaskRoleName,ParameterValue=${ECS_TASK_ROLE_NAME} \
                 ParameterKey=ExecutionRoleName,ParameterValue=${ECS_EXECUTION_ROLE_NAME} \
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${AWS_DEFAULT_REGION} \
    --profile ${AWS_PROFILE}
```

**호스트 네트워크 모드에서 Amazon ECS 클러스터의 CloudFormation 스택 생성**

```
export AWS_PROFILE=your_aws_config_profile_eg_default
export AWS_DEFAULT_REGION=your_aws_region_eg_ap-southeast-1
export ECS_CLUSTER_NAME=your_ec2_ecs_cluster_name
export ECS_NETWORK_MODE=host
export CREATE_IAM_ROLES=True
export ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
export ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name


curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml

aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
    --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                 ParameterKey=CreateIAMRoles,ParameterValue=${CREATE_IAM_ROLES} \
                 ParameterKey=ECSNetworkMode,ParameterValue=${ECS_NETWORK_MODE} \
                 ParameterKey=TaskRoleName,ParameterValue=${ECS_TASK_ROLE_NAME} \
                 ParameterKey=ExecutionRoleName,ParameterValue=${ECS_EXECUTION_ROLE_NAME} \ 
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${AWS_DEFAULT_REGION} \
    --profile ${AWS_PROFILE}
```

**awsvpc 네트워크 모드에서 Amazon ECS 클러스터의 CloudFormation 스택 생성**

```
export AWS_PROFILE=your_aws_config_profile_eg_default
export AWS_DEFAULT_REGION=your_aws_region_eg_ap-southeast-1
export ECS_CLUSTER_NAME=your_ec2_ecs_cluster_name
export ECS_LAUNCH_TYPE=EC2
export CREATE_IAM_ROLES=True
export ECS_CLUSTER_SECURITY_GROUP=your_security_group_eg_sg-xxxxxxxxxx
export ECS_CLUSTER_SUBNET=your_subnet_eg_subnet-xxxxxxxxxx
export ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
export ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name

curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-awsvpc.yaml

aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-${ECS_LAUNCH_TYPE}-awsvpc \
    --template-body file://cwagent-ecs-prometheus-metric-for-awsvpc.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                 ParameterKey=CreateIAMRoles,ParameterValue=${CREATE_IAM_ROLES} \
                 ParameterKey=ECSLaunchType,ParameterValue=${ECS_LAUNCH_TYPE} \
                 ParameterKey=SecurityGroupID,ParameterValue=${ECS_CLUSTER_SECURITY_GROUP} \
                 ParameterKey=SubnetID,ParameterValue=${ECS_CLUSTER_SUBNET} \
                 ParameterKey=TaskRoleName,ParameterValue=${ECS_TASK_ROLE_NAME} \
                 ParameterKey=ExecutionRoleName,ParameterValue=${ECS_EXECUTION_ROLE_NAME} \
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${AWS_DEFAULT_REGION} \
    --profile ${AWS_PROFILE}
```

**awsvpc 네트워크 모드에서 Fargate 클러스터의 CloudFormation 스택 생성**

```
export AWS_PROFILE=your_aws_config_profile_eg_default
export AWS_DEFAULT_REGION=your_aws_region_eg_ap-southeast-1
export ECS_CLUSTER_NAME=your_ec2_ecs_cluster_name
export ECS_LAUNCH_TYPE=FARGATE
export CREATE_IAM_ROLES=True
export ECS_CLUSTER_SECURITY_GROUP=your_security_group_eg_sg-xxxxxxxxxx
export ECS_CLUSTER_SUBNET=your_subnet_eg_subnet-xxxxxxxxxx
export ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
export ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name            

curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-awsvpc.yaml

aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-${ECS_LAUNCH_TYPE}-awsvpc \
    --template-body file://cwagent-ecs-prometheus-metric-for-awsvpc.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                 ParameterKey=CreateIAMRoles,ParameterValue=${CREATE_IAM_ROLES} \
                 ParameterKey=ECSLaunchType,ParameterValue=${ECS_LAUNCH_TYPE} \
                 ParameterKey=SecurityGroupID,ParameterValue=${ECS_CLUSTER_SECURITY_GROUP} \
                 ParameterKey=SubnetID,ParameterValue=${ECS_CLUSTER_SUBNET} \
                 ParameterKey=TaskRoleName,ParameterValue=${ECS_TASK_ROLE_NAME} \
                 ParameterKey=ExecutionRoleName,ParameterValue=${ECS_EXECUTION_ROLE_NAME} \
    --capabilities CAPABILITY_NAMED_IAM \
    --region ${AWS_DEFAULT_REGION} \
    --profile ${AWS_PROFILE}
```

### CloudFormation 스택에서 생성한 AWS 리소스
<a name="ContainerInsights-Prometheus-Setup-ECS-resources"></a>

다음 표에는 CloudFormation을 사용하여 Amazon ECS 클러스터에서 Prometheus 모니터링과 함께 Container Insights를 설정할 때 생성되는 AWS 리소스가 나와 있습니다.


| 리소스 유형 | 리소스 이름 | 설명 | 
| --- | --- | --- | 
|  AWS::SSM::Parameter  |  AmazonCloudWatch-CWAgentConfig-\$1*ECS\$1CLUSTER\$1NAME*-\$1*ECS\$1LAUNCH\$1TYPE*-\$1*ECS\$1NETWORK\$1MODE*  |  이 리소스는 기본 App Mesh 및 Java/JMX 임베디드 지표 형식 정의가 있는 CloudWatch 에이전트입니다.  | 
|  AWS::SSM::Parameter  |  AmazonCloudWatch-PrometheusConfigName-\$1*ECS\$1CLUSTER\$1NAME*-\$1*ECS\$1LAUNCH\$1TYPE*-\$1*ECS\$1NETWORK\$1MODE*  |  이 리소스는 Prometheus 스크레이핑 구성입니다.  | 
|  AWS::IAM::Role  |  **\$1ECS\$1TASK\$1ROLE\$1NAME**.  |  Amazon ECS 태스크 역할입니다. `CREATE_IAM_ROLES`에서 **True**를 지정한 경우에만 생성됩니다.  | 
|  AWS::IAM::Role  |  **\$1\$1ECS\$1EXECUTION\$1ROLE\$1NAME\$1**   |  Amazon ECS 태스크 실행 역할입니다. `CREATE_IAM_ROLES`에서 **True**를 지정한 경우에만 생성됩니다.  | 
|  AWS::ECS::TaskDefinition  |  cwagent-prometheus-\$1*ECS\$1CLUSTER\$1NAME*-\$1*ECS\$1LAUNCH\$1TYPE*-\$1*ECS\$1NETWORK\$1MODE*   |   | 
|  AWS::ECS::Service  |  cwagent-prometheus-replica-service-\$1*ECS\$1LAUNCH\$1TYPE*-\$1*ECS\$1NETWORK\$1MODE*  |   | 

### Prometheus 모니터링이 포함된 CloudWatch 에이전트의 CloudFormation 스택 삭제
<a name="ContainerInsights-Prometheus-ECS-delete"></a>

Amazon ECS 클러스터에서 CloudWatch 에이전트를 삭제하려면 다음 명령을 입력합니다.

```
export AWS_PROFILE=your_aws_config_profile_eg_default
export AWS_DEFAULT_REGION=your_aws_region_eg_ap-southeast-1
export CLOUDFORMATION_STACK_NAME=your_cloudformation_stack_name

aws cloudformation delete-stack \
--stack-name ${CLOUDFORMATION_STACK_NAME} \
--region ${AWS_DEFAULT_REGION} \
--profile ${AWS_PROFILE}
```

# 추가 Prometheus 소스 스크레이핑 및 해당 지표 가져오기
<a name="ContainerInsights-Prometheus-Setup-configure-ECS"></a>

Prometheus 모니터링이 포함된 CloudWatch 에이전트는 Prometheus 지표를 스크레이프하는 데 두 가지 구성이 필요합니다. 하나는 Prometheus 설명서의 [<scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config)에 설명된 표준 Prometheus 구성을 위한 것입니다. 다른 하나는 CloudWatch 에이전트 구성을 위한 것입니다.

Amazon ECS 클러스터의 경우 구성은 다음과 같이 Amazon ECS 태스크 정의의 보안 암호를 통해 AWS Systems Manager의 파라미터 스토어와 통합됩니다.
+ 보안 암호 `PROMETHEUS_CONFIG_CONTENT`는 Prometheus 스크레이프 구성을 위한 것입니다.
+ 보안 암호 `CW_CONFIG_CONTENT`는 CloudWatch 에이전트 구성을 위한 것입니다.

추가 Prometheus 지표 소스를 스크레이프하고 해당 지표를 CloudWatch에 가져오려면 Prometheus 스크레이프 구성과 CloudWatch 에이전트 구성을 모두 수정한 다음, 업데이트된 구성으로 에이전트를 다시 배포합니다.

**VPC 보안 그룹 요구 사항**

Prometheus 워크로드의 보안 그룹 수신 규칙은 프라이빗 IP로 Prometheus 지표를 스크레이프하기 위해 CloudWatch 에이전트에 대한 Prometheus 포트를 열어야 합니다.

CloudWatch 에이전트의 보안 그룹 송신 규칙은 CloudWatch 에이전트가 프라이빗 IP로 Prometheus 워크로드의 포트에 연결할 수 있도록 허용해야 합니다.

## Prometheus 스크레이프 구성
<a name="ContainerInsights-Prometheus-Setup-config-global"></a>

CloudWatch 에이전트는 Prometheus 설명서의 [ <scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config)에 설명된 대로 표준 Prometheus 스크레이프 구성을 지원합니다. 이 섹션을 편집하여 이 파일에 이미 있는 구성을 업데이트하고 Prometheus 스크레이핑 대상을 더 추가할 수 있습니다. 기본적으로 샘플 구성 파일에는 다음과 같은 글로벌 구성 줄이 포함되어 있습니다.

```
global:
  scrape_interval: 1m
  scrape_timeout: 10s
```
+ **scrape\$1interval** - 대상을 스크레이프하는 빈도를 정의합니다.
+ **scrape\$1timeout** - 스크레이프 요청 시간이 초과되기 전에 대기할 시간을 정의합니다.

작업 수준에서 이러한 설정에 다른 값을 정의하여 전역 구성을 재정의할 수도 있습니다.

### Prometheus 스크레이핑 작업
<a name="ContainerInsights-Prometheus-Setup-config-scrape"></a>

CloudWatch 에이전트 YAML 파일에는 일부 기본 스크레이핑 작업이 이미 구성되어 있습니다. 예를 들어 `cwagent-ecs-prometheus-metric-for-bridge-host.yaml`과 같은 Amazon ECS의 YAML 파일에서 기본 스크레이핑 작업은 `ecs_service_discovery` 섹션에서 구성됩니다.

```
"ecs_service_discovery": {
                  "sd_frequency": "1m",
                  "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
                  "docker_label": {
                  },
                  "task_definition_list": [
                    {
                      "sd_job_name": "ecs-appmesh-colors",
                      "sd_metrics_ports": "9901",
                      "sd_task_definition_arn_pattern": ".*:task-definition\/.*-ColorTeller-(white):[0-9]+",
                      "sd_metrics_path": "/stats/prometheus"
                    },
                    {
                      "sd_job_name": "ecs-appmesh-gateway",
                      "sd_metrics_ports": "9901",
                      "sd_task_definition_arn_pattern": ".*:task-definition/.*-ColorGateway:[0-9]+",
                      "sd_metrics_path": "/stats/prometheus"
                    }
                  ]
                }
```

이러한 각 기본 대상은 스크레이프되고 지표는 임베디드 지표 형식을 사용하여 로그 이벤트로 CloudWatch에 전송됩니다. 자세한 내용은 [로그 내에 지표 포함](CloudWatch_Embedded_Metric_Format.md) 섹션을 참조하세요.

Amazon ECS 클러스터의 로그 이벤트는 **/aws/ecs/containerinsights/*cluster\$1name*/prometheus** 로그 그룹에 저장됩니다.

각 스크레이핑 작업은 이 로그 그룹의 서로 다른 로그 스트림에 포함됩니다.

새 스크레이핑 대상을 추가하려면 YAML 파일의 `ecs_service_discovery` 섹션 아래 `task_definition_list` 섹션에 새 항목을 추가하고 에이전트를 다시 시작합니다. 이 프로세스의 예는 [새로운 Prometheus 스크레이프 대상을 추가하기 위한 튜토리얼: Prometheus API 서버 지표](ContainerInsights-Prometheus-Setup-configure.md#ContainerInsights-Prometheus-Setup-new-exporters) 단원을 참조하세요.

## Prometheus에 대한 CloudWatch 에이전트 구성
<a name="ContainerInsights-Prometheus-Setup-cw-agent-config"></a>

CloudWatch 에이전트 구성 파일에는 `metrics_collected` 아래에 Prometheus 스크레이핑 구성에 대한 `prometheus` 섹션이 있습니다. 여기에는 다음 구성 옵션이 포함됩니다.
+ **cluster\$1name** - 로그 이벤트에서 레이블로 추가할 클러스터 이름을 지정합니다. 이 필드는 선택 사항입니다. 생략하는 경우 에이전트가 Amazon ECS 클러스터 이름을 감지할 수 있습니다.
+ **log\$1group\$1name** - 스크레이프한 Prometheus 지표의 로그 그룹 이름을 지정합니다. 이 필드는 선택 사항입니다. 생략하는 경우 CloudWatch는 Amazon ECS 클러스터의 로그에 **/aws/ecs/containerinsights/*cluster\$1name*/prometheus**를 사용합니다.
+ **prometheus\$1config\$1path** - Prometheus 스크레이프 구성 파일 경로를 지정합니다. 이 필드의 값이 `env:`로 시작하는 경우 Prometheus 스크레이프 구성 파일 내용이 컨테이너의 환경 변수에서 검색됩니다. 이 값은 변경하지 마세요.
+ **ecs\$1service\$1discovery** - Amazon ECS Prometheus 대상 자동 검색 기능의 구성을 지정하는 섹션입니다. Prometheus 대상을 검색하기 위해 두 모드, 즉 컨테이너의 Docker 레이블을 기반으로 하는 검색 또는 Amazon ECS 태스크 정의 ARN 정규 표현식을 기반으로 하는 검색이 지원됩니다. 두 모드를 함께 사용할 수 있습니다. CloudWatch 에이전트는 *\$1private\$1ip\$1:\$1port\$1/\$1metrics\$1path\$1*를 기반으로 검색된 대상의 중복을 제거합니다.

  `ecs_service_discovery` 섹션에는 다음 필드가 포함될 수 있습니다.
  + `sd_frequency`는 Prometheus Exporter를 검색하는 빈도입니다. 숫자와 단위 접미사를 지정합니다. 예를 들어 1분마다 한 번의 경우 `1m` 또는 30초마다 한 번의 경우 `30s`입니다. 유효한 단위 접미사는 `ns`, `us`, `ms`, `s`, `m`, `h`입니다.

    이 필드는 선택 사항입니다. 기본값은 60초(1분)입니다.
  + `sd_target_cluster`는 자동 검색의 대상 Amazon ECS 클러스터 이름입니다. 이 필드는 선택 사항입니다. 기본값은 CloudWatch 에이전트가 설치된 Amazon ECS 클러스터의 이름입니다.
  + `sd_cluster_region`은 대상 Amazon ECS 클러스터의 리전입니다. 이 필드는 선택 사항입니다. 기본값은 CloudWatch 에이전트가 설치된 Amazon ECS 클러스터의 리전입니다.
  + `sd_result_file`은 Prometheus 대상 결과의 YAML 파일 경로입니다. Prometheus 스크레이프 구성은 이 파일을 참조합니다.
  + `docker_label`은 Docker 레이블 기반 서비스 검색을 위한 구성을 지정하는 데 사용할 수 있는 선택적 섹션입니다. 이 섹션을 생략하면 Docker 레이블 기반 검색이 사용되지 않습니다. 이 섹션에는 다음 필드가 포함될 수 있습니다.
    + `sd_port_label`은 Prometheus 지표에 대한 컨테이너 포트를 지정하는 컨테이너의 Docker 레이블 이름입니다. 기본값은 `ECS_PROMETHEUS_EXPORTER_PORT`입니다. 컨테이너에 이 Docker 레이블이 없다면 CloudWatch 에이전트는 이 필드를 건너뜁니다.
    + `sd_metrics_path_label`은 Prometheus 지표 경로를 지정하는 컨테이너의 Docker 레이블 이름입니다. 기본값은 `ECS_PROMETHEUS_METRICS_PATH`입니다. 컨테이너에 이 도커 레이블이 없다면 에이전트는 기본 경로 `/metrics`를 가정합니다.
    + `sd_job_name_label`은 Prometheus 스크레이프 작업 이름을 지정하는 컨테이너의 Docker 레이블 이름입니다. 기본값은 `job`입니다. 컨테이너에 이 Docker 레이블이 없다면 CloudWatch 에이전트는 Prometheus 스크레이프 구성의 작업 이름을 사용합니다.
  + `task_definition_list`는 태스크 정의 기반 서비스 검색의 구성을 지정하는 데 사용할 수 있는 선택적 섹션입니다. 이 섹션을 생략하면 태스크 정의 기반 검색이 사용되지 않습니다. 이 섹션에는 다음 필드가 포함될 수 있습니다.
    + `sd_task_definition_arn_pattern`은 검색할 Amazon ECS 태스크 정의를 지정하는 데 사용할 패턴입니다. 이는 정규 표현식입니다.
    + `sd_metrics_ports`는 Prometheus 지표에 대한 containerPort를 나열합니다. containerPort를 세미콜론으로 구분합니다.
    + `sd_container_name_pattern`은 Amazon ECS 태스크 컨테이너 이름을 지정합니다. 이는 정규 표현식입니다.
    + `sd_metrics_path`는 Prometheus 지표 경로를 지정합니다. 이 필드를 생략하면 에이전트는 기본 경로 `/metrics`를 가정합니다.
    + `sd_job_name`은 Prometheus 스크레이프 작업 이름을 지정합니다. 이 필드를 생략하면 CloudWatch 에이전트는 Prometheus 스크레이프 구성의 작업 이름을 사용합니다.
  + `service_name_list_for_tasks`는 서비스 이름 기반 검색의 구성을 지정하는 데 사용할 수 있는 선택적 섹션입니다. 이 섹션을 생략하면 서비스 이름 기반 검색이 사용되지 않습니다. 이 섹션에는 다음 필드가 포함될 수 있습니다.
    + `sd_service_name_pattern`은 태스크를 검색할 Amazon ECS 서비스를 지정하는 데 사용할 패턴입니다. 이는 정규 표현식입니다.
    + `sd_metrics_ports`는 Prometheus 지표에 대한 `containerPort`를 나열합니다. 여러 `containerPorts`를 세미콜론으로 구분합니다.
    + `sd_container_name_pattern`은 Amazon ECS 태스크 컨테이너 이름을 지정합니다. 이는 정규 표현식입니다.
    + `sd_metrics_path`는 Prometheus 지표 경로를 지정합니다. 이 필드를 생략하면 에이전트는 기본 경로 `/metrics`를 가정합니다.
    + `sd_job_name`은 Prometheus 스크레이프 작업 이름을 지정합니다. 이 필드를 생략하면 CloudWatch 에이전트는 Prometheus 스크레이프 구성의 작업 이름을 사용합니다.
+ **metric\$1declaration** - 생성할 임베디드 지표 형식이 있는 로그 배열을 지정하는 섹션입니다. CloudWatch 에이전트가 기본적으로 가져오는 각 Prometheus 소스에 대한 `metric_declaration` 섹션이 있습니다. 이러한 섹션에는 각각 다음 필드가 포함됩니다.
  + `label_matcher`는 `source_labels`에 나열된 레이블의 값을 확인하는 정규 표현식입니다. 일치하는 지표는 CloudWatch에 전송된 임베디드 지표 형식에 포함할 수 있습니다.

    `source_labels`에 여러 레이블이 지정된 경우 `label_matcher`의 정규 표현식에 `^` 또는 `$` 문자를 사용하지 않는 것이 좋습니다.
  + `source_labels`는 `label_matcher` 줄에 의해 확인되는 레이블의 값을 지정합니다.
  + `label_separator`는 여러 `source_labels`가 지정된 경우 ` label_matcher` 줄에 사용할 구분 기호를 지정합니다. 기본값은 `;`입니다. 다음 예에서 `label_matcher` 줄에 이 기본값이 사용된 것을 볼 수 있습니다.
  + `metric_selectors`는 수집하여 CloudWatch에 보낼 지표를 지정하는 정규 표현식입니다.
  + `dimensions`는 선택한 각 지표의 CloudWatch 측정기준으로 사용할 레이블 목록입니다.

다음 `metric_declaration` 예를 참조하세요.

```
"metric_declaration": [
  {
     "source_labels":[ "Service", "Namespace"],
     "label_matcher":"(.*node-exporter.*|.*kube-dns.*);kube-system$",
     "dimensions":[
        ["Service", "Namespace"]
     ],
     "metric_selectors":[
        "^coredns_dns_request_type_count_total$"
     ]
  }
]
```

이 예에서는 다음 조건이 충족될 경우 임베디드 지표 형식 섹션을 로그 이벤트로 전송하도록 구성합니다.
+ `Service`의 값에 `node-exporter` 또는 `kube-dns`가 포함되어 있습니다.
+ `Namespace`의 값이 `kube-system`입니다.
+ Prometheus `coredns_dns_request_type_count_total` 지표에 `Service`와 `Namespace` 레이블이 모두 포함되어 있습니다.

전송되는 로그 이벤트에는 다음과 같은 강조 표시된 섹션이 포함됩니다.

```
{
   "CloudWatchMetrics":[
      {
         "Metrics":[
            {
               "Name":"coredns_dns_request_type_count_total"
            }
         ],
         "Dimensions":[
            [
               "Namespace",
               "Service"
            ]
         ],
         "Namespace":"ContainerInsights/Prometheus"
      }
   ],
   "Namespace":"kube-system",
   "Service":"kube-dns",
   "coredns_dns_request_type_count_total":2562,
   "eks_amazonaws_com_component":"kube-dns",
   "instance":"192.168.61.254:9153",
   "job":"kubernetes-service-endpoints",
   ...
}
```

# Amazon ECS 클러스터의 자동 검색에 대한 자세한 가이드
<a name="ContainerInsights-Prometheus-Setup-autodiscovery-ecs"></a>

Prometheus는 [<scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config)에 설명된 대로 수십 가지의 동적 서비스 검색 메커니즘을 제공합니다. 그러나 Amazon ECS에 대한 기본 제공 서비스 검색은 없습니다. CloudWatch 에이전트가 이 메커니즘을 추가합니다.

Amazon ECS Prometheus 서비스 검색을 사용 설정하면 CloudWatch 에이전트는 Amazon ECS 및 Amazon EC2 프런트엔드에 대해 다음 API 호출을 주기적으로 수행하여 대상 ECS 클러스터에서 실행 중인 ECS 태스크의 메타데이터를 검색합니다.

```
EC2:DescribeInstances
ECS:ListTasks
ECS:ListServices
ECS:DescribeContainerInstances
ECS:DescribeServices
ECS:DescribeTasks
ECS:DescribeTaskDefinition
```

CloudWatch 에이전트는 메타데이터를 사용하여 ECS 클러스터 내에서 Prometheus 대상을 스캔합니다. CloudWatch 에이전트는 다음과 같은 세 가지 서비스 검색 모드를 지원합니다.
+ 컨테이너 Docker 레이블 기반 서비스 검색
+ 이 예에서는 ECS 태스크 정의 ARN 정규 표현식 기반 서비스 검색을 사용 설정합니다.
+ ECS 서비스 이름 정규 표현식 기반 서비스 검색

모든 모드를 함께 사용할 수 있습니다. CloudWatch 에이전트는 `{private_ip}:{port}/{metrics_path}`를 기반으로 검색된 대상의 중복을 제거합니다.

검색된 모든 대상은 CloudWatch 에이전트 컨테이너 내의 `sd_result_file` 구성 필드에서 지정한 결과 파일에 작성됩니다. 다음은 샘플 결과 파일입니다.

```
- targets:
  - 10.6.1.95:32785
  labels:
    __metrics_path__: /metrics
    ECS_PROMETHEUS_EXPORTER_PORT: "9406"
    ECS_PROMETHEUS_JOB_NAME: demo-jar-ec2-bridge-dynamic
    ECS_PROMETHEUS_METRICS_PATH: /metrics
    InstanceType: t3.medium
    LaunchType: EC2
    SubnetId: subnet-123456789012
    TaskDefinitionFamily: demo-jar-ec2-bridge-dynamic-port
    TaskGroup: family:demo-jar-ec2-bridge-dynamic-port
    TaskRevision: "7"
    VpcId: vpc-01234567890
    container_name: demo-jar-ec2-bridge-dynamic-port
    job: demo-jar-ec2-bridge-dynamic
- targets:
  - 10.6.3.193:9404
  labels:
    __metrics_path__: /metrics
    ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_B: "9404"
    ECS_PROMETHEUS_JOB_NAME: demo-tomcat-ec2-bridge-mapped-port
    ECS_PROMETHEUS_METRICS_PATH: /metrics
    InstanceType: t3.medium
    LaunchType: EC2
    SubnetId: subnet-123456789012
    TaskDefinitionFamily: demo-tomcat-ec2-bridge-mapped-port
    TaskGroup: family:demo-jar-tomcat-bridge-mapped-port
    TaskRevision: "12"
    VpcId: vpc-01234567890
    container_name: demo-tomcat-ec2-bridge-mapped-port
    job: demo-tomcat-ec2-bridge-mapped-port
```

이 결과 파일을 Prometheus 파일 기반 서비스 검색과 직접 통합할 수 있습니다. Prometheus 파일 기반 서비스 검색에 대한 자세한 내용은 [<file\$1sd\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config)를 참조하세요.

 결과 파일이 `/tmp/cwagent_ecs_auto_sd.yaml`에 작성되었다고 가정합니다. 다음 Prometheus 스크레이프 구성은 이 파일을 사용합니다.

```
global:
  scrape_interval: 1m
  scrape_timeout: 10s
scrape_configs:
  - job_name: cwagent-ecs-file-sd-config
    sample_limit: 10000
    file_sd_configs:
      - files: [ "/tmp/cwagent_ecs_auto_sd.yaml" ]
```

CloudWatch 에이전트는 검색된 대상에 대해 다음과 같은 레이블도 추가합니다.
+ `container_name`
+ `TaskDefinitionFamily`
+ `TaskRevision`
+ `TaskGroup`
+ `StartedBy`
+ `LaunchType`
+ `job`
+ `__metrics_path__`
+ Docker 레이블

클러스터에 EC2 시작 유형이 있는 경우 다음과 같은 레이블 세 가지가 추가됩니다.
+ `InstanceType`
+ `VpcId`
+ `SubnetId`

**참고**  
정규 표현식 `[a-zA-Z_][a-zA-Z0-9_]*`와 일치하지 않는 Docker 레이블은 필터링되어 제외됩니다. 이는 Prometheus 설명서에 있는 [구성 파일](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#labelname)의 `label_name`에 나열된 Prometheus 규칙과 일치합니다.

## ECS 서비스 검색 구성 예
<a name="ContainerInsights-Prometheus-Setup-autodiscovery-ecs-examples"></a>

이 단원에는 ECS 서비스 검색을 보여 주는 예가 포함되어 있습니다.

**예제 1**.

```
"ecs_service_discovery": {
  "sd_frequency": "1m",
  "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
  "docker_label": {
  }
}
```

이 예에서는 Docker 레이블 기반 서비스 검색을 사용 설정합니다. CloudWatch 에이전트는 1분마다 한 번씩 ECS 태스크의 메타데이터를 쿼리하고 검색된 대상을 CloudWatch 에이전트 컨테이너 내의 `/tmp/cwagent_ecs_auto_sd.yaml` 파일에 씁니다.

`docker_label` 섹션에 있는 `sd_port_label`의 기본값은 `ECS_PROMETHEUS_EXPORTER_PORT`입니다. ECS 태스크의 실행 중인 컨테이너에 `ECS_PROMETHEUS_EXPORTER_PORT` Docker 레이블이 있는 경우 CloudWatch 에이전트는 해당 값을 `container port`로 사용하여 컨테이너의 노출된 포트를 모두 스캔합니다. 일치하는 항목이 있다면 매핑된 호스트 포트와 컨테이너의 프라이빗 IP를 사용하여 `private_ip:host_port` 형식으로 Prometheus Exporter 대상을 구성합니다.

`docker_label` 섹션에 있는 `sd_metrics_path_label`의 기본값은 `ECS_PROMETHEUS_METRICS_PATH`입니다. 컨테이너에 이 Docker 레이블이 있는 경우 해당 값을 `__metrics_path__`로 사용합니다. 컨테이너에 이 레이블이 없다면 기본값인 `/metrics`를 사용합니다.

`docker_label` 섹션에 있는 `sd_job_name_label`의 기본값은 `job`입니다. 컨테이너에 이 Docker 레이블이 있는 경우 해당 값은 대상에 대한 레이블 중 하나로 추가되어 Prometheus 구성에 지정된 기본 작업 이름을 대체합니다. 이 Docker 레이블의 값은 CloudWatch Logs 로그 그룹의 로그 스트림 이름으로 사용됩니다.

**예제 2**.

```
"ecs_service_discovery": {
  "sd_frequency": "15s",
  "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
  "docker_label": {
    "sd_port_label": "ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A",
    "sd_job_name_label": "ECS_PROMETHEUS_JOB_NAME"  
  }
}
```

이 예에서는 Docker 레이블 기반 서비스 검색을 사용 설정합니다. CloudWatch 에이전트는 15초마다 ECS 태스크의 메타데이터를 쿼리하고 검색된 대상을 CloudWatch 에이전트 컨테이너 내의 `/tmp/cwagent_ecs_auto_sd.yaml` 파일에 씁니다. `ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A`의 Docker 레이블이 있는 컨테이너를 스캔합니다. Docker 레이블 `ECS_PROMETHEUS_JOB_NAME`의 값을 작업 이름으로 사용합니다.

**예 3**

```
"ecs_service_discovery": {
  "sd_frequency": "5m",
  "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
  "task_definition_list": [
    {
      "sd_job_name": "java-prometheus",
      "sd_metrics_path": "/metrics",
      "sd_metrics_ports": "9404; 9406",
      "sd_task_definition_arn_pattern": ".*:task-definition/.*javajmx.*:[0-9]+"
    },
    {
      "sd_job_name": "envoy-prometheus",
      "sd_metrics_path": "/stats/prometheus",
      "sd_container_name_pattern": "^envoy$", 
      "sd_metrics_ports": "9901",
      "sd_task_definition_arn_pattern": ".*:task-definition/.*appmesh.*:23"
    }
  ]
}
```

이 예에서는 ECS 태스크 정의 ARN 정규 표현식 기반 서비스 검색을 사용 설정합니다. CloudWatch 에이전트는 5분마다 ECS 태스크의 메타데이터를 쿼리하고 검색된 대상을 CloudWatch 에이전트 컨테이너 내의 `/tmp/cwagent_ecs_auto_sd.yaml` 파일에 씁니다.

다음과 같이 두 태스크 정의 ARN 정규 표현식 섹션이 정의됩니다.
+  첫 번째 섹션의 경우 ECS 태스크 정의 ARN에 `javajmx`가 있는 ECS 태스크가 컨테이너 포트 스캔에 대해 필터링됩니다. 이러한 ECS 태스크 내의 컨테이너가 9404 또는 9406의 컨테이너 포트를 노출하는 경우 컨테이너의 프라이빗 IP와 함께 매핑된 호스트 포트를 사용하여 Prometheus Exporter 대상을 생성합니다. `sd_metrics_path` 값은 `__metrics_path__`를 `/metrics`로 설정합니다. 따라서 CloudWatch 에이전트는 `private_ip:host_port/metrics`에서 Prometheus 지표를 스크레이프하고, 스크레이프한 지표를 CloudWatch Logs 로그 그룹 `/aws/ecs/containerinsights/cluster_name/prometheus`의 `java-prometheus` 로그 스트림에 전송합니다.
+  두 번째 섹션의 경우 ECS 태스크 정의 ARN에 `appmesh`가 있고 `version`이 `:23`인 ECS 태스크가 컨테이너 포트 스캔에 대해 필터링됩니다. `envoy`라는 이름의 컨테이너가 `9901`의 컨테이너 포트를 노출하는 경우 컨테이너의 프라이빗 IP와 함께 매핑된 호스트 포트를 사용하여 Prometheus Exporter 대상을 생성합니다. 이러한 ECS 태스크 내의 값은 9404 또는 9406의 컨테이너 포트를 노출하며, 컨테이너의 프라이빗 IP와 함께 매핑된 호스트 포트를 사용하여 Prometheus Exporter 대상을 생성합니다. `sd_metrics_path` 값은 `__metrics_path__`를 `/stats/prometheus`로 설정합니다. 따라서 CloudWatch 에이전트는 `private_ip:host_port/stats/prometheus`에서 Prometheus 지표를 스크레이프하고, 스크레이프한 지표를 CloudWatch Logs 로그 그룹 `/aws/ecs/containerinsights/cluster_name/prometheus`의 `envoy-prometheus` 로그 스트림에 전송합니다.

**예 4**

```
"ecs_service_discovery": {
  "sd_frequency": "5m",
  "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
  "service_name_list_for_tasks": [
    {
      "sd_job_name": "nginx-prometheus",
      "sd_metrics_path": "/metrics",
      "sd_metrics_ports": "9113",
      "sd_service_name_pattern": "^nginx-.*"
    },
    {
      "sd_job_name": "haproxy-prometheus",
      "sd_metrics_path": "/stats/metrics",
      "sd_container_name_pattern": "^haproxy$",
      "sd_metrics_ports": "8404",
      "sd_service_name_pattern": ".*haproxy-service.*"
    }
  ]
}
```

이 예에서는 ECS 서비스 이름 정규 표현식 기반 서비스 검색을 사용 설정합니다. CloudWatch 에이전트는 5분마다 ECS 서비스의 메타데이터를 쿼리하고 검색된 대상을 CloudWatch 에이전트 컨테이너 내의 `/tmp/cwagent_ecs_auto_sd.yaml` 파일에 씁니다.

다음과 같이 두 서비스 이름 정규 표현식 섹션이 정의됩니다.
+  첫 번째 섹션의 경우 이름이 정규 표현식 `^nginx-.*`와 일치하는 ECS 서비스와 연결된 ECS 태스크가 컨테이너 포트 스캔에 대해 필터링됩니다. 이러한 ECS 태스크 내의 컨테이너가 9113의 컨테이너 포트를 노출하는 경우 컨테이너의 프라이빗 IP와 함께 매핑된 호스트 포트를 사용하여 Prometheus Exporter 대상을 생성합니다. `sd_metrics_path` 값은 `__metrics_path__`를 `/metrics`로 설정합니다. 따라서 CloudWatch 에이전트는 `private_ip:host_port/metrics`에서 Prometheus 지표를 스크레이프하고, 스크레이프한 지표를 CloudWatch Logs 로그 그룹 `/aws/ecs/containerinsights/cluster_name/prometheus`의 `nginx-prometheus` 로그 스트림에 전송합니다.
+  두 번째 섹션의 경우 이름이 정규 표현식 `.*haproxy-service.*`와 일치하는 ECS 서비스와 연결된 ECS 태스크가 컨테이너 포트 스캔에 대해 필터링됩니다. `haproxy`라는 이름의 컨테이너가 8404의 컨테이너 포트를 노출하는 경우 컨테이너의 프라이빗 IP와 함께 매핑된 호스트 포트를 사용하여 Prometheus Exporter 대상을 생성합니다. `sd_metrics_path` 값은 `__metrics_path__`를 `/stats/metrics`로 설정합니다. 따라서 CloudWatch 에이전트는 `private_ip:host_port/stats/metrics`에서 Prometheus 지표를 스크레이프하고, 스크레이프한 지표를 CloudWatch Logs 로그 그룹 `/aws/ecs/containerinsights/cluster_name/prometheus`의 `haproxy-prometheus` 로그 스트림에 전송합니다.

**예 5**

```
"ecs_service_discovery": {
  "sd_frequency": "1m30s",
  "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
  "docker_label": {
    "sd_port_label": "MY_PROMETHEUS_EXPORTER_PORT_LABEL",
    "sd_metrics_path_label": "MY_PROMETHEUS_METRICS_PATH_LABEL",
    "sd_job_name_label": "MY_PROMETHEUS_METRICS_NAME_LABEL"  
  }
  "task_definition_list": [
    {
      "sd_metrics_ports": "9150",
      "sd_task_definition_arn_pattern": "*memcached.*"
    }
  ]
}
```

이 예에서는 두 ECS 서비스 검색 모드를 모두 사용하도록 설정합니다. CloudWatch 에이전트는 90초마다 ECS 태스크의 메타데이터를 쿼리하고 검색된 대상을 CloudWatch 에이전트 컨테이너 내의 `/tmp/cwagent_ecs_auto_sd.yaml` 파일에 씁니다.

Docker 기반 서비스 검색 구성의 경우:
+ Docker 레이블 `MY_PROMETHEUS_EXPORTER_PORT_LABEL`이 있는 ECS 태스크가 Prometheus 포트 스캔에 대해 필터링됩니다. 대상 Prometheus 컨테이너 포트는 `MY_PROMETHEUS_EXPORTER_PORT_LABEL` 레이블의 값으로 지정합니다.
+ `__metrics_path__`에 Docker 레이블 `MY_PROMETHEUS_EXPORTER_PORT_LABEL`의 값을 사용합니다. 컨테이너에 이 Docker 레이블이 없다면 기본값인 `/metrics`를 사용합니다.
+ Docker 레이블 `MY_PROMETHEUS_EXPORTER_PORT_LABEL`의 값을 작업 레이블로 사용합니다. 컨테이너에 이 Docker 레이블이 없다면 Prometheus 구성에 정의된 작업 이름을 사용합니다.

ECS 태스크 정의 ARN 정규 표현식 기반 서비스 검색 구성의 경우:
+ ECS 태스크 정의 ARN에 `memcached`가 있는 ECS 태스크가 컨테이너 포트 스캔에 대해 필터링됩니다. 대상 Prometheus 컨테이너 포트는 `sd_metrics_ports`에 정의된 대로 9150입니다. 기본 지표 경로인 `/metrics`를 사용합니다. Prometheus 구성에 정의된 작업 이름을 사용합니다.

# (선택 사항) Prometheus 지표 테스트를 위한 컨테이너화된 Amazon ECS 워크로드 샘플 설정
<a name="ContainerInsights-Prometheus-Sample-Workloads-ECS"></a>

CloudWatch Container Insights에서 Prometheus 지표 지원을 테스트하기 위해 다음과 같은 컨테이너화된 워크로드 중 하나 이상을 설정할 수 있습니다. Prometheus가 지원되는 CloudWatch 에이전트는 이러한 각 워크로드에서 지표를 자동으로 수집합니다. 기본적으로 수집되는 지표를 보려면 [CloudWatch 에이전트가 수집하는 Prometheus 지표](ContainerInsights-Prometheus-metrics.md) 단원을 참조하세요.

**Topics**
+ [Amazon ECS 클러스터의 App Mesh 워크로드 샘플](ContainerInsights-Prometheus-Sample-Workloads-ECS-appmesh.md)
+ [Amazon ECS 클러스터의 Java/JMX 워크로드 샘플](ContainerInsights-Prometheus-Sample-Workloads-ECS-javajmx.md)
+ [Amazon ECS 클러스터의 NGINX 워크로드 샘플](ContainerInsights-Prometheus-Setup-nginx-ecs.md)
+ [Amazon ECS 클러스터의 NGINX Plus 워크로드 샘플](ContainerInsights-Prometheus-Setup-nginx-plus-ecs.md)
+ [새로운 Prometheus 스크레이프 대상을 추가하기 위한 튜토리얼: Amazon ECS의 Memcached](ContainerInsights-Prometheus-Setup-memcached-ecs.md)
+ [Amazon OSS Fargate의 Redis Prometheus 지표 스크레이핑 자습서](ContainerInsights-Prometheus-Setup-redis-ecs.md)

# Amazon ECS 클러스터의 App Mesh 워크로드 샘플
<a name="ContainerInsights-Prometheus-Sample-Workloads-ECS-appmesh"></a>

Amazon ECS의 Prometheus 워크로드 샘플에서 지표를 수집하려면 클러스터에서 Container Insights를 실행 중이어야 합니다. Container Insights 설치에 대한 자세한 내용은 [Amazon ECS에서 Container Insights 설정](deploy-container-insights-ECS.md) 단원을 참조하세요.

먼저, 이 [시연](https://github.com/aws/aws-app-mesh-examples/tree/main/examples/apps/colorapp#app-mesh-walkthrough-deploy-the-color-app-on-ecs)에 따라 Amazon ECS 클러스터에 샘플 컬러 앱을 배포합니다. 완료하면 포트 9901에 App Mesh Prometheus 지표가 노출됩니다.

다음으로, 다음 단계에 따라 컬러 앱을 설치한 동일한 Amazon ECS 클러스터에 Prometheus 모니터링이 포함된 CloudWatch 에이전트를 설치합니다. 이 단원의 단계에서는 브리지 네트워크 모드에서 CloudWatch 에이전트를 설치합니다.

시연에서 설정한 환경 변수인 `ENVIRONMENT_NAME`, `AWS_PROFILE`, `AWS_DEFAULT_REGION`은 다음 단계에서도 사용됩니다.

**테스트를 위해 Prometheus 모니터링이 포함된 CloudWatch 에이전트를 설치하려면**

1. 다음 명령을 입력하여 CloudFormation 템플릿을 다운로드합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml
   ```

1. 다음 명령을 입력하여 네트워크 모드를 설정합니다.

   ```
   export ECS_CLUSTER_NAME=${ENVIRONMENT_NAME}
   export ECS_NETWORK_MODE=bridge
   ```

1. 다음 명령을 입력하여 CloudFormation 스택을 생성합니다.

   ```
   aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=${ECS_CLUSTER_NAME} \
                    ParameterKey=CreateIAMRoles,ParameterValue=True \
                    ParameterKey=ECSNetworkMode,ParameterValue=${ECS_NETWORK_MODE} \
                    ParameterKey=TaskRoleName,ParameterValue=CWAgent-Prometheus-TaskRole-${ECS_CLUSTER_NAME} \
                    ParameterKey=ExecutionRoleName,ParameterValue=CWAgent-Prometheus-ExecutionRole-${ECS_CLUSTER_NAME} \
       --capabilities CAPABILITY_NAMED_IAM \
       --region ${AWS_DEFAULT_REGION} \
       --profile ${AWS_PROFILE}
   ```

1. (선택 사항) CloudFormation 스택이 생성되면 `CREATE_COMPLETE` 메시지가 표시됩니다. 해당 메시지가 표시되기 전에 상태를 확인하려면 다음 명령을 입력합니다.

   ```
   aws cloudformation describe-stacks \
   --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
   --query 'Stacks[0].StackStatus' \
   --region ${AWS_DEFAULT_REGION} \
   --profile ${AWS_PROFILE}
   ```

**문제 해결**

시연 단계에서는 jq를 사용하여 AWS CLI의 출력 결과를 구문 분석합니다. jq 설치에 대한 자세한 내용은 [jq](https://stedolan.github.io/jq/)를 참조하세요. jq가 올바르게 구문 분석할 수 있도록 다음 명령을 사용하여 AWS CLI의 기본 출력 형식을 JSON으로 설정합니다.

```
$ aws configure
```

[기본 출력 형식(`Default output format`)] 응답에 **json**을 입력합니다.

## Prometheus 모니터링이 포함된 CloudWatch 에이전트 제거
<a name="ContainerInsights-Prometheus-Sample-Workloads-ECS-appmesh-uninstall"></a>

테스트를 마쳤으면 다음 명령을 입력하여 CloudFormation 스택을 삭제함으로써 CloudWatch 에이전트를 제거합니다.

```
aws cloudformation delete-stack \
--stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
--region ${AWS_DEFAULT_REGION} \
--profile ${AWS_PROFILE}
```

# Amazon ECS 클러스터의 Java/JMX 워크로드 샘플
<a name="ContainerInsights-Prometheus-Sample-Workloads-ECS-javajmx"></a>

JMX Exporter는 JMX mBeans를 스크레이프하여 노출할 수 있는 공식 Prometheus 익스포터입니다. 자세한 내용은 [prometheus/jmx\$1exporter](https://github.com/prometheus/jmx_exporter)를 참조하세요.

Prometheus가 지원되는 CloudWatch 에이전트는 Amazon ECS 클러스터의 서비스 검색 구성을 기반으로 Java/JMX Prometheus 지표를 스크레이프합니다. 지표를 다른 포트 또는 metrics\$1path에 노출하도록 JMX Exporter를 구성할 수 있습니다. 포트 또는 경로를 변경하는 경우 CloudWatch 에이전트 구성의 기본 `ecs_service_discovery` 섹션을 업데이트하세요.

Amazon ECS의 Prometheus 워크로드 샘플에서 지표를 수집하려면 클러스터에서 Container Insights를 실행 중이어야 합니다. Container Insights 설치에 대한 자세한 내용은 [Amazon ECS에서 Container Insights 설정](deploy-container-insights-ECS.md) 단원을 참조하세요.

**Amazon ECS 클러스터의 Java/JMX 샘플 워크로드를 설치하려면**

1. 이 단원의 절차에 따라 Docker 이미지를 생성합니다.
   + [예: Prometheus 지표가 있는 Java Jar 애플리케이션 Docker 이미지](ContainerInsights-Prometheus-Sample-Workloads-javajmx.md#ContainerInsights-Prometheus-Sample-Workloads-javajmx-jar)
   + [예: Prometheus 지표가 있는 Apache Tomcat Docker 이미지](ContainerInsights-Prometheus-Sample-Workloads-javajmx.md#ContainerInsights-Prometheus-Sample-Workloads-javajmx-tomcat)

1. Amazon ECS 태스크 정의 파일에서 다음과 같은 두 Docker 레이블을 지정합니다. 그러면 클러스터에서 태스크 정의를 Amazon ECS 서비스 또는 Amazon ECS 태스크로 실행할 수 있습니다.
   + `ECS_PROMETHEUS_EXPORTER_PORT`를 Prometheus 지표가 노출되는 containerPort를 가리키도록 설정합니다.
   + `Java_EMF_Metrics`를 `true`으로 설정합니다. CloudWatch 에이전트는 이 플래그를 사용하여 로그 이벤트에 임베디드 지표 형식을 생성합니다.

   다음은 예제입니다.

   ```
   {
     "family": "workload-java-ec2-bridge",
     "taskRoleArn": "{{task-role-arn}}",
     "executionRoleArn": "{{execution-role-arn}}",
     "networkMode": "bridge",
     "containerDefinitions": [
       {
         "name": "tomcat-prometheus-workload-java-ec2-bridge-dynamic-port",
         "image": "your_docker_image_tag_for_tomcat_with_prometheus_metrics",
         "portMappings": [
           {
             "hostPort": 0,
             "protocol": "tcp",
             "containerPort": 9404
           }
         ],
         "dockerLabels": {
           "ECS_PROMETHEUS_EXPORTER_PORT": "9404",
           "Java_EMF_Metrics": "true"
         }
       }
     ],
     "requiresCompatibilities": [
       "EC2"  ],
     "cpu": "256",
     "memory": "512"
     }
   ```

CloudFormation 템플릿에서 CloudWatch 에이전트의 기본 설정은 Docker 레이블 기반 서비스 검색과 태스크 정의 ARN 기반 서비스 검색을 모두 사용 설정합니다. 이러한 기본 설정을 보려면 [CloudWatch 에이전트 YAML 구성 파일](https://github.com/aws-samples/amazon-cloudwatch-container-insights/blob/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml#L65)의 65번 코드 줄을 참조하세요. `ECS_PROMETHEUS_EXPORTER_PORT` 레이블이 있는 컨테이너는 Prometheus 스크레이핑에 대해 지정된 컨테이너 포트를 기반으로 자동 검색됩니다.

또한 CloudWatch 에이전트의 기본 설정에는 동일한 파일의 112번 코드 줄에서 찾아볼 수 있는 Java/JMX의 `metric_declaration` 설정도 있습니다. 대상 컨테이너의 모든 Docker 레이블은 Prometheus 지표의 레이블로 추가되고 CloudWatch Logs에 전송됩니다. `Java_EMF_Metrics=“true”`의 Docker 레이블이 있는 Java/JMX 컨테이너의 경우 임베디드 지표 형식이 생성됩니다.

# Amazon ECS 클러스터의 NGINX 워크로드 샘플
<a name="ContainerInsights-Prometheus-Setup-nginx-ecs"></a>

NGINX Prometheus Exporter는 NGINX 데이터를 Prometheus 지표로 스크레이프하고 노출할 수 있습니다. 이 예에서는 Amazon ECS의 NGINX 역방향 프록시 서비스와 함께 Exporter를 사용합니다.

NGINX Prometheus Exporter에 대한 자세한 내용은 Github의 [nginx-prometheus-exporter](https://github.com/nginxinc/nginx-prometheus-exporter)를 참조하세요. NGINX 역방향 프록시에 대한 자세한 내용은 Github의 [ecs-nginx-reverse-proxy](https://github.com/awslabs/ecs-nginx-reverse-proxy)를 참조하세요.

Prometheus가 지원되는 CloudWatch 에이전트는 Amazon ECS 클러스터의 서비스 검색 구성을 기반으로 NGINX Prometheus 지표를 스크레이프합니다. 지표를 다른 포트 또는 경로에 노출하도록 NGINX Prometheus Exporter를 구성할 수 있습니다. 포트 또는 경로를 변경하는 경우 CloudWatch 에이전트 구성 파일의 `ecs_service_discovery` 섹션을 업데이트하세요.

## Amazon ECS 클러스터의 NGINX 역방향 프록시 샘플 워크로드 설치
<a name="ContainerInsights-Prometheus-nginx-ecs-setup"></a>

다음 단계에 따라 NGINX 역방향 프록시 샘플 워크로드를 설치합니다.

### Docker 이미지 생성
<a name="ContainerInsights-Prometheus-nginx-ecs-setup-docker"></a>

**NGINX 역방향 프록시 샘플 워크로드의 Docker 이미지를 생성하려면**

1. NGINX 역방향 프록시 리포지토리에서 다음 폴더를 다운로드합니다. [ https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/](https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/)

1. `app` 디렉터리를 찾아 해당 디렉터리에서 이미지를 구축합니다.

   ```
   docker build -t web-server-app ./path-to-app-directory
   ```

1. NGINX용 사용자 지정 이미지를 구축합니다. 먼저, 다음과 같은 두 파일이 포함된 디렉터리를 만듭니다.
   + 샘플 Dockerfile:

     ```
     FROM nginx
     COPY nginx.conf /etc/nginx/nginx.conf
     ```
   + [https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/](https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/)에서 수정한 `nginx.conf` 파일:

     ```
     events {
       worker_connections 768;
     }
     
     http {
       # Nginx will handle gzip compression of responses from the app server
       gzip on;
       gzip_proxied any;
       gzip_types text/plain application/json;
       gzip_min_length 1000;
     
       server{
         listen 8080;
         location /stub_status {
             stub_status   on;
         }
       }
     
       server {
         listen 80;
     
         # Nginx will reject anything not matching /api
         location /api {
           # Reject requests with unsupported HTTP method
           if ($request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|DELETE)$) {
             return 405;
           }
     
           # Only requests matching the whitelist expectations will
           # get sent to the application server
           proxy_pass http://app:3000;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection 'upgrade';
           proxy_set_header Host $host;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_cache_bypass $http_upgrade;
         }
       }
     }
     ```
**참고**  
`nginx-prometheus-exporter`가 지표를 스크레이프하도록 구성된 동일한 포트에서 `stub_status`를 사용하도록 설정해야 합니다. 태스크 정의 예에서 `nginx-prometheus-exporter`는 포트 8080에서 지표를 스크레이프하도록 구성됩니다.

1. 새 디렉터리의 파일에서 이미지를 구축합니다.

   ```
   docker build -t nginx-reverse-proxy ./path-to-your-directory
   ```

1. 나중에 사용할 수 있도록 새 이미지를 이미지 리포지토리에 업로드합니다.

### Amazon ECS에서 NGINX 및 웹 서버 앱을 실행하는 태스크 정의 생성
<a name="ContainerInsights-Prometheus-nginx-ecs-setup-task"></a>

다음으로, 태스크 정의를 설정합니다.

이 태스크 정의를 사용하면 NGINX Prometheus 지표를 수집하고 내보낼 수 있습니다. NGINX 컨테이너는 앱의 입력을 추적하고, `nginx.conf`에 설정된 대로 해당 데이터를 포트 8080에 노출합니다. NGINX Prometheus Exporter 컨테이너는 이러한 지표를 스크레이프하며 CloudWatch에서 사용할 수 있도록 포트 9113에 게시합니다.

**NGINX 샘플 Amazon ECS 워크로드의 태스크 정의를 설정하려면**

1. 다음 내용이 포함된 태스크 정의 JSON 파일을 생성합니다. *your-customized-nginx-iamge*를 사용자 지정 NGINX 이미지의 이미지 URI로 바꾸고 *your-web-server-app-image*를 웹 서버 앱 이미지의 이미지 URI로 바꿉니다.

   ```
   {
     "containerDefinitions": [
       {
         "name": "nginx",
         "image": "your-customized-nginx-image",
         "memory": 256,
         "cpu": 256,
         "essential": true,
         "portMappings": [
           {
             "containerPort": 80,
             "protocol": "tcp"
           }
         ],
         "links": [
           "app"
         ]
       },
       {
         "name": "app",
         "image": "your-web-server-app-image",
         "memory": 256,
         "cpu": 256,
         "essential": true
       },
       {
         "name": "nginx-prometheus-exporter",
         "image": "docker.io/nginx/nginx-prometheus-exporter:0.8.0",
         "memory": 256,
         "cpu": 256,
         "essential": true,
         "command": [
           "-nginx.scrape-uri",
           "http://nginx:8080/stub_status"
       ],
       "links":[
         "nginx"
       ],
         "portMappings":[
           {
             "containerPort": 9113,
             "protocol": "tcp"
           }
         ]
       }
     ],
     "networkMode": "bridge",
     "placementConstraints": [],
     "family": "nginx-sample-stack"
   }
   ```

1. 다음 명령을 입력하여 태스크 정의를 등록합니다.

   ```
   aws ecs register-task-definition --cli-input-json file://path-to-your-task-definition-json
   ```

1. 다음 명령을 입력하여 태스크를 실행할 서비스를 생성합니다.

   서비스 이름을 변경해서는 안 됩니다. 태스크를 시작한 서비스의 이름 패턴을 사용해 태스크를 검색하는 구성을 사용하여 CloudWatch 에이전트 서비스를 실행합니다. 예를 들어 CloudWatch 에이전트가 이 명령으로 시작된 태스크를 찾도록 하려면 `sd_service_name_pattern` 값을 `^nginx-service$`로 지정할 수 있습니다. 다음 단원에서 더 자세히 설명합니다.

   ```
   aws ecs create-service \
    --cluster your-cluster-name \
    --service-name nginx-service \
    --task-definition nginx-sample-stack:1 \
    --desired-count 1
   ```

### NGINX Prometheus 지표를 스크레이프하도록 CloudWatch 에이전트 구성
<a name="ContainerInsights-Prometheus-nginx-ecs-setup-agent"></a>

마지막 단계는 NGINX 지표를 스크레이프하도록 CloudWatch 에이전트를 구성하는 것입니다. 이 예에서 CloudWatch 에이전트는 서비스 이름 패턴과 Exporter가 NGINX에 대한 Prometheus 지표를 노출하는 포트 9113을 통해 태스크를 검색합니다. 태스크를 검색하고 지표를 사용할 수 있게 되면 CloudWatch 에이전트는 수집된 지표를 로그 스트림 **nginx-prometheus-exporter**에 게시하기 시작합니다.

**NGINX 지표를 스크레이프하도록 CloudWatch 에이전트를 구성하려면**

1. 다음 명령을 입력하여 필요한 YAML 파일의 최신 버전을 다운로드합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml
   ```

1. 텍스트 편집기를 사용하여 파일을 열고 `resource:CWAgentConfigSSMParameter` 섹션에서 `value` 키의 전체 CloudWatch 에이전트 구성을 찾습니다. 그런 다음, `ecs_service_discovery` 섹션에서 다음 `service_name_list_for_tasks` 섹션을 추가합니다.

   ```
   "service_name_list_for_tasks": [
     {
       "sd_job_name": "nginx-prometheus-exporter",
       "sd_metrics_path": "/metrics",
       "sd_metrics_ports": "9113",
       "sd_service_name_pattern": "^nginx-service$"
      }
   ],
   ```

1. 동일한 파일의 `metric_declaration` 섹션에 다음 섹션을 추가하여 NGINX 지표를 허용합니다. 이때 기존의 들여쓰기 패턴을 따라야 합니다.

   ```
   {
     "source_labels": ["job"],
     "label_matcher": ".*nginx.*",
     "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName"]],
     "metric_selectors": [
       "^nginx_.*$"
     ]
   },
   ```

1. 이 클러스터에 CloudWatch 에이전트를 아직 배포하지 않은 경우 8단계로 건너뜁니다.

   AWS CloudFormation을 사용하여 Amazon ECS 클러스터에 CloudWatch 에이전트를 이미 배포한 경우 다음 명령을 입력하여 변경 세트를 생성할 수 있습니다.

   ```
   ECS_CLUSTER_NAME=your_cluster_name
   AWS_REGION=your_aws_region
   ECS_NETWORK_MODE=bridge
   CREATE_IAM_ROLES=True
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-change-set --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION \
       --change-set-name nginx-scraping-support
   ```

1. CloudFormation 콘솔([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/))을 엽니다.

1. 새로 생성한 변경 세트인 **nginx-scraping-support**를 검토합니다. **CWAgentConfigSSMParameter** 리소스에 적용된 변경 사항 하나가 표시되어야 합니다. 변경 세트를 실행하고 다음 명령을 입력하여 CloudWatch 에이전트 태스크를 다시 시작합니다.

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 0 \
   --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \
   --region $AWS_REGION
   ```

1. 10초 정도 기다린 후 다음 명령을 입력합니다.

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 1 \
   --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \
   --region $AWS_REGION
   ```

1. 클러스터에 처음으로 Prometheus 지표 수집이 포함된 CloudWatch 에이전트를 설치하는 경우 다음 명령을 입력합니다.

   ```
   ECS_CLUSTER_NAME=your_cluster_name
   AWS_REGION=your_aws_region
   ECS_NETWORK_MODE=bridge
   CREATE_IAM_ROLES=True
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION
   ```

## NGINX 지표 및 로그 보기
<a name="ContainerInsights-Prometheus-Setup-nginx-view"></a>

이제 수집 중인 NGINX 지표를 볼 수 있습니다.

**샘플 NGINX 워크로드에 대한 지표를 보려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 클러스터가 실행되고 있는 리전에서 왼쪽 탐색 창의 [**지표(Metrics)**]를 선택합니다. **ContainerInsights/Prometheus** 네임스페이스를 찾아 지표를 확인합니다.

1. CloudWatch Logs 이벤트를 보려면 탐색 창에서 [**로그 그룹(Log groups)**]을 선택합니다. 이벤트는 로그 그룹 **/aws/containerinsights/*your\$1cluster\$1name*/prometheus**의 로그 스트림 *nginx-prometheus-exporter*에 있습니다.

# Amazon ECS 클러스터의 NGINX Plus 워크로드 샘플
<a name="ContainerInsights-Prometheus-Setup-nginx-plus-ecs"></a>

NGINX Plus는 NGINX의 상용 버전입니다. 사용하려면 라이선스가 있어야 합니다. 자세한 내용은 [NGINX Plus](https://www.nginx.com/products/nginx/)를 참조하세요.

NGINX Prometheus Exporter는 NGINX 데이터를 Prometheus 지표로 스크레이프하고 노출할 수 있습니다. 이 예에서는 Amazon ECS의 NGINX Plus 역방향 프록시 서비스와 함께 Exporter를 사용합니다.

NGINX Prometheus Exporter에 대한 자세한 내용은 Github의 [nginx-prometheus-exporter](https://github.com/nginxinc/nginx-prometheus-exporter)를 참조하세요. NGINX 역방향 프록시에 대한 자세한 내용은 Github의 [ecs-nginx-reverse-proxy](https://github.com/awslabs/ecs-nginx-reverse-proxy)를 참조하세요.

Prometheus가 지원되는 CloudWatch 에이전트는 Amazon ECS 클러스터의 서비스 검색 구성을 기반으로 NGINX Plus Prometheus 지표를 스크레이프합니다. 지표를 다른 포트 또는 경로에 노출하도록 NGINX Prometheus Exporter를 구성할 수 있습니다. 포트 또는 경로를 변경하는 경우 CloudWatch 에이전트 구성 파일의 `ecs_service_discovery` 섹션을 업데이트하세요.

## Amazon ECS 클러스터의 NGINX Plus 역방향 프록시 샘플 워크로드 설치
<a name="ContainerInsights-Prometheus-nginx-plus-ecs-setup"></a>

다음 단계에 따라 NGINX 역방향 프록시 샘플 워크로드를 설치합니다.

### Docker 이미지 생성
<a name="ContainerInsights-Prometheus-nginx-plus-ecs-setup-docker"></a>

**NGINX Plus 역방향 프록시 샘플 워크로드의 Docker 이미지를 생성하려면**

1. NGINX 역방향 프록시 리포지토리에서 다음 폴더를 다운로드합니다. [ https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/](https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/)

1. `app` 디렉터리를 찾아 해당 디렉터리에서 이미지를 구축합니다.

   ```
   docker build -t web-server-app ./path-to-app-directory
   ```

1. NGINX Plus용 사용자 지정 이미지를 구축합니다. NGINX Plus용 이미지를 구축하기 전에 먼저, `nginx-repo.key`라는 키와 라이선스가 있는 NGINX Plus의 SSL 인증서인 `nginx-repo.crt`를 가져와야 합니다. 디렉터리를 만들어서 그 안에 `nginx-repo.key` 및 `nginx-repo.crt` 파일을 저장합니다.

   방금 만든 디렉터리에서 다음과 같은 두 파일을 생성합니다.
   + 다음 내용이 포함된 샘플 Dockerfile: 이 Docker 파일은 [https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-docker/\$1docker\$1plus\$1image](https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-docker/#docker_plus_image)에서 제공한 샘플 파일에서 채택한 것입니다. 중요한 변경 사항은 다음 단계에서 생성될 `nginx.conf`라는 별도의 파일을 로드한다는 것입니다.

     ```
     FROM debian:buster-slim
     
     LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>“
     
     # Define NGINX versions for NGINX Plus and NGINX Plus modules
     # Uncomment this block and the versioned nginxPackages block in the main RUN
     # instruction to install a specific release
     # ENV NGINX_VERSION 21
     # ENV NJS_VERSION 0.3.9
     # ENV PKG_RELEASE 1~buster
     
     # Download certificate and key from the customer portal (https://cs.nginx.com (https://cs.nginx.com/))
     # and copy to the build context
     COPY nginx-repo.crt /etc/ssl/nginx/
     COPY nginx-repo.key /etc/ssl/nginx/
     # COPY nginx.conf /etc/ssl/nginx/nginx.conf
     
     RUN set -x \
     # Create nginx user/group first, to be consistent throughout Docker variants
     && addgroup --system --gid 101 nginx \
     && adduser --system --disabled-login --ingroup nginx --no-create-home --home /nonexistent --gecos "nginx user" --shell /bin/false --uid 101 nginx \
     && apt-get update \
     && apt-get install --no-install-recommends --no-install-suggests -y ca-certificates gnupg1 \
     && \
     NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62; \
     found=''; \
     for server in \
     ha.pool.sks-keyservers.net (http://ha.pool.sks-keyservers.net/) \
     hkp://keyserver.ubuntu.com:80 \
     hkp://p80.pool.sks-keyservers.net:80 \
     pgp.mit.edu (http://pgp.mit.edu/) \
     ; do \
     echo "Fetching GPG key $NGINX_GPGKEY from $server"; \
     apt-key adv --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$NGINX_GPGKEY" && found=yes && break; \
     done; \
     test -z "$found" && echo >&2 "error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1; \
     apt-get remove --purge --auto-remove -y gnupg1 && rm -rf /var/lib/apt/lists/* \
     # Install the latest release of NGINX Plus and/or NGINX Plus modules
     # Uncomment individual modules if necessary
     # Use versioned packages over defaults to specify a release
     && nginxPackages=" \
     nginx-plus \
     # nginx-plus=${NGINX_VERSION}-${PKG_RELEASE} \
     # nginx-plus-module-xslt \
     # nginx-plus-module-xslt=${NGINX_VERSION}-${PKG_RELEASE} \
     # nginx-plus-module-geoip \
     # nginx-plus-module-geoip=${NGINX_VERSION}-${PKG_RELEASE} \
     # nginx-plus-module-image-filter \
     # nginx-plus-module-image-filter=${NGINX_VERSION}-${PKG_RELEASE} \
     # nginx-plus-module-perl \
     # nginx-plus-module-perl=${NGINX_VERSION}-${PKG_RELEASE} \
     # nginx-plus-module-njs \
     # nginx-plus-module-njs=${NGINX_VERSION}+${NJS_VERSION}-${PKG_RELEASE} \
     " \
     && echo "Acquire::https::plus-pkgs.nginx.com::Verify-Peer \"true\";" >> /etc/apt/apt.conf.d/90nginx \
     && echo "Acquire::https::plus-pkgs.nginx.com::Verify-Host \"true\";" >> /etc/apt/apt.conf.d/90nginx \
     && echo "Acquire::https::plus-pkgs.nginx.com::SslCert \"/etc/ssl/nginx/nginx-repo.crt\";" >> /etc/apt/apt.conf.d/90nginx \
     && echo "Acquire::https::plus-pkgs.nginx.com::SslKey \"/etc/ssl/nginx/nginx-repo.key\";" >> /etc/apt/apt.conf.d/90nginx \
     && printf "deb https://plus-pkgs.nginx.com/debian buster nginx-plus\n" > /etc/apt/sources.list.d/nginx-plus.list \
     && apt-get update \
     && apt-get install --no-install-recommends --no-install-suggests -y \
     $nginxPackages \
     gettext-base \
     curl \
     && apt-get remove --purge --auto-remove -y && rm -rf /var/lib/apt/lists/* /etc/apt/sources.list.d/nginx-plus.list \
     && rm -rf /etc/apt/apt.conf.d/90nginx /etc/ssl/nginx
     
     # Forward request logs to Docker log collector
     RUN ln -sf /dev/stdout /var/log/nginx/access.log \
     && ln -sf /dev/stderr /var/log/nginx/error.log
     
     COPY nginx.conf /etc/nginx/nginx.conf
     
     EXPOSE 80
     
     STOPSIGNAL SIGTERM
     
     CMD ["nginx", "-g", "daemon off;"]
     ```
   + [https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/nginx](https://github.com/awslabs/ecs-nginx-reverse-proxy/tree/master/reverse-proxy/nginx)에서 수정한 `nginx.conf` 파일

     ```
     events {
       worker_connections 768;
     }
     
     http {
       # Nginx will handle gzip compression of responses from the app server
       gzip on;
       gzip_proxied any;
       gzip_types text/plain application/json;
       gzip_min_length 1000;
     
       upstream backend {
         zone name 10m;
         server app:3000    weight=2;
         server app2:3000    weight=1;
       }
     
       server{
         listen 8080;
         location /api {
           api write=on;
         }
       }
     
       match server_ok {
         status 100-599;
       }
     
       server {
         listen 80;
         status_zone zone;
         # Nginx will reject anything not matching /api
         location /api {
           # Reject requests with unsupported HTTP method
           if ($request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|DELETE)$) {
             return 405;
           }
     
           # Only requests matching the whitelist expectations will
           # get sent to the application server
           proxy_pass http://backend;
           health_check uri=/lorem-ipsum match=server_ok;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection 'upgrade';
           proxy_set_header Host $host;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_cache_bypass $http_upgrade;
         }
       }
     }
     ```

1. 새 디렉터리의 파일에서 이미지를 구축합니다.

   ```
   docker build -t nginx-plus-reverse-proxy ./path-to-your-directory
   ```

1. 나중에 사용할 수 있도록 새 이미지를 이미지 리포지토리에 업로드합니다.

### Amazon ECS에서 NGINX Plus 및 웹 서버 앱을 실행하는 태스크 정의 생성
<a name="ContainerInsights-Prometheus-nginx-plus-ecs-setup-task"></a>

다음으로, 태스크 정의를 설정합니다.

이 태스크 정의를 사용하면 NGINX Plus Prometheus 지표를 수집하고 내보낼 수 있습니다. NGINX 컨테이너는 앱의 입력을 추적하고, `nginx.conf`에 설정된 대로 해당 데이터를 포트 8080에 노출합니다. NGINX Prometheus Exporter 컨테이너는 이러한 지표를 스크레이프하며 CloudWatch에서 사용할 수 있도록 포트 9113에 게시합니다.

**NGINX 샘플 Amazon ECS 워크로드의 태스크 정의를 설정하려면**

1. 다음 내용이 포함된 태스크 정의 JSON 파일을 생성합니다. *your-customized-nginx-plus-image*를 사용자 지정 NGINX Plus 이미지의 이미지 URI로 바꾸고 *your-web-server-app-image*를 웹 서버 앱 이미지의 이미지 URI로 바꿉니다.

   ```
   {
     "containerDefinitions": [
       {
         "name": "nginx",
         "image": "your-customized-nginx-plus-image",
         "memory": 256,
         "cpu": 256,
         "essential": true,
         "portMappings": [
           {
             "containerPort": 80,
             "protocol": "tcp"
           }
         ],
         "links": [
           "app",
           "app2"
         ]
       },
       {
         "name": "app",
         "image": "your-web-server-app-image",
         "memory": 256,
         "cpu": 128,
         "essential": true
       },
       {
         "name": "app2",
         "image": "your-web-server-app-image",
         "memory": 256,
         "cpu": 128,
         "essential": true
       },
       {
         "name": "nginx-prometheus-exporter",
         "image": "docker.io/nginx/nginx-prometheus-exporter:0.8.0",
         "memory": 256,
         "cpu": 256,
         "essential": true,
         "command": [
           "-nginx.plus",
           "-nginx.scrape-uri",
            "http://nginx:8080/api"
       ],
       "links":[
         "nginx"
       ],
         "portMappings":[
           {
             "containerPort": 9113,
             "protocol": "tcp"
           }
         ]
       }
     ],
     "networkMode": "bridge",
     "placementConstraints": [],
     "family": "nginx-plus-sample-stack"
   }
   ```

1. 태스크 정의를 등록합니다.

   ```
   aws ecs register-task-definition --cli-input-json file://path-to-your-task-definition-json
   ```

1. 다음 명령을 입력하여 태스크를 실행할 서비스를 생성합니다.

   ```
   aws ecs create-service \
    --cluster your-cluster-name \
    --service-name nginx-plus-service \
    --task-definition nginx-plus-sample-stack:1 \
    --desired-count 1
   ```

   서비스 이름을 변경해서는 안 됩니다. 태스크를 시작한 서비스의 이름 패턴을 사용해 태스크를 검색하는 구성을 사용하여 CloudWatch 에이전트 서비스를 실행합니다. 예를 들어 CloudWatch 에이전트가 이 명령으로 시작된 태스크를 찾도록 하려면 `sd_service_name_pattern` 값을 `^nginx-plus-service$`로 지정할 수 있습니다. 다음 단원에서 더 자세히 설명합니다.

### NGINX Plus Prometheus 지표를 스크레이프하도록 CloudWatch 에이전트 구성
<a name="ContainerInsights-Prometheus-nginx-plus-ecs-setup-agent"></a>

마지막 단계는 NGINX 지표를 스크레이프하도록 CloudWatch 에이전트를 구성하는 것입니다. 이 예에서 CloudWatch 에이전트는 서비스 이름 패턴과 Exporter가 NGINX에 대한 Prometheus 지표를 노출하는 포트 9113을 통해 태스크를 검색합니다. 태스크를 검색하고 지표를 사용할 수 있게 되면 CloudWatch 에이전트는 수집된 지표를 로그 스트림 **nginx-prometheus-exporter**에 게시하기 시작합니다.

**NGINX 지표를 스크레이프하도록 CloudWatch 에이전트를 구성하려면**

1. 다음 명령을 입력하여 필요한 YAML 파일의 최신 버전을 다운로드합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-bridge-host.yaml
   ```

1. 텍스트 편집기를 사용하여 파일을 열고 `resource:CWAgentConfigSSMParameter` 섹션에서 `value` 키의 전체 CloudWatch 에이전트 구성을 찾습니다. 그런 다음, `ecs_service_discovery` 섹션에서 다음 `service_name_list_for_tasks` 섹션을 추가합니다.

   ```
   "service_name_list_for_tasks": [
     {
       "sd_job_name": "nginx-plus-prometheus-exporter",
       "sd_metrics_path": "/metrics",
       "sd_metrics_ports": "9113",
       "sd_service_name_pattern": "^nginx-plus.*"
      }
   ],
   ```

1. 동일한 파일의 `metric_declaration` 섹션에 다음 섹션을 추가하여 NGINX Plus 지표를 허용합니다. 이때 기존의 들여쓰기 패턴을 따라야 합니다.

   ```
   {
     "source_labels": ["job"],
     "label_matcher": "^nginx-plus.*",
     "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName"]],
     "metric_selectors": [
       "^nginxplus_connections_accepted$",
       "^nginxplus_connections_active$",
       "^nginxplus_connections_dropped$",
       "^nginxplus_connections_idle$",
       "^nginxplus_http_requests_total$",
       "^nginxplus_ssl_handshakes$",
       "^nginxplus_ssl_handshakes_failed$",
       "^nginxplus_up$",
       "^nginxplus_upstream_server_health_checks_fails$"
     ]
   },
   {
     "source_labels": ["job"],
     "label_matcher": "^nginx-plus.*",
     "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName", "upstream"]],
     "metric_selectors": [
       "^nginxplus_upstream_server_response_time$"
     ]
   },
   {
     "source_labels": ["job"],
     "label_matcher": "^nginx-plus.*",
     "dimensions": [["ClusterName", "TaskDefinitionFamily", "ServiceName", "code"]],
     "metric_selectors": [
       "^nginxplus_upstream_server_responses$",
       "^nginxplus_server_zone_responses$"
     ]
   },
   ```

1. 이 클러스터에 CloudWatch 에이전트를 아직 배포하지 않은 경우 8단계로 건너뜁니다.

   AWS CloudFormation을 사용하여 Amazon ECS 클러스터에 CloudWatch 에이전트를 이미 배포한 경우 다음 명령을 입력하여 변경 세트를 생성할 수 있습니다.

   ```
   ECS_CLUSTER_NAME=your_cluster_name
   AWS_REGION=your_aws_region
   ECS_NETWORK_MODE=bridge
   CREATE_IAM_ROLES=True
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-change-set --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION \
       --change-set-name nginx-plus-scraping-support
   ```

1. CloudFormation 콘솔([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/))을 엽니다.

1. 새로 생성한 변경 세트인 **nginx-plus-scraping-support**를 검토합니다. **CWAgentConfigSSMParameter** 리소스에 적용된 변경 사항 하나가 표시되어야 합니다. 변경 세트를 실행하고 다음 명령을 입력하여 CloudWatch 에이전트 태스크를 다시 시작합니다.

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 0 \
   --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \
   --region $AWS_REGION
   ```

1. 10초 정도 기다린 후 다음 명령을 입력합니다.

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 1 \
   --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \
   --region $AWS_REGION
   ```

1. 클러스터에 처음으로 Prometheus 지표 수집이 포함된 CloudWatch 에이전트를 설치하는 경우 다음 명령을 입력합니다.

   ```
   ECS_CLUSTER_NAME=your_cluster_name
   AWS_REGION=your_aws_region
   ECS_NETWORK_MODE=bridge
   CREATE_IAM_ROLES=True
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION
   ```

## NGINX Plus 지표 및 로그 보기
<a name="ContainerInsights-Prometheus-Setup-nginx-plus-view"></a>

이제 수집 중인 NGINX Plus 지표를 볼 수 있습니다.

**샘플 NGINX 워크로드에 대한 지표를 보려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 클러스터가 실행되고 있는 리전에서 왼쪽 탐색 창의 [**지표(Metrics)**]를 선택합니다. **ContainerInsights/Prometheus** 네임스페이스를 찾아 지표를 확인합니다.

1. CloudWatch Logs 이벤트를 보려면 탐색 창에서 [**로그 그룹(Log groups)**]을 선택합니다. 이벤트는 로그 그룹 **/aws/containerinsights/*your\$1cluster\$1name*/prometheus**의 로그 스트림 *nginx-plus-prometheus-exporter*에 있습니다.

# 새로운 Prometheus 스크레이프 대상을 추가하기 위한 튜토리얼: Amazon ECS의 Memcached
<a name="ContainerInsights-Prometheus-Setup-memcached-ecs"></a>

이 튜토리얼에서는 EC2 시작 유형의 Amazon ECS 클러스터에서 샘플 Memcached 애플리케이션의 Prometheus 지표를 스크레이프하는 실습을 소개합니다. CloudWatch 에이전트는 ECS 태스크 정의 기반 서비스 검색을 통해 Memcached Prometheus Exporter 대상을 자동 검색합니다.

Memcached는 범용 분산 메모리 캐싱 시스템으로, 흔히 외부 데이터 소스(예: 데이터베이스 또는 API)를 읽어야 하는 횟수를 줄이기 위해 RAM에 데이터 및 객체를 캐싱하여 동적 데이터베이스 기반 웹 사이트의 속도를 높이는 데 사용됩니다. 자세한 내용은 [Memcached란 무엇입니까?](https://www.memcached.org/)를 참조하세요.

[memchached\$1exporter](https://github.com/prometheus/memcached_exporter)(Apache 라이선스 2.0)는 공식 Prometheus Exporter 중 하나입니다. 기본적으로 memcache\$1exporter는 `/metrics.`의 포트 0.0.0.0:9150에서 제공됩니다.

이 튜토리얼에서는 다음과 같은 두 Docker Hub 리포지토리의 Docker 이미지를 사용합니다.
+ [ Memcached](https://hub.docker.com/_/memcached?tab=description)
+ [ prom/memcached-exporter](https://hub.docker.com/r/prom/memcached-exporter/)

**사전 조건**

Amazon ECS의 Prometheus 워크로드 샘플에서 지표를 수집하려면 클러스터에서 Container Insights를 실행 중이어야 합니다. Container Insights 설치에 대한 자세한 내용은 [Amazon ECS에서 Container Insights 설정](deploy-container-insights-ECS.md) 단원을 참조하세요.

**Topics**
+ [Amazon ECS EC2 클러스터 환경 변수 설정](#ContainerInsights-Prometheus-Setup-memcached-ecs-environment)
+ [샘플 Memcached 워크로드 설치](#ContainerInsights-Prometheus-Setup-memcached-ecs-install-workload)
+ [Memcached Prometheus 지표를 스크레이프하도록 CloudWatch 에이전트 구성](#ContainerInsights-Prometheus-Setup-memcached-ecs-agent)
+ [Memcached 지표 보기](#ContainerInsights-Prometheus-ECS-memcached-view)

## Amazon ECS EC2 클러스터 환경 변수 설정
<a name="ContainerInsights-Prometheus-Setup-memcached-ecs-environment"></a>

**Amazon ECS EC2 클러스터 환경 변수를 설정하려면**

1. 아직 설치하지 않은 경우 Amazon ECS CLI를 설치합니다. 자세한 내용은 [Amazon ECS CLI 설치](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_CLI_installation.html) 단원을 참조하세요.

1. 새 Amazon ECS 클러스터 이름 및 리전을 설정합니다. 예:

   ```
   ECS_CLUSTER_NAME=ecs-ec2-memcached-tutorial
   AWS_DEFAULT_REGION=ca-central-1
   ```

1. (선택 사항) 샘플 Memcached 워크로드 및 CloudWatch 에이전트를 설치하려는 EC2 시작 유형의 Amazon ECS 클러스터가 아직 없는 경우 다음 명령을 입력하여 클러스터를 생성할 수 있습니다.

   ```
   ecs-cli up --capability-iam --size 1 \
   --instance-type t3.medium \
   --cluster $ECS_CLUSTER_NAME \
   --region $AWS_REGION
   ```

   이 명령의 예상 결과는 다음과 같습니다.

   ```
   WARN[0000] You will not be able to SSH into your EC2 instances without a key pair. 
   INFO[0000] Using recommended Amazon Linux 2 AMI with ECS Agent 1.44.4 and Docker version 19.03.6-ce 
   INFO[0001] Created cluster                               cluster=ecs-ec2-memcached-tutorial region=ca-central-1
   INFO[0002] Waiting for your cluster resources to be created... 
   INFO[0002] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
   INFO[0063] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
   INFO[0124] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
   VPC created: vpc-xxxxxxxxxxxxxxxxx
   Security Group created: sg-xxxxxxxxxxxxxxxxx
   Subnet created: subnet-xxxxxxxxxxxxxxxxx
   Subnet created: subnet-xxxxxxxxxxxxxxxxx
   Cluster creation succeeded.
   ```

## 샘플 Memcached 워크로드 설치
<a name="ContainerInsights-Prometheus-Setup-memcached-ecs-install-workload"></a>

**Prometheus 지표를 노출하는 샘플 Memcached 워크로드를 설치하려면**

1. 다음 명령을 입력하여 Memcached CloudFormation 템플릿을 다운로드합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/sample_traffic/memcached/memcached-traffic-sample.yaml
   ```

1. 다음 명령을 입력하여 Memcached용으로 생성할 IAM 역할 이름을 설정합니다.

   ```
   MEMCACHED_ECS_TASK_ROLE_NAME=memcached-prometheus-demo-ecs-task-role-name
   MEMCACHED_ECS_EXECUTION_ROLE_NAME=memcached-prometheus-demo-ecs-execution-role-name
   ```

1. 다음 명령을 입력하여 샘플 Memcached 워크로드를 설치합니다. 이 샘플은 `host` 네트워크 모드에서 워크로드를 설치합니다.

   ```
   MEMCACHED_ECS_NETWORK_MODE=host
   
   aws cloudformation create-stack --stack-name Memcached-Prometheus-Demo-ECS-$ECS_CLUSTER_NAME-EC2-$MEMCACHED_ECS_NETWORK_MODE \
       --template-body file://memcached-traffic-sample.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=ECSNetworkMode,ParameterValue=$MEMCACHED_ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$MEMCACHED_ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$MEMCACHED_ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION
   ```

CloudFormation 스택은 다음과 같은 네 개의 리소스를 생성합니다.
+ ECS 태스크 역할 1개
+ ECS 태스크 실행 역할 1개
+ Memcached 태스크 정의 1개
+ Memcached 서비스 1개

Memcached 태스크 정의에서는 다음과 같이 두 컨테이너가 정의됩니다.
+ 기본 컨테이너는 단순한 Memcached 애플리케이션을 실행하고 액세스를 위해 포트 11211을 엽니다.
+ 다른 컨테이너에서는 Redis OSS 내보내기 도구 프로세스를 실행하여 포트 9150에서 Prometheus 지표를 노출합니다. 이는 CloudWatch 에이전트가 검색하고 스크레이프할 컨테이너입니다.

## Memcached Prometheus 지표를 스크레이프하도록 CloudWatch 에이전트 구성
<a name="ContainerInsights-Prometheus-Setup-memcached-ecs-agent"></a>

**Memcached Prometheus 지표를 스크레이프하도록 CloudWatch 에이전트를 구성하려면**

1. 다음 명령을 입력하여 최신 버전의 `cwagent-ecs-prometheus-metric-for-awsvpc.yaml`을 다운로드합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-awsvpc.yaml
   ```

1. 텍스트 편집기를 사용하여 파일을 열고 `resource:CWAgentConfigSSMParameter` 섹션에서 `value` 키 뒤에 있는 전체 CloudWatch 에이전트 구성을 찾습니다.

   그런 다음, `ecs_service_discovery` 섹션에서 다음 구성을 `task_definition_list` 섹션에 추가합니다.

   ```
   {
       "sd_job_name": "ecs-memcached",
       "sd_metrics_ports": "9150",
       "sd_task_definition_arn_pattern": ".*:task-definition/memcached-prometheus-demo.*:[0-9]+"
   },
   ```

   `metric_declaration` 섹션의 경우 기본 설정은 어느 Memcached 지표도 허용하지 않습니다. Memcached 지표를 허용하려면 다음 섹션을 추가합니다. 이때 기존의 들여쓰기 패턴을 따라야 합니다.

   ```
   {
     "source_labels": ["container_name"],
     "label_matcher": "memcached-exporter-.*",
     "dimensions": [["ClusterName", "TaskDefinitionFamily"]],
     "metric_selectors": [
       "^memcached_current_(bytes|items|connections)$",
       "^memcached_items_(reclaimed|evicted)_total$",
       "^memcached_(written|read)_bytes_total$",
       "^memcached_limit_bytes$",
       "^memcached_commands_total$"
     ]
   },
   {
     "source_labels": ["container_name"],
     "label_matcher": "memcached-exporter-.*",
     "dimensions": [["ClusterName", "TaskDefinitionFamily","status","command"], ["ClusterName", "TaskDefinitionFamily","command"]],
     "metric_selectors": [
       "^memcached_commands_total$"
     ]
   },
   ```

1. CloudFormation에서 Amazon ECS 클러스터에 CloudWatch 에이전트를 이미 배포한 경우 다음 명령을 입력하여 변경 세트를 생성할 수 있습니다.

   ```
   ECS_NETWORK_MODE=bridge
   CREATE_IAM_ROLES=True
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-change-set --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION \
       --change-set-name memcached-scraping-support
   ```

1. CloudFormation 콘솔([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/))을 엽니다.

1. 새로 생성한 변경 세트인 `memcached-scraping-support`를 검토합니다. `CWAgentConfigSSMParameter` 리소스에 적용된 변경 사항 하나가 표시되어야 합니다. 변경 세트를 실행하고 다음 명령을 입력하여 CloudWatch 에이전트 태스크를 다시 시작합니다.

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 0 \
   --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \
   --region $AWS_REGION
   ```

1. 10초 정도 기다린 후 다음 명령을 입력합니다.

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 1 \
   --service cwagent-prometheus-replica-service-EC2-$ECS_NETWORK_MODE \
   --region $AWS_REGION
   ```

1. 클러스터에 처음으로 Prometheus 지표 수집이 포함된 CloudWatch 에이전트를 설치하는 경우 다음 명령을 입력합니다.

   ```
   ECS_NETWORK_MODEE=bridge
   CREATE_IAM_ROLES=True
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
       --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_REGION
   ```

## Memcached 지표 보기
<a name="ContainerInsights-Prometheus-ECS-memcached-view"></a>

이 튜토리얼에서는 CloudWatch의 **ECS/ContainerInsights/Prometheus** 네임스페이스에 다음 지표를 전송합니다. CloudWatch 콘솔을 사용하여 해당 네임스페이스의 지표를 볼 수 있습니다.


| 지표 이름 | 측정기준 | 
| --- | --- | 
|  `memcached_current_items` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_current_connections` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_limit_bytes` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_current_bytes` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_written_bytes_total` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_read_bytes_total` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_items_evicted_total` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_items_reclaimed_total` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `memcached_commands_total` |  `ClusterName`, `TaskDefinitionFamily` `ClusterName`, TaskDefinitionFamily, 명령 `ClusterName`, TaskDefinitionFamily, 상태, 명령  | 

**참고**  
[**명령(command)**] 측정기준의 값은 `delete`, `get`, `cas`, `set`, `decr`, `touch`, `incr` 또는 `flush`일 수 있습니다.  
[**상태(status)**] 측정기준의 값은 `hit`, `miss` 또는 `badval`일 수 있습니다.

또한 Memcached Prometheus 지표에 대한 CloudWatch 대시보드를 생성할 수도 있습니다.

**Memcached Prometheus 지표에 대한 대시보드를 생성하려면**

1. 환경 변수를 만들어서 아래의 값을 배포와 일치하도록 바꿉니다.

   ```
   DASHBOARD_NAME=your_memcached_cw_dashboard_name
   ECS_TASK_DEF_FAMILY=memcached-prometheus-demo-$ECS_CLUSTER_NAME-EC2-$MEMCACHED_ECS_NETWORK_MOD
   ```

1. 다음 명령을 입력하여 대시보드를 생성합니다.

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/sample_cloudwatch_dashboards/memcached/cw_dashboard_memcached.json \
   | sed "s/{{YOUR_AWS_REGION}}/$AWS_REGION/g" \
   | sed "s/{{YOUR_CLUSTER_NAME}}/$ECS_CLUSTER_NAME/g" \
   | sed "s/{{YOUR_TASK_DEF_FAMILY}}/$ECS_TASK_DEF_FAMILY/g" \
   | xargs -0 aws cloudwatch put-dashboard --dashboard-name ${DASHBOARD_NAME} --region $AWS_REGION --dashboard-body
   ```

# Amazon OSS Fargate의 Redis Prometheus 지표 스크레이핑 자습서
<a name="ContainerInsights-Prometheus-Setup-redis-ecs"></a>

이 자습서에서는 Amazon ECS Fargate 클러스터에서 샘플 Redis OSS 애플리케이션의 Prometheus 지표를 스크레이핑하는 실습 입문을 제공합니다. CloudWatch 에이전트는 컨테이너의 Docker 레이블을 기반으로 하는 Prometheus 지표 지원을 통해 Redis OSS Prometheus 내보내기 도구 대상을 자동 검색합니다.

Redis OSS(https://redis.io/)는 데이터베이스, 캐시 및 메시지 브로커로 사용되는 오픈 소스(BSD 라이선스), 인메모리 구조 데이터 스토어입니다. 자세한 내용은 [redis](https://redis.io/)를 참조하세요.

redis\$1exporter(MIT License 라이선스)는 지정된 포트(기본값: 0.0.0.0:9121)에서 Redis OSS Prometheus 지표를 노출하는 데 사용됩니다. 자세한 내용은 [redis\$1exporter](https://github.com/oliver006/redis_exporter)를 참조하세요.

이 튜토리얼에서는 다음과 같은 두 Docker Hub 리포지토리의 Docker 이미지를 사용합니다.
+ [ redis](https://hub.docker.com/_/redis?tab=description)
+ [ redis\$1exporter](https://hub.docker.com/r/oliver006/redis_exporter)

**사전 조건**

Amazon ECS의 Prometheus 워크로드 샘플에서 지표를 수집하려면 클러스터에서 Container Insights를 실행 중이어야 합니다. Container Insights 설치에 대한 자세한 내용은 [Amazon ECS에서 Container Insights 설정](deploy-container-insights-ECS.md) 단원을 참조하세요.

**Topics**
+ [Amazon ECS Fargate 클러스터 환경 변수 설정](#ContainerInsights-Prometheus-Setup-redis-ecs-variable)
+ [Amazon ECS Fargate 클러스터의 네트워크 환경 변수 설정](#ContainerInsights-Prometheus-Setup-redis-ecs-variable2)
+ [샘플 Redis OSS 워크로드 설치](#ContainerInsights-Prometheus-Setup-redis-ecs-install-workload)
+ [Redis OSS Prometheus 지표를 스크레이핑하도록 CloudWatch 에이전트 구성](#ContainerInsights-Prometheus-Setup-redis-ecs-agent)
+ [Redis OSS 지표 보기](#ContainerInsights-Prometheus-Setup-redis-view)

## Amazon ECS Fargate 클러스터 환경 변수 설정
<a name="ContainerInsights-Prometheus-Setup-redis-ecs-variable"></a>

**Amazon ECS Fargate 클러스터 환경 변수를 설정하려면**

1. 아직 설치하지 않은 경우 Amazon ECS CLI를 설치합니다. 자세한 내용은 [Amazon ECS CLI 설치](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_CLI_installation.html) 단원을 참조하세요.

1. 새 Amazon ECS 클러스터 이름 및 리전을 설정합니다. 예제:

   ```
   ECS_CLUSTER_NAME=ecs-fargate-redis-tutorial
   AWS_DEFAULT_REGION=ca-central-1
   ```

1. (선택 사항) 샘플 Redis OSS 워크로드 및 CloudWatch 에이전트를 설치하려는 Amazon ECS Fargate 클러스터가 아직 없는 경우 다음 명령을 입력하여 클러스터를 생성할 수 있습니다.

   ```
   ecs-cli up --capability-iam \
   --cluster $ECS_CLUSTER_NAME \
   --launch-type FARGATE \
   --region $AWS_DEFAULT_REGION
   ```

   이 명령의 예상 결과는 다음과 같습니다.

   ```
   INFO[0000] Created cluster   cluster=ecs-fargate-redis-tutorial region=ca-central-1
   INFO[0001] Waiting for your cluster resources to be created...
   INFO[0001] Cloudformation stack status   stackStatus=CREATE_IN_PROGRESS
   VPC created: vpc-xxxxxxxxxxxxxxxxx
   Subnet created: subnet-xxxxxxxxxxxxxxxxx
   Subnet created: subnet-xxxxxxxxxxxxxxxxx
   Cluster creation succeeded.
   ```

## Amazon ECS Fargate 클러스터의 네트워크 환경 변수 설정
<a name="ContainerInsights-Prometheus-Setup-redis-ecs-variable2"></a>

**Amazon ECS Fargate 클러스터의 네트워크 환경 변수를 설정하려면**

1. Amazon ECS 클러스터의 VPC 및 서브넷 ID를 설정합니다. 이전 절차에서 새 클러스터를 생성한 경우 마지막 명령의 결과에 다음과 같은 값이 표시됩니다. 그렇지 않으면 Redis와 함께 사용할 기존 클러스터의 ID를 사용합니다.

   ```
   ECS_CLUSTER_VPC=vpc-xxxxxxxxxxxxxxxxx
   ECS_CLUSTER_SUBNET_1=subnet-xxxxxxxxxxxxxxxxx
   ECS_CLUSTER_SUBNET_2=subnet-xxxxxxxxxxxxxxxxx
   ```

1. 이 자습서에서는 Amazon ECS 클러스터 VPC의 기본 보안 그룹에 Redis OSS 애플리케이션 및 CloudWatch 에이전트를 설치합니다. 기본 보안 그룹은 동일한 보안 그룹 내의 모든 네트워크 연결을 허용하므로 CloudWatch 에이전트가 Redis OSS 컨테이너에 노출된 Prometheus 지표를 스크레이링할 수 있습니다. 실제 프로덕션 환경에서는 Redis OSS 애플리케이션 및 CloudWatch 에이전트의 전용 보안 그룹을 생성하고 이에 대한 사용자 지정 권한을 설정할 수 있습니다.

   다음 명령을 입력하여 기본 보안 그룹 ID를 가져옵니다.

   ```
   aws ec2 describe-security-groups \
   --filters Name=vpc-id,Values=$ECS_CLUSTER_VPC  \
   --region $AWS_DEFAULT_REGION
   ```

   그다음에는 다음 명령을 입력하여 Fargate 클러스터 기본 보안 그룹 변수를 설정하고 *my-default-security-group*을 이전의 명령에서 찾은 값으로 바꿉니다.

   ```
   ECS_CLUSTER_SECURITY_GROUP=my-default-security-group
   ```

## 샘플 Redis OSS 워크로드 설치
<a name="ContainerInsights-Prometheus-Setup-redis-ecs-install-workload"></a>

**Prometheus 지표를 노출하는 샘플 Redis OSS 워크로드를 설치하는 방법**

1. 다음 명령을 입력하여 Redis OSS CloudFormation 템플릿을 다운로드합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/sample_traffic/redis/redis-traffic-sample.yaml
   ```

1. 다음 명령을 입력하여 Redis OSS 용으로 생성할 IAM 역할 이름을 설정합니다.

   ```
   REDIS_ECS_TASK_ROLE_NAME=redis-prometheus-demo-ecs-task-role-name
   REDIS_ECS_EXECUTION_ROLE_NAME=redis-prometheus-demo-ecs-execution-role-name
   ```

1. 다음 명령을 입력하여 샘플 Redis OSS 워크로드를 설치합니다.

   ```
   aws cloudformation create-stack --stack-name Redis-Prometheus-Demo-ECS-$ECS_CLUSTER_NAME-fargate-awsvpc \
       --template-body file://redis-traffic-sample.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=SecurityGroupID,ParameterValue=$ECS_CLUSTER_SECURITY_GROUP \
                    ParameterKey=SubnetID,ParameterValue=$ECS_CLUSTER_SUBNET_1 \
                    ParameterKey=TaskRoleName,ParameterValue=$REDIS_ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$REDIS_ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region $AWS_DEFAULT_REGION
   ```

CloudFormation 스택은 다음과 같은 네 개의 리소스를 생성합니다.
+ ECS 태스크 역할 1개
+ ECS 태스크 실행 역할 1개
+ Redis OSS 태스크 정의 1개
+ Redis OSS 서비스 1개

Redis OSS 태스크 정의에서는 다음과 같이 두 컨테이너가 정의됩니다.
+ 기본 컨테이너는 단순한 Redis OSS 애플리케이션을 실행하고 액세스를 위해 포트 6379를 엽니다.
+ 다른 컨테이너에서는 Redis OSS 내보내기 도구 프로세스를 실행하여 포트 9121에서 Prometheus 지표를 노출합니다. 이는 CloudWatch 에이전트가 검색하고 스크레이프할 컨테이너입니다. 다음 Docker 레이블을 정의하여 CloudWatch 에이전트가 해당 레이블을 기반으로 이 컨테이너를 검색할 수 있도록 합니다.

  ```
  ECS_PROMETHEUS_EXPORTER_PORT: 9121
  ```

## Redis OSS Prometheus 지표를 스크레이핑하도록 CloudWatch 에이전트 구성
<a name="ContainerInsights-Prometheus-Setup-redis-ecs-agent"></a>

**Redis OSS Prometheus 지표를 스크레이핑하도록 CloudWatch 에이전트를 구성하려는 방법**

1. 다음 명령을 입력하여 최신 버전의 `cwagent-ecs-prometheus-metric-for-awsvpc.yaml`을 다운로드합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/ecs-task-definition-templates/deployment-mode/replica-service/cwagent-prometheus/cloudformation-quickstart/cwagent-ecs-prometheus-metric-for-awsvpc.yaml
   ```

1. 텍스트 편집기를 사용하여 파일을 열고 `resource:CWAgentConfigSSMParameter` 섹션에서 `value` 키 뒤에 있는 전체 CloudWatch 에이전트 구성을 찾습니다.

   여기에 나와 있는 `ecs_service_discovery` 섹션에서는 Redis OSS ECS 태스크 정의에서 정의한 Docker 레이블과 일치하는 `ECS_PROMETHEUS_EXPORTER_PORT`를 기반으로 하는 기본 설정으로 `docker_label` 기반 서비스 검색이 사용 설정됩니다. 따라서 이 섹션에서는 아무것도 변경할 필요가 없습니다.

   ```
   ecs_service_discovery": {
     "sd_frequency": "1m",
     "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml",
   *  "docker_label": {
     },*
     ...
   ```

   `metric_declaration` 섹션의 경우 기본 설정은 어느 Redis OSS 지표도 허용하지 않습니다. Redis OSS 지표를 허용하려면 다음 섹션을 추가합니다. 이때 기존의 들여쓰기 패턴을 따라야 합니다.

   ```
   {
     "source_labels": ["container_name"],
     "label_matcher": "^redis-exporter-.*$",
     "dimensions": [["ClusterName","TaskDefinitionFamily"]],
     "metric_selectors": [
       "^redis_net_(in|out)put_bytes_total$",
       "^redis_(expired|evicted)_keys_total$",
       "^redis_keyspace_(hits|misses)_total$",
       "^redis_memory_used_bytes$",
       "^redis_connected_clients$"
     ]
   },
   {
     "source_labels": ["container_name"],
     "label_matcher": "^redis-exporter-.*$",
     "dimensions": [["ClusterName","TaskDefinitionFamily","cmd"]],
     "metric_selectors": [
       "^redis_commands_total$"
     ]
   },
   {
     "source_labels": ["container_name"],
     "label_matcher": "^redis-exporter-.*$",
     "dimensions": [["ClusterName","TaskDefinitionFamily","db"]],
     "metric_selectors": [
       "^redis_db_keys$"
     ]
   },
   ```

1. CloudFormation에서 Amazon ECS 클러스터에 CloudWatch 에이전트를 이미 배포한 경우 다음 명령을 입력하여 변경 세트를 생성할 수 있습니다.

   ```
   ECS_LAUNCH_TYPE=FARGATE
   CREATE_IAM_ROLES=True
   ECS_CLUSTER_SUBNET=$ECS_CLUSTER_SUBNET_1
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-change-set --stack-name CWAgent-Prometheus-ECS-$ECS_CLUSTER_NAME-$ECS_LAUNCH_TYPE-awsvpc \
       --template-body file://cwagent-ecs-prometheus-metric-for-awsvpc.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSLaunchType,ParameterValue=$ECS_LAUNCH_TYPE \
                    ParameterKey=SecurityGroupID,ParameterValue=$ECS_CLUSTER_SECURITY_GROUP \
                    ParameterKey=SubnetID,ParameterValue=$ECS_CLUSTER_SUBNET \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region ${AWS_DEFAULT_REGION} \
       --change-set-name redis-scraping-support
   ```

1. CloudFormation 콘솔([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/))을 엽니다.

1. 새로 생성한 변경 세트인 `redis-scraping-support`를 검토합니다. `CWAgentConfigSSMParameter` 리소스에 적용된 변경 사항 하나가 표시되어야 합니다. 변경 세트를 실행하고 다음 명령을 입력하여 CloudWatch 에이전트 태스크를 다시 시작합니다.

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 0 \
   --service cwagent-prometheus-replica-service-$ECS_LAUNCH_TYPE-awsvpc \
   --region ${AWS_DEFAULT_REGION}
   ```

1. 10초 정도 기다린 후 다음 명령을 입력합니다.

   ```
   aws ecs update-service --cluster $ECS_CLUSTER_NAME \
   --desired-count 1 \
   --service cwagent-prometheus-replica-service-$ECS_LAUNCH_TYPE-awsvpc \
   --region ${AWS_DEFAULT_REGION}
   ```

1. 클러스터에 처음으로 Prometheus 지표 수집이 포함된 CloudWatch 에이전트를 설치하는 경우 다음 명령을 입력합니다.

   ```
   ECS_LAUNCH_TYPE=FARGATE
   CREATE_IAM_ROLES=True
   ECS_CLUSTER_SUBNET=$ECS_CLUSTER_SUBNET_1
   ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
   ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
   
   aws cloudformation create-stack --stack-name CWAgent-Prometheus-ECS-$ECS_CLUSTER_NAME-$ECS_LAUNCH_TYPE-awsvpc \
       --template-body file://cwagent-ecs-prometheus-metric-for-awsvpc.yaml \
       --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                    ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                    ParameterKey=ECSLaunchType,ParameterValue=$ECS_LAUNCH_TYPE \
                    ParameterKey=SecurityGroupID,ParameterValue=$ECS_CLUSTER_SECURITY_GROUP \
                    ParameterKey=SubnetID,ParameterValue=$ECS_CLUSTER_SUBNET \
                    ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                    ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
       --capabilities CAPABILITY_NAMED_IAM \
       --region ${AWS_DEFAULT_REGION}
   ```

## Redis OSS 지표 보기
<a name="ContainerInsights-Prometheus-Setup-redis-view"></a>

이 튜토리얼에서는 CloudWatch의 **ECS/ContainerInsights/Prometheus** 네임스페이스에 다음 지표를 전송합니다. CloudWatch 콘솔을 사용하여 해당 네임스페이스의 지표를 볼 수 있습니다.


| 지표 이름 | 측정기준 | 
| --- | --- | 
|  `redis_net_input_bytes_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `redis_net_output_bytes_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `redis_expired_keys_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `redis_evicted_keys_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `redis_keyspace_hits_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `redis_keyspace_misses_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `redis_memory_used_bytes` |  ClusterName, `TaskDefinitionFamily`   | 
|  `redis_connected_clients` |  ClusterName, `TaskDefinitionFamily`   | 
|  `redis_commands_total` |  ` ClusterName`, `TaskDefinitionFamily`, `cmd`  | 
|  `redis_db_keys` |  `ClusterName`, `TaskDefinitionFamily`, `db`  | 

**참고**  
[**cmd**] 측정기준의 값은 `append`, `client`, `command`, `config`, `dbsize`, `flushall`, `get`, `incr`, `info`, `latency` 또는 `slowlog`일 수 있습니다.  
[**db**] 측정기준의 값은 `db0`\$1`db15`일 수 있습니다.

Redis OSS Prometheus 지표에 대한 CloudWatch 대시보드를 생성할 수도 있습니다.

**Redis OSS Prometheus 지표에 대한 대시보드를 생성하는 방법**

1. 환경 변수를 만들어서 아래의 값을 배포와 일치하도록 바꿉니다.

   ```
   DASHBOARD_NAME=your_cw_dashboard_name
   ECS_TASK_DEF_FAMILY=redis-prometheus-demo-$ECS_CLUSTER_NAME-fargate-awsvpc
   ```

1. 다음 명령을 입력하여 대시보드를 생성합니다.

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/redis/cw_dashboard_redis.json \
   | sed "s/{{YOUR_AWS_REGION}}/${REGION_NAME}/g" \
   | sed "s/{{YOUR_CLUSTER_NAME}}/${CLUSTER_NAME}/g" \
   | sed "s/{{YOUR_NAMESPACE}}/${NAMESPACE}/g" \
   ```

# Amazon EKS 및 Kubernetes 클러스터에서 Prometheus 지표 수집 설정 및 구성
<a name="ContainerInsights-Prometheus-install-EKS"></a>

Amazon EKS 또는 Kubernetes를 실행하는 클러스터에서 Prometheus 지표를 수집하려면 CloudWatch 에이전트를 수집기로 사용하거나 AWS Distro for OpenTelemetry Collector를 사용하면 됩니다. AWS Distro for OpenTelemetry Collector 사용에 대한 자세한 내용은 [https://aws-otel.github.io/docs/getting-started/container-insights/eks-prometheus](https://aws-otel.github.io/docs/getting-started/container-insights/eks-prometheus)를 참조하세요.

다음 단원에서는 CloudWatch 에이전트를 사용하여 Prometheus 지표를 수집하는 방법을 설명합니다. Amazon EKS 또는 Kubernetes를 실행 중인 클러스터에 Prometheus 모니터링이 포함된 CloudWatch 에이전트를 설치하는 방법과 추가 대상을 스크레이프하도록 에이전트를 구성하는 방법을 설명합니다. 또한 Prometheus 모니터링을 통해 테스트하는 데 사용할 샘플 워크로드를 설정하기 위한 선택적 튜토리얼도 제공합니다.

**Topics**
+ [Amazon EKS 및 Kubernetes 클러스터에 Prometheus 지표 수집과 함께 CloudWatch 에이전트 설치](ContainerInsights-Prometheus-Setup.md)

# Amazon EKS 및 Kubernetes 클러스터에 Prometheus 지표 수집과 함께 CloudWatch 에이전트 설치
<a name="ContainerInsights-Prometheus-Setup"></a>

이 단원에서는 Amazon EKS 또는 Kubernetes를 실행 중인 클러스터에서 Prometheus 모니터링이 포함된 CloudWatch 에이전트를 설정하는 방법을 설명합니다. 이렇게 에이전트를 설정하면 에이전트가 해당 클러스터에서 실행 중인 다음 워크로드에 대한 지표를 자동으로 스크레이프하고 가져옵니다.
+ AWS App Mesh
+ NGINX
+ Memcached
+ Java/JMX
+ HAProxy
+ Fluent Bit

추가 Prometheus 워크로드 및 소스를 스크레이프하고 가져오도록 에이전트를 구성할 수도 있습니다.

다음 단계에 따라 Prometheus 지표 수집용 CloudWatch 에이전트를 설치하기 전에 먼저, Amazon EKS에서 클러스터가 실행 중이거나 Amazon EC2 인스턴스에서 Kubernetes 클러스터가 실행 중이어야 합니다.

**VPC 보안 그룹 요구 사항**

Prometheus 워크로드의 보안 그룹 수신 규칙은 프라이빗 IP로 Prometheus 지표를 스크레이프하기 위해 CloudWatch 에이전트에 대한 Prometheus 포트를 열어야 합니다.

CloudWatch 에이전트의 보안 그룹 송신 규칙은 CloudWatch 에이전트가 프라이빗 IP로 Prometheus 워크로드의 포트에 연결할 수 있도록 허용해야 합니다.

**Topics**
+ [Amazon EKS 및 Kubernetes 클러스터에 Prometheus 지표 수집과 함께 CloudWatch 에이전트 설치](#ContainerInsights-Prometheus-Setup-roles)
+ [추가 Prometheus 소스 스크레이핑 및 해당 지표 가져오기](ContainerInsights-Prometheus-Setup-configure.md)
+ [(선택 사항) Prometheus 지표 테스트를 위한 컨테이너화된 Amazon EKS 워크로드 샘플 설정](ContainerInsights-Prometheus-Sample-Workloads.md)

## Amazon EKS 및 Kubernetes 클러스터에 Prometheus 지표 수집과 함께 CloudWatch 에이전트 설치
<a name="ContainerInsights-Prometheus-Setup-roles"></a>

이 단원에서는 Amazon EKS 또는 Kubernetes를 실행 중인 클러스터에서 Prometheus 모니터링이 포함된 CloudWatch 에이전트를 설정하는 방법을 설명합니다. 이렇게 에이전트를 설정하면 에이전트가 해당 클러스터에서 실행 중인 다음 워크로드에 대한 지표를 자동으로 스크레이프하고 가져옵니다.
+ AWS App Mesh
+ NGINX
+ Memcached
+ Java/JMX
+ HAProxy
+ Fluent Bit

추가 Prometheus 워크로드 및 소스를 스크레이프하고 가져오도록 에이전트를 구성할 수도 있습니다.

다음 단계에 따라 Prometheus 지표 수집용 CloudWatch 에이전트를 설치하기 전에 먼저, Amazon EKS에서 클러스터가 실행 중이거나 Amazon EC2 인스턴스에서 Kubernetes 클러스터가 실행 중이어야 합니다.

**VPC 보안 그룹 요구 사항**

Prometheus 워크로드의 보안 그룹 수신 규칙은 프라이빗 IP로 Prometheus 지표를 스크레이프하기 위해 CloudWatch 에이전트에 대한 Prometheus 포트를 열어야 합니다.

CloudWatch 에이전트의 보안 그룹 송신 규칙은 CloudWatch 에이전트가 프라이빗 IP로 Prometheus 워크로드의 포트에 연결할 수 있도록 허용해야 합니다.

**Topics**
+ [IAM 역할 설정](#ContainerInsights-Prometheus-Setup-roles)
+ [Prometheus 지표를 수집하기 위한 CloudWatch 에이전트 설치](#ContainerInsights-Prometheus-Setup-install-agent)

### IAM 역할 설정
<a name="ContainerInsights-Prometheus-Setup-roles"></a>

첫 번째 단계는 클러스터에 필요한 IAM 역할을 설정하는 것입니다. 다음과 같은 두 가지 방법으로 설정할 수 있습니다.
+ **‘서비스 역할’이라고도 하는 서비스 계정의 IAM 역할을 설정합니다. 이 방법은 EC2 시작 유형과 Fargate 시작 유형 모두에 적용됩니다.
+ 클러스터에 사용되는 IAM 역할에 IAM 정책을 추가합니다. 이는 EC2 시작 유형에만 적용됩니다.

**서비스 역할 설정(EC2 시작 유형 및 Fargate 시작 유형)**

서비스 역할을 설정하려면 다음 명령을 입력합니다. *MyCluster*를 클러스터 이름으로 바꿉니다.

```
eksctl create iamserviceaccount \
 --name cwagent-prometheus \
--namespace amazon-cloudwatch \
 --cluster MyCluster \
--attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \
--approve \
--override-existing-serviceaccounts
```

**노드 그룹의 IAM 역할에 정책 추가(EC2 시작 유형만 해당)**

**Prometheus 지원을 위해 노드 그룹에서 IAM 정책을 설정하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **인스턴스**를 선택합니다.

1. 클러스터에 대한 IAM 역할 이름의 접두사를 찾아야 합니다. 이렇게 하려면 클러스터에 있는 인스턴스 이름 옆의 확인란을 선택하고 **작업**, **보안**, **IAM 역할 수정**을 선택합니다. 그런 다음, `eksctl-dev303-workshop-nodegroup`과 같은 IAM 역할의 접두사를 복사합니다.

1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

1. 탐색 창에서 **역할**을 선택합니다.

1. 검색 상자를 사용하여 이 절차의 앞부분에서 복사한 접두사를 찾은 다음 해당 역할을 선택합니다.

1. **정책 연결**을 선택합니다.

1. 검색 상자를 사용하여 **CloudWatchAgentServerPolicy**를 찾습니다. **CloudWatchAgentServerPolicy** 옆의 확인란을 선택하고 **정책 연결**을 선택합니다.

### Prometheus 지표를 수집하기 위한 CloudWatch 에이전트 설치
<a name="ContainerInsights-Prometheus-Setup-install-agent"></a>

지표를 수집하려면 클러스터에 CloudWatch 에이전트를 설치해야 합니다. Amazon EKS 클러스터와 Kubernetes 클러스터의 에이전트 설치 방법은 다릅니다.

**Prometheus가 지원되는 CloudWatch 에이전트의 이전 버전 삭제**

클러스터에 Prometheus가 지원되는 CloudWatch 에이전트 버전을 이미 설치한 경우 다음 명령을 입력하여 해당 버전을 삭제해야 합니다. 이는 Prometheus가 지원되는 이전 버전의 에이전트에만 필요합니다. Prometheus가 지원되지 않는 Container Insights를 사용하는 CloudWatch 에이전트는 삭제할 필요가 없습니다.

```
kubectl delete deployment cwagent-prometheus -n amazon-cloudwatch
```

#### EC2 시작 유형의 Amazon EKS 클러스터에 CloudWatch 에이전트 설치
<a name="ContainerInsights-Prometheus-Setup-install-agent-EKS"></a>

Amazon EKS 클러스터에 Prometheus가 지원되는 CloudWatch 에이전트를 설치하려면 다음 단계를 따릅니다.

**Amazon EKS 클러스터에 Prometheus가 지원되는 CloudWatch 에이전트를 설치하려면**

1. 다음 명령을 입력하여 `amazon-cloudwatch` 네임스페이스가 이미 생성되었는지 확인합니다.

   ```
   kubectl get namespace
   ```

1. `amazon-cloudwatch`가 결과에 표시되지 않으면 다음 명령을 입력하여 생성합니다.

   ```
   kubectl create namespace amazon-cloudwatch
   ```

1. 기본 구성으로 에이전트를 배포하고 에이전트가 설치된 AWS 리전으로 데이터를 전송하도록 하려면 다음 명령을 입력합니다.

   ```
   kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml
   ```

   에이전트가 대신 다른 리전으로 데이터를 전송하도록 하려면 다음 단계를 따르세요.

   1. 다음 명령을 입력하여 에이전트에 대한 YAML 파일을 다운로드합니다.

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml
      ```

   1. 텍스트 편집기로 파일을 열고 파일의 `cwagentconfig.json` 블록을 검색합니다.

   1. 강조 표시된 선을 추가하여 원하는 리전을 지정합니다.

      ```
      cwagentconfig.json: |
          {
            "agent": {
              "region": "us-east-2"
            },
            "logs": { ...
      ```

   1. 파일을 저장하고, 업데이트된 파일을 사용하여 에이전트를 배포합니다.

      ```
      kubectl apply -f prometheus-eks.yaml
      ```

#### Fargate 시작 유형의 Amazon EKS 클러스터에 CloudWatch 에이전트 설치
<a name="ContainerInsights-Prometheus-Setup-install-agent-EKS-fargate"></a>

Fargate 시작 유형의 Amazon EKS 클러스터에 Prometheus가 지원되는 CloudWatch 에이전트를 설치하려면 다음 단계를 따릅니다.

**Fargate 시작 유형의 Amazon EKS 클러스터에 Prometheus가 지원되는 CloudWatch 에이전트를 설치하려면**

1. 다음 명령을 입력하여 CloudWatch 에이전트의 Fargate 프로파일을 생성하여 클러스터 내에서 실행될 수 있도록 합니다. *MyCluster*를 클러스터 이름으로 바꿉니다.

   ```
   eksctl create fargateprofile --cluster MyCluster \
   --name amazon-cloudwatch \
   --namespace amazon-cloudwatch
   ```

1. CloudWatch 에이전트를 설치하려면 다음 명령을 입력합니다. *MyCluster*를 클러스터 이름으로 바꿉니다. 이 이름은 에이전트가 수집한 로그 이벤트를 저장하는 로그 그룹 이름에 사용되며, 에이전트에서 수집한 지표에 대한 측정기준으로도 사용됩니다.

   *region*을 지표를 전송할 리전의 이름으로 바꿉니다. 예를 들어 `us-west-1`입니다.

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks-fargate.yaml | 
   sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" | 
   kubectl apply -f -
   ```

#### Kubernetes 클러스터에 CloudWatch 에이전트 설치
<a name="ContainerInsights-Prometheus-Setup-install-agent-Kubernetes"></a>

Kubernetes를 실행하는 클러스터에 Prometheus가 지원되는 CloudWatch 에이전트를 설치하려면 다음 명령을 입력합니다.

```
curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-k8s.yaml | 
sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" | 
kubectl apply -f -
```

*MyCluster*를 클러스터 이름으로 바꿉니다. 이 이름은 에이전트가 수집한 로그 이벤트를 저장하는 로그 그룹 이름에 사용되며, 에이전트에서 수집한 지표에 대한 측정기준으로도 사용됩니다.

*리전*을 지표를 전송할 AWS 리전의 이름으로 바꿉니다. 예를 들어 **us-west-1**입니다.

#### 에이전트가 실행 중인지 확인
<a name="ContainerInsights-Prometheus-Setup-install-agent-verify"></a>

Amazon EKS 클러스터와 Kubernetes 클러스터 모두에서 다음 명령을 입력하여 에이전트가 실행 중인지 확인할 수 있습니다.

```
kubectl get pod -l "app=cwagent-prometheus" -n amazon-cloudwatch
```

결과에 `Running` 상태의 단일 CloudWatch 에이전트 포드가 포함되어 있다면 에이전트가 실행 중이며 Prometheus 지표를 수집하고 있는 것입니다. 기본적으로 CloudWatch 에이전트는 1분마다 App Mesh, NGINX, Memcached, Java/JMX, HAProxy에 대한 지표를 수집합니다. 지표에 대한 자세한 내용은 [CloudWatch 에이전트가 수집하는 Prometheus 지표](ContainerInsights-Prometheus-metrics.md) 단원을 참조하세요. CloudWatch에서 Prometheus 지표를 확인하는 방법에 대한 지침은 [Prometheus 지표 보기](ContainerInsights-Prometheus-viewmetrics.md) 단원을 참조하세요.

또한 다른 Prometheus Exporter에서 지표를 수집하도록 CloudWatch 에이전트를 구성할 수도 있습니다. 자세한 내용은 [추가 Prometheus 소스 스크레이핑 및 해당 지표 가져오기](ContainerInsights-Prometheus-Setup-configure.md) 섹션을 참조하세요.

# 추가 Prometheus 소스 스크레이핑 및 해당 지표 가져오기
<a name="ContainerInsights-Prometheus-Setup-configure"></a>

Prometheus 모니터링이 포함된 CloudWatch 에이전트는 Prometheus 지표를 스크레이프하는 데 두 가지 구성이 필요합니다. 하나는 Prometheus 설명서의 [<scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config)에 설명된 표준 Prometheus 구성을 위한 것입니다. 다른 하나는 CloudWatch 에이전트 구성을 위한 것입니다.

Amazon EKS 클러스터에서 구성은 `prometheus-eks.yaml`(EC2 시작 유형의 경우) 또는 `prometheus-eks-fargate.yaml`(Fargate 시작 유형의 경우)에 다음과 같은 두 config 맵으로 정의됩니다.
+ `name: prometheus-config` 섹션에는 Prometheus 스크레이핑 설정이 포함되어 있습니다.
+ `name: prometheus-cwagentconfig` 섹션에는 CloudWatch 에이전트에 대한 구성이 포함되어 있습니다. 이 섹션을 사용하여 CloudWatch가 Prometheus 지표를 수집하는 방법을 구성할 수 있습니다. 예를 들어 CloudWatch에 가져올 지표를 지정하고 해당 지표의 측정기준을 정의합니다.

Amazon EC2 인스턴스에서 실행되는 Kubernetes 클러스터에서 구성은 `prometheus-k8s.yaml` YAML 파일에 다음과 같은 두 config 맵으로 정의됩니다.
+ `name: prometheus-config` 섹션에는 Prometheus 스크레이핑 설정이 포함되어 있습니다.
+ `name: prometheus-cwagentconfig` 섹션에는 CloudWatch 에이전트에 대한 구성이 포함되어 있습니다.

추가 Prometheus 지표 소스를 스크레이프하고 해당 지표를 CloudWatch에 가져오려면 Prometheus 스크레이프 구성과 CloudWatch 에이전트 구성을 모두 수정한 다음, 업데이트된 구성으로 에이전트를 다시 배포합니다.

**VPC 보안 그룹 요구 사항**

Prometheus 워크로드의 보안 그룹 수신 규칙은 프라이빗 IP로 Prometheus 지표를 스크레이프하기 위해 CloudWatch 에이전트에 대한 Prometheus 포트를 열어야 합니다.

CloudWatch 에이전트의 보안 그룹 송신 규칙은 CloudWatch 에이전트가 프라이빗 IP로 Prometheus 워크로드의 포트에 연결할 수 있도록 허용해야 합니다.

## Prometheus 스크레이프 구성
<a name="ContainerInsights-Prometheus-Setup-config-global"></a>

CloudWatch 에이전트는 Prometheus 설명서의 [ <scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config)에 설명된 대로 표준 Prometheus 스크레이프 구성을 지원합니다. 이 섹션을 편집하여 이 파일에 이미 있는 구성을 업데이트하고 Prometheus 스크레이핑 대상을 더 추가할 수 있습니다. 기본적으로 샘플 구성 파일에는 다음과 같은 글로벌 구성 줄이 포함되어 있습니다.

```
global:
  scrape_interval: 1m
  scrape_timeout: 10s
```
+ **scrape\$1interval** - 대상을 스크레이프하는 빈도를 정의합니다.
+ **scrape\$1timeout** - 스크레이프 요청 시간이 초과되기 전에 대기할 시간을 정의합니다.

작업 수준에서 이러한 설정에 다른 값을 정의하여 전역 구성을 재정의할 수도 있습니다.

### Prometheus 스크레이핑 작업
<a name="ContainerInsights-Prometheus-Setup-config-scrape"></a>

CloudWatch 에이전트 YAML 파일에는 일부 기본 스크레이핑 작업이 이미 구성되어 있습니다. 예를 들어 `prometheus-eks.yaml`에서 기본 스크레이핑 작업은 `scrape_configs` 섹션의 `job_name` 줄에서 구성됩니다. 이 파일에서 다음 기본 `kubernetes-pod-jmx` 섹션에서는 JMX Exporter 지표를 스크레이프합니다.

```
   - job_name: 'kubernetes-pod-jmx'
      sample_limit: 10000
      metrics_path: /metrics
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels: [__address__]
        action: keep
        regex: '.*:9404$'
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
      - action: replace
        source_labels:
        - __meta_kubernetes_namespace
        target_label: Namespace
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: pod_name
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_container_name
        target_label: container_name
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_controller_name
        target_label: pod_controller_name
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_controller_kind
        target_label: pod_controller_kind
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_phase
        target_label: pod_phase
```

이러한 각 기본 대상은 스크레이프되고 지표는 임베디드 지표 형식을 사용하여 로그 이벤트로 CloudWatch에 전송됩니다. 자세한 내용은 [로그 내에 지표 포함](CloudWatch_Embedded_Metric_Format.md) 섹션을 참조하세요.

Amazon EKS 및 Kubernetes 클러스터의 로그 이벤트는 CloudWatch Logs의 **/aws/containerinsights/*cluster\$1name*/prometheus** 로그 그룹에 저장됩니다. Amazon ECS 클러스터의 로그 이벤트는 **/aws/ecs/containerinsights/*cluster\$1name*/prometheus** 로그 그룹에 저장됩니다.

각 스크레이핑 작업은 이 로그 그룹의 서로 다른 로그 스트림에 포함됩니다. 예를 들어 Prometheus 스크레이핑 작업 `kubernetes-pod-appmesh-envoy`는 App Mesh에 대해 정의됩니다. Amazon EKS 및 Kubernetes 클러스터의 모든 App Mesh Prometheus 지표는 **/aws/containerinsights/*cluster\$1name*>prometheus/kubernetes-pod-appmesh-envoy/**라는 로그 스트림에 전송됩니다.

새 스크레이핑 대상을 추가하려면 YAML 파일의 `scrape_configs` 섹션에 새 `job_name` 섹션을 추가하고 에이전트를 다시 시작합니다. 이 프로세스의 예는 [새로운 Prometheus 스크레이프 대상을 추가하기 위한 튜토리얼: Prometheus API 서버 지표](#ContainerInsights-Prometheus-Setup-new-exporters) 단원을 참조하세요.

## Prometheus에 대한 CloudWatch 에이전트 구성
<a name="ContainerInsights-Prometheus-Setup-cw-agent-config2"></a>

CloudWatch 에이전트 구성 파일에는 `metrics_collected` 아래에 Prometheus 스크레이핑 구성에 대한 `prometheus` 섹션이 있습니다. 여기에는 다음 구성 옵션이 포함됩니다.
+ **cluster\$1name** - 로그 이벤트에서 레이블로 추가할 클러스터 이름을 지정합니다. 이 필드는 선택 사항입니다. 생략하는 경우 에이전트가 Amazon EKS 또는 Kubernetes 클러스터 이름을 감지할 수 있습니다.
+ **log\$1group\$1name** - 스크레이프한 Prometheus 지표의 로그 그룹 이름을 지정합니다. 이 필드는 선택 사항입니다. 생략하는 경우 CloudWatch는 Amazon EKS 및 Kubernetes 클러스터의 로그에 **/aws/containerinsights/*cluster\$1name*/prometheus**를 사용합니다.
+ **prometheus\$1config\$1path** - Prometheus 스크레이프 구성 파일 경로를 지정합니다. 이 필드의 값이 `env:`로 시작하는 경우 Prometheus 스크레이프 구성 파일 내용이 컨테이너의 환경 변수에서 검색됩니다. 이 값은 변경하지 마세요.
+ **ecs\$1service\$1discovery** - Amazon ECS Prometheus 서비스 검색을 위한 구성을 지정하는 섹션입니다. 자세한 내용은 [Amazon ECS 클러스터의 자동 검색에 대한 자세한 가이드](ContainerInsights-Prometheus-Setup-autodiscovery-ecs.md) 섹션을 참조하세요.

  `ecs_service_discovery` 섹션에는 다음 필드가 포함될 수 있습니다.
  + `sd_frequency`는 Prometheus Exporter를 검색하는 빈도입니다. 숫자와 단위 접미사를 지정합니다. 예를 들어 1분마다 한 번의 경우 `1m` 또는 30초마다 한 번의 경우 `30s`입니다. 유효한 단위 접미사는 `ns`, `us`, `ms`, `s`, `m`, `h`입니다.

    이 필드는 선택 사항입니다. 기본값은 60초(1분)입니다.
  + `sd_target_cluster`는 자동 검색의 대상 Amazon ECS 클러스터 이름입니다. 이 필드는 선택 사항입니다. 기본값은 CloudWatch 에이전트가 설치된 Amazon ECS 클러스터의 이름입니다.
  + `sd_cluster_region`은 대상 Amazon ECS 클러스터의 리전입니다. 이 필드는 선택 사항입니다. 기본값은 CloudWatch 에이전트가 설치된 Amazon ECS 클러스터의 리전입니다.
  + `sd_result_file`은 Prometheus 대상 결과의 YAML 파일 경로입니다. Prometheus 스크레이프 구성은 이 파일을 참조합니다.
  + `docker_label`은 Docker 레이블 기반 서비스 검색을 위한 구성을 지정하는 데 사용할 수 있는 선택적 섹션입니다. 이 섹션을 생략하면 Docker 레이블 기반 검색이 사용되지 않습니다. 이 섹션에는 다음 필드가 포함될 수 있습니다.
    + `sd_port_label`은 Prometheus 지표에 대한 컨테이너 포트를 지정하는 컨테이너의 Docker 레이블 이름입니다. 기본값은 `ECS_PROMETHEUS_EXPORTER_PORT`입니다. 컨테이너에 이 Docker 레이블이 없다면 CloudWatch 에이전트는 이 필드를 건너뜁니다.
    + `sd_metrics_path_label`은 Prometheus 지표 경로를 지정하는 컨테이너의 Docker 레이블 이름입니다. 기본값은 `ECS_PROMETHEUS_METRICS_PATH`입니다. 컨테이너에 이 도커 레이블이 없다면 에이전트는 기본 경로 `/metrics`를 가정합니다.
    + `sd_job_name_label`은 Prometheus 스크레이프 작업 이름을 지정하는 컨테이너의 Docker 레이블 이름입니다. 기본값은 `job`입니다. 컨테이너에 이 Docker 레이블이 없다면 CloudWatch 에이전트는 Prometheus 스크레이프 구성의 작업 이름을 사용합니다.
  + `task_definition_list`는 태스크 정의 기반 서비스 검색의 구성을 지정하는 데 사용할 수 있는 선택적 섹션입니다. 이 섹션을 생략하면 태스크 정의 기반 검색이 사용되지 않습니다. 이 섹션에는 다음 필드가 포함될 수 있습니다.
    + `sd_task_definition_arn_pattern`은 검색할 Amazon ECS 태스크 정의를 지정하는 데 사용할 패턴입니다. 이는 정규 표현식입니다.
    + `sd_metrics_ports`는 Prometheus 지표에 대한 containerPort를 나열합니다. containerPort를 세미콜론으로 구분합니다.
    + `sd_container_name_pattern`은 Amazon ECS 태스크 컨테이너 이름을 지정합니다. 이는 정규 표현식입니다.
    + `sd_metrics_path`는 Prometheus 지표 경로를 지정합니다. 이 필드를 생략하면 에이전트는 기본 경로 `/metrics`를 가정합니다.
    + `sd_job_name`은 Prometheus 스크레이프 작업 이름을 지정합니다. 이 필드를 생략하면 CloudWatch 에이전트는 Prometheus 스크레이프 구성의 작업 이름을 사용합니다.
+ **metric\$1declaration** - 생성할 임베디드 지표 형식이 있는 로그 배열을 지정하는 섹션입니다. CloudWatch 에이전트가 기본적으로 가져오는 각 Prometheus 소스에 대한 `metric_declaration` 섹션이 있습니다. 이러한 섹션에는 각각 다음 필드가 포함됩니다.
  + `label_matcher`는 `source_labels`에 나열된 레이블의 값을 확인하는 정규 표현식입니다. 일치하는 지표는 CloudWatch에 전송된 임베디드 지표 형식에 포함할 수 있습니다.

    `source_labels`에 여러 레이블이 지정된 경우 `label_matcher`의 정규 표현식에 `^` 또는 `$` 문자를 사용하지 않는 것이 좋습니다.
  + `source_labels`는 `label_matcher` 줄에 의해 확인되는 레이블의 값을 지정합니다.
  + `label_separator`는 여러 `source_labels`가 지정된 경우 ` label_matcher` 줄에 사용할 구분 기호를 지정합니다. 기본값은 `;`입니다. 다음 예에서 `label_matcher` 줄에 이 기본값이 사용된 것을 볼 수 있습니다.
  + `metric_selectors`는 수집하여 CloudWatch에 보낼 지표를 지정하는 정규 표현식입니다.
  + `dimensions`는 선택한 각 지표의 CloudWatch 측정기준으로 사용할 레이블 목록입니다.

다음 `metric_declaration` 예를 참조하세요.

```
"metric_declaration": [
  {
     "source_labels":[ "Service", "Namespace"],
     "label_matcher":"(.*node-exporter.*|.*kube-dns.*);kube-system",
     "dimensions":[
        ["Service", "Namespace"]
     ],
     "metric_selectors":[
        "^coredns_dns_request_type_count_total$"
     ]
  }
]
```

이 예에서는 다음 조건이 충족될 경우 임베디드 지표 형식 섹션을 로그 이벤트로 전송하도록 구성합니다.
+ `Service`의 값에 `node-exporter` 또는 `kube-dns`가 포함되어 있습니다.
+ `Namespace`의 값이 `kube-system`입니다.
+ Prometheus `coredns_dns_request_type_count_total` 지표에 `Service`와 `Namespace` 레이블이 모두 포함되어 있습니다.

전송되는 로그 이벤트에는 다음과 같은 강조 표시된 섹션이 포함됩니다.

```
{
   "CloudWatchMetrics":[
      {
         "Metrics":[
            {
               "Name":"coredns_dns_request_type_count_total"
            }
         ],
         "Dimensions":[
            [
               "Namespace",
               "Service"
            ]
         ],
         "Namespace":"ContainerInsights/Prometheus"
      }
   ],
   "Namespace":"kube-system",
   "Service":"kube-dns",
   "coredns_dns_request_type_count_total":2562,
   "eks_amazonaws_com_component":"kube-dns",
   "instance":"192.168.61.254:9153",
   "job":"kubernetes-service-endpoints",
   ...
}
```

## 새로운 Prometheus 스크레이프 대상을 추가하기 위한 튜토리얼: Prometheus API 서버 지표
<a name="ContainerInsights-Prometheus-Setup-new-exporters"></a>

Kubernetes API 서버는 기본적으로 엔드포인트에 Prometheus 지표를 표시합니다. Kubernetes API 서버 스크레이핑 구성에 대한 공식 예제는 [Github](https://github.com/prometheus/prometheus/blob/main/documentation/examples/prometheus-kubernetes.yml)에 있습니다.

다음 튜토리얼에서는 아래 단계를 수행하여 Kubernetes API 서버 지표를 CloudWatch로 가져오는 방법을 보여 줍니다.
+ CloudWatch 에이전트 YAML 파일에 Kubernetes API 서버의 Prometheus 스크레이핑 구성 추가
+ CloudWatch 에이전트 YAML 파일에서 임베디드 지표 형식 지표 정의 구성
+ (선택 사항) Kubernetes API 서버 지표에 대한 CloudWatch 대시보드 생성

**참고**  
Kubernetes API 서버는 게이지, 카운터, 히스토그램 및 요약 지표를 표시합니다. 이 Prometheus 지표 지원 릴리스에서는 CloudWatch가 게이지, 카운터 및 요약 유형의 지표만 가져옵니다.

**CloudWatch에서 Kubernetes API 서버 Prometheus 지표 수집을 시작하려면**

1. 다음 명령 중 하나를 입력하여 `prometheus-eks.yaml`, `prometheus-eks-fargate.yaml` 또는 `prometheus-k8s.yaml` 파일의 최신 버전을 다운로드합니다.

   EC2 시작 유형의 Amazon EKS 클러스터의 경우 다음 명령을 입력합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml
   ```

   Fargate 시작 유형의 Amazon EKS 클러스터의 경우 다음 명령을 입력합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks-fargate.yaml
   ```

   Amazon EC2 인스턴스에서 실행되는 Kubernetes 클러스터의 경우 다음 명령을 입력합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-k8s.yaml
   ```

1. 텍스트 편집기로 파일을 열고 `prometheus-config` 섹션을 찾은 후 이 섹션 안에 다음 섹션을 추가합니다. 그리고 변경 사항을 저장합니다.

   ```
       # Scrape config for API servers
       - job_name: 'kubernetes-apiservers'
         kubernetes_sd_configs:
           - role: endpoints
             namespaces:
               names:
                 - default
         scheme: https
         tls_config:
           ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
           insecure_skip_verify: true
         bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
         relabel_configs:
         - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
           action: keep
           regex: kubernetes;https
         - action: replace
           source_labels:
           - __meta_kubernetes_namespace
           target_label: Namespace
         - action: replace
           source_labels:
           - __meta_kubernetes_service_name
           target_label: Service
   ```

1. 텍스트 편집기에서 YAML 파일을 열어 둔 상태로 `cwagentconfig.json` 섹션을 찾습니다. 다음 하위 섹션을 추가하고 변경 사항을 저장합니다. 이 섹션에서는 API 서버 지표를 CloudWatch 에이전트 허용 목록에 넣습니다. 다음과 같은 세 유형의 API 서버 지표가 허용 목록에 추가됩니다.
   + etcd 객체 카운트
   + API 서버 등록 컨트롤러 지표
   + API 서버 요청 지표

   ```
   {"source_labels": ["job", "resource"],
     "label_matcher": "^kubernetes-apiservers;(services|daemonsets.apps|deployments.apps|configmaps|endpoints|secrets|serviceaccounts|replicasets.apps)",
     "dimensions": [["ClusterName","Service","resource"]],
     "metric_selectors": [
     "^etcd_object_counts$"
     ]
   },
   {"source_labels": ["job", "name"],
      "label_matcher": "^kubernetes-apiservers;APIServiceRegistrationController$",
      "dimensions": [["ClusterName","Service","name"]],
      "metric_selectors": [
      "^workqueue_depth$",
      "^workqueue_adds_total$",
      "^workqueue_retries_total$"
     ]
   },
   {"source_labels": ["job","code"],
     "label_matcher": "^kubernetes-apiservers;2[0-9]{2}$",
     "dimensions": [["ClusterName","Service","code"]],
     "metric_selectors": [
      "^apiserver_request_total$"
     ]
   },
   {"source_labels": ["job"],
     "label_matcher": "^kubernetes-apiservers",
     "dimensions": [["ClusterName","Service"]],
     "metric_selectors": [
     "^apiserver_request_total$"
     ]
   },
   ```

1. 클러스터에 Prometheus가 지원되는 CloudWatch 에이전트를 이미 배포한 경우 다음 명령을 입력하여 해당 에이전트를 삭제해야 합니다.

   ```
   kubectl delete deployment cwagent-prometheus -n amazon-cloudwatch
   ```

1. 다음 명령 중 하나를 입력하여 업데이트된 구성으로 CloudWatch 에이전트를 배포합니다. EC2 시작 유형의 Amazon EKS 클러스터의 경우 다음 명령을 입력합니다.

   ```
   kubectl apply -f prometheus-eks.yaml
   ```

   Fargate 시작 유형의 Amazon EKS 클러스터의 경우 다음 명령을 입력합니다. *MyCluster* 및 *region*을 배포와 일치하는 값으로 바꿉니다.

   ```
   cat prometheus-eks-fargate.yaml \
   | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \
   | kubectl apply -f -
   ```

   Kubernetes 클러스터의 경우 다음 명령을 입력합니다. *MyCluster* 및 *region*을 배포와 일치하는 값으로 바꿉니다.

   ```
   cat prometheus-k8s.yaml \
   | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \
   | kubectl apply -f -
   ```

이 작업을 완료하면 **kubernetes-apiservers**라는 새 로그 스트림이 **/aws/containerinsights/*cluster\$1name*/prometheus** 로그 그룹에 나타납니다. 이 로그 스트림은 다음과 같은 임베디드 지표 형식 정의가 있는 로그 이벤트를 포함해야 합니다.

```
{
   "CloudWatchMetrics":[
      {
         "Metrics":[
            {
               "Name":"apiserver_request_total"
            }
         ],
         "Dimensions":[
            [
               "ClusterName",
               "Service"
            ]
         ],
         "Namespace":"ContainerInsights/Prometheus"
      }
   ],
   "ClusterName":"my-cluster-name",
   "Namespace":"default",
   "Service":"kubernetes",
   "Timestamp":"1592267020339",
   "Version":"0",
   "apiserver_request_count":0,
   "apiserver_request_total":0,
   "code":"0",
   "component":"apiserver",
   "contentType":"application/json",
   "instance":"192.0.2.0:443",
   "job":"kubernetes-apiservers",
   "prom_metric_type":"counter",
   "resource":"pods",
   "scope":"namespace",
   "verb":"WATCH",
   "version":"v1"
}
```

CloudWatch 콘솔의 **ContainerInsights/Prometheus** 네임스페이스에서 지표를 볼 수 있습니다. 또한 선택적으로 Prometheus Kubernetes API 서버 지표에 대한 CloudWatch 대시보드를 생성할 수도 있습니다.

### (선택 사항) Kubernetes API 서버 지표에 대한 대시보드 생성
<a name="ContainerInsights-Prometheus-Setup-KPI-dashboard"></a>

대시보드에서 Kubernetes API 서버 지표를 보려면 먼저, 이전 단원의 단계를 완료하여 CloudWatch에서 이러한 지표 수집을 시작해야 합니다.

**Kubernetes API 서버 지표에 대한 대시보드를 생성하려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 올바른 AWS 리전을 선택했는지 확인합니다.

1. 탐색 창에서 **대시보드**를 선택합니다.

1. **대시보드 생성**을 선택합니다. 새 대시보드의 이름을 입력하고 **대시보드 생성**을 선택합니다.

1. **이 대시보드에 추가**에서 **취소**를 선택합니다.

1. **작업**, **소스 보기/편집**을 선택합니다.

1. [Kubernetes API 대시보드 소스](https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/kubernetes_api_server/cw_dashboard_kubernetes_api_server.json)라는 JSON 파일을 다운로드합니다.

1. 텍스트 편집기로 다운로드한 JSON 파일을 열고, 다음과 같이 변경합니다.
   + 모든 `{{YOUR_CLUSTER_NAME}}` 문자열을 정확한 클러스터 이름으로 바꿉니다. 텍스트 앞이나 뒤에 공백을 추가하지 않도록 하세요.
   + 모든 `{{YOUR_AWS_REGION}}` 문자열을 지표가 수집되는 리전의 이름으로 바꿉니다. 예: `us-west-2`. 텍스트 앞이나 뒤에 공백을 추가하지 않도록 하세요.

1. JSON blob 전체를 복사하여 CloudWatch 콘솔의 텍스트 상자에 붙여넣어 이미 상자에 있는 내용을 바꿉니다.

1. **업데이트**, **대시보드 저장**을 선택합니다.

# (선택 사항) Prometheus 지표 테스트를 위한 컨테이너화된 Amazon EKS 워크로드 샘플 설정
<a name="ContainerInsights-Prometheus-Sample-Workloads"></a>

CloudWatch Container Insights에서 Prometheus 지표 지원을 테스트하기 위해 다음과 같은 컨테이너화된 워크로드 중 하나 이상을 설정할 수 있습니다. Prometheus가 지원되는 CloudWatch 에이전트는 이러한 각 워크로드에서 지표를 자동으로 수집합니다. 기본적으로 수집되는 지표를 보려면 [CloudWatch 에이전트가 수집하는 Prometheus 지표](ContainerInsights-Prometheus-metrics.md) 단원을 참조하세요.

이러한 워크로드를 설치하려면 다음 명령을 입력하여 Helm 3.x를 설치해야 합니다.

```
brew install helm
```

자세한 내용은 [Helm](https://helm.sh)을 참조하세요.

**Topics**
+ [Amazon EKS 및 Kubernetes의 AWS App Mesh 샘플 워크로드 설정](ContainerInsights-Prometheus-Sample-Workloads-appmesh.md)
+ [Amazon EKS 및 Kubernetes에서 샘플 트래픽이 포함된 NGINX 설정](ContainerInsights-Prometheus-Sample-Workloads-nginx.md)
+ [Amazon EKS 및 Kubernetes에서 지표 익스포터가 포함된 Memcached 설정](ContainerInsights-Prometheus-Sample-Workloads-memcached.md)
+ [Amazon EKS 및 Kubernetes에서 Java/JMX 샘플 워크로드 설정](ContainerInsights-Prometheus-Sample-Workloads-javajmx.md)
+ [Amazon EKS 및 Kubernetes에서 지표 익스포터가 포함된 HAProxy 설정](ContainerInsights-Prometheus-Sample-Workloads-haproxy.md)
+ [새로운 Prometheus 스크레이핑 대상을 추가하는 자습서: Amazon EKS 및 Kubernetes 클러스터의 Redis OSS](ContainerInsights-Prometheus-Setup-redis-eks.md)

# Amazon EKS 및 Kubernetes의 AWS App Mesh 샘플 워크로드 설정
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh"></a>

CloudWatch Container Insights의 Prometheus 지원은 AWS App Mesh를 지원합니다. 다음 단원에서는 App Mesh를 설정하는 방법을 설명합니다.

**Topics**
+ [EC2 시작 유형의 Amazon EKS 클러스터 또는 Kubernetes 클러스터에서 AWS App Mesh 샘플 워크로드 설정](ContainerInsights-Prometheus-Sample-Workloads-appmesh-EKS.md)
+ [Fargate 시작 유형의 Amazon EKS 클러스터에서 AWS App Mesh 샘플 워크로드 설정](ContainerInsights-Prometheus-Sample-Workloads-appmesh-Fargate.md)

# EC2 시작 유형의 Amazon EKS 클러스터 또는 Kubernetes 클러스터에서 AWS App Mesh 샘플 워크로드 설정
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-EKS"></a>

EC2 시작 유형의 Amazon EKS를 실행하는 클러스터 또는 Kubernetes 클러스터에서 App Mesh를 설정할 경우 다음 지침을 따르세요.

## IAM 권한 구성
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-iam"></a>

Amazon EKS 또는 Kubernetes 노드 그룹의 IAM 역할에 **AWSAppMeshFullAccess** 정책을 추가해야 합니다. Amazon EKS에서 이 노드 그룹 이름은 `eksctl-integ-test-eks-prometheus-NodeInstanceRole-ABCDEFHIJKL`과 유사합니다. Kubernetes에서는 `nodes.integ-test-kops-prometheus.k8s.local`과 유사하게 보일 수 있습니다.

## App Mesh 설치
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-install"></a>

App Mesh Kubernetes 컨트롤러를 설치하려면 [App Mesh 컨트롤러](https://github.com/aws/eks-charts/tree/master/stable/appmesh-controller#app-mesh-controller)의 지침을 따르세요.

## 샘플 애플리케이션 설치
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-application"></a>

[aws-app-mesh-examples](https://github.com/aws/aws-app-mesh-examples)에는 여러 Kubernetes App Mesh 시연이 포함되어 있습니다. 이 튜토리얼에서는 http 라우팅이 들어오는 요청을 일치시키기 위해 어떻게 헤더를 사용하는지 보여 주는 샘플 컬러 애플리케이션을 설치합니다.

**샘플 App Mesh 애플리케이션을 사용하여 Container Insights를 테스트하려면**

1. 다음 지침에 따라 애플리케이션을 설치합니다. [https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-http-headers](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-http-headers) 

1. 다음과 같이 curler 포드를 시작하여 트래픽을 생성합니다.

   ```
   kubectl -n default run -it curler --image=tutum/curl /bin/bash
   ```

1. HTTP 헤더를 변경하여 다양한 엔드포인트를 curl합니다. 다음과 같이 curl 명령을 여러 번 실행합니다.

   ```
   curl -H "color_header: blue" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;
   
   curl -H "color_header: red" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;
   
   curl -H "color_header: yellow" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;
   ```

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 클러스터가 실행되고 있는 AWS 리전에서 왼쪽 탐색 창의 [**지표(Metrics)**]를 선택합니다. 지표는 **ContainerInsights/Prometheus** 네임스페이스에 있습니다.

1. CloudWatch Logs 이벤트를 보려면 탐색 창에서 [**로그 그룹(Log groups)**]을 선택합니다. 이벤트는 로그 그룹 ` /aws/containerinsights/your_cluster_name/prometheus `의 로그 스트림 `kubernetes-pod-appmesh-envoy`에 있습니다.

## App Mesh 테스트 환경 삭제
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-delete"></a>

App Mesh 및 샘플 애플리케이션의 사용을 마쳤으면 다음 명령을 사용하여 불필요한 리소스를 삭제합니다. 다음 명령을 입력하여 샘플 애플리케이션을 삭제합니다.

```
cd aws-app-mesh-examples/walkthroughs/howto-k8s-http-headers/
kubectl delete -f _output/manifest.yaml
```

다음 명령을 입력하여 App Mesh 컨트롤러를 삭제합니다.

```
helm delete appmesh-controller -n appmesh-system
```

# Fargate 시작 유형의 Amazon EKS 클러스터에서 AWS App Mesh 샘플 워크로드 설정
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-Fargate"></a>

Fargate 시작 유형의 Amazon EKS를 실행하는 클러스터에서 App Mesh를 설정할 경우 다음 지침을 따르세요.

## IAM 권한 구성
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh--fargate-iam"></a>

IAM 권한을 설정하려면 다음 명령을 입력합니다. *MyCluster*를 클러스터 이름으로 바꿉니다.

```
eksctl create iamserviceaccount --cluster MyCluster \
 --namespace howto-k8s-fargate \
 --name appmesh-pod \
 --attach-policy-arn arn:aws:iam::aws:policy/AWSAppMeshEnvoyAccess \
 --attach-policy-arn arn:aws:iam::aws:policy/AWSCloudMapDiscoverInstanceAccess \
 --attach-policy-arn arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess \
 --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchLogsFullAccess \
 --attach-policy-arn arn:aws:iam::aws:policy/AWSAppMeshFullAccess \
 --attach-policy-arn arn:aws:iam::aws:policy/AWSCloudMapFullAccess \
 --override-existing-serviceaccounts \
 --approve
```

## App Mesh 설치
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-fargate-install"></a>

App Mesh Kubernetes 컨트롤러를 설치하려면 [App Mesh 컨트롤러](https://github.com/aws/eks-charts/tree/master/stable/appmesh-controller#app-mesh-controller)의 지침을 따르세요. Fargate 시작 유형의 Amazon EKS에 대한 지침을 따라야 합니다.

## 샘플 애플리케이션 설치
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-fargate-application"></a>

[aws-app-mesh-examples](https://github.com/aws/aws-app-mesh-examples)에는 여러 Kubernetes App Mesh 시연이 포함되어 있습니다. 이 튜토리얼에서는 Fargate 시작 유형의 Amazon EKS 클러스터에서 작동하는 샘플 컬러 애플리케이션을 설치합니다.

**샘플 App Mesh 애플리케이션을 사용하여 Container Insights를 테스트하려면**

1. 다음 지침에 따라 애플리케이션을 설치합니다. [https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-fargate](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-fargate) 

   해당 지침에서는 올바른 Fargate 프로파일을 사용하여 새 클러스터를 생성한다고 가정합니다. 이미 설정한 Amazon EKS 클러스터를 사용하려는 경우 다음 명령을 사용하여 해당 클러스터를 이 데모에 맞게 설정할 수 있습니다. *MyCluster*를 클러스터 이름으로 바꿉니다.

   ```
   eksctl create iamserviceaccount --cluster MyCluster \
    --namespace howto-k8s-fargate \
    --name appmesh-pod \
    --attach-policy-arn arn:aws:iam::aws:policy/AWSAppMeshEnvoyAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AWSCloudMapDiscoverInstanceAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchLogsFullAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AWSAppMeshFullAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AWSCloudMapFullAccess \
    --override-existing-serviceaccounts \
    --approve
   ```

   ```
   eksctl create fargateprofile --cluster MyCluster \
   --namespace howto-k8s-fargate --name howto-k8s-fargate
   ```

1. 다음과 같이 프런트 애플리케이션 배포를 포트 포워딩합니다.

   ```
   kubectl -n howto-k8s-fargate port-forward deployment/front 8080:8080
   ```

1. 다음과 같이 프런트 앱을 curl합니다.

   ```
   while true; do  curl -s http://localhost:8080/color; sleep 0.1; echo ; done
   ```

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 클러스터가 실행되고 있는 AWS 리전에서 왼쪽 탐색 창의 [**지표(Metrics)**]를 선택합니다. 지표는 **ContainerInsights/Prometheus** 네임스페이스에 있습니다.

1. CloudWatch Logs 이벤트를 보려면 탐색 창에서 [**로그 그룹(Log groups)**]을 선택합니다. 이벤트는 로그 그룹 ` /aws/containerinsights/your_cluster_name/prometheus `의 로그 스트림 `kubernetes-pod-appmesh-envoy`에 있습니다.

## App Mesh 테스트 환경 삭제
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-fargate-delete"></a>

App Mesh 및 샘플 애플리케이션의 사용을 마쳤으면 다음 명령을 사용하여 불필요한 리소스를 삭제합니다. 다음 명령을 입력하여 샘플 애플리케이션을 삭제합니다.

```
cd aws-app-mesh-examples/walkthroughs/howto-k8s-fargate/
kubectl delete -f _output/manifest.yaml
```

다음 명령을 입력하여 App Mesh 컨트롤러를 삭제합니다.

```
helm delete appmesh-controller -n appmesh-system
```

# Amazon EKS 및 Kubernetes에서 샘플 트래픽이 포함된 NGINX 설정
<a name="ContainerInsights-Prometheus-Sample-Workloads-nginx"></a>

NGINX는 로드 밸런서 및 역방향 프록시로도 사용할 수 있는 웹 서버입니다. Kubernetes가 진입에 NGINX를 사용하는 방법에 대한 자세한 내용은 [kubernetes/ingress-nginx](https://github.com/kubernetes/ingress-nginx)를 참조하세요.

**샘플 트래픽 서비스와 함께 Ingress-NGINX를 설치하여 Container Insights Prometheus 지원을 테스트하려면**

1. 다음 명령을 입력하여 Helm ingress-nginx 리포지토리를 추가합니다.

   ```
   helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
   ```

1. 다음 명령을 입력합니다.

   ```
   kubectl create namespace nginx-ingress-sample
   
   helm install my-nginx ingress-nginx/ingress-nginx \
   --namespace nginx-ingress-sample \
   --set controller.metrics.enabled=true \
   --set-string controller.metrics.service.annotations."prometheus\.io/port"="10254" \
   --set-string controller.metrics.service.annotations."prometheus\.io/scrape"="true"
   ```

1. 다음 명령을 입력하여 서비스가 올바르게 시작되었는지 확인합니다.

   ```
   kubectl get service -n nginx-ingress-sample
   ```

   이 명령의 출력에는 `EXTERNAL-IP` 열을 포함한 여러 열이 표시되어야 합니다.

1. `EXTERNAL-IP` 변수를 NGINX 수신 컨트롤러의 행에 있는 `EXTERNAL-IP` 열 값으로 설정합니다.

   ```
   EXTERNAL_IP=your-nginx-controller-external-ip
   ```

1. 다음 명령을 입력하여 샘플 NGINX 트래픽을 시작합니다.

   ```
   SAMPLE_TRAFFIC_NAMESPACE=nginx-sample-traffic
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_traffic/nginx-traffic/nginx-traffic-sample.yaml | 
   sed "s/{{external_ip}}/$EXTERNAL_IP/g" | 
   sed "s/{{namespace}}/$SAMPLE_TRAFFIC_NAMESPACE/g" | 
   kubectl apply -f -
   ```

1. 다음 명령을 입력하여 세 개의 포드가 모두 `Running` 상태에 있는지 확인합니다.

   ```
   kubectl get pod -n $SAMPLE_TRAFFIC_NAMESPACE
   ```

   실행 중인 경우 **ContainerInsights/Prometheus** 네임스페이스에 지표가 곧 표시됩니다.

**NGINX 및 샘플 트래픽 애플리케이션을 제거하려면**

1. 다음 명령을 입력하여 샘플 트래픽 서비스를 삭제합니다.

   ```
   kubectl delete namespace $SAMPLE_TRAFFIC_NAMESPACE
   ```

1. Helm 릴리스 이름으로 NGINX egress를 삭제합니다.

   ```
   helm uninstall my-nginx --namespace nginx-ingress-sample
   kubectl delete namespace nginx-ingress-sample
   ```

# Amazon EKS 및 Kubernetes에서 지표 익스포터가 포함된 Memcached 설정
<a name="ContainerInsights-Prometheus-Sample-Workloads-memcached"></a>

memcached는 오픈 소스 메모리 객체 캐싱 시스템입니다. 자세한 내용은 [Memcached란 무엇입니까?](https://www.memcached.org)를 참조하세요.

Fargate 시작 유형의 클러스터에서 Memcached를 실행할 경우 이 절차의 단계를 수행하기 전에 먼저, Fargate 프로파일을 설정해야 합니다. 프로파일을 설정하려면 다음 명령을 입력합니다. *MyCluster*를 클러스터 이름으로 바꿉니다.

```
eksctl create fargateprofile --cluster MyCluster \
--namespace memcached-sample --name memcached-sample
```

**Container Insights Prometheus 지원을 테스트하기 위해 지표 익스포터와 함께 memcached를 설치하려면**

1. 다음 명령을 입력하여 리포지토리를 추가합니다.

   ```
   helm repo add bitnami https://charts.bitnami.com/bitnami
   ```

1. 다음 명령을 입력하여 새 네임스페이스를 생성합니다.

   ```
   kubectl create namespace memcached-sample
   ```

1. 다음 명령을 입력하여 Memcached를 설치합니다.

   ```
   helm install my-memcached bitnami/memcached --namespace memcached-sample \
   --set metrics.enabled=true \
   --set-string serviceAnnotations.prometheus\\.io/port="9150" \
   --set-string serviceAnnotations.prometheus\\.io/scrape="true"
   ```

1. 다음 명령을 입력하여 실행 중인 서비스의 주석을 확인합니다.

   ```
   kubectl describe service my-memcached-metrics -n memcached-sample
   ```

   다음 두 주석이 표시됩니다.

   ```
   Annotations:   prometheus.io/port: 9150
                  prometheus.io/scrape: true
   ```

**memcached를 제거하려면**
+ 다음 명령을 입력합니다.

  ```
  helm uninstall my-memcached --namespace memcached-sample
  kubectl delete namespace memcached-sample
  ```

# Amazon EKS 및 Kubernetes에서 Java/JMX 샘플 워크로드 설정
<a name="ContainerInsights-Prometheus-Sample-Workloads-javajmx"></a>

JMX Exporter는 JMX mBeans를 스크레이프하여 노출할 수 있는 공식 Prometheus 익스포터입니다. 자세한 내용은 [prometheus/jmx\$1exporter](https://github.com/prometheus/jmx_exporter)를 참조하세요.

Container Insights는 JMX Exporter를 사용하여 Java Virtual Machine(JVM), Java 및 Tomcat(Catalina)에서 사전 정의된 Prometheus 지표를 수집할 수 있습니다.

## 기본 Prometheus 스크레이프 구성
<a name="ContainerInsights-Prometheus-Sample-Workloads-javajmx-default"></a>

기본적으로 Prometheus가 지원되는 CloudWatch 에이전트는 Amazon EKS 또는 Kubernetes 클러스터에 있는 각 포드의 `http://CLUSTER_IP:9404/metrics`에서 Java/JMX Prometheus 지표를 스크레이프합니다. 이는 Prometheus `kubernetes_sd_config`의 `role: pod` 검색에 의해 수행됩니다. 9404는 Prometheus에서 JMX Exporter에 할당한 기본 포트입니다. `role: pod` 검색에 대한 자세한 내용은 [포드](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#pod)를 참조하세요. 지표를 다른 포트 또는 metrics\$1path에 노출하도록 JMX Exporter를 구성할 수 있습니다. 포트 또는 경로를 변경하는 경우 CloudWatch 에이전트 config 맵의 기본 jmx scrape\$1config를 업데이트하세요. 다음 명령을 실행하여 현재 CloudWatch 에이전트 Prometheus 구성을 가져옵니다.

```
kubectl describe cm prometheus-config -n amazon-cloudwatch
```

변경할 필드는 다음 예제에서 강조 표시된 대로 `/metrics` 및 `regex: '.*:9404$'` 필드입니다.

```
job_name: 'kubernetes-jmx-pod'
sample_limit: 10000
metrics_path: /metrics
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__address__]
  action: keep
  regex: '.*:9404$'
- action: replace
  regex: (.+)
  source_labels:
```

## 기타 Prometheus 스크레이프 구성
<a name="ContainerInsights-Prometheus-Sample-Workloads-javajmx-other"></a>

Kubernetes Service의 Java/JMX Prometheus Exporter가 있는 포드 세트에서 실행 중인 애플리케이션을 노출하는 경우 Prometheus `kubernetes_sd_config`의 `role: service` 검색 또는 `role: endpoint` 검색을 사용하도록 전환할 수도 있습니다. 이러한 검색 방법에 대한 자세한 내용은 [서비스](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#service), [엔드포인트](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#endpoints), [<kubernetes\$1sd\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config)를 참조하세요.

이러한 두 가지 서비스 검색 모드는 더 많은 메타 레이블을 제공하므로 CloudWatch 지표 측정기준을 구축하는 데 유용할 수 있습니다. 예를 들어 `__meta_kubernetes_service_name`의 레이블을 `Service`로 다시 지정하고 이를 지표의 측정기준에 포함할 수 있습니다. CloudWatch 지표 및 해당 측정기준의 사용자 지정에 대한 자세한 내용은 [Prometheus에 대한 CloudWatch 에이전트 구성](ContainerInsights-Prometheus-Setup-configure-ECS.md#ContainerInsights-Prometheus-Setup-cw-agent-config) 단원을 참조하세요.

## JMX Exporter가 포함된 Docker 이미지
<a name="ContainerInsights-Prometheus-Sample-Workloads-javajmx-docker"></a>

다음으로, Docker 이미지를 구축합니다. 다음 단원에서는 두 가지 Dockerfile 예를 제공합니다.

이미지를 구축한 경우 Amazon EKS 또는 Kubernetes에 로드한 후 다음 명령을 실행하여 Prometheus 지표가 포트 9404에서 `JMX_EXPORTER`에 의해 노출되는지 확인합니다. *\$1JAR\$1SAMPLE\$1TRAFFIC\$1POD*를 실행 중인 포드 이름으로 바꾸고 *\$1JAR\$1SAMPLE\$1TRAFFIC\$1NAMESPACE*를 애플리케이션 네임스페이스로 바꿉니다.

Fargate 시작 유형의 클러스터에서 JMX Exporter를 실행할 경우 이 절차의 단계를 수행하기 전에 먼저, Fargate 프로파일도 설정해야 합니다. 프로파일을 설정하려면 다음 명령을 입력합니다. *MyCluster*를 클러스터 이름으로 바꿉니다.

```
eksctl create fargateprofile --cluster MyCluster \
--namespace $JAR_SAMPLE_TRAFFIC_NAMESPACE\
 --name $JAR_SAMPLE_TRAFFIC_NAMESPACE
```

```
kubectl exec $JAR_SAMPLE_TRAFFIC_POD -n $JARCAT_SAMPLE_TRAFFIC_NAMESPACE -- curl http://localhost:9404
```

## 예: Prometheus 지표가 있는 Apache Tomcat Docker 이미지
<a name="ContainerInsights-Prometheus-Sample-Workloads-javajmx-tomcat"></a>

Apache Tomcat 서버는 기본적으로 JMX mBeans를 노출합니다. JMX Exporter를 Tomcat과 통합하여 JMX mBeans를 Prometheus 지표로 노출할 수 있습니다. 다음 Dockerfile 예는 테스트 이미지를 구축하는 단계를 보여 줍니다.

```
# From Tomcat 9.0 JDK8 OpenJDK 
FROM tomcat:9.0-jdk8-openjdk 

RUN mkdir -p /opt/jmx_exporter

COPY ./jmx_prometheus_javaagent-0.12.0.jar /opt/jmx_exporter
COPY ./config.yaml /opt/jmx_exporter
COPY ./setenv.sh /usr/local/tomcat/bin 
COPY your web application.war /usr/local/tomcat/webapps/

RUN chmod  o+x /usr/local/tomcat/bin/setenv.sh

ENTRYPOINT ["catalina.sh", "run"]
```

다음 목록은 이 Dockerfile에 있는 4개의 `COPY` 줄을 설명합니다.
+ [https://github.com/prometheus/jmx\$1exporter](https://github.com/prometheus/jmx_exporter)에서 최신 JMX Exporter jar 파일을 다운로드합니다.
+ `config.yaml`은 JMX Exporter 구성 파일입니다. 자세한 내용은 [https://github.com/prometheus/jmx\$1exporter\$1Configuration](https://github.com/prometheus/jmx_exporter#Configuration )을 참조하세요.

  다음은 Java 및 Tomcat의 샘플 구성 파일입니다.

  ```
  lowercaseOutputName: true
  lowercaseOutputLabelNames: true
  
  rules:
  - pattern: 'java.lang<type=OperatingSystem><>(FreePhysicalMemorySize|TotalPhysicalMemorySize|FreeSwapSpaceSize|TotalSwapSpaceSize|SystemCpuLoad|ProcessCpuLoad|OpenFileDescriptorCount|AvailableProcessors)'
    name: java_lang_OperatingSystem_$1
    type: GAUGE
  
  - pattern: 'java.lang<type=Threading><>(TotalStartedThreadCount|ThreadCount)'
    name: java_lang_threading_$1
    type: GAUGE
  
  - pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+)'
    name: catalina_globalrequestprocessor_$3_total
    labels:
      port: "$2"
      protocol: "$1"
    help: Catalina global $3
    type: COUNTER
  
  - pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount)'
    name: catalina_servlet_$3_total
    labels:
      module: "$1"
      servlet: "$2"
    help: Catalina servlet $3 total
    type: COUNTER
  
  - pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount)'
    name: catalina_threadpool_$3
    labels:
      port: "$2"
      protocol: "$1"
    help: Catalina threadpool $3
    type: GAUGE
  
  - pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions)'
    name: catalina_session_$3_total
    labels:
      context: "$2"
      host: "$1"
    help: Catalina session $3 total
    type: COUNTER
  
  - pattern: ".*"
  ```
+ `setenv.sh`는 Tomcat과 함께 JMX Exporter를 시작하고 localhost의 포트 9404에 Prometheus 지표를 노출하는 Tomcat 시작 스크립트입니다. 또한 JMX Exporter에 `config.yaml` 파일 경로를 제공합니다.

  ```
  $ cat setenv.sh 
  export JAVA_OPTS="-javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent-0.12.0.jar=9404:/opt/jmx_exporter/config.yaml $JAVA_OPTS"
  ```
+ web application.war는 Tomcat에 의해 로드될 웹 애플리케이션 `war` 파일입니다.

이 구성으로 Docker 이미지를 구축하고 이미지 리포지토리에 업로드합니다.

## 예: Prometheus 지표가 있는 Java Jar 애플리케이션 Docker 이미지
<a name="ContainerInsights-Prometheus-Sample-Workloads-javajmx-jar"></a>

다음 Dockerfile 예는 테스트 이미지를 구축하는 단계를 보여 줍니다.

```
# Alpine Linux with OpenJDK JRE
FROM openjdk:8-jre-alpine

RUN mkdir -p /opt/jmx_exporter

COPY ./jmx_prometheus_javaagent-0.12.0.jar /opt/jmx_exporter
COPY ./SampleJavaApplication-1.0-SNAPSHOT.jar /opt/jmx_exporter
COPY ./start_exporter_example.sh /opt/jmx_exporter
COPY ./config.yaml /opt/jmx_exporter

RUN chmod -R o+x /opt/jmx_exporter
RUN apk add curl

ENTRYPOINT exec /opt/jmx_exporter/start_exporter_example.sh
```

다음 목록은 이 Dockerfile에 있는 4개의 `COPY` 줄을 설명합니다.
+ [https://github.com/prometheus/jmx\$1exporter](https://github.com/prometheus/jmx_exporter)에서 최신 JMX Exporter jar 파일을 다운로드합니다.
+ `config.yaml`은 JMX Exporter 구성 파일입니다. 자세한 내용은 [https://github.com/prometheus/jmx\$1exporter\$1Configuration](https://github.com/prometheus/jmx_exporter#Configuration )을 참조하세요.

  다음은 Java 및 Tomcat의 샘플 구성 파일입니다.

  ```
  lowercaseOutputName: true
  lowercaseOutputLabelNames: true
  
  rules:
  - pattern: 'java.lang<type=OperatingSystem><>(FreePhysicalMemorySize|TotalPhysicalMemorySize|FreeSwapSpaceSize|TotalSwapSpaceSize|SystemCpuLoad|ProcessCpuLoad|OpenFileDescriptorCount|AvailableProcessors)'
    name: java_lang_OperatingSystem_$1
    type: GAUGE
  
  - pattern: 'java.lang<type=Threading><>(TotalStartedThreadCount|ThreadCount)'
    name: java_lang_threading_$1
    type: GAUGE
  
  - pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+)'
    name: catalina_globalrequestprocessor_$3_total
    labels:
      port: "$2"
      protocol: "$1"
    help: Catalina global $3
    type: COUNTER
  
  - pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount)'
    name: catalina_servlet_$3_total
    labels:
      module: "$1"
      servlet: "$2"
    help: Catalina servlet $3 total
    type: COUNTER
  
  - pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount)'
    name: catalina_threadpool_$3
    labels:
      port: "$2"
      protocol: "$1"
    help: Catalina threadpool $3
    type: GAUGE
  
  - pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions)'
    name: catalina_session_$3_total
    labels:
      context: "$2"
      host: "$1"
    help: Catalina session $3 total
    type: COUNTER
  
  - pattern: ".*"
  ```
+ `start_exporter_example.sh`는 Prometheus 지표를 내보낸 JAR 애플리케이션을 시작하는 스크립트입니다. 또한 JMX Exporter에 `config.yaml` 파일 경로를 제공합니다.

  ```
  $ cat start_exporter_example.sh 
  java -javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent-0.12.0.jar=9404:/opt/jmx_exporter/config.yaml -cp  /opt/jmx_exporter/SampleJavaApplication-1.0-SNAPSHOT.jar com.gubupt.sample.app.App
  ```
+ SampleJavaApplication-1.0-SNAPSHOT.jar은 샘플 Java 애플리케이션 jar 파일입니다. 이 파일을 모니터링할 Java 애플리케이션으로 바꿉니다.

이 구성으로 Docker 이미지를 구축하고 이미지 리포지토리에 업로드합니다.

# Amazon EKS 및 Kubernetes에서 지표 익스포터가 포함된 HAProxy 설정
<a name="ContainerInsights-Prometheus-Sample-Workloads-haproxy"></a>

HAProxy는 오픈 소스 프록시 애플리케이션입니다. 자세한 내용은 [HAProxy](https://www.haproxy.org)를 참조하세요.

Fargate 시작 유형의 클러스터에서 HAProxy를 실행할 경우 이 절차의 단계를 수행하기 전에 먼저, Fargate 프로파일을 설정해야 합니다. 프로파일을 설정하려면 다음 명령을 입력합니다. *MyCluster*를 클러스터 이름으로 바꿉니다.

```
eksctl create fargateprofile --cluster MyCluster \
--namespace haproxy-ingress-sample --name haproxy-ingress-sample
```

**지표 익스포터와 함께 HAProxy를 설치하여 Container Insights Prometheus 지원을 테스트하려면**

1. 다음 명령을 입력하여 Helm 인큐베이터 리포지토리를 추가합니다.

   ```
   helm repo add haproxy-ingress https://haproxy-ingress.github.io/charts
   ```

1. 다음 명령을 입력하여 새 네임스페이스를 생성합니다.

   ```
   kubectl create namespace haproxy-ingress-sample
   ```

1. 다음 명령을 입력하여 HAProxy를 설치합니다.

   ```
   helm install haproxy haproxy-ingress/haproxy-ingress \
   --namespace haproxy-ingress-sample \
   --set defaultBackend.enabled=true \
   --set controller.stats.enabled=true \
   --set controller.metrics.enabled=true \
   --set-string controller.metrics.service.annotations."prometheus\.io/port"="9101" \
   --set-string controller.metrics.service.annotations."prometheus\.io/scrape"="true"
   ```

1. 다음 명령을 입력하여 서비스의 주석을 확인합니다.

   ```
   kubectl describe service haproxy-haproxy-ingress-metrics -n haproxy-ingress-sample
   ```

   다음과 같은 주석이 표시됩니다.

   ```
   Annotations:   prometheus.io/port: 9101
                  prometheus.io/scrape: true
   ```

**HAProxy를 제거하려면**
+ 다음 명령을 입력합니다.

  ```
  helm uninstall haproxy --namespace haproxy-ingress-sample
  kubectl delete namespace haproxy-ingress-sample
  ```

# 새로운 Prometheus 스크레이핑 대상을 추가하는 자습서: Amazon EKS 및 Kubernetes 클러스터의 Redis OSS
<a name="ContainerInsights-Prometheus-Setup-redis-eks"></a>

이 자습서에서는 Amazon EKS 및 Kubernetes에서 샘플 Redis OSS 애플리케이션의 Prometheus 지표를 스크레이핑하는 실습 입문을 제공합니다. Redis OSS(https://redis.io/)는 데이터베이스, 캐시 및 메시지 브로커로 사용되는 오픈 소스(BSD 라이선스), 인메모리 구조 데이터 스토어입니다. 자세한 내용은 [redis](https://redis.io/)를 참조하세요.

redis\$1exporter(MIT License 라이선스)는 지정된 포트(기본값: 0.0.0.0:9121)에서 Redis OSS Prometheus 지표를 노출하는 데 사용됩니다. 자세한 내용은 [redis\$1exporter](https://github.com/oliver006/redis_exporter)를 참조하세요.

이 튜토리얼에서는 다음과 같은 두 Docker Hub 리포지토리의 Docker 이미지를 사용합니다.
+ [ redis](https://hub.docker.com/_/redis?tab=description)
+ [ redis\$1exporter](https://hub.docker.com/r/oliver006/redis_exporter)

**Prometheus 지표를 노출하는 샘플 Redis OSS 워크로드를 설치하는 방법**

1. 샘플 Redis OSS 워크로드의 네임스페이스를 설정합니다.

   ```
   REDIS_NAMESPACE=redis-sample
   ```

1. Fargate 시작 유형의 클러스터에서 Redis OSS를 실행하는 경우 Fargate 프로파일을 설정해야 합니다. 프로파일을 설정하려면 다음 명령을 입력합니다. *MyCluster*를 클러스터 이름으로 바꿉니다.

   ```
   eksctl create fargateprofile --cluster MyCluster \
   --namespace $REDIS_NAMESPACE --name $REDIS_NAMESPACE
   ```

1. 다음 명령을 입력하여 샘플 Redis OSS 워크로드를 설치합니다.

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_traffic/redis/redis-traffic-sample.yaml \
   | sed "s/{{namespace}}/$REDIS_NAMESPACE/g" \
   | kubectl apply -f -
   ```

1. 설치에는 포트 9121에서 Redis OSS Prometheus 지표를 노출하는 `my-redis-metrics`라는 서비스가 포함되어 있습니다. 다음 명령을 입력하여 서비스 세부 정보를 가져옵니다.

   ```
   kubectl describe service/my-redis-metrics  -n $REDIS_NAMESPACE
   ```

   결과의 `Annotations` 섹션에는 다음과 같이 워크로드를 자동 검색할 수 있도록 CloudWatch 에이전트의 Prometheus 스크레이프 구성과 일치하는 두 개의 주석이 표시됩니다.

   ```
   prometheus.io/port: 9121
   prometheus.io/scrape: true
   ```

   관련 Prometheus 스크레이프 구성은 `kubernetes-eks.yaml` 또는 `kubernetes-k8s.yaml`의 `- job_name: kubernetes-service-endpoints` 섹션에서 찾아볼 수 있습니다.

**CloudWatch에서 Redis OSS Prometheus 지표 수집을 시작하는 방법**

1. 다음 명령 중 하나를 입력하여 최신 버전의 `kubernetes-eks.yaml` 또는 `kubernetes-k8s.yaml` 파일을 다운로드합니다. EC2 시작 유형의 Amazon EKS 클러스터의 경우 다음 명령을 입력합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml
   ```

   Fargate 시작 유형의 Amazon EKS 클러스터의 경우 다음 명령을 입력합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks-fargate.yaml
   ```

   Amazon EC2 인스턴스에서 실행되는 Kubernetes 클러스터의 경우 다음 명령을 입력합니다.

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-k8s.yaml
   ```

1. 텍스트 편집기를 사용하여 파일을 열고 `cwagentconfig.json` 섹션을 찾습니다. 다음 하위 섹션을 추가하고 변경 사항을 저장합니다. 이때 들여쓰기가 기존 패턴을 따라야 합니다.

   ```
   {
     "source_labels": ["pod_name"],
     "label_matcher": "^redis-instance$",
     "dimensions": [["Namespace","ClusterName"]],
     "metric_selectors": [
       "^redis_net_(in|out)put_bytes_total$",
       "^redis_(expired|evicted)_keys_total$",
       "^redis_keyspace_(hits|misses)_total$",
       "^redis_memory_used_bytes$",
       "^redis_connected_clients$"
     ]
   },
   {
     "source_labels": ["pod_name"],
     "label_matcher": "^redis-instance$",
     "dimensions": [["Namespace","ClusterName","cmd"]],
     "metric_selectors": [
       "^redis_commands_total$"
     ]
   },
   {
     "source_labels": ["pod_name"],
     "label_matcher": "^redis-instance$",
     "dimensions": [["Namespace","ClusterName","db"]],
     "metric_selectors": [
       "^redis_db_keys$"
     ]
   },
   ```

   추가한 섹션에서는 Redis OSS 지표를 CloudWatch 에이전트 허용 목록에 넣습니다. 해당 지표 목록은 다음 단원을 참조하세요.

1. 이 클러스터에 Prometheus가 지원되는 CloudWatch 에이전트를 이미 배포한 경우 다음 명령을 입력하여 해당 에이전트를 삭제해야 합니다.

   ```
   kubectl delete deployment cwagent-prometheus -n amazon-cloudwatch
   ```

1. 다음 명령 중 하나를 입력하여 업데이트된 구성으로 CloudWatch 에이전트를 배포합니다. *MyCluster* 및 *region*을 설정과 일치하도록 바꿉니다.

   EC2 시작 유형의 Amazon EKS 클러스터의 경우 다음 명령을 입력합니다.

   ```
   kubectl apply -f prometheus-eks.yaml
   ```

   Fargate 시작 유형의 Amazon EKS 클러스터의 경우 다음 명령을 입력합니다.

   ```
   cat prometheus-eks-fargate.yaml \
   | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \
   | kubectl apply -f -
   ```

   Kubernetes 클러스터의 경우 다음 명령을 입력합니다.

   ```
   cat prometheus-k8s.yaml \
   | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \
   | kubectl apply -f -
   ```

## Redis OSS Prometheus 지표 보기
<a name="ContainerInsights-Prometheus-Setup-redis-eks-view"></a>

이 튜토리얼에서는 CloudWatch의 **ContainerInsights/Prometheus** 네임스페이스에 다음 지표를 전송합니다. CloudWatch 콘솔을 사용하여 해당 네임스페이스의 지표를 볼 수 있습니다.


| 지표 이름 | 측정기준 | 
| --- | --- | 
|  `redis_net_input_bytes_total` |  ClusterName, `Namespace`   | 
|  `redis_net_output_bytes_total` |  ClusterName, `Namespace`   | 
|  `redis_expired_keys_total` |  ClusterName, `Namespace`   | 
|  `redis_evicted_keys_total` |  ClusterName, `Namespace`   | 
|  `redis_keyspace_hits_total` |  ClusterName, `Namespace`   | 
|  `redis_keyspace_misses_total` |  ClusterName, `Namespace`   | 
|  `redis_memory_used_bytes` |  ClusterName, `Namespace`   | 
|  `redis_connected_clients` |  ClusterName, `Namespace`   | 
|  `redis_commands_total` |  ClusterName, `Namespace`, cmd  | 
|  `redis_db_keys` |  ClusterName, `Namespace`, db  | 

**참고**  
[**cmd**] 측정기준의 값은 `append`, `client`, `command`, `config`, `dbsize`, `flushall`, `get`, `incr`, `info`, `latency` 또는 `slowlog`일 수 있습니다.  
[**db**] 측정기준의 값은 `db0`\$1`db15`일 수 있습니다.

Redis OSS Prometheus 지표에 대한 CloudWatch 대시보드를 생성할 수도 있습니다.

**Redis OSS Prometheus 지표에 대한 대시보드를 생성하는 방법**

1. 환경 변수를 만들어서 아래의 값을 배포와 일치하도록 바꿉니다.

   ```
   DASHBOARD_NAME=your_cw_dashboard_name
   REGION_NAME=your_metric_region_such_as_us-east-1
   CLUSTER_NAME=your_k8s_cluster_name_here
   NAMESPACE=your_redis_service_namespace_here
   ```

1. 다음 명령을 입력하여 대시보드를 생성합니다.

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/redis/cw_dashboard_redis.json \
   | sed "s/{{YOUR_AWS_REGION}}/${REGION_NAME}/g" \
   | sed "s/{{YOUR_CLUSTER_NAME}}/${CLUSTER_NAME}/g" \
   | sed "s/{{YOUR_NAMESPACE}}/${NAMESPACE}/g" \
   ```

# CloudWatch 에이전트의 Prometheus 지표 유형 변환
<a name="ContainerInsights-Prometheus-metrics-conversion"></a>

Prometheus 클라이언트 라이브러리는 다음과 같은 네 가지 핵심 지표 유형을 제공합니다.
+ Counter
+ 게이지
+ 요약
+ 히스토그램

CloudWatch 에이전트는 카운터, 게이지 및 요약 지표 유형을 지원합니다.

 지원되지 않는 히스토그램 지표 유형이 포함된 Prometheus 지표는 CloudWatch 에이전트에서 삭제합니다. 자세한 내용은 [삭제된 Prometheus 지표 로깅](ContainerInsights-Prometheus-troubleshooting-EKS.md#ContainerInsights-Prometheus-troubleshooting-droppedmetrics) 섹션을 참조하세요.

**게이지 지표**

Prometheus 게이지 지표는 임의로 올라가고 내려갈 수 있는 단일 숫자 값을 나타내는 지표입니다. CloudWatch 에이전트는 게이지 지표를 스크레이프하고 해당 값을 곧바로 내보냅니다.

**카운터 지표**

Prometheus 카운터 지표는 값이 증가하거나 0으로 재설정될 수만 있는 단일 단조 증가 카운터를 나타내는 누적 지표입니다. CloudWatch 에이전트는 이전 스크레이프에서 델타를 계산하고 델타 값을 로그 이벤트의 지표 값으로 보냅니다. 따라서 CloudWatch 에이전트는 두 번째 스크레이프에서 하나의 로그 이벤트를 생성하고 후속 스크레이프를 계속합니다(있는 경우).

**요약 지표**

Prometheus 요약 지표는 여러 데이터 요소로 표현되는 복잡한 지표 유형입니다. 이 지표는 총 관측 수 및 모든 관측값의 합계를 제공합니다. 슬라이딩 기간 동안 구성 가능한 분위수를 계산합니다.

요약 지표의 합계 및 개수는 누적되지만 분위수는 누적되지 않습니다. 다음 예에서는 분위수의 분산을 보여 줍니다.

```
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 7.123e-06
go_gc_duration_seconds{quantile="0.25"} 9.204e-06
go_gc_duration_seconds{quantile="0.5"} 1.1065e-05
go_gc_duration_seconds{quantile="0.75"} 2.8731e-05
go_gc_duration_seconds{quantile="1"} 0.003841496
go_gc_duration_seconds_sum 0.37630427
go_gc_duration_seconds_count 9774
```

CloudWatch 에이전트는 이전 단원에서 설명한 대로 카운터 지표를 처리하는 것과 동일한 방식으로 요약 지표의 합계 및 개수를 처리합니다. CloudWatch 에이전트는 원래 보고된 대로 분위수 값을 유지합니다.

# CloudWatch 에이전트가 수집하는 Prometheus 지표
<a name="ContainerInsights-Prometheus-metrics"></a>

Prometheus가 지원되는 CloudWatch 에이전트는 여러 서비스 및 워크로드에서 지표를 자동으로 수집합니다. 기본적으로 수집하는 지표 목록은 다음 단원에 나와 있습니다. 또한 이러한 서비스에서 더 많은 지표를 수집하고 다른 애플리케이션 및 서비스에서 Prometheus 지표를 수집하도록 에이전트를 구성할 수도 있습니다. 추가 지표 수집에 대한 자세한 내용은 [Prometheus에 대한 CloudWatch 에이전트 구성](ContainerInsights-Prometheus-Setup-configure-ECS.md#ContainerInsights-Prometheus-Setup-cw-agent-config) 단원을 참조하세요.

Amazon EKS 및 Kubernetes 클러스터에서 수집된 Prometheus 지표는 **ContainerInsights/Prometheus** 네임스페이스에 있습니다. Amazon ECS 클러스터에서 수집된 Prometheus 지표는 **ECS/ContainerInsights/Prometheus** 네임스페이스에 있습니다.

**Topics**
+ [App Mesh의 Prometheus 지표](#ContainerInsights-Prometheus-metrics-appmesh)
+ [NGINX의 Prometheus 지표](#ContainerInsights-Prometheus-metrics-nginx)
+ [Memcached의 Prometheus 지표](#ContainerInsights-Prometheus-metrics-memcached)
+ [Java/JMX의 Prometheus 지표](#ContainerInsights-Prometheus-metrics-jmx)
+ [HAProxy의 Prometheus 지표](#ContainerInsights-Prometheus-metrics-haproxy)

## App Mesh의 Prometheus 지표
<a name="ContainerInsights-Prometheus-metrics-appmesh"></a>

다음 지표는 App Mesh에서 자동으로 수집됩니다.

**Amazon EKS 및 Kubernetes 클러스터의 App Mesh에 대한 Prometheus 지표**


| 지표 이름 | 측정기준 | 
| --- | --- | 
|  `envoy_http_downstream_rq_total` |  ClusterName, `Namespace`   | 
|  `envoy_http_downstream_rq_xx` |  ClusterName, `Namespace`  ClusterName, `Namespace`, envoy\$1http\$1conn\$1manager\$1prefix, envoy\$1response\$1code\$1class  | 
|  `envoy_cluster_upstream_cx_rx_bytes_total` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_cx_tx_bytes_total` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_membership_healthy` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_membership_total` |  ClusterName, `Namespace`   | 
|  `envoy_server_memory_heap_size` |  ClusterName, `Namespace`   | 
|  `envoy_server_memory_allocated` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_cx_connect_timeout` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_rq_pending_failure_eject` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_rq_pending_overflow` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_rq_timeout` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_rq_try_per_timeout` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_rq_rx_reset` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_cx_destroy_local_with_active_rq` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_cx_destroy_remote_active_rq` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_rq_maintenance_mode` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_flow_control_paused_reading_total` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_flow_control_resumed_reading_total` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_flow_control_backed_up_total` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_flow_control_drained_total` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_rq_retry` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_rq_retry_success` |  ClusterName, `Namespace`   | 
|  `envoy_cluster_upstream_rq_retry_overflow` |  ClusterName, `Namespace`   | 
|  `envoy_server_live` |  ClusterName, `Namespace`   | 
|  `envoy_server_uptime` |  ClusterName, `Namespace`   | 

**Amazon ECS 클러스터의 App Mesh에 대한 Prometheus 지표**


| 지표 이름 | 측정기준 | 
| --- | --- | 
|  `envoy_http_downstream_rq_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_http_downstream_rq_xx` |  ClusterName, `TaskDefinitionFamily`  | 
|  `envoy_cluster_upstream_cx_rx_bytes_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_cx_tx_bytes_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_membership_healthy` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_membership_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_server_memory_heap_size` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_server_memory_allocated` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_cx_connect_timeout` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_rq_pending_failure_eject` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_rq_pending_overflow` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_rq_timeout` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_rq_try_per_timeout` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_rq_rx_reset` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_cx_destroy_local_with_active_rq` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_cx_destroy_remote_active_rq` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_rq_maintenance_mode` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_flow_control_paused_reading_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_flow_control_resumed_reading_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_flow_control_backed_up_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_flow_control_drained_total` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_rq_retry` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_rq_retry_success` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_cluster_upstream_rq_retry_overflow` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_server_live` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_server_uptime` |  ClusterName, `TaskDefinitionFamily`   | 
|  `envoy_http_downstream_rq_xx` |  ClusterName, TaskDefinitionFamily, envoy\$1http\$1conn\$1manager\$1prefix, envoy\$1response\$1code\$1class ClusterName, TaskDefinitionFamily, envoy\$1response\$1code\$1class | 

**참고**  
`TaskDefinitionFamily`는 Mesh의 Kubernetes 네임스페이스입니다.  
`envoy_http_conn_manager_prefix`의 값은 `ingress`, `egress` 또는 `admin`일 수 있습니다.  
`envoy_response_code_class`의 값은 `1`(`1xx`를 나타냄), `2`(`2xx`를 나타냄), `3`(`3xx`를 나타냄), `4`(`4xx`를 나타냄) 또는 `5`(`5xx`를 나타냄)일 수 있습니다.

## NGINX의 Prometheus 지표
<a name="ContainerInsights-Prometheus-metrics-nginx"></a>

다음 지표는 Amazon EKS 및 Kubernetes 클러스터의 NGINX에서 자동으로 수집됩니다.


| 지표 이름 | 측정기준 | 
| --- | --- | 
|  `nginx_ingress_controller_nginx_process_cpu_seconds_total` |  ClusterName, `Namespace`, 서비스  | 
|  `nginx_ingress_controller_success` |  ClusterName, `Namespace`, 서비스  | 
|  `nginx_ingress_controller_requests` |  ClusterName, `Namespace`, 서비스  | 
|  `nginx_ingress_controller_nginx_process_connections` |  ClusterName, `Namespace`, 서비스  | 
|  `nginx_ingress_controller_nginx_process_connections_total` |  ClusterName, `Namespace`, 서비스  | 
|  `nginx_ingress_controller_nginx_process_resident_memory_bytes` |  ClusterName, `Namespace`, 서비스  | 
|  `nginx_ingress_controller_config_last_reload_successful` |  ClusterName, `Namespace`, 서비스  | 
|  `nginx_ingress_controller_requests` |  ClusterName, `Namespace`, 서비스, 상태  | 

## Memcached의 Prometheus 지표
<a name="ContainerInsights-Prometheus-metrics-memcached"></a>

다음 지표는 Amazon EKS 및 Kubernetes 클러스터의 Memcached에서 자동으로 수집됩니다.


| 지표 이름 | 측정기준 | 
| --- | --- | 
|  `memcached_current_items` |  ClusterName, `Namespace`, 서비스  | 
|  `memcached_current_connections` |  ClusterName, `Namespace`, 서비스  | 
|  `memcached_limit_bytes` |  ClusterName, `Namespace`, 서비스  | 
|  `memcached_current_bytes` |  ClusterName, `Namespace`, 서비스  | 
|  `memcached_written_bytes_total` |  ClusterName, `Namespace`, 서비스  | 
|  `memcached_read_bytes_total` |  ClusterName, `Namespace`, 서비스  | 
|  `memcached_items_evicted_total` |  ClusterName, `Namespace`, 서비스  | 
|  `memcached_items_reclaimed_total` |  ClusterName, `Namespace`, 서비스  | 
|  `memcached_commands_total` |  ClusterName, `Namespace`, 서비스 ClusterName, `Namespace`, 서비스, 명령 ClusterName, `Namespace`, 서비스, 상태, 명령  | 

## Java/JMX의 Prometheus 지표
<a name="ContainerInsights-Prometheus-metrics-jmx"></a>

**Amazon EKS 및 Kubernetes 클러스터에서 수집된 지표**

Amazon EKS 및 Kubernetes 클러스터에서 Container Insights는 JMX Exporter를 사용하여 Java 가상 머신(JVM), Java 및 Tomcat(Catalina)에서 다음과 같은 미리 정의된 Prometheus 지표를 수집할 수 있습니다. 자세한 내용은 Github의 [prometheus/jmx\$1exporter](https://github.com/prometheus/jmx_exporter)를 참조하세요.

**Amazon EKS 및 Kubernetes 클러스터의 Java/JMX**


| 지표 이름 | 측정기준 | 
| --- | --- | 
|  `jvm_classes_loaded` |  `ClusterName`, `Namespace`  | 
|  `jvm_threads_current` |  `ClusterName`, `Namespace`  | 
|  `jvm_threads_daemon` |  `ClusterName`, `Namespace`  | 
|  `java_lang_operatingsystem_totalswapspacesize` |  `ClusterName`, `Namespace`  | 
|  `java_lang_operatingsystem_systemcpuload` |  `ClusterName`, `Namespace`  | 
|  `java_lang_operatingsystem_processcpuload` |  `ClusterName`, `Namespace`  | 
|  `java_lang_operatingsystem_freeswapspacesize` |  `ClusterName`, `Namespace`  | 
|  `java_lang_operatingsystem_totalphysicalmemorysize` |  `ClusterName`, `Namespace`  | 
|  `java_lang_operatingsystem_freephysicalmemorysize` |  `ClusterName`, `Namespace`  | 
|  `java_lang_operatingsystem_openfiledescriptorcount` |  `ClusterName`, `Namespace`  | 
|  `java_lang_operatingsystem_availableprocessors` |  `ClusterName`, `Namespace`  | 
|  `jvm_memory_bytes_used` |  `ClusterName`, `Namespace`, 영역  | 
|  `jvm_memory_pool_bytes_used` |  `ClusterName`, `Namespace`, 풀  | 

**참고**  
`area` 측정기준 값은 `heap` 또는 `nonheap`일 수 있습니다.  
`pool` 측정기준 값은 `Tenured Gen`, `Compress Class Space`, `Survivor Space`, `Eden Space`, `Code Cache` 또는 `Metaspace`일 수 있습니다.

**Amazon EKS 및 Kubernetes 클러스터의 Tomcat/JMX**

이전 테이블의 Java/JMX 지표 외에도 Tomcat 워크로드에 대해 다음 지표가 수집됩니다.


| 지표 이름 | 측정기준 | 
| --- | --- | 
|  `catalina_manager_activesessions` |  `ClusterName`, `Namespace`  | 
|  `catalina_manager_rejectedsessions` |  `ClusterName`, `Namespace`  | 
|  `catalina_globalrequestprocessor_bytesreceived` |  `ClusterName`, `Namespace`  | 
|  `catalina_globalrequestprocessor_bytessent` |  `ClusterName`, `Namespace`  | 
|  `catalina_globalrequestprocessor_requestcount` |  `ClusterName`, `Namespace`  | 
|  `catalina_globalrequestprocessor_errorcount` |  `ClusterName`, `Namespace`  | 
|  `catalina_globalrequestprocessor_processingtime` |  `ClusterName`, `Namespace`  | 

**Amazon ECS 클러스터의 Java/JMX**


| 지표 이름 | 측정기준 | 
| --- | --- | 
|  `jvm_classes_loaded` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `jvm_threads_current` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `jvm_threads_daemon` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `java_lang_operatingsystem_totalswapspacesize` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `java_lang_operatingsystem_systemcpuload` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `java_lang_operatingsystem_processcpuload` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `java_lang_operatingsystem_freeswapspacesize` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `java_lang_operatingsystem_totalphysicalmemorysize` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `java_lang_operatingsystem_freephysicalmemorysize` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `java_lang_operatingsystem_openfiledescriptorcount` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `java_lang_operatingsystem_availableprocessors` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `jvm_memory_bytes_used` |  `ClusterName`, TaskDefinitionFamily, 구역  | 
|  `jvm_memory_pool_bytes_used` |  `ClusterName`, TaskDefinitionFamily, 풀  | 

**참고**  
`area` 측정기준 값은 `heap` 또는 `nonheap`일 수 있습니다.  
`pool` 측정기준 값은 `Tenured Gen`, `Compress Class Space`, `Survivor Space`, `Eden Space`, `Code Cache` 또는 `Metaspace`일 수 있습니다.

**Amazon ECS 클러스터의 Tomcat/JMX**

이전 표의 Java/JMX 지표 외에도 Amazon ECS 클러스터의 Tomcat 워크로드에 대해 다음 지표도 수집됩니다.


| 지표 이름 | 측정기준 | 
| --- | --- | 
|  `catalina_manager_activesessions` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `catalina_manager_rejectedsessions` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `catalina_globalrequestprocessor_bytesreceived` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `catalina_globalrequestprocessor_bytessent` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `catalina_globalrequestprocessor_requestcount` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `catalina_globalrequestprocessor_errorcount` |  `ClusterName`, `TaskDefinitionFamily`  | 
|  `catalina_globalrequestprocessor_processingtime` |  `ClusterName`, `TaskDefinitionFamily`  | 

## HAProxy의 Prometheus 지표
<a name="ContainerInsights-Prometheus-metrics-haproxy"></a>

다음 지표는 Amazon EKS 및 Kubernetes 클러스터의 HAProxy에서 자동으로 수집됩니다.

수집된 지표는 사용 중인 HAProxy Ingress 버전에 따라 다릅니다. HAProxy Ingress 및 해당 버전에 대한 자세한 내용은 [haproxy-ingress](https://artifacthub.io/packages/helm/haproxy-ingress/haproxy-ingress)를 참조하세요.


| 지표 이름 | 측정기준 | 가용성 | 
| --- | --- | --- | 
|  `haproxy_backend_bytes_in_total` |  `ClusterName`, `Namespace`, 서비스  | 모든 HAProxy Ingress 버전 | 
|  `haproxy_backend_bytes_out_total` |  `ClusterName`, `Namespace`, 서비스  | 모든 HAProxy Ingress 버전 | 
|  `haproxy_backend_connection_errors_total` |  `ClusterName`, `Namespace`, 서비스  | 모든 HAProxy Ingress 버전 | 
|  `haproxy_backend_connections_total` |  `ClusterName`, `Namespace`, 서비스  | 모든 HAProxy Ingress 버전 | 
|  `haproxy_backend_current_sessions` |  `ClusterName`, `Namespace`, 서비스  | 모든 HAProxy Ingress 버전 | 
|  `haproxy_backend_http_responses_total` |  `ClusterName`, `Namespace`, 서비스, 코드, 백엔드  | 모든 HAProxy Ingress 버전 | 
|  `haproxy_backend_status` |  `ClusterName`, `Namespace`, 서비스  |  HAProxy Ingress 버전 0.10 이상에서만  | 
|  `haproxy_backend_up` |  `ClusterName`, `Namespace`, 서비스  |  HAProxy Ingress 버전 0.10 미만에서만  | 
|  `haproxy_frontend_bytes_in_total` |  `ClusterName`, `Namespace`, 서비스  | 모든 HAProxy Ingress 버전 | 
|  `haproxy_frontend_bytes_out_total` |  `ClusterName`, `Namespace`, 서비스  | 모든 HAProxy Ingress 버전 | 
|  `haproxy_frontend_connections_total` |  `ClusterName`, `Namespace`, 서비스  | 모든 HAProxy Ingress 버전 | 
|  `haproxy_frontend_current_sessions` |  `ClusterName`, `Namespace`, 서비스  | 모든 HAProxy Ingress 버전 | 
|  `haproxy_frontend_http_requests_total` |  `ClusterName`, `Namespace`, 서비스  | 모든 HAProxy Ingress 버전 | 
|  `haproxy_frontend_http_responses_total` |  `ClusterName`, `Namespace`, 서비스, 코드, 프런트엔드  | 모든 HAProxy Ingress 버전 | 
|  `haproxy_frontend_request_errors_total` |  `ClusterName`, `Namespace`, 서비스  | 모든 HAProxy Ingress 버전 | 
|  `haproxy_frontend_requests_denied_total` |  `ClusterName`, `Namespace`, 서비스  | 모든 HAProxy Ingress 버전 | 

**참고**  
`code` 측정기준 값은 `1xx`, `2xx`, `3xx`, `4xx`, `5xx` 또는 `other`일 수 있습니다.  
`backend` 측정기준의 값은 다음일 수 있습니다.  
HAProxy Ingress 버전 0.0.27 이하의 경우 `http-default-backend`, `http-shared-backend` 또는 `httpsback-shared-backend`
0.0.27보다 뒤에 출시된 HAProxy Ingress 버전의 경우 `_default_backend`
`frontend` 측정기준의 값은 다음일 수 있습니다.  
HAProxy Ingress 버전 0.0.27 이하의 경우 `httpfront-default-backend`, `httpfront-shared-frontend` 또는 `httpfronts`
0.0.27보다 뒤에 출시된 HAProxy Ingress 버전의 경우 `_front_http` 또는 `_front_https`

# Prometheus 지표 보기
<a name="ContainerInsights-Prometheus-viewmetrics"></a>

App Mesh, NGINX, Java/JMX, Memcached, HAProxy의 큐레이팅되고 사전 집계된 지표 및 사용자가 추가했을 수 있는 수동으로 구성된 기타 Prometheus Exporter를 포함하여 모든 Prometheus 지표를 모니터링하고 경보를 보낼 수 있습니다. 다른 Prometheus 익스포터에서 지표 수집에 대한 자세한 내용은 [새로운 Prometheus 스크레이프 대상을 추가하기 위한 튜토리얼: Prometheus API 서버 지표](ContainerInsights-Prometheus-Setup-configure.md#ContainerInsights-Prometheus-Setup-new-exporters) 단원을 참조하세요.

CloudWatch 콘솔에서 Container Insights는 다음과 같은 사전 구축된 보고서를 제공합니다.
+ Amazon EKS 및 Kubernetes 클러스터의 경우 App Mesh, NGINX, HAPROXY, Memcached, Java/JMX에 대해 사전 구축된 보고서가 있습니다.
+ Amazon ECS 클러스터의 경우 App Mesh 및 Java/JMX에 대해 사전 구축된 보고서가 있습니다.

또한 Container Insights는 Container Insights가 큐레이팅된 지표를 수집하는 각 워크로드에 대한 사용자 지정 대시보드를 제공합니다. GitHub에서 이러한 대시보드를 다운로드할 수 있습니다.

**모든 Prometheus 지표를 보려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **지표**를 선택합니다.

1. 네임스페이스 목록에서 [**ContainerInsights/Prometheus**] 또는 [**ECS/ContainerInsights/Prometheus**]를 선택합니다.

1. 다음 목록에서 측정기준 세트 중 하나를 선택합니다. 그런 다음, 보려는 지표 옆의 확인란을 선택합니다.

**Prometheus 지표에 대한 사전 작성된 보고서를 보려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **성능 모니터링**을 선택합니다.

1. 페이지 상단 근처의 드롭다운 상자에서 Prometheus 옵션을 선택합니다.

   다른 드롭다운 상자에서 보려는 클러스터를 선택합니다.

NGINX, App Mesh, Memcached, HAProxy, Java/JMX에 대한 사용자 지정 대시보드도 제공합니다.

**Amazon에서 제공한 사용자 지정 대시보드를 사용하려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **대시보드**를 선택합니다.

1. **대시보드 생성**을 선택합니다. 새 대시보드의 이름을 입력하고 **대시보드 생성**을 선택합니다.

1. **이 대시보드에 추가**에서 **취소**를 선택합니다.

1. **작업**, **소스 보기/편집**을 선택합니다.

1. 다음 JSON 파일 중 하나를 다운로드합니다.
   + [ Github의 NGINX 사용자 지정 대시보드 소스](https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/nginx-ingress/cw_dashboard_nginx_ingress_controller.json).
   + [Github의 App Mesh 사용자 지정 대시보드 소스](https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/appmesh/cw_dashboard_awsappmesh.json)
   + [ Github의 Memcached 사용자 지정 대시보드 소스](https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/memcached/cw_dashboard_memcached.json)
   + [ Github의 HAProxy-Ingress 사용자 지정 대시보드 소스](https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/haproxy-ingress/cw_dashboard_haproxy_ingress.json)
   + [Github의 Java/JMX 사용자 지정 대시보드 소스](https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/javajmx/cw_dashboard_javajmx.json).

1. 텍스트 편집기로 다운로드한 JSON 파일을 열고, 다음과 같이 변경합니다.
   + 모든 `{{YOUR_CLUSTER_NAME}}` 문자열을 정확한 클러스터 이름으로 바꿉니다. 텍스트 앞이나 뒤에 공백을 추가하지 않도록 하세요.
   + 모든 `{{YOUR_REGION}}` 문자열을 클러스터가 실행되고 있는 AWS 리전으로 바꿉니다. 예를 들어 **us-west-1**으로 바꿉니다. 텍스트 앞뒤에 공백을 추가해서는 안 됩니다.
   + 모든 `{{YOUR_NAMESPACE}}` 문자열을 워크로드의 정확한 네임스페이스로 바꿉니다.
   + 모든 `{{YOUR_SERVICE_NAME}}` 문자열을 워크로드의 정확한 서비스 이름으로 바꿉니다. 예: **haproxy-haproxy-ingress-controller-metrics**

1. JSON blob 전체를 복사하여 CloudWatch 콘솔의 텍스트 상자에 붙여넣어 이미 상자에 있는 내용을 바꿉니다.

1. **업데이트**, **대시보드 저장**을 선택합니다.

# Prometheus 지표 문제 해결
<a name="ContainerInsights-Prometheus-troubleshooting"></a>

이 단원에서는 Prometheus 지표 설정 문제를 해결하기 위한 도움말을 제공합니다.

**Topics**
+ [Amazon ECS의 Prometheus 지표 문제 해결](ContainerInsights-Prometheus-troubleshooting-ECS.md)
+ [Amazon EKS 및 Kubernetes 클러스터의 Prometheus 지표 문제 해결](ContainerInsights-Prometheus-troubleshooting-EKS.md)

# Amazon ECS의 Prometheus 지표 문제 해결
<a name="ContainerInsights-Prometheus-troubleshooting-ECS"></a>

이 단원에서는 Amazon ECS 클러스터에서 Prometheus 지표 설정 문제를 해결하기 위한 도움말을 제공합니다.

## CloudWatch Logs에 전송된 Prometheus 지표가 표시되지 않음
<a name="ContainerInsights-Prometheus-troubleshooting-ECS-nometrics"></a>

Prometheus 지표는 로그 그룹 **/aws/ecs/containerinsights/cluster-name/Prometheus**의 로그 이벤트로 수집됩니다. 로그 그룹이 생성되지 않았거나 Prometheus 지표가 로그 그룹에 전송되지 않은 경우 먼저, CloudWatch 에이전트가 Prometheus 대상을 성공적으로 검색했는지 여부를 확인해야 합니다. 그런 다음, CloudWatch 에이전트의 보안 그룹 및 권한 설정을 확인합니다. 다음 단계에서는 디버깅 수행을 안내합니다.

**1단계: CloudWatch 에이전트 디버깅 모드 사용 설정**

먼저 CloudFormation 템플릿 파일 `cwagent-ecs-prometheus-metric-for-bridge-host.yaml` 또는 `cwagent-ecs-prometheus-metric-for-awsvpc.yaml`에 다음과 같이 굵게 표시된 줄을 추가하여 CloudWatch 에이전트를 디버그 모드로 변경합니다. 그런 다음 파일을 저장합니다.

```
cwagentconfig.json: |
    {
      "agent": {
        "debug": true
      },
      "logs": {
        "metrics_collected": {
```

기존 스택에 대해 새 CloudFormation 변경 세트를 생성합니다. 변경 세트의 다른 파라미터를 기존 CloudFormation 스택과 동일한 값으로 설정합니다. 다음은 EC2 시작 유형 및 브리지 네트워크 모드를 사용하는 Amazon ECS 클러스터에 설치된 CloudWatch 에이전트를 위한 예입니다.

```
ECS_NETWORK_MODE=bridge
 CREATE_IAM_ROLES=True
ECS_TASK_ROLE_NAME=your_selected_ecs_task_role_name
ECS_EXECUTION_ROLE_NAME=your_selected_ecs_execution_role_name
NEW_CHANGESET_NAME=your_selected_ecs_execution_role_name

aws cloudformation create-change-set --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
    --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                 ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                 ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                 ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                 ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
    --capabilities CAPABILITY_NAMED_IAM \
    --region $AWS_REGION \
    --change-set-name $NEW_CHANGESET_NAME
```

CloudFormation 콘솔로 이동하여 새 변경 세트인 `$NEW_CHANGESET_NAME`을 검토합니다. **CWAgentConfigSSMParameter** 리소스에 적용된 변경 사항 하나가 있어야 합니다. 변경 세트를 실행하고 다음 명령을 입력하여 CloudWatch 에이전트 태스크를 다시 시작합니다.

```
aws ecs update-service --cluster $ECS_CLUSTER_NAME \
--desired-count 0 \
--service your_service_name_here \
--region $AWS_REGION
```

10초 정도 기다린 후 다음 명령을 입력합니다.

```
aws ecs update-service --cluster $ECS_CLUSTER_NAME \
--desired-count 1 \
--service your_service_name_here \
--region $AWS_REGION
```

**2단계: ECS 서비스 검색 로그 확인**

CloudWatch 에이전트의 ECS 태스크 정의는 아래 섹션에서 기본적으로 로그를 사용 설정합니다. 로그는 CloudWatch Logs의 로그 그룹 **/ecs/ecs-cwagent-prometheus**에 전송됩니다.

```
LogConfiguration:
  LogDriver: awslogs
    Options:
      awslogs-create-group: 'True'
      awslogs-group: "/ecs/ecs-cwagent-prometheus"
      awslogs-region: !Ref AWS::Region
      awslogs-stream-prefix: !Sub 'ecs-${ECSLaunchType}-awsvpc'
```

다음 예와 같이 `ECS_SD_Stats` 문자열로 로그를 필터링하여 ECS 서비스 검색과 관련된 지표를 가져옵니다.

```
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeContainerInstances: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeInstancesRequest: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeTaskDefinition: 2
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeTasks: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_ListTasks: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: Exporter_DiscoveredTargetCount: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Get_EC2MetaData: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Get_TaskDefinition: 2
2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Size_ContainerInstance: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Size_TaskDefinition: 2
2020-09-1T01:53:14Z D! ECS_SD_Stats: Latency: 43.399783ms
```

특정 ECS 서비스 검색 주기에 대한 각 지표의 의미는 다음과 같습니다.
+ **AWSCLI\$1DescribeContainerInstances** – 수행된 `ECS::DescribeContainerInstances` API 호출의 수입니다.
+ **AWSCLI\$1DescribeInstancesRequest** – 수행된 `ECS::DescribeInstancesRequest` API 호출의 수입니다.
+ **AWSCLI\$1DescribeTaskDefinition** – 수행된 `ECS::DescribeTaskDefinition` API 호출의 수입니다.
+ **AWSCLI\$1DescribeTasks** – 수행된 `ECS::DescribeTasks` API 호출의 수입니다.
+ **AWSCLI\$1ListTasks** - 수행된 `ECS::ListTasks` API 호출의 수입니다.
+ **ExporterDiscoveredTargetCount** – 검색되어 컨테이너 내의 대상 결과 파일로 내보낸 Prometheus 대상의 수입니다.
+ **LRUCache\$1Get\$1EC2MetaData** – 컨테이너 인스턴스 메타데이터가 캐시에서 검색된 횟수입니다.
+ **LRUCache\$1Get\$1TaskDefinition** – ECS 태스크 정의 메타데이터가 캐시에서 검색된 횟수입니다.
+ **LRUCache\$1Size\$1ContainerInstance** – 메모리에 캐시된 고유 컨테이너 인스턴스의 메타데이터 수입니다.
+ **LRUCache\$1Size\$1TaskDefinition** – 메모리에 캐시된 고유 ECS 태스크 정의의 수입니다.
+ **Latency** – 서비스 검색 주기에 걸리는 시간입니다.

`ExporterDiscoveredTargetCount` 값을 확인하여 검색된 Prometheus 대상이 예상과 일치하는지 확인하세요. 그렇지 않은 경우 가능한 이유는 다음과 같습니다.
+ ECS 서비스 검색의 구성이 애플리케이션의 설정과 일치하지 않을 수 있습니다. Docker 레이블 기반 서비스 검색의 경우 대상 컨테이너에서 자동 검색에 필요한 Docker 레이블이 CloudWatch 에이전트에 구성되어 있지 않을 수 있습니다. ECS 태스크 정의 ARN 정규 표현식 기반 서비스 검색의 경우 CloudWatch 에이전트의 regex 설정이 애플리케이션의 태스크 정의와 일치하지 않을 수 있습니다.
+ CloudWatch 에이전트의 ECS 태스크 역할에 ECS 태스크의 메타데이터를 검색할 권한이 없을 수 있습니다. CloudWatch 에이전트에 다음과 같은 읽기 전용 권한이 부여되어 있는지 확인합니다.
  + `ec2:DescribeInstances`
  + `ecs:ListTasks`
  + `ecs:DescribeContainerInstances`
  + `ecs:DescribeTasks`
  + `ecs:DescribeTaskDefinition`

**3단계: 네트워크 연결 및 ECS 태스크 역할 정책 확인**

`Exporter_DiscoveredTargetCount` 값이 검색된 Prometheus 대상이 있음을 나타내는데도 여전히 대상 CloudWatch Logs 로그 그룹에 전송된 로그 이벤트가 없다면 이는 다음 중 하나로 인해 발생했을 수 있습니다.
+ CloudWatch 에이전트가 Prometheus 대상 포트에 연결하지 못할 수 있습니다. CloudWatch 에이전트 뒤에 있는 보안 그룹 설정을 확인합니다. 프라이빗 IP는 CloudWatch 에이전트가 Prometheus Exporter 포트에 연결할 수 있도록 허용해야 합니다.
+ CloudWatch 에이전트의 ECS 태스크 역할에 **CloudWatchAgentServerPolicy** 관리형 정책이 없을 수 있습니다. Prometheus 지표를 로그 이벤트로 전송할 수 있으려면 CloudWatch 에이전트의 ECS 태스크 역할에 이 정책이 있어야 합니다. 샘플 CloudFormation 템플릿을 사용하여 IAM 역할을 자동으로 생성했다면 ECS 태스크 역할과 ECS 실행 역할에 모두 Prometheus 모니터링을 수행할 수 있는 최소 권한이 부여됩니다.

# Amazon EKS 및 Kubernetes 클러스터의 Prometheus 지표 문제 해결
<a name="ContainerInsights-Prometheus-troubleshooting-EKS"></a>

이 단원에서는 Amazon EKS 및 Kubernetes 클러스터에서 Prometheus 지표 설정 문제를 해결하기 위한 도움말을 제공합니다.

## Amazon EKS의 일반적인 문제 해결 단계
<a name="ContainerInsights-Prometheus-troubleshooting-general"></a>

CloudWatch 에이전트가 실행 중인지 확인하려면 다음 명령을 입력합니다.

```
kubectl get pod -n amazon-cloudwatch
```

출력에는 `NAME` 열에 `cwagent-prometheus-id`가 있고 `STATUS column.`에 `Running`이 있는 행이 포함되어 있습니다.

실행 중인 포드에 대한 세부 정보를 표시하려면 다음 명령을 입력합니다. *pod-name*을 `cw-agent-prometheus`로 시작하는 이름이 있는 포드의 전체 이름으로 바꿉니다.

```
kubectl describe pod pod-name -n amazon-cloudwatch
```

CloudWatch Container Insights를 설치한 경우 CloudWatch Logs Insights를 사용하여 Prometheus 지표를 수집하는 CloudWatch 에이전트에서 로그를 쿼리할 수 있습니다.

**애플리케이션 로그를 쿼리하려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 [**CloudWatch Logs Insights**]를 선택합니다.

1. 애플리케이션 로그의 로그 그룹 **/aws/containerinsights/*cluster-name*/application**을 선택합니다.

1. 검색 쿼리 표현식을 다음 쿼리로 바꾸고 **쿼리 실행**을 선택합니다.

   ```
   fields ispresent(kubernetes.pod_name) as haskubernetes_pod_name, stream, kubernetes.pod_name, log | 
   filter haskubernetes_pod_name and kubernetes.pod_name like /cwagent-prometheus
   ```

Prometheus 지표 및 메타데이터가 CloudWatch Logs 이벤트로 수집되고 있는지 확인할 수도 있습니다.

**Prometheus 데이터가 수집되는지 확인하려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 [**CloudWatch Logs Insights**]를 선택합니다.

1. **/aws/containerinsights/*cluster-name*/prometheus**를 선택합니다.

1. 검색 쿼리 표현식을 다음 쿼리로 바꾸고 **쿼리 실행**을 선택합니다.

   ```
   fields @timestamp, @message | sort @timestamp desc | limit 20
   ```

## 삭제된 Prometheus 지표 로깅
<a name="ContainerInsights-Prometheus-troubleshooting-droppedmetrics"></a>

이 릴리스는 히스토그램 유형의 Prometheus 지표를 수집하지 않습니다. CloudWatch 에이전트를 사용하면 Prometheus 지표가 히스토그램 지표라서 삭제되고 있는지 여부를 확인할 수 있습니다. Prometheus 지표가 히스토그램 지표이므로 삭제되고 CloudWatch에 전송되지 않은 처음 500개의 Prometheus 지표 목록을 로그할 수도 있습니다.

지표가 삭제되는지 확인하려면 다음 명령을 입력합니다.

```
kubectl logs -l "app=cwagent-prometheus" -n amazon-cloudwatch --tail=-1
```

지표가 삭제되는 경우 `/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log` 파일에 다음 줄이 표시됩니다.

```
I! Drop Prometheus metrics with unsupported types. Only Gauge, Counter and Summary are supported.
I! Please enable CWAgent debug mode to view the first 500 dropped metrics
```

이러한 줄이 표시되는 경우 삭제되는 지표가 무엇인지 알고 싶다면 다음 단계를 사용하세요.

**삭제된 Prometheus 지표 목록을 로깅하려면**

1. `prometheus-eks.yaml` 또는 `prometheus-k8s.yaml` 파일에 다음과 같이 굵게 표시된 줄을 추가하여 CloudWatch 에이전트를 디버그 모드로 변경하고 파일을 저장합니다.

   ```
   {
         "agent": {
           "debug": true
         },
   ```

   파일의 이 섹션은 다음과 같아야 합니다.

   ```
   cwagentconfig.json: |
       {
         "agent": {
           "debug": true
         },
         "logs": {
           "metrics_collected": {
   ```

1. 다음 명령을 입력함으로써 CloudWatch 에이전트를 다시 설치하여 디버그 모드를 사용합니다.

   ```
   kubectl delete deployment cwagent-prometheus -n amazon-cloudwatch
   kubectl apply -f prometheus.yaml
   ```

   삭제된 지표는 CloudWatch 에이전트 포드에 로그됩니다.

1. CloudWatch 에이전트 포드에서 로그를 검색하려면 다음 명령을 입력합니다.

   ```
   kubectl logs -l "app=cwagent-prometheus" -n amazon-cloudwatch --tail=-1
   ```

   또는 Container Insights Fluentd 로깅을 설치한 경우 로그는 CloudWatch Logs 로그 그룹 **/aws/containerinsights/*cluster\$1name*/application**에도 저장됩니다.

   이러한 로그를 쿼리하려면 [Amazon EKS의 일반적인 문제 해결 단계](#ContainerInsights-Prometheus-troubleshooting-general)에서 애플리케이션 로그를 쿼리하는 단계를 수행 할 수 있습니다.

## CloudWatch Logs 로그 이벤트로 수집된 Prometheus 지표는 어디에 있습니까?
<a name="ContainerInsights-Prometheus-troubleshooting-metrics_ingested"></a>

CloudWatch 에이전트는 각 Prometheus 스크레이프 작업 구성에 대한 로그 스트림을 생성합니다. 예를 들어 `prometheus-eks.yaml` 및 `prometheus-k8s.yaml` 파일에서 `job_name: 'kubernetes-pod-appmesh-envoy'` 줄은 App Mesh 지표를 스크레이프합니다. Prometheus 대상은 `kubernetes-pod-appmesh-envoy`로 정의됩니다. 따라서 모든 App Mesh Prometheus 지표는 **/aws/containerinsights/cluster-name/Prometheus**라는 로그 그룹 아래의 로그 스트림 **kubernetes-pod-appmesh-envoy**에 CloudWatch Logs 이벤트로 수집됩니다.

## CloudWatch 지표에 Amazon EKS 또는 Kubernetes Prometheus 지표가 표시되지 않음
<a name="ContainerInsights-Prometheus-troubleshooting-no-metrics"></a>

먼저 Prometheus 지표가 로그 그룹 **/aws/containerinsights/cluster-name/Prometheus**의 로그 이벤트로 수집되는지 확인합니다. [CloudWatch Logs 로그 이벤트로 수집된 Prometheus 지표는 어디에 있습니까?](#ContainerInsights-Prometheus-troubleshooting-metrics_ingested)의 정보를 사용하여 대상 로그 스트림을 확인할 수 있습니다. 로그 스트림이 생성되지 않았거나 로그 스트림에 새 로그 이벤트가 없는 경우 다음을 확인하세요.
+ Prometheus 지표 익스포터 엔드포인트가 올바르게 설정되었는지 확인합니다.
+ CloudWatch 에이전트 YAML 파일의 `config map: cwagent-prometheus` 섹션에서 Prometheus 스크레이핑 구성이 올바른지 확인합니다. 구성은 Prometheus 구성 파일에 있는 구성과 동일해야 합니다. 자세한 내용은 Prometheus 설명서의 [<scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config)를 참조하세요.

Prometheus 지표가 로그 이벤트로 올바르게 수집되는 경우, 포함된 지표 형식 설정이 로그 이벤트에 추가되어 CloudWatch 지표를 생성하는지 확인합니다.

```
"CloudWatchMetrics":[
   {
      "Metrics":[
         {
            "Name":"envoy_http_downstream_cx_destroy_remote_active_rq"
         }
      ],
      "Dimensions":[
         [
            "ClusterName",
            "Namespace"
         ]
      ],
      "Namespace":"ContainerInsights/Prometheus"
   }
],
```

포함된 지표 형식에 대한 자세한 내용은 [사양: 임베디드 지표 형식](CloudWatch_Embedded_Metric_Format_Specification.md) 단원을 참조하세요.

로그 이벤트에 임베디드 지표 형식이 없는 경우 CloudWatch 에이전트 설치 YAML 파일의 `config map: prometheus-cwagentconfig` 섹션에서 `metric_declaration` 섹션이 올바르게 구성되었는지 확인합니다. 자세한 내용은 [새로운 Prometheus 스크레이프 대상을 추가하기 위한 튜토리얼: Prometheus API 서버 지표](ContainerInsights-Prometheus-Setup-configure.md#ContainerInsights-Prometheus-Setup-new-exporters) 섹션을 참조하세요.

# Application Insights와 통합
<a name="container-insights-appinsights"></a>

Amazon CloudWatch Application Insights는 애플리케이션 리소스와 기술 스택 전반에 걸쳐 애플리케이션을 모니터링하고 주요 지표, 로그, 경보를 식별 및 설정하는 데 도움이 됩니다. 자세한 내용은 [CloudWatch Application Insights로 일반적인 애플리케이션 문제 감지](cloudwatch-application-insights.md) 섹션을 참조하세요.

Application Insights를 활성화하여 컨테이너화 애플리케이션 및 마이크로서비스에서 추가 데이터를 수집할 수 있습니다. 아직 Application Insights를 활성화하지 않은 경우 Container Insights 대시보드의 성능 보기 아래에 있는 **Application Insights 자동 구성(Auto-configure Application Insights)**을 선택해 활성화할 수 있습니다.

컨테이너화된 애플리케이션을 모니터링하도록 CloudWatch Application Insights를 이미 설정한 경우 Application Insights 대시보드가 Container Insights 대시보드 아래에 표시됩니다.

Application Insights 및 컨테이너화 애플리케이션에 대한 자세한 내용은 [Amazon ECS 및 Amazon EKS 리소스 모니터링을 위한 Application Insights 활성화](appinsights-setting-up-console.md#appinsights-container-insights) 섹션을 참조하세요.

# Container Insights 내에서 Amazon ECS 수명 주기 이벤트 보기
<a name="container-insights-ECS-lifecycle-events"></a>

Container Insights 콘솔 내에서 Amazon ECS 수명 주기 이벤트를 볼 수 있습니다. 이렇게 하면 단일 보기에서 컨테이너 지표, 로그 및 이벤트의 상관 관계를 지정하여 보다 완전한 운영 가시성을 확보할 수 있습니다.

이벤트에는 컨테이너 인스턴스 상태 변경 이벤트, 태스크 상태 변경 이벤트 및 서비스 작업 이벤트가 포함됩니다. 이러한 이벤트는 Amazon ECS에서 Amazon EventBridge로 자동 전송되며 이벤트 로그 형식으로 CloudWatch에서도 수집됩니다. 이러한 이벤트에 대한 자세한 내용을 알아보려면 [Amazon ECS 이벤트](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_cwe_events.html)를 참조하세요.

표준 Container Insights 요금은 Amazon ECS 수명 주기 이벤트에 적용됩니다. 자세한 내용은 [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/)을 참조하세요.

수명 주기 이벤트의 테이블을 구성하고 클러스터에 대한 규칙을 생성하려면 `events:PutRule`, `events:PutTargets` 및 `logs:CreateLogGroup` 권한이 있어야 합니다. 또한 EventBridge가 로그 스트림을 생성하고 로그를 CloudWatch Logs로 전송하도록 지원하는 리소스 정책이 있는지도 확인해야 합니다. 이 리소스 정책이 없는 경우 다음 명령을 입력하여 생성할 수 있습니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Principal": {
        "Service": ["events.amazonaws.com", "delivery.logs.amazonaws.com"]
      },
      "Resource": "arn:aws:logs:us-east-1:111122223333:log-group:/aws/events/ecs/containerinsights/*:*",
      "Condition": {
        "StringEquals": {
        "aws:SourceAccount": "111122223333"
        },
        "ArnLike": {
        "aws:SourceArn": "arn:aws:events:us-east-1:111122223333:rule/eventsToLog*"
        }
      },
      "Sid": "TrustEventBridgeToStoreECSLifecycleLogEvents"
    }
  ]
}
```

------

다음 명령을 사용하여 이 정책이 이미 있는지 확인하고 정책이 제대로 연결되었는지 확인할 수 있습니다.

```
aws logs describe-resource-policies --region region --output json
```

수명 주기 이벤트 테이블을 보려면 `events:DescribeRule`, `events:ListTargetsByRule` 및 `logs:DescribeLogGroups` 권한이 있어야 합니다.

**CloudWatch Container Insights 콘솔에서 Amazon ECS 수명 주기 이벤트 보기**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. **Insights**, **Container Insights**를 선택합니다.

1. **성능 대시보드 보기**를 선택합니다.

1. 다음 드롭다운에서 **ECS Clusters**(ECS 클러스터), **ECS Services**(ECS 서비스) 또는 **ECS Tasks**(ECS 태스크)를 선택합니다.

1. 이전 단계에서 **ECS Services**(ECS 서비스) 또는 **ECS Tasks**(ECS 태스크)를 선택한 경우 **Lifecycle events**(수명 주기 이벤트) 탭을 선택합니다.

1. 페이지 하단에 **Configure lifecycle events**(수명 주기 이벤트 구성)가 표시되면 이를 선택하여 클러스터에 대한 EventBridge 규칙을 생성합니다.

   이벤트는 Container Insights 창 아래와 Application Insights 섹션 위에 표시됩니다. 추가 분석을 실행하고 이러한 이벤트에 대한 추가 시각화를 생성하려면 Lifecycle Events(수명 주기 이벤트) 테이블에서 **View in Logs Insights**(Logs Insights에서 보기)를 선택합니다.

# Container Insights 문제 해결
<a name="ContainerInsights-troubleshooting"></a>

Container Insights에 문제가 있는 경우 다음 단원을 참조하면 도움이 됩니다.

## Amazon EKS 또는 Kubernetes에서 배포 실패
<a name="ContainerInsights-setup-EKS-troubleshooting-general"></a>

에이전트가 Kubernetes 클러스터에 올바르게 배포하지 않는 경우 다음을 수행해 보세요.
+ 다음 명령을 실행하여 Pod 목록을 가져옵니다.

  ```
  kubectl get pods -n amazon-cloudwatch
  ```
+ 다음 명령을 실행하고 출력 하단에서 이벤트를 확인합니다.

  ```
  kubectl describe pod pod-name -n amazon-cloudwatch
  ```
+ 다음 명령을 실행하여 로그를 확인합니다.

  ```
  kubectl logs pod-name -n amazon-cloudwatch
  ```

## 권한이 없는 패닉: Kubelet에서 cadvisor 데이터를 검색할 수 없음
<a name="ContainerInsights-setup-EKS-troubleshooting-permissions"></a>

`Unauthorized panic: Cannot retrieve cadvisor data from kubelet` 오류가 표시되면서 배포에 실패한 경우 kubelet 에 Webhook 인증 모드가 활성화되어 있지 않을 수 있습니다. 이는 Container Insights에 필요한 모드입니다. 자세한 내용은 [CloudWatch에서 Container Insights에 대한 사전 요구 사항 확인](Container-Insights-prerequisites.md) 섹션을 참조하세요.

## 삭제하고 다시 생성한 Amazon ECS의 클러스터에 Container Insights 배포
<a name="ContainerInsights-troubleshooting-recreate"></a>

Container Insights가 사용되지 않은 기존 Amazon ECS 클러스터를 삭제하고 같은 이름으로 다시 생성하는 경우 다시 생성하는 시점에는 이 새 클러스터에서 Container Insights를 사용할 수 없습니다. 다시 생성한 후 다음 명령을 입력해야만 활성화할 수 있습니다.

```
aws ecs update-cluster-settings --cluster myCICluster --settings name=container Insights,value=enabled
```

## 잘못된 엔드포인트 오류
<a name="ContainerInsights-setup-invalid-endpoint"></a>

다음과 유사한 오류 메시지가 표시되는 경우 사용하는 명령의 *cluster-name* 및 *region-name* 같은 자리 표시자를 모두 배포에 해당하는 올바른 정보로 바꿨는지 확인합니다.

```
"log": "2020-04-02T08:36:16Z E! cloudwatchlogs: code: InvalidEndpointURL, message: invalid endpoint uri, original error: &url.Error{Op:\"parse\", URL:\"https://logs.{{region_name}}.amazonaws.com/\", Err:\"{\"}, &awserr.baseError{code:\"InvalidEndpointURL\", message:\"invalid endpoint uri\", errs:[]error{(*url.Error)(0xc0008723c0)}}\n",
```

## 콘솔에 지표가 나타나지 않음
<a name="ContainerInsights-setup-EKS-troubleshooting-nometrics"></a>

AWS Management Console에 Container Insights 지표가 보이지 않는 경우 Container Insights 설정을 완료했는지 확인합니다. Container Insights가 완전히 설정되지 않으면 지표가 나타나지 않습니다. 자세한 내용은 [Container Insights 설정](deploy-container-insights.md) 섹션을 참조하세요.

## 클러스터를 업그레이드한 후 Amazon EKS 또는 Kubernetes에서 포드 지표가 누락됨
<a name="ContainerInsights-troubleshooting-podmetrics-missing"></a>

이 섹션은 CloudWatch 에이전트를 새 클러스터 또는 업그레이드된 클러스터에 DaemonSet로 배포한 후 전체 또는 일부 포드 지표가 누락되거나 `W! No pod metric collected` 메시지와 함께 오류 로그가 표시되는 경우에 유용할 수 있습니다.

이러한 오류는 containerd 또는 docker systemd cgroup 드라이버와 같은 컨테이너 런타임의 변경으로 인해 발생할 수 있습니다. 일반적으로 호스트의 containerd 소켓이 컨테이너에 탑재되도록 배포 매니페스트를 업데이트함으로써 이 문제를 해결할 수 있습니다. 다음 예를 참조하세요.

```
# For full example see https://github.com/aws-samples/amazon-cloudwatch-container-insights/blob/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: cloudwatch-agent
  namespace: amazon-cloudwatch
spec:
  template:
    spec:
      containers:
        - name: cloudwatch-agent
# ...
          # Don't change the mountPath
          volumeMounts:
# ...
            - name: dockersock
              mountPath: /var/run/docker.sock
              readOnly: true
            - name: varlibdocker
              mountPath: /var/lib/docker
              readOnly: true
            - name: containerdsock # NEW mount
              mountPath: /run/containerd/containerd.sock
              readOnly: true
# ...
      volumes:
# ...
        - name: dockersock
          hostPath:
            path: /var/run/docker.sock
        - name: varlibdocker
          hostPath:
            path: /var/lib/docker
        - name: containerdsock # NEW volume
          hostPath:
            path: /run/containerd/containerd.sock
```

## Amazon EKS에 Bottlerocket을 사용할 때 포드 지표가 없음
<a name="ContainerInsights-troubleshooting-bottlerocket"></a>

Bottlerocket은 AWS에서 컨테이너를 실행하기 위해 특별히 구축한 Linux 기반 오픈 소스 운영 체제입니다.

Bottlerocket은 호스트에서 다른 `containerd` 경로를 사용하므로 볼륨을 해당 위치로 변경해야 합니다. 그러지 않으면 `W! No pod metric collected`가 포함된 오류가 로그에 표시됩니다. 다음 예제를 참조하세요.

```
volumes:
  # ... 
    - name: containerdsock
      hostPath:
        # path: /run/containerd/containerd.sock
        # bottlerocket does not mount containerd sock at normal place
        # https://github.com/bottlerocket-os/bottlerocket/commit/91810c85b83ff4c3660b496e243ef8b55df0973b
        path: /run/dockershim.sock
```

## Amazon EKS 또는 Kubernetes에 containerd 런타임을 사용할 때 컨테이너 파일 시스템 지표가 없음
<a name="ContainerInsights-troubleshooting-containerd"></a>

이는 알려진 문제이며, 커뮤니티 기여자가 이 문제를 해결하기 위해 노력하고 있습니다. 자세한 내용은 GitHub에서 [containerd의 디스크 사용량 지표](https://github.com/google/cadvisor/issues/2785) 및 [containerd용 cadvisor에서 컨테이너 파일 시스템 지표를 지원하지 않음](https://github.com/aws/amazon-cloudwatch-agent/issues/192)을 참조하세요.

## Prometheus 지표를 수집할 때 CloudWatch 에이전트에서 예상치 못한 로그 볼륨 증가
<a name="ContainerInsights-troubleshooting-log-volume-increase"></a>

이는 CloudWatch 에이전트 버전 1.247347.6b250880에 도입된 회귀였습니다. 이 회귀는 최신 버전의 에이전트에서 이미 수정되었습니다. 따라서 이 문제의 영향은 고객이 CloudWatch 에이전트 자체의 로그를 수집하고 Prometheus도 사용하는 시나리오로 제한되었습니다. 자세한 내용은 GitHub에서 [[prometheus] 에이전트가 로그에 스크레이프한 모든 지표를 인쇄하고 있음](https://github.com/aws/amazon-cloudwatch-agent/issues/209)을 참조하세요.

## 릴리스 정보에 언급된 최신 Docker 이미지를 DockerHub에서 찾을 수 없음
<a name="ContainerInsights-troubleshooting-docker-image"></a>

내부적으로 실제 릴리스를 시작하기 전에 Github에서 릴리스 정보와 태그를 업데이트합니다. Github에 버전 번호를 올린 후 레지스트리에서 최신 Docker 이미지를 확인하는 데 일반적으로 1\$12주가 걸립니다. CloudWatch 에이전트 컨테이너 이미지에 대한 야간 릴리스는 없습니다. 다음 위치의 소스에서 직접 이미지를 구축할 수 있습니다. [https://github.com/aws/amazon-cloudwatch-agent/tree/main/amazon-cloudwatch-container-insights/cloudwatch-agent-dockerfile](https://github.com/aws/amazon-cloudwatch-agent/tree/main/amazon-cloudwatch-container-insights/cloudwatch-agent-dockerfile)

## CloudWatch 에이전트의 CrashLoopBackoff 오류
<a name="ContainerInsights-troubleshooting-crashloopbackoff"></a>

CloudWatch 에이전트에 대해 `CrashLoopBackOff` 오류가 표시되면 IAM 권한이 정확하게 설정되어 있는지 확인합니다. 자세한 내용은 [CloudWatch에서 Container Insights에 대한 사전 요구 사항 확인](Container-Insights-prerequisites.md) 섹션을 참조하세요.

## CloudWatch 에이전트 또는 Fluentd 포드가 보류 상태에서 멈춤
<a name="ContainerInsights-troubleshooting-pending"></a>

`Pending` 상태에서 멈춰 있거나 `FailedScheduling` 오류가 있는 CloudWatch 에이전트 또는 Fluentd 포드가 있는 경우 에이전트에 필요한 코어 수와 RAM 양을 기반으로 노드에 충분한 컴퓨팅 리소스가 있는지 확인합니다. 다음 명령을 입력하여 Pod를 설명합니다.

```
kubectl describe pod cloudwatch-agent-85ppg -n amazon-cloudwatch
```

# 자체 CloudWatch 에이전트 Docker 이미지 구축
<a name="ContainerInsights-build-docker-image"></a>

[https://github.com/aws-samples/amazon-cloudwatch-container-insights/blob/latest/cloudwatch-agent-dockerfile/Dockerfile](https://github.com/aws-samples/amazon-cloudwatch-container-insights/blob/latest/cloudwatch-agent-dockerfile/Dockerfile)에 있는 Dockerfile을 참조하여 자체 CloudWatch 에이전트 Docker 이미지를 구축할 수 있습니다.

Dockerfile은 `docker buildx`를 사용한 직접 다중 아키텍처 이미지 구축을 지원합니다.

# 컨테이너에 다른 CloudWatch 에이전트 기능 배포
<a name="ContainerInsights-other-agent-features"></a>

CloudWatch 에이전트를 사용하여 컨테이너에 추가 모니터링 기능을 배포할 수 있습니다. 이러한 특성은 다음과 같습니다.
+ **임베디드 지표 형식** - 자세한 내용은 [로그 내에 지표 포함](CloudWatch_Embedded_Metric_Format.md) 단원을 참조하세요.
+ **StatsD** - 자세한 내용은 [StatsD를 사용하여 사용자 지정 지표 검색](CloudWatch-Agent-custom-metrics-statsd.md) 단원을 참조하세요.

지침 및 필요한 파일은 GitHub의 다음 위치에 있습니다.
+ Amazon ECS 컨테이너의 경우 [배포 모드를 기반으로 한 Amazon ECS 태스크 정의 예](https://github.com/aws-samples/amazon-cloudwatch-container-insights/tree/latest/ecs-task-definition-templates/deployment-mode)를 참조하세요.
+ Amazon EKS 및 Kubernetes 컨테이너의 경우 [배포 모드를 기반으로 한 Kubernetes YAML 파일 예](https://github.com/aws-samples/amazon-cloudwatch-container-insights/tree/latest/k8s-deployment-manifest-templates/deployment-mode)를 참조하세요.