

# CloudWatch RUM
<a name="CloudWatch-RUM"></a>

CloudWatch RUM을 사용하면 실제 사용자 모니터링을 수행하여 실제 사용자 세션에서 웹 및 모바일 애플리케이션 성능에 대한 클라이언트 측 데이터를 거의 실시간으로 수집하고 볼 수 있습니다. 웹 애플리케이션의 경우 페이지 로드 시간, 클라이언트 측 오류, 사용자 동작을 분석할 수 있습니다. 모바일 애플리케이션의 경우 화면 로드 시간, 앱 시작 시간, 네트워크 오류, 충돌, Android ANR(Application Not Responding, 애플리케이션 응답 중지) 및 iOS 앱 멈춤 같은 플랫폼별 문제를 모니터링할 수 있습니다. 이러한 데이터를 열람할 경우 모든 집계된 데이터를 함께 볼 수 있으며 디바이스 유형, 운영 체제 및 애플리케이션 사용에 대한 기타 특성에 따른 분석 내용도 볼 수 있습니다.

수집된 데이터를 사용하여 클라이언트 측 성능 문제를 신속하게 식별하고 디버깅할 수 있습니다. CloudWatch RUM을 사용하면 애플리케이션 성능 이상을 시각화하고 오류 메시지, 스택 추적 및 사용자 세션 등의 관련 디버깅 데이터를 찾을 수 있습니다. 또한 RUM을 사용하여 사용자 수, 위치 정보 및 사용된 브라우저/디바이스 등 최종 사용자의 영향 범위를 파악할 수 있습니다.

CloudWatch RUM에 대해 수집하는 최종 사용자 데이터는 30일 동안 보존된 다음 자동으로 삭제됩니다. RUM 원격 분석 데이터를 더 오랫동안 유지하려면 앱 모니터에서 원격 분석의 복사본을 계정의 CloudWatch Logs에 보내도록 선택할 수 있습니다. 그런 다음, 해당 로그 그룹의 보존 기간을 조정할 수 있습니다.

RUM을 사용하려면 *앱 모니터*를 생성해서 일부 정보를 제공합니다. RUM은 애플리케이션에 종속성 주입을 추가하는 데 사용할 수 있는 코드 조각을 생성합니다. 코드 조각은 필요 시 RUM 클라이언트 코드를 가져옵니다. RUM 클라이언트는 미리 구축된 대시보드에 표시되는 애플리케이션 사용자 세션의 특정 비율로 데이터를 캡처합니다. 데이터를 수집할 사용자 세션의 비율을 지정할 수 있습니다.

 CloudWatch RUM은 애플리케이션 서비스, 클라이언트, Synthetics canary 및 서비스 종속성을 검색하고 모니터링할 수 있는 [Application Signals](CloudWatch-Application-Monitoring-Sections.md)와 통합됩니다. Application Signals를 사용하여 서비스의 목록 또는 시각적 맵을 확인하고, 서비스 수준 목표(SLO)를 기준으로 상태 지표를 확인하고, 더 자세한 문제 해결을 위해 상관관계가 있는 X-Ray 트레이스를 드릴다운할 수 있습니다. Application Signals에서 RUM 클라이언트 페이지 요청을 보려면 [앱 모니터 생성](CloudWatch-RUM-get-started-create-app-monitor.md) 시 X-Ray 활성 추적을 켭니다. 웹 애플리케이션의 경우 [RUM 웹 클라이언트를 수동으로 구성](CloudWatch-RUM-configure-client.md)하여 이 기능을 활성화할 수도 있습니다. RUM 클라이언트는 서비스에 연결된 [애플리케이션 맵](ServiceMap.md)에 표시되고, 직접적으로 호출하는 서비스의 [서비스 세부 정보](ServiceDetail.md) 페이지에 표시됩니다.

RUM 클라이언트는 오픈 소스입니다. 자세한 내용은 [CloudWatch RUM Web Client](https://github.com/aws-observability/aws-rum-web), [AWS Distro for OpenTelemetry(ADOT) Android SDK](https://github.com/aws-observability/aws-otel-android), [AWS Distro for OpenTelemetry(ADOT) iOS SDK](https://github.com/aws-observability/aws-otel-swift)를 참조하세요.

**RUM 요금**

요금에 대한 자세한 내용은 [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/)을 참조하세요.

**리전 가용성**

CloudWatch RUM은 현재 다음 리전에서 사용 가능합니다.
+ 미국 동부(버지니아 북부)
+ 미국 동부(오하이오)
+ 미국 서부(캘리포니아 북부)
+ 미국 서부(오리건)
+ 아프리카(케이프타운)
+ AWS GovCloud(미국 동부)
+ AWS GovCloud(미국 서부)
+ 아시아 태평양(뭄바이)
+ 아시아 태평양(하이데라바드)
+ 아시아 태평양(멜버른)
+ 아시아 태평양(오사카)
+ 아시아 태평양(서울)
+ 아시아 태평양(싱가포르)
+ 아시아 태평양(시드니)
+ 아시아 태평양(자카르타)
+ 아시아 태평양(말레이시아)
+ 아시아 태평양(태국)
+ 아시아 태평양(도쿄)
+ 아시아 태평양(홍콩)
+ 캐나다(중부)
+ 유럽(프랑크푸르트)
+ 유럽(아일랜드)
+ 유럽(런던)
+ 유럽(밀라노)
+ 유럽(파리)
+ 유럽(스페인)
+ 유럽(스톡홀름)
+ 유럽(취리히)
+ AWS European Sovereign Cloud(독일)
+ 중동(바레인)
+ 중동(UAE)
+ 멕시코(중부)
+ 남아메리카(상파울루)
+ 이스라엘(텔아비브)
+ 캐나다 서부(캘거리)

# CloudWatch RUM을 사용하도록 모바일 애플리케이션 설정
<a name="CloudWatch-RUM-web-mobile"></a>

모바일 애플리케이션을 모니터링하려면 앱 모니터를 생성한 후 이를 모바일 플랫폼에 맞게 구성한 다음, AWS Distro for OpenTelemetry(ADOT) SDK를 애플리케이션에 통합합니다. 모바일 RUM은 OpenTelemetry Protocol(OTLP)을 사용하여 원격 분석 데이터를 전용 OTLP 엔드포인트로 전송합니다.

## 모바일 플랫폼용 앱 모니터를 생성하려면
<a name="mobile-platform-app-monitor"></a>

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

1. 탐색 창에서 **Application Signals**, **RUM**을 선택합니다.

1. **앱 모니터 추가(Add app monitor)**를 선택합니다.

1. **앱 모니터 이름(App monitor name)**에서 CloudWatch RUM 콘솔 내에서 이 앱 모니터를 식별하는 데 사용할 이름을 입력합니다.

1. **Android** 또는 **iOS**를 플랫폼으로 선택합니다.

1. **데이터 스토리지**에서 RUM OTEL 로그 이벤트 및 스팬의 복사본을 CloudWatch Logs에 저장하도록 선택하고, 보존을 구성할 수 있습니다. 기본적으로 CloudWatch Logs 로그 그룹은 데이터를 30일 동안 보존합니다. CloudWatch Logs 콘솔에서 보존 기간을 조정할 수 있습니다.

1. (선택 사항) **리소스 기반 정책**에서 앱 모니터에 요청을 전송할 수 있는 사용자를 제어하는 리소스 기반 정책을 추가하도록 선택합니다. **퍼블릭 정책 생성**을 선택하면 누구나 요청을 앱 모니터로 전송할 수 있도록 허용하는 리소스 정책이 앱 모니터에 연결됩니다. 자세한 내용은 [CloudWatch RUM에서 리소스 기반 정책 사용](CloudWatch-RUM-resource-policies.md) 섹션을 참조하세요.

1. 샘플링한 사용자 세션의 AWS X-Ray 추적을 사용하려면 **활성 추적**을 선택한 후 **AWS로 내 서비스 추적**을 선택합니다.

   선택이 완료되면 샘플링한 사용자 세션 동안 생성된 OTEL 스팬이 추적됩니다. 그런 다음 RUM 대시보드, X-Ray 트레이스 맵, 트레이스 세부 정보 페이지에서 이러한 세션의 트레이스와 스팬을 볼 수 있습니다. 이러한 사용자 세션은 애플리케이션에 대해 활성화된 후 Application Signals의 클라이언트 페이지로도 표시됩니다.

1. (선택 사항) 앱 모니터에 태그를 추가하려면:

   1. **태그**에서 **새 태그 추가**를 선택합니다.

   1. **키**에 태그의 이름을 입력합니다. **값**에 선택적 값을 추가할 수 있습니다.

   1. 다른 태그를 추가하려면 **새 태그 추가**를 다시 선택합니다.

   자세한 내용은 *AWS 태그 지정 및 태그 편집기 사용 설명서*의 [AWS 리소스 태그 지정](https://docs.aws.amazon.com/tagging/latest/userguide/tagging-resources.html) 섹션을 참조하세요.

1. **앱 모니터 추가(Add app monitor)**를 선택합니다.

1. **샘플 코드** 섹션에서 애플리케이션에 추가할 코드 조각을 복사할 수 있습니다. AWS Distro for OpenTelemetry(ADOT) SDK를 사용하면 **수동 계측**을 선택하여 애플리케이션 코드에서 모니터링을 구성하거나, 구성 변경을 최소화하는 **제로 코드 계측**을 선택할 수 있습니다.

   제로 코드 계측은 구성 파일을 사용하여 원격 분석 수집을 자동으로 초기화하므로, Android 및 iOS 애플리케이션 양쪽 모두에서 가장 간단히 사용할 수 있는 옵션입니다. 수동 계측을 사용하면 초기화 및 구성 프로세스를 더욱 잘 제어할 수 있습니다.

1. **복사(Copy)** 또는 **다운로드(Download)**를 선택한 다음 **완료(Done)**를 선택합니다.

### iOS 애플리케이션 설정
<a name="CloudWatch-RUM-ios-setup"></a>

iOS 애플리케이션의 경우 [AWS Distro for OpenTelemetry(ADOT) iOS SDK](https://github.com/aws-observability/aws-otel-swift)를 통합하여 RUM 모니터링을 활성화할 수 있습니다. SDK는 iOS 16 이상 버전을 지원하며, 일반적인 성능 시나리오를 위한 자동 계측 기능을 제공합니다.

### Android 애플리케이션 설정
<a name="CloudWatch-RUM-android-setup"></a>

Android 애플리케이션의 경우 [AWS Distro for OpenTelemetry(ADOT) Android SDK](https://github.com/aws-observability/aws-otel-android)를 통합하여 RUM 모니터링을 활성화할 수 있습니다. SDK는 자동 계측을 제공하며, 서명된 인증 모델과 서명되지 않은 인증 모델을 둘 다 지원합니다.

## 인증 및 보안
<a name="CloudWatch-RUM-authentication"></a>

모바일 RUM은 SDK에 정의된 대로 유연한 인증 모델을 지원합니다.
+ iOS 애플리케이션은 [AWS Distro for OpenTelemetry(ADOT) iOS SDK](https://github.com/aws-observability/aws-otel-swift)를 사용합니다.
+ Android 애플리케이션은 [AWS Distro for OpenTelemetry(ADOT) Android SDK](https://github.com/aws-observability/aws-otel-android)를 사용합니다.

# CloudWatch RUM을 사용하는 IAM 정책
<a name="CloudWatch-RUM-permissions"></a>

CloudWatch RUM을 완벽하게 관리하려면 **AmazonCloudWatchRUMFullAccess** IAM 정책을 포함하는 IAM 사용자 또는 역할로 로그인해야 합니다. 또한 다음과 같은 다른 정책이나 권한이 필요할 수 있습니다.
+ 권한 부여를 위해 새 Amazon Cognito 자격 증명 풀을 생성하는 앱 모니터를 만들려면 **관리자(Admin)** IAM 역할 또는 **AdministratorAccess** IAM 정책이 있어야 합니다.
+ CloudWatch Logs로 데이터를 전송하는 앱 모니터를 생성하려면 다음 권한을 가진 IAM 역할 또는 정책에 로그온해야 합니다.

  ```
  {
      "Effect": "Allow",
      "Action": [
          "logs:PutResourcePolicy"
      ],
      "Resource": [
          "*"
      ]
  }
  ```
+ 앱 모니터에서 JavaScript 소스 맵을 활성화하려면 소스 맵 파일을 Amazon S3 버킷에 업로드해야 합니다. IAM 역할 또는 정책에는 Amazon S3 버킷 생성, 버킷 정책 설정 및 버킷의 파일 관리를 허용하는 특정 Amazon S3 권한이 필요합니다. 보안을 위해 이러한 권한의 범위를 특정 리소스로 지정합니다. 아래 예제 정책은 이름에 `rum`이 포함된 버킷에 대한 액세스를 제한하고 `aws:ResourceAccount` 조건 키를 사용하여 권한을 보안 주체 계정만으로 제한합니다.

  ```
  {
      "Sid": "AllowS3BucketCreationAndListing",
      "Effect": "Allow",
      "Action": [
          "s3:CreateBucket",
          "s3:ListAllMyBuckets"
      ],
      "Resource": "arn:aws:s3:::*",
      "Condition": {
          "StringEquals": {
              "aws:ResourceAccount": "${aws:PrincipalAccount}"
          }
      }
  },
  {
      "Sid": "AllowS3BucketActions",
      "Effect": "Allow",
      "Action": [
          "s3:GetBucketLocation",
          "s3:ListBucket"
      ],
      "Resource": "arn:aws:s3:::*rum*",
      "Condition": {
          "StringEquals": {
              "aws:ResourceAccount": "${aws:PrincipalAccount}"
          }
      }
  },
  {
      "Sid": "AllowS3BucketPolicyActions",
      "Effect": "Allow",
      "Action": [
          "s3:PutBucketPolicy",
          "s3:GetBucketPolicy"
      ],
      "Resource": "arn:aws:s3:::*rum*",
      "Condition": {
          "StringEquals": {
              "aws:ResourceAccount": "${aws:PrincipalAccount}"
          }
      }
  },
  {
      "Sid": "AllowS3ObjectActions",
      "Effect": "Allow",
      "Action": [
          "s3:GetObject",
          "s3:PutObject",
          "s3:DeleteObject",
          "s3:AbortMultipartUpload"
      ],
      "Resource": "arn:aws:s3:::*rum*",
      "Condition": {
          "StringEquals": {
              "aws:ResourceAccount": "${aws:PrincipalAccount}"
          }
      }
  }
  ```
+ 소스 맵 버킷에서 서버 측 암호화에 자체 AWS KMS 키를 사용하려면 IAM 역할 또는 정책에는 키를 생성하고, 키 정책을 업데이트하고, Amazon S3에서 AWS KMS 키를 사용하고, Amazon S3 버킷의 암호화 구성을 설정할 수 있는 특정 AWS KMS 권한이 필요합니다. 보안을 위해 이러한 권한의 범위를 특정 용도로 지정합니다. 아래 예제에서는 특정 리전 및 accountId의 키에 대한 액세스를 제한하고 위의 예제와 유사한 S3 제한을 적용합니다.

  ```
  {
      "Sid": "AllowKMSKeyCreation",
      "Effect": "Allow",
      "Action": [
          "kms:CreateKey",
          "kms:CreateAlias"
      ],
      "Resource": "*"
  },
  {
      "Sid": "KMSReadPermissions",
      "Effect": "Allow",
      "Action": [
          "kms:ListAliases"
      ],
      "Resource": "*"
  },
  {
      "Sid": "AllowUpdatingKeyPolicy",
      "Effect": "Allow",
      "Action": [
          "kms:PutKeyPolicy",
          "kms:GetKeyPolicy",
          "kms:ListKeyPolicies"
      ],
      "Resource": "arn:aws:kms:REGION:ACCOUNT_ID:key/*"
  },
  {
      "Sid": "AllowUseOfKMSKeyForS3",
      "Effect": "Allow",
      "Action": [
          "kms:DescribeKey",
          "kms:Encrypt",
          "kms:Decrypt",
          "kms:GenerateDataKey"
      ],
      "Resource": "arn:aws:kms:REGION:ACCOUNT_ID:key/*"
  },
  {
      "Sid": "AllowS3EncryptionConfiguration",
      "Effect": "Allow",
      "Action": [
          "s3:PutEncryptionConfiguration",
          "s3:GetEncryptionConfiguration"
      ],
      "Resource": "arn:aws:s3:::*rum*",
      "Condition": {
          "StringEquals": {
              "aws:ResourceAccount": "${aws:PrincipalAccount}"
          }
      }
  }
  ```

CloudWatch RUM 데이터를 조회해야 하지만 CloudWatch RUM 리소스를 만들 필요는 없는 다른 사용자에게 **AmazonCloudWatchRUMReadOnlyAccess** 정책을 부여할 수 있습니다.

# CloudWatch RUM을 사용하도록 웹 애플리케이션 설정
<a name="CloudWatch-RUM-get-started"></a>

이 섹션의 단계를 사용하여 실제 사용자 세션에서 성능 데이터를 수집하는 데 CloudWatch RUM을 사용하도록 웹 애플리케이션을 설정합니다.

**Topics**
+ [웹 애플리케이션에서 데이터를 AWS로 전송하도록 권한 부여](CloudWatch-RUM-get-started-authorization.md)
+ [웹 애플리케이션용 CloudWatch RUM 앱 모니터 생성](CloudWatch-RUM-get-started-create-app-monitor.md)
+ [코드 조각을 수정하여 CloudWatch RUM 웹 클라이언트 구성(선택 사항)](CloudWatch-RUM-modify-snippet.md)
+ [애플리케이션에 CloudWatch 앱 모니터 코드 조각 삽입](CloudWatch-RUM-get-started-insert-code-snippet.md)
+ [사용자 이벤트를 생성하여 CloudWatch 앱 모니터 설정 테스트](CloudWatch-RUM-get-started-generate-data.md)

# 웹 애플리케이션에서 데이터를 AWS로 전송하도록 권한 부여
<a name="CloudWatch-RUM-get-started-authorization"></a>

데이터 인증을 설정하는 4가지 옵션이 있습니다.
+ Amazon Cognito를 사용하고 CloudWatch RUM에서 애플리케이션에 대한 새 Amazon Cognito ID 풀을 생성할 수 있습니다. 이 방법은 설정하는 데 최소한의 노력이 필요합니다.

  자격 증명 풀에는 인증되지 않은 자격 증명이 포함됩니다. 이렇게 하면 CloudWatch RUM 웹 클라이언트가 애플리케이션 사용자를 인증하지 않고도 CloudWatch RUM에 데이터를 전송할 수 있습니다.

  Amazon Cognito 자격 증명 풀에는 연결된 IAM 역할이 있습니다. Amazon Cognito 인증되지 않은 자격 증명을 사용하면 웹 클라이언트가 CloudWatch RUM에 데이터를 전송할 수 있는 권한이 부여된 IAM 역할을 맡을 수 있습니다.
+ 인증에 Amazon Cognito를 사용합니다. 이를 사용하는 경우 기존 Amazon Cognito ID 풀을 사용하거나 이 앱 모니터와 함께 사용할 새 ID 풀을 생성할 수 있습니다. 기존 ID 풀을 사용하는 경우 ID 풀에 연결된 IAM 역할도 수정해야 합니다. 인증되지 않은 사용자를 지원하는 자격 증명 풀에 이 옵션을 사용합니다. 동일한 리전의 자격 증명 풀만 사용할 수 있습니다.
+ 이미 설정한 기존 자격 증명 공급자의 인증을 사용합니다. 이 경우 자격 증명 공급자로부터 자격 증명을 가져와야 하며 애플리케이션은 이러한 자격 증명을 RUM 웹 클라이언트에 전달해야 합니다.

  인증된 사용자만 지원하는 자격 증명 풀에 이 옵션을 사용합니다.
+ 리소스 기반 정책을 사용하여 앱 모니터에 대한 액세스를 관리합니다. 여기에는 AWS 자격 증명 없이 인증되지 않은 요청을 CloudWatch RUM으로 보내는 기능이 포함됩니다. 리소스 기반 정책에 대해 자세히 알아보려면 [CloudWatch RUM에서 리소스 기반 정책 사용](CloudWatch-RUM-resource-policies.md) 단원을 참조하세요.

다음 섹션에서는 이러한 옵션에 대해 상세히 알아봅니다.

## 기존 Amazon Cognito 자격 증명 풀을 사용
<a name="CloudWatch-RUM-get-started-authorization-existingcognito"></a>

Amazon Cognito ID 풀을 사용하도록 선택한 경우 애플리케이션을 CloudWatch RUM에 추가할 때 ID 풀을 지정합니다. 풀은 인증되지 않은 자격 증명에 대한 액세스를 활성화할 수 있도록 지원해야 합니다. 동일한 리전의 자격 증명 풀만 사용할 수 있습니다.

또한 이 자격 증명 풀과 관련된 IAM 역할에 연결된 IAM 정책에 다음 권한을 추가해야 합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        { 
            "Effect": "Allow",
            "Action": [
                "rum:PutRumEvents"
            ],
            "Resource": "arn:aws:rum:us-east-1:123456789012:appmonitor/app monitor name" 
        }
    ]
}
```

------

Amazon Cognito는 애플리케이션이 CloudWatch RUM에 액세스할 수 있도록 필요한 보안 토큰을 전송합니다.

## 서드 파티 공급자
<a name="CloudWatch-RUM-get-started-authorization-thirdparty"></a>

서드 파티 공급자로부터 프라이빗 인증을 사용하는 경우 자격 증명 공급자로부터 자격 증명을 가져와 AWS로 전달해야 합니다. 이를 수행하는 가장 좋은 방법은 *보안 토큰 공급 업체*를 이용하는 것입니다. AWS Security Token Service와 함께 Amazon Cognito를 포함한 모든 보안 토큰 공급 업체를 이용할 수 있습니다. AWS STS에 대한 자세한 내용은 [AWS Security Token Service API 참조 소개](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html)를 참조하세요.

이 시나리오에서 Amazon Cognito를 토큰 공급 업체로 사용하려면 인증 공급자와 함께 작동하도록 Amazon Cognito를 구성할 수 있습니다. 자세한 내용은 [Amazon Cognito 자격 증명 풀 시작(페더레이션 자격 증명)](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html)을 참조하세요.

자격 증명 공급자와 함께 작동하도록 Amazon Cognito를 구성한 후에는 다음을 수행해야 합니다.
+ 다음 권한을 가진 IAM 역할을 만듭니다. 애플리케이션은 이 역할을 사용하여 AWS에 액세스합니다.

------
#### [ JSON ]

****  

  ```
  { 
   "Version":"2012-10-17",		 	 	 
   "Statement": [ 
     { 
       "Effect": "Allow",
       "Action": "rum:PutRumEvents",
       "Resource": "arn:aws:rum:us-east-2:123456789012:appmonitor/AppMonitorName"
     }
   ]
  }
  ```

------
+ 애플리케이션에 다음을 추가하여 공급자의 자격 증명을 CloudWatch RUM으로 전달하도록 합니다. 사용자가 애플리케이션에 로그인하고 AWS에 액세스하는 데 사용할 자격 증명을 받은 후 실행되도록 라인을 삽입합니다.

  ```
  cwr('setAwsCredentials', {/* Credentials or CredentialProvider */});
  ```

AWS JavaScript SDK의 자격 증명 공급자에 대한 자세한 내용은 JavaScript SDK용 v3 개발자 가이드에서 [웹 브라우저에서 자격 증명 설정](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-browser.html), JavaScript SDK용 v2 개발자 가이드에서 [웹 브라우저에서 자격 증명 설정](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-browser.html) 및 [@aws-sdk/credential-providers](https://www.npmjs.com/package/@aws-sdk/credential-providers)를 참조하세요.

CloudWatch RUM 웹 클라이언트용 SDK를 사용하여 웹 클라이언트 인증 방법을 구성할 수도 있습니다. 웹 클라이언트 SDK에 대한 자세한 내용은 [CloudWatch RUM 웹 클라이언트 SDK](https://github.com/aws-observability/aws-rum-web)를 참조하세요.

# 웹 애플리케이션용 CloudWatch RUM 앱 모니터 생성
<a name="CloudWatch-RUM-get-started-create-app-monitor"></a>

애플리케이션에서 CloudWatch RUM을 사용하려면 *앱 모니터*를 생성합니다. 앱 모니터가 생성되면 RUM은 사용자가 애플리케이션에 붙여넣을 수 있도록 코드 조각을 생성합니다. 코드 조각은 RUM 클라이언트 코드를 가져옵니다. RUM 클라이언트는 애플리케이션의 사용자 세션에서 데이터를 캡처한 후 이를 RUM으로 전송합니다.

## 웹 플랫폼용 앱 모니터를 생성하려면
<a name="web-platform-app-monitor"></a>

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

1. 탐색 창에서 **Application Signals**, **RUM**을 선택합니다.

1. **앱 모니터 추가(Add app monitor)**를 선택합니다.

1. **앱 모니터 이름(App monitor name)**에서 CloudWatch RUM 콘솔 내에서 이 앱 모니터를 식별하는 데 사용할 이름을 입력합니다.

1. **웹**을 플랫폼으로 선택합니다.

1. **애플리케이션 도메인 목록**에서 애플리케이션에 관리 권한이 있는 등록된 도메인 이름을 입력합니다. 와일드카드 문자 `*`를 사용하여 모든 하위 도메인 또는 최상위 도메인(예: \$1.amazon.com, amazon.\$1, \$1.amazon.\$1)을 허용할 수도 있습니다.

1. **RUM 데이터 수집 구성(Configure RUM data collection)**에서 앱 모니터에서 다음을 각각 수집할지 여부를 지정합니다.
   + **성능 원격 측정(Performance telemetry)**: 페이지 로드 및 리소스 로드 시간에 대한 정보를 수집합니다.
   + **JavaScript 오류**: 애플리케이션에서 발생하는 처리되지 않은 JavaScript 오류에 대한 정보를 수집합니다.

     **JavaScript 오류 스택 트레이스 축소 해제**를 선택하여 축소되지 않은 JavaScript 오류를 디버깅할 수 있습니다. 이 기능을 사용하려면 소스 맵 파일을 Amazon S3 버킷 또는 폴더에 업로드하고 Amazon S3 URI를 제공합니다. 활성화되면 RUM은 이러한 소스 맵을 사용하고 축소되지 않은 스택 트레이스를 추가하여 JavaScript 오류 이벤트를 보강합니다. 활성화한 후에 이 기능은 새 JavaScript 오류 이벤트만 처리하며 이전에 수집된 데이터에서는 사용할 수 없습니다. 자세한 내용은 [JavaScript 오류 스택 트레이스의 축소 해제 활성화](CloudWatch-RUM-JavaScriptStackTraceSourceMaps.md) 섹션을 참조하세요.
   + **HTTP 오류**: 애플리케이션에서 발생하는 HTTP 오류에 대한 정보를 수집합니다.

   이러한 옵션을 선택하면 애플리케이션에 대한 자세한 정보가 제공되지만, 더 많은 CloudWatch RUM 이벤트가 생성되므로 더 많은 요금이 발생합니다.

   이 중 하나를 선택하지 않아도 앱 모니터가 세션 시작 이벤트 및 페이지 ID를 수집하여 운영 체제 유형 및 버전, 브라우저 유형 및 버전, 디바이스 유형 및 위치별 분류를 포함하여 애플리케이션을 사용하는 사용자 수를 확인할 수 있습니다.

1. 샘플링된 사용자 세션에서 사용자 ID 및 세션 ID를 수집할 수 있도록 하려면 **CloudWatch RUM 웹 클라이언트가 쿠키를 설정할 수 있도록 이 옵션 선택(Check this option to allow the CloudWatch RUM Web Client to set cookies)**을 선택합니다. 사용자 ID는 RUM에 의해 임의로 생성됩니다. 자세한 정보는 [CloudWatch RUM 웹 클라이언트 쿠키(또는 유사한 기술)](CloudWatch-RUM-privacy.md#CloudWatch-RUM-cookies)을 참조하세요.

1. **세션 샘플(Session samples)**에서 RUM 데이터를 수집하는 데 사용할 사용자 세션 비율을 입력합니다. 기본값은 100%입니다. 이 수를 줄이면 데이터가 줄어들지만, 요금도 줄어듭니다. RUM 요금에 대한 자세한 내용은 [RUM 요금](CloudWatch-RUM.md#RUMpricing)을 참조하세요.

1. CloudWatch RUM에 대해 수집하는 최종 사용자 데이터는 30일 동안 보존된 다음 자동으로 삭제됩니다. CloudWatch Logs에 RUM 이벤트 복사본을 보관하고 이러한 복사본을 보존하는 기간을 구성하려면 **데이터 스토리지(Data storage)**에서 **애플리케이션 원격 측정 데이터를 CloudWatch Logs 계정에 저장하려면 이 옵션을 선택(Check this option to store your application telemetry data in your CloudWatch Logs account)**을 선택합니다. 기본적으로 CloudWatch Logs 로그 그룹은 데이터를 30일 동안 보존합니다. CloudWatch Logs 콘솔에서 보존 기간을 조정할 수 있습니다.

1. (선택 사항) 앱 모니터에 리소스 기반 정책을 추가하여 앱 모니터에 `PutRumEvents` 요청을 보낼 수 있는 사용자를 제어하도록 선택합니다. **퍼블릭 정책 생성**을 선택하면 누구나 `PutRumEvents` 요청을 앱 모니터로 보낼 수 있는 리소스 정책이 앱 모니터에 연결됩니다. 이 방법에 대한 자세한 내용은 [CloudWatch RUM에서 리소스 기반 정책 사용](CloudWatch-RUM-resource-policies.md) 단원을 참조하세요.

1. 이전 단계에서 리소스 기반 정책을 연결한 경우에는 AWS 자격 증명으로 CloudWatch RUM에 대한 요청에 서명할 필요가 없으며, 권한 부여 설정을 건너뛸 수 있습니다. 그렇지 않으면 **권한 부여**에서 신규 또는 기존 Amazon Cognito ID 풀을 사용할지 여부를 지정하거나 다른 ID 제공업체(idP)를 사용합니다. 새 자격 증명 풀을 만드는 것은 다른 설정 단계가 필요하지 않은 가장 간단한 옵션입니다. 자세한 내용은 [웹 애플리케이션에서 데이터를 AWS로 전송하도록 권한 부여](CloudWatch-RUM-get-started-authorization.md) 섹션을 참조하세요.

   새 Amazon Cognito 자격 증명 풀을 생성하려면 관리 권한이 필요합니다. 자세한 내용은 [CloudWatch RUM을 사용하는 IAM 정책](CloudWatch-RUM-permissions.md) 섹션을 참조하세요.

1. (선택 사항) 기본적으로 애플리케이션에 RUM 코드 조각을 추가하면 웹 클라이언트는 애플리케이션의 모든 페이지에 있는 HTML 코드에 JavaScript 태그를 삽입하여 사용량을 모니터링합니다. 이를 변경하려면 **페이지 구성(Configure pages)**을 선택한 다음 **이 페이지만 포함(Include only these pages)** 또는 **이 페이지 제외(Exclude these pages)** 중 하나를 선택합니다. 그런 다음, 포함하거나 제외할 페이지를 지정합니다. 포함하거나 제외할 페이지를 지정하려면 전체 URL을 입력합니다. 추가 페이지를 지정하려면 **URL 추가(Add URL)**를 선택합니다.

1. 앱 모니터에서 샘플링한 사용자 세션의 AWS X-Ray 추적을 사용하려면 **Active tracing**(활성 추적)을 선택하고 **Trace my service with AWS X-Ray**(으로 내 서비스 추적)을 선택합니다.

   이 옵션을 선택하면 `XMLHttpRequest` 및 `fetch` 요청이 앱 모니터에서 샘플링하는 사용자 세션 중에 수행됩니다. 그런 다음, RUM 대시보드, X-Ray 트레이스 맵 및 트레이스 세부 정보 페이지에서 이러한 사용자 세션의 트레이스와 세그먼트를 볼 수 있습니다. 이러한 사용자 세션은 애플리케이션에 대해 활성화된 후 [Application Signals](CloudWatch-Application-Monitoring-Sections.md)의 클라이언트 페이지로도 표시됩니다.

   CloudWatch RUM 웹 클라이언트에 대한 추가 구성을 변경함으로써 HTTP 요청에 X-Ray 추적 헤더를 추가하여 AWS 관리형 서비스 다운스트림으로 사용자 세션의 엔드 투 엔드 추적을 활성화할 수 있습니다. 자세한 내용은 [X-Ray 종단 간 추적 활성화](CloudWatch-RUM-modify-snippet.md#CloudWatch-RUM-xraytraceheader) 섹션을 참조하세요.

1. (선택 사항) 앱 모니터에 태그를 추가하려면 **태그(Tags)**에서 **새 태그 추가(Add new tag)**를 선택합니다.

   그런 다음, **키(Key)**에서 태그 이름을 입력합니다. **값(Value)**에 태그의 선택적 값을 추가할 수 있습니다.

   다른 태그를 추가하려면 **새 태그 추가(Add new tag)**를 다시 선택합니다.

   자세한 내용은 [AWS 리소스에 태깅](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html)을 참조하세요.

1. **앱 모니터 추가(Add app monitor)**를 선택합니다.

1. **샘플 코드(Sample code)** 섹션에서 애플리케이션에 추가하는 데 사용할 코드 조각을 복사할 수 있습니다. **JavaScript** 또는 **TypeScript**를 선택하고 NPM을 사용하여 CloudWatch RUM 웹 클라이언트를 JavaScript 모듈로 설치하는 것이 좋습니다.

   또는 콘텐츠 전송 네트워크(CDN)를 사용하는 **HTML**을 선택하여 CloudWatch RUM 웹 클라이언트를 설치합니다. CDN 사용 시의 단점은 웹 클라이언트가 광고 차단기에 의해 차단되는 경우가 많다는 것입니다.

1. **복사(Copy)** 또는 **다운로드(Download)**를 선택한 다음 **완료(Done)**를 선택합니다.

# 코드 조각을 수정하여 CloudWatch RUM 웹 클라이언트 구성(선택 사항)
<a name="CloudWatch-RUM-modify-snippet"></a>

애플리케이션에 삽입하기 전에 코드 조각을 수정하여 여러 옵션을 활성화하거나 비활성화할 수 있습니다. 자세한 내용은 [ CloudWatch RUM 웹 클라이언트 설명서](https://github.com/aws-observability/aws-rum-web/blob/main/docs/cdn_installation.md)를 참조하세요.

이러한 단원에서 논의한 대로 반드시 알고 있어야 하는 4가지 구성 옵션이 있습니다.

## 개인 정보를 포함할 수 있는 리소스 URL 수집 방지
<a name="CloudWatch-RUM-resourceURL"></a>

기본적으로 CloudWatch RUM 웹 클라이언트는 애플리케이션에서 다운로드한 리소스 URL을 기록하도록 구성됩니다. 이러한 리소스에는 HTML 파일, 이미지, CSS 파일, JavaScript 파일 등이 포함됩니다. 일부 애플리케이션의 경우 URL에 개인 식별 정보(PII)가 포함될 수 있습니다.

애플리케이션이 여기에 해당한다면 애플리케이션에 삽입하기 전에 코드 조각 구성에서.`recordResourceUrl: false` 설정을 통해 리소스 URL 수집을 비활성화할 것을 강력히 권장합니다.

## 페이지 보기 수동 기록
<a name="CloudWatch-RUM-pageload"></a>

기본적으로 웹 클라이언트는 페이지가 처음 로드할 때와 브라우저 기록 API가 호출될 때 페이지 보기를 기록합니다. 기본 페이지 ID는 `window.location.pathname`입니다. 그러나 경우에 따라 이 동작을 재정의하고 애플리케이션을 계측하여 페이지 보기를 프로그래밍 방식으로 기록할 수도 있습니다. 이렇게 하면 페이지 ID와 기록 시기를 제어할 수 있습니다. 변수 식별자가 있는 URI(예: `/entity/123` 또는 `/entity/456`)가 있는 웹 애플리케이션을 예로 들어 보겠습니다. 기본적으로 CloudWatch RUM은 경로 이름과 일치하는 고유한 페이지 ID를 가진 각 URI에 대해 페이지 보기 이벤트를 생성하지만, 대신 동일한 페이지 ID로 그룹화할 수 있습니다. 이렇게 하려면 `disableAutoPageView` 구성을 사용하여 웹 클라이언트의 페이지 보기 자동화를 사용하지 않도록 설정하고 `recordPageView` 명령을 사용하여 원하는 페이지 ID를 설정합니다. 자세한 내용은 GitHub의 [Application-specific Configurations](https://github.com/aws-observability/aws-rum-web/blob/main/docs/configuration.md)를 참조하세요.

**임베디드 스크립트 예:**

```
cwr('recordPageView', { pageId: 'entityPageId' });
```

**JavaScript 모듈 예:**

```
awsRum.recordPageView({ pageId: 'entityPageId' });
```

## X-Ray 종단 간 추적 활성화
<a name="CloudWatch-RUM-xraytraceheader"></a>

앱 모니터를 생성할 때 **Trace my service with AWS X-Ray**(으로 내 서비스 추적)을 선택하면 앱 모니터에서 샘플링한 사용자 세션 도중에 만들어진 `XMLHttpRequest` 및 `fetch` 요청 추적을 사용할 수 있습니다. 그런 다음, CloudWatch RUM 대시보드, X-Ray 트레이스 맵 및 트레이스 세부 정보 페이지에서 이러한 HTTP 요청의 트레이스를 볼 수 있습니다.

기본적으로 이러한 클라이언트 측 추적은 다운스트림 서버 측 추적에 연결되지 않습니다. 클라이언트 측 추적을 서버 측 추적에 연결하고 종단 간 추적을 활성화하려면 웹 클라이언트에서 `addXRayTraceIdHeader` 옵션을 `true`로 설정합니다. 이로 인해 CloudWatch RUM 웹 클라이언트가 HTTP 요청에 X-Ray 추적 헤더를 추가합니다.

다음 코드 블록은 클라이언트 측 추적을 추가하는 예를 보여줍니다. 가독성을 위해 이 샘플에서 일부 구성 옵션이 생략됩니다.

```
<script>
    (function(n,i,v,r,s,c,u,x,z){...})(
        'cwr',
        '00000000-0000-0000-0000-000000000000',
        '1.0.0',
        'us-west-2',
        'https://client.rum.us-east-1.amazonaws.com/1.0.2/cwr.js',
        {
            enableXRay: true,
            telemetries: [ 
                'errors', 
                'performance',
                [ 'http', { addXRayTraceIdHeader: true } ]
            ]
        }
    );
</script>
```

**주의**  
HTTP 요청에 X-Ray 추적 헤더를 추가하도록 CloudWatch RUM 웹 클라이언트를 구성하면 요청이 SigV4로 서명된 경우 cross-origin 리소스 공유(CORS)가 실패하거나 요청의 서명이 무효화될 수 있습니다. 자세한 내용은 [ CloudWatch RUM 웹 클라이언트 설명서](https://github.com/aws-observability/aws-rum-web/blob/main/docs/cdn_installation.md)를 참조하세요. 프로덕션 환경에서 클라이언트 측 X-Ray 추적 헤더를 추가하기 전에 애플리케이션을 테스트하는 것을 강력하게 권장합니다.

자세한 내용은 [ CloudWatch RUM 웹 클라이언트 설명서](https://github.com/aws-observability/aws-rum-web/blob/main/docs/cdn_installation.md#http)를 참조하세요.

## CloudWatch RUM에 서명되지 않은 요청 보내기
<a name="CloudWatch-RUM-unsigned"></a>

기본적으로 RUM 웹 클라이언트는 RUM으로 전송되는 모든 요청에 서명합니다. 클라이언트 구성에서 `signing:false`를 설정하면 요청이 CloudWatch RUM으로 전송될 때 서명되지 않습니다. 앱 모니터에 연결된 퍼블릭 리소스 기반 정책이 있는 경우에만 RUM에 데이터가 수집됩니다. 자세한 내용은 [CloudWatch RUM에서 리소스 기반 정책 사용](CloudWatch-RUM-resource-policies.md) 섹션을 참조하세요.

# 애플리케이션에 CloudWatch 앱 모니터 코드 조각 삽입
<a name="CloudWatch-RUM-get-started-insert-code-snippet"></a>

다음으로 이전 섹션에서 생성한 코드 조각을 애플리케이션에 삽입합니다.

**주의**  
코드 조각으로 다운로드 및 구성된 웹 클라이언트는 최종 사용자 데이터를 수집하기 위해 쿠키(또는 유사한 기술)를 사용합니다. 코드 조각을 삽입하기 전에 [콘솔에서 메타데이터 속성별로 필터링CloudWatch RUM을 통한 데이터 보호 및 데이터 프라이버시](CloudWatch-RUM-privacy.md) 섹션을 참고하세요.

이전에 생성된 코드 조각이 없는 경우 [이미 생성한 코드 조각을 찾으려면 어떻게 해야 한가요?](CloudWatch-RUM-find-code-snippet.md) 섹션의 지침에 따라 찾을 수 있습니다.

**애플리케이션에 CloudWatch RUM 코드 조각 삽입**

1. 복사하거나 다운로드한 코드 조각을 애플리케이션의 `<head>` 요소의 이전 섹션에 삽입합니다. `<body>` 요소 또는 기타 `<script>` 태그 앞에 삽입합니다.

   다음은 생성된 코드 조각의 예입니다.

   ```
   <script>
   (function (n, i, v, r, s, c, x, z) {
       x = window.AwsRumClient = {q: [], n: n, i: i, v: v, r: r, c: c};
       window[n] = function (c, p) {
           x.q.push({c: c, p: p});
       };
       z = document.createElement('script');
       z.async = true;
       z.src = s;
       document.head.insertBefore(z, document.getElementsByTagName('script')[0]);
   })('cwr',
       '194a1c89-87d8-41a3-9d1b-5c5cd3dafbd0',
       '1.0.0',
       'us-east-2',
       'https://client.rum.us-east-1.amazonaws.com/1.0.2/cwr.js',
       {
           sessionSampleRate: 1,
           identityPoolId: "us-east-2:c90ef0ac-e3b8-4d1a-b313-7e73cfd21443",
           endpoint: "https://dataplane.rum.us-east-2.amazonaws.com",
           telemetries: ["performance", "errors", "http"],
           allowCookies: true,
           enableXRay: false
       });
   </script>
   ```

1. 애플리케이션이 여러 페이지의 웹 애플리케이션인 경우 데이터 수집에 포함할 각 HTML 페이지에 대해 1단계를 반복해야 합니다.

# 사용자 이벤트를 생성하여 CloudWatch 앱 모니터 설정 테스트
<a name="CloudWatch-RUM-get-started-generate-data"></a>

코드 조각을 삽입하고 업데이트된 애플리케이션이 실행 중이면 수동으로 사용자 이벤트를 생성하여 테스트할 수 있습니다. 이 테스트를 하려면 다음을 수행하는 것이 좋습니다. 이 테스트에서는 표준 CloudWatch RUM 요금이 발생합니다.
+ 웹 애플리케이션의 페이지 사이를 탐색합니다.
+ 서로 다른 브라우저와 디바이스를 사용하여 여러 사용자 세션을 생성합니다.
+ 요청을 생성합니다.
+ JavaScript 오류를 유발합니다.

일부 이벤트를 생성한 후에는 CloudWatch RUM 대시보드에서 해당 이벤트를 확인합니다. 자세한 내용은 [CloudWatch RUM 대시보드 보기](CloudWatch-RUM-view-data.md) 섹션을 참조하세요.

사용자 세션의 데이터가 대시보드에 표시되는 데 최대 15분이 걸릴 수 있습니다.

애플리케이션에서 이벤트를 생성한 후 15분 후에 데이터가 표시되지 않으면 [CloudWatch RUM 문제 해결](CloudWatch-RUM-troubleshooting.md) 섹션을 참조하세요.

# CloudWatch RUM에서 리소스 기반 정책 사용
<a name="CloudWatch-RUM-resource-policies"></a>

CloudWatch RUM 앱 모니터에 리소스 정책을 연결할 수 있습니다. 기본적으로 앱 모니터에는 연결된 리소스 정책이 없습니다. CloudWatch RUM 리소스 기반 정책은 교차 계정 액세스를 지원하지 않습니다.

AWS 리소스 정책에 대해 자세히 알아보려면 [ID 기반 정책 및 리소스 기반 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)을 참조하세요.

리소스 정책 및 ID 정책 평가 방법에 대한 자세한 내용은 [정책 평가 로직](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)을 참조하세요.

IAM 정책 문법에 대한 자세한 내용은 [IAM JSON 정책 요소 참조](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)를 참조하세요.

## 지원되는 작업
<a name="RUM-resource-policies-actions"></a>

앱 모니터의 리소스 기반 정책은 `rum:PutRumEvents` 작업을 지원합니다.

## CloudWatch RUM에서 사용하는 샘플 정책
<a name="RUM-resource-policies-samples"></a>

다음 예제에서는 SigV4 자격 증명이 없는 사람을 포함하여 누구나 앱 모니터에 데이터를 쓸 수 있습니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "rum:PutRumEvents",
            "Resource": "arn:aws:rum:us-east-1:123456789012:appmonitor/app monitor name",
            "Principal": "*"
        }
    ]
}
```

------

지정된 소스 IP 주소를 차단하도록 `aws:SourceIp` 조건 키를 사용하여 정책을 수정할 수 있습니다. 이 예제에서는 이 정책을 사용하여 나열된 IP 주소의 PutRumEvents가 거부됩니다. 다른 IP 주소의 다른 요청은 모두 수락됩니다. 이 조건 키에 대한 자세한 내용은 IAM 사용 설명서의 [네트워크의 속성](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-network-properties)을 참조하세요.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "rum:PutRumEvents",
            "Resource": "arn:aws:rum:us-east-1:123456789012:appmonitor/AppMonitorName",
            "Principal": "*"
        },
        {
            "Effect": "Deny",
            "Action": "rum:PutRumEvents",
            "Resource": "arn:aws:rum:us-east-1:123456789012:appmonitor/AppMonitorName",
            "Principal": "*",
            "Condition": {
                "NotIpAddress": {
                "aws:SourceIp": "198.51.100.252"
                }
            }
        }
    ]
}
```

------

또한 `rum:alias` 서비스 컨텍스트 키를 사용하여 어떤 요청을 수락할지 제어할 수 있습니다.

웹 앱 모니터의 경우, GitHub의 [애플리케이션별 구성](https://github.com/aws-observability/aws-rum-web/blob/main/docs/configuration.md)에 설명된 대로 CloudWatch RUM 웹 클라이언트의 버전 1.20 이상을 사용하여 `Alias`를 전송하도록 웹 클라이언트를 구성해야 합니다.

모바일 앱 모니터의 경우 SDK에 따라 계측을 구성해야 합니다.
+ iOS 애플리케이션은 [AWS Distro for OpenTelemetry(ADOT) iOS SDK](https://github.com/aws-observability/aws-otel-swift)를 사용합니다.
+ Android 애플리케이션은 [AWS Distro for OpenTelemetry(ADOT) Android SDK](https://github.com/aws-observability/aws-otel-android)를 사용합니다.

다음 예제에서 리소스 정책에 따라 이벤트를 수락하려면 요청에 `alias1` 또는 `alias2`를 포함해야 합니다.

```
    {
    "Version":"2012-10-17",                   
    "Statement": [
        {
            "Sid": "AllowRUMPutEvents",
            "Effect": "Allow",
            "Action": "rum:PutRumEvents",
            "Resource": "arn:aws:rum:us-east-1:123456789012:appmonitor/MyApplication",
            "Principal": "*",
            "Condition": {
                "StringEquals": {
                    "rum:alias":["alias1", "alias2"]
                }
            }
        }
    ]
}
```

# CloudWatch RUM 웹 클라이언트 구성
<a name="CloudWatch-RUM-configure-client"></a>

애플리케이션은 CloudWatch RUM에서 생성한 코드 조각 중 하나를 사용하여 CloudWatch RUM 웹 클라이언트를 설치할 수 있습니다. 생성된 조각은 NPM을 통한 JavaScript 모듈이나 콘텐츠 전송 네트워크(CDN)의 두 가지 설치 방법을 지원합니다. 최상의 성능을 내려면 NPM 설치 방법을 사용하는 것이 좋습니다. 이 방법의 사용에 대한 자세한 내용은 [JavaScript 모듈로 설치](https://github.com/aws-observability/aws-rum-web/blob/main/docs/npm_installation.md)를 참조하세요.

CDN 설치 옵션을 사용하는 경우 광고 차단기가 CloudWatch RUM에서 제공하는 기본 CDN을 차단할 수 있습니다. 이렇게 하면 광고 차단기를 설치한 사용자에 대해 애플리케이션 모니터링이 사용 중지됩니다. 따라서 CloudWatch RUM이 포함된 초기 온보딩에만 기본 CDN을 사용하는 것이 좋습니다. 이 문제를 완화하는 방법에 대한 자세한 내용은 [애플리케이션 계측](https://github.com/aws-observability/aws-rum-web/blob/main/docs/cdn_installation.md#instrument-the-application)을 참조하세요.

코드 조각은 HTML 파일의 `<head>` 태그에 위치하고, 웹 클라이언트를 다운로드한 다음 모니터링 중인 애플리케이션에 대한 웹 클라이언트를 구성하여 웹 클라이언트를 설치합니다. 코드 조각은 다음과 비슷하게 보이는 자체 실행 함수입니다. 이 예제에서는 가독성을 위해 코드 조각 함수의 본문이 생략되었습니다.

```
<script>
(function(n,i,v,r,s,c,u,x,z){...})(
'cwr',
'00000000-0000-0000-0000-000000000000',
'1.0.0',
'us-west-2',
'https://client.rum.us-east-1.amazonaws.com/1.0.2/cwr.js',
{ /* Configuration Options Here */ }
);
<script>
```

## 인수
<a name="CloudWatch-RUM-configure-client-arguments"></a>

코드 조각은 6개의 인수를 허용합니다.
+ 웹 클라이언트에서 명령을 실행하기 위한 네임스페이스(예: `'cwr'`)
+ 앱 모니터의 ID(예: `'00000000-0000-0000-0000-000000000000'`)
+ 애플리케이션 버전(예: `'1.0.0'`)
+ 앱 모니터의 AWS 리전(예: `'us-west-2'`)
+ 웹 클라이언트 URL(예: `'https://client.rum.us-east-1.amazonaws.com/1.0.2/cwr.js'`)
+ 애플리케이션별 구성 옵션 자세한 내용은 다음 섹션을 참조하세요.

## 오류 무시
<a name="CloudWatch-RUM-configure-ignore-errors"></a>

CloudWatch RUM 웹 클라이언트는 애플리케이션에서 발생하는 모든 유형의 오류를 수신합니다. CloudWatch RUM 대시보드에 표시하지 않으려는 JavaScript 오류가 애플리케이션에서 전달되는 경우, 이러한 오류를 필터링하고 CloudWatch RUM 대시보드에 관련 오류 이벤트만 표시하도록 CloudWatch RUM 웹 클라이언트를 구성할 수 있습니다. 예를 들어 일부 JavaScript 오류에 대한 수정 사항을 이미 식별했고 방대한 오류의 양으로 인해 다른 오류가 가려지는 경우 대시보드에 일부 JavaScript 오류를 표시하지 않도록 선택할 수 있습니다. 또한 서드 파티가 소유한 라이브러리의 소유이기 때문에 수정할 수 없는 오류를 무시할 수도 있습니다.

특정 JavaScript 오류를 필터링하도록 웹 클라이언트를 구성하는 방법에 대한 자세한 내용은 웹 클라이언트 Github 설명서에서 [오류](https://github.com/aws-observability/aws-rum-web/blob/main/docs/configuration.md#errors)의 예를 참조하세요.

## 구성 옵션
<a name="CloudWatch-RUM-configure-options"></a>

CloudWatch RUM 웹 클라이언트에서 사용할 수 있는 구성 옵션에 대한 자세한 내용은 [ CloudWatch RUM 웹 클라이언트 설명서](https://github.com/aws-observability/aws-rum-web/blob/main/docs/configuration.md)를 참조하세요.

# JavaScript 오류 스택 트레이스의 축소 해제 활성화
<a name="CloudWatch-RUM-JavaScriptStackTraceSourceMaps"></a>

웹 애플리케이션 JavaScript 소스 코드가 축소되면 오류 스택 트레이스를 읽기 어려울 수 있습니다. 소스 맵을 Amazon S3에 업로드하여 스택 트레이스에 대한 축소 해제를 활성화할 수 있습니다. CloudWatch RUM은 소스 맵을 검색하여 축소된 소스 코드의 라인 및 열 번호를 축소되지 않은 원래 소스 코드에 다시 매핑합니다. 이를 통해 오류 스택 트레이스의 가독성이 향상되고 원래 소스 코드에서 오류 위치를 식별할 수 있습니다.

## 요구 사항 및 구문
<a name="CloudWatch-RUM-RequirementsJavaScriptStackTraceSourceMaps"></a>

소스 맵은 다양한 릴리스에서 웹 애플리케이션의 문제를 디버깅하고 추적하는 데 매우 중요합니다. 각 웹 애플리케이션 릴리스에 고유한 소스 맵이 있는지 확인합니다. 각 릴리스에는 고유한 releaseId가 있어야 합니다. releaseId는 1\$1200자의 문자열이어야 하며 문자, 숫자, 밑줄, 하이픈, 콜론, 슬래시 및 마침표만 포함할 수 있습니다. `releaseId`를 RUM 이벤트에 메타데이터로 추가하려면 CloudWatch RUM 웹 클라이언트를 구성합니다.

소스 맵은 [소스 맵 V3 사양](https://sourcemaps.info/spec.html)에 정의된 구조를 따르는 일반 JSON 파일이어야 합니다. `version`, `file`, `sources`, `names`, `mappings` 필드는 필수입니다.

각 소스 맵의 크기가 50MB 제한을 초과하지 않는지 확인합니다. 또한 RUM 서비스는 스택 트레이스당 최대 50MB의 소스 맵만 검색합니다. 필요한 경우 소스 코드를 여러 개의 작은 청크로 분할합니다. 자세한 내용은 [WebpackJS를 사용한 코드 분할](https://webpack.js.org/guides/code-splitting/)을 참조하세요.

**Topics**
+ [요구 사항 및 구문](#CloudWatch-RUM-RequirementsJavaScriptStackTraceSourceMaps)
+ [RUM 서비스 액세스를 허용하도록 Amazon S3 버킷 리소스 정책 구성](#CloudWatch-RUM-ConfigureS3)
+ [소스 맵 업로드](#CloudWatch-RUM-UploadSourceMaps)
+ [CloudWatch RUM 웹 클라이언트에서 releaseId 구성](#CloudWatch-RUM-ConfigureRumID)
+ [CloudWatch RUM 앱 모니터를 활성화하여 JavaScript 스택 트레이스 축소 해제](#CloudWatch-RUM-unminifyjavascript)
+ [RUM 콘솔에서 축소되지 않은 스택 트레이스 보기](#CloudWatch-RUM-viewunminifiedstacktraces)
+ [CloudWatch Logs에서 축소되지 않은 스택 트레이스 보기](#CloudWatch-RUM-viewunminifiedstacktracesCWL)
+ [소스 맵 문제 해결](#CloudWatch-RUM-troubleshootsourcemaps)

## RUM 서비스 액세스를 허용하도록 Amazon S3 버킷 리소스 정책 구성
<a name="CloudWatch-RUM-ConfigureS3"></a>

Amazon S3 버킷이 RUM appMonitor와 동일한 리전에 있는지 확인합니다. 소스 맵 파일을 검색하기 위한 RUM 서비스 액세스를 허용하도록 Amazon S3 버킷을 구성합니다. `aws:SourceArn` 및 `aws:SourceAccount` 전역 조건 컨텍스트 키를 포함하여 리소스에 대한 서비스의 권한을 제한합니다. 이는 [혼동된 대리자 문제](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)를 방지하는 가장 효과적인 방법입니다.

다음 예에서는 Amazon S3에서 `aws:SourceArn` 및 `aws:SourceAccount` 전역 조건 컨텍스트 키를 사용하여 혼동된 대리자 문제를 방지하는 방법을 보여줍니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "RUM Service S3 Read Permissions",
            "Effect": "Allow",
            "Principal": {
                "Service": "rum.amazonaws.com"
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::BUCKET_NAME",
                "arn:aws:s3:::BUCKET_NAME/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "ACCOUNT_ID",
                    "aws:SourceArn": "arn:aws:rum:REGION:ACCOUNT_ID:appmonitor/APP_MONITOR_NAME"
                }
            }
        }
    ]
}
```

------

AWS KMS 키를 사용하여 데이터를 암호화하는 경우 키를 사용하여 소스 맵 파일을 검색할 수 있는 액세스 권한을 RUM 서비스에 부여하기 위해 `aws:SourceArn` 및 `aws:SourceAccount` 전역 조건 컨텍스트 키를 포함하도록 키의 리소스 정책이 유사하게 구성되어 있는지 확인합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "RUM Service KMS Read Permissions",
            "Effect": "Allow",
            "Principal": {
                "Service": "rum.amazonaws.com"
            },
            "Action": "kms:Decrypt",
            "Resource": "arn:aws:kms:us-east-1:123456789012:key/KEY_ID",
            "Condition": {
                "StringEquals": {
                "aws:SourceAccount": "123456789012",
    "aws:SourceArn": "arn:aws:rum:us-east-1:123456789012/APP_MONITOR_NAME"
                }
            }
        }
    ]
}
```

------

## 소스 맵 업로드
<a name="CloudWatch-RUM-UploadSourceMaps"></a>

축소 중에 소스 맵을 생성하도록 JavaScript 번들을 구성합니다. 애플리케이션을 빌드하면 번들은 축소된 JavaScript 파일과 해당 소스 맵이 포함된 디렉터리(예: dist)를 생성합니다. 아래 예제를 참조하십시오.

```
./dist
    |-index.d5a07c87.js
    |-index.d5a07c87.js.map
```

Amazon S3 버킷에 소스 맵 파일을 업로드합니다. 파일은 이름이 `releaseId`인 폴더에 있어야 합니다. 예를 들어 버킷 이름이 `my-application-source-maps`이고 `releaseId`가 2.0.0인 경우 소스 맵 파일은 다음 위치에 있습니다.

```
my-application-source-maps
    |-2.0.0
        |-index.d5a07c87.js.map
```

소스 맵 업로드를 자동화하려면 다음 bash 스크립트를 생성하고 빌드 프로세스의 일부로 실행하면 됩니다.

```
#!/bin/bash
# Ensure the script is called with required arguments
if [ "$#" -ne 2 ]; then
 echo "Usage: $0 S3_BUCKET_NAME RELEASE_ID"
 exit 1
fi

# Read arguments
S3_BUCKET="$1"
RELEASE_ID="$2"

# Set the path to your build directory
BUILD_DIR="./dist"


# Upload all .map files recursively
 if aws s3 cp "$BUILD_DIR" "s3://$S3_BUCKET/$RELEASE_ID/" --recursive --exclude "*" --include "*.map"; then
    echo "Successfully uploaded all source map files"
else
    echo "Failed to upload source map files"
fi
```

## CloudWatch RUM 웹 클라이언트에서 releaseId 구성
<a name="CloudWatch-RUM-ConfigureRumID"></a>

CloudWatch RUM은 구성된 `releaseId`를 사용하여 소스 맵 파일을 검색할 폴더를 결정합니다. `releaseId`에 소스 맵 파일 폴더와 동일한 이름을 지정합니다. 위의 제공된 bash 스크립트 또는 유사한 스크립트를 사용한 경우 스크립트에 구성된 `releaseId`는 CloudWatch RUM 웹 클라이언트에 구성된 것과 동일해야 합니다. 버전 1.21.0 이상의 CloudWatch RUM 웹 클라이언트를 사용해야 합니다.

```
import { AwsRum, AwsRumConfig } from "aws-rum-web";

try {
    const config: AwsRumConfig = {
        sessionSampleRate: 1,
        endpoint: "https://dataplane.rum.us-west-2.amazonaws.com",
        telemetries: ["performance", "errors", "http"],
        allowCookies: true,
        releaseId: "RELEASE_ID", //Add this
    };

    const APPLICATION_ID: string = "APP_MONITOR_ID";
    const APPLICATION_VERSION: string = "1.0.0";
    const APPLICATION_REGION: string = "us-west-2";

    new AwsRum(APPLICATION_ID, APPLICATION_VERSION, APPLICATION_REGION, config);
} catch (error: any) {
    // Ignore errors thrown during CloudWatch RUM web client initialization
}
```

## CloudWatch RUM 앱 모니터를 활성화하여 JavaScript 스택 트레이스 축소 해제
<a name="CloudWatch-RUM-unminifyjavascript"></a>

JavaScript 스택 트레이스 축소를 해제하려면 앱 모니터의 SourceMap 상태를 `ENABLED`로 설정합니다. 앱 모니터의 모든 소스 맵이 포함된 버킷 또는 폴더에 해당하는 Amazon S3 URI를 입력합니다.

소스 맵을 기본 버킷(하위 폴더 아님)에 직접 저장할 때는 Amazon S3 URI의 형식을 `Amazon S3://BUCKET_NAME`으로 지정해야 합니다. 이 경우 소스 맵 파일은 다음 위치에 있어야 합니다.

```
BUCKET_NAME
    |- RELEASE_ID
        |-index.d5a07c87.js.map
```

하위 디렉터리가 루트인 경우 Amazon S3 URI는 `Amazon S3://BUCKET_NAME/DIRECTORY` 형식으로 지정되어야 합니다. 이 경우 소스 맵 파일은 다음 위치에 있어야 합니다.

```
BUCKET_NAME
    |- DIRECTORY
        |-RELEASE_ID
            |-index.d5a07c87.js.map
```

## RUM 콘솔에서 축소되지 않은 스택 트레이스 보기
<a name="CloudWatch-RUM-viewunminifiedstacktraces"></a>

소스 맵을 Amazon S3에 업로드하고, RUM 앱 모니터에서 소스 맵을 활성화하고, CloudWatch RUM 웹 클라이언트에 구성된 `releaseId`를 사용하여 웹 애플리케이션을 배포한 후 RUM 콘솔에서 **이벤트**를 선택합니다. 이 탭에는 원시 RUM 이벤트 데이터가 표시됩니다. JS 오류 이벤트 유형을 기준으로 필터링하고 최신 JS 오류 이벤트를 확인합니다. 기능이 활성화된 후 수집되는 이벤트에 대해 축소되지 않은 스택 트레이스가 새 `event_details.unminifiedStack` 필드에 표시됩니다.

## CloudWatch Logs에서 축소되지 않은 스택 트레이스 보기
<a name="CloudWatch-RUM-viewunminifiedstacktracesCWL"></a>

**데이터 스토리지**를 켜서 CloudWatch Logs에서 RUM 이벤트 스토리지를 활성화합니다. 활성화되면 새 **event\$1details.unminifiedStack** 필드를 검색할 수 있습니다. 이를 통해 CloudWatch Logs 쿼리를 사용하여 여러 세션에서 추세를 분석하고 문제를 연관시킬 수 있습니다.

## 소스 맵 문제 해결
<a name="CloudWatch-RUM-troubleshootsourcemaps"></a>

CloudWatch RUM은 소스 맵 설정 문제를 해결하기 위해 즉시 사용 가능한 지표를 제공합니다. 이러한 지표는 `AWS/RUM`이라는 지표 네임스페이스에 게시됩니다. 다음 지표는 application\$1name 차원으로 게시됩니다. 이 차원값은 앱 모니터 이름입니다. 해당 지표는 `aws:releaseId` 차원으로도 게시됩니다. 이 차원의 값은 JavaScript 오류 이벤트와 연관된 `releaseId`입니다.


| MetricName | 단위 | 설명 | 
| --- | --- | --- | 
|  UnminifyLineFailureCount  |  개수  |  축소 해제에 실패한 JS 오류 이벤트의 스택 트레이스 라인 수입니다. 실패에 대한 추가 세부 정보는 event\$1details.unminifiedStack 필드에서 실패한 특정 라인에 추가됩니다.  | 
|  UnminifyLineSuccessCount  |  개수  | 축소 해제된 JS 오류 이벤트의 스택 트레이스 라인 수입니다. | 
| UnminifyEventFailureCount | 개수 | 라인 축소 해제에 실패한 JS 오류 이벤트 수입니다. 실패에 대한 추가 세부 정보는 event\$1details.unminifiedStack 필드에 추가됩니다. | 
| UnminifyEventSuccessCount | 개수 | 하나 이상의 스택 트레이스 라인이 축소되지 않은 상태로 성공한 JS 오류 이벤트 수입니다. | 

CloudWatch RUM은 다음을 포함하되 이에 국한되지 않는 다양한 이유로 스택 트레이스의 라인을 축소 해제하지 못할 수 있습니다.
+ 권한 문제로 인해 해당 소스 맵 파일을 검색하지 못했습니다. 버킷 리소스 정책이 올바르게 구성되었는지 확인합니다.
+ 해당 소스 맵 파일이 존재하지 않습니다. 소스 맵 파일이 CloudWatch RUM 웹 클라이언트에 구성된 releaseId와 동일한 이름의 올바른 버킷 또는 폴더에 업로드되었는지 확인합니다.
+ 해당 소스 맵 파일이 너무 큽니다. 소스 코드를 더 작은 청크로 분할합니다.
+ 스택 트레이스에 대해 이미 50MB의 소스 맵 파일이 검색되었습니다. 서비스 측 제한으로 인해 스택 트레이스 길이를 50MB로 줄입니다.
+ 소스 맵이 유효하지 않아 인덱싱할 수 없습니다. 소스 맵이 소스 맵 V3 사양에 정의된 구조를 따르는 일반 JSON이고 버전, 파일, 소스, 이름, 매핑 필드가 포함되어 있는지 확인합니다.
+ 소스 맵이 축소된 소스 코드를 축소되지 않은 스택 트레이스에 다시 매핑할 수 없습니다. 소스 맵이 지정된 releaseId에 대해 올바른 소스 맵인지 확인합니다.

# 지역화
<a name="CloudWatch-RUM-Regionalization"></a>

이 섹션에서는 다양한 리전의 애플리케이션과 함께 CloudWatch RUM을 사용하는 전략을 설명합니다.

## 애플리케이션이 여러 AWS 리전에 배포되어 있음
<a name="CloudWatch-RUM-Regionalization-multiple"></a>

애플리케이션이 여러 AWS 리전에 배포되어 있는 경우 다음과 같은 3가지 옵션을 사용할 수 있습니다.
+ 하나의 계정으로 하나의 리전에 하나의 앱 모니터를 배포하여 모든 리전에 서비스를 제공합니다.
+ 각 리전에 대해 고유한 계정으로 별도의 앱 모니터를 배포합니다.
+ 하나의 계정으로 각 리전에 대해 별도의 앱 모니터를 배포할 수 있습니다.

하나의 앱 모니터를 사용하면 모든 데이터가 하나의 시각화로 중앙 집중화되고 모든 로그가 CloudWatch Logs의 동일한 로그 그룹에 기록된다는 이점이 있습니다. 단일 앱 모니터를 사용하면 요청에 대한 추가 지연 시간이 적고 단일 장애 지점이 있습니다.

여러 개의 앱 모니터를 사용하면 단일 장애 지점은 제거되지만 모든 데이터가 하나의 시각화로 결합되지 않습니다.

### 내 애플리케이션이 배포된 일부 지역에서 CloudWatch RUM이 시작되지 않았습니다.
<a name="CloudWatch-RUM-Regionalization-notavailable"></a>

CloudWatch RUM은 여러 지역에 출시되어 광범위한 지역 서비스를 제공합니다. 사용 가능한 지역에서 CloudWatch RUM을 설정하면 혜택을 누릴 수 있습니다. 최종 사용자는 연결 중인 리전에서 앱 모니터를 설정한 경우 어디에 있더라도 세션에 포함될 수 있습니다.

그러나 CloudWatch RUM은 중국 내 리전에서 아직 출시되지 않았습니다. 이러한 지역에서는 CloudWatch RUM으로 데이터를 전송할 수 없습니다.

# 페이지 그룹 사용
<a name="CloudWatch-RUM-page-groups"></a>

페이지 그룹을 사용하여 애플리케이션의 여러 페이지를 서로 연결함으로써 페이지 그룹에 대한 집계된 분석을 확인할 수 있습니다. 예를 들어 모든 랜딩 페이지의 집계된 페이지 로드 시간을 확인할 수 있습니다.ag 

CloudWatch RUM 웹 클라이언트의 페이지 보기 이벤트에 태그를 하나 이상 추가하여 페이지를 페이지 그룹에 넣을 수 있습니다. 다음 예에서는 `/home` 페이지를 `en`이라는 페이지 그룹과 `landing`이라는 페이지 그룹에 넣습니다.

**임베디드 스크립트 예**

```
cwr('recordPageView', { pageId: '/home', pageTags: ['en', 'landing']});
```

**JavaScript 모듈 예**

```
awsRum.recordPageView({ pageId: '/home', pageTags: ['en', 'landing']});
```

**참고**  
페이지 그룹은 여러 페이지에서 분석을 쉽게 집계하기 위한 것입니다. 애플리케이션에 대해 `pageIds`를 정의하고 조작하는 방법에 대한 자세한 내용은 [코드 조각을 수정하여 CloudWatch RUM 웹 클라이언트 구성(선택 사항)](CloudWatch-RUM-modify-snippet.md)의 **페이지 조회 수 수동으로 기록하기** 섹션을 참조하세요.

# 사용자 지정 메타데이터 지정
<a name="CloudWatch-RUM-custom-metadata"></a>

CloudWatch RUM은 각 이벤트에 추가 데이터를 메타데이터로 첨부합니다. 이벤트 메타데이터는 키-값 페어 형식의 속성으로 구성됩니다. 이러한 속성을 사용하여 CloudWatch RUM 콘솔에서 이벤트를 검색하거나 필터링할 수 있습니다. 기본적으로 CloudWatch RUM은 사용자를 위해 몇 가지 메타데이터를 생성합니다. 기본 메타데이터에 대한 자세한 내용은 [RUM 이벤트 메타데이터](CloudWatch-RUM-datacollected.md#CloudWatch-RUM-datacollected-metadata) 섹션을 참조하세요.

CloudWatch RUM 웹 클라이언트를 사용하여 CloudWatch RUM 이벤트에 사용자 지정 메타데이터를 추가할 수도 있습니다. 사용자 지정 메타데이터는 세션 속성과 페이지 속성을 포함할 수 있습니다.

사용자 지정 메타데이터를 추가하려면 버전 1.10.0 이상의 CloudWatch RUM 웹 클라이언트를 사용해야 합니다.

## 요구 사항 및 구문
<a name="CloudWatch-RUM-custom-metadata-syntax"></a>

각 이벤트는 메타데이터에 최대 10개의 사용자 지정 속성을 포함할 수 있습니다. 사용자 지정 속성의 구문 요구 사항은 다음과 같습니다.
+ **키**
  + 최대 128자입니다.
  + 영숫자 문자, 콜론(:) 및 밑줄(\$1)을 포함할 수 있습니다.
  + `aws:`으로 시작할 수 없습니다.
  + 다음 섹션에 나열된 예약 키워드로만 구성될 수 없습니다. 해당 키워드를 더 긴 키 이름의 일부로 사용할 수 있습니다.
+ **값**
  + 최대 256자입니다.
  + 문자열, 숫자 또는 부울 값이어야 합니다.

**예약어**

다음 예약 키워드는 전체 키 이름으로 사용할 수 없습니다. `applicationVersion`과 같은 더 긴 키 이름의 일부로 다음 키워드를 사용할 수 있습니다.
+ `browserLanguage`
+ `browserName`
+ `browserVersion`
+ `countryCode`
+ `deviceType`
+ `domain`
+ `interaction`
+ `osName`
+ `osVersion`
+ `pageId`
+ `pageTags`
+ `pageTitle`
+ `pageUrl`
+ `parentPageId`
+ `platformType`
+ `referrerUrl`
+ `subdivisionCode`
+ `title`
+ `url`
+ `version`

**참고**  
CloudWatch RUM은 속성에 유효하지 않은 키 또는 값이 포함되어 있거나 이벤트당 사용자 지정 속성 제한 10개에 이미 도달한 경우 RUM 이벤트에서 사용자 지정 속성을 제거합니다.

## 세션 속성 추가
<a name="CloudWatch-RUM-session-attributes"></a>

사용자 지정 세션 속성을 구성하면 해당 속성이 세션의 모든 이벤트에 추가됩니다. CloudWatch RUM 웹 클라이언트 초기화 중 또는 런타임에 `addSessionAttributes` 명령을 사용하여 세션 속성을 구성합니다.

예를 들어, 애플리케이션의 버전을 세션 속성으로 추가할 수 있습니다. 그런 다음 CloudWatch RUM 콘솔에서 버전별로 오류를 필터링하여 오류율 증가가 애플리케이션의 특정 버전과 관련이 있는지 확인할 수 있습니다.

**초기화 시 세션 속성 추가, NPM 예제**

굵게 표시된 코드 섹션은 세션 속성을 추가합니다.

```
import { AwsRum, AwsRumConfig } from 'aws-rum-web';

try {
  const config: AwsRumConfig = {
    allowCookies: true,
    endpoint: "https://dataplane.rum.us-west-2.amazonaws.com",
    guestRoleArn: "arn:aws:iam::000000000000:role/RUM-Monitor-us-west-2-000000000000-00xx-Unauth",
    identityPoolId: "us-west-2:00000000-0000-0000-0000-000000000000",
    sessionSampleRate: 1,
    telemetries: ['errors', 'performance'],
    sessionAttributes: {
        applicationVersion: "1.3.8"
    }
  };

  const APPLICATION_ID: string = '00000000-0000-0000-0000-000000000000';
  const APPLICATION_VERSION: string = '1.0.0';
  const APPLICATION_REGION: string = 'us-west-2';

  const awsRum: AwsRum = new AwsRum(
    APPLICATION_ID,
    APPLICATION_VERSION,
    APPLICATION_REGION,
    config
  );
} catch (error) {
  // Ignore errors thrown during CloudWatch RUM web client initialization
}
```

**런타임 시 세션 속성 추가, NPM 예제**

```
awsRum.addSessionAttributes({ 
    applicationVersion: "1.3.8"    
})
```

**초기화 시 세션 속성 추가, 임베디드 스크립트 예제**

굵게 표시된 코드 섹션은 세션 속성을 추가합니다.

```
<script>
    (function(n,i,v,r,s,c,u,x,z){...})(
        'cwr',
        '00000000-0000-0000-0000-000000000000',
        '1.0.0',
        'us-west-2',
        'https://client.rum.us-east-1.amazonaws.com/1.0.2/cwr.js',
        {
            sessionSampleRate:1,
            guestRoleArn:'arn:aws:iam::000000000000:role/RUM-Monitor-us-west-2-000000000000-00xx-Unauth',
            identityPoolId:'us-west-2:00000000-0000-0000-0000-000000000000',
            endpoint:'https://dataplane.rum.us-west-2.amazonaws.com',
            telemetries:['errors','http','performance'],
            allowCookies:true,
            sessionAttributes: {
                applicationVersion: "1.3.8"
            }
        }
    );
</script>
```

**런타임 시 세션 속성 추가, 임베디드 스크립트 예제**

```
<script>
    function addSessionAttribute() {
        cwr('addSessionAttributes', {
            applicationVersion: "1.3.8"
        })
    }
            
</script>
```

## 페이지 속성 추가
<a name="CloudWatch-RUM-page-attributes"></a>

사용자 지정 페이지 속성을 구성하면 해당 속성이 현재 페이지의 모든 이벤트에 추가됩니다. CloudWatch RUM 웹 클라이언트 초기화 중 또는 런타임에 `recordPageView` 명령을 사용하여 페이지 속성을 구성합니다.

예를 들어, 페이지 템플릿을 페이지 속성으로 추가할 수 있습니다. 그런 다음 CloudWatch RUM 콘솔에서 페이지 템플릿별로 오류를 필터링하여 오류율 증가가 애플리케이션의 특정 페이지 템플릿과 관련이 있는지 확인할 수 있습니다.

**초기화 시 페이지 속성 추가, NPM 예제**

굵게 표시된 코드 섹션은 페이지 속성을 추가합니다.

```
const awsRum: AwsRum = new AwsRum(
    APPLICATION_ID,
    APPLICATION_VERSION,
    APPLICATION_REGION,
    { disableAutoPageView:  true // optional }
);
awsRum.recordPageView({  
    pageId:'/home',  
    pageAttributes: {
      template: 'artStudio'
    }
});
const credentialProvider = new CustomCredentialProvider();
if(awsCreds) awsRum.setAwsCredentials(credentialProvider);
```

**런타임 시 페이지 속성 추가, NPM 예제**

```
awsRum.recordPageView({ 
    pageId: '/home', 
    pageAttributes: {
        template: 'artStudio'
    } 
});
```

**초기화 시 페이지 속성 추가, 임베디드 스크립트 예제**

굵게 표시된 코드 섹션은 페이지 속성을 추가합니다.

```
<script>
    (function(n,i,v,r,s,c,u,x,z){...})(
        'cwr',
        '00000000-0000-0000-0000-000000000000',
        '1.0.0',
        'us-west-2',
        'https://client.rum.us-east-1.amazonaws.com/1.0.2/cwr.js',
        {
            disableAutoPageView: true //optional
        }
    );
    cwr('recordPageView', { 
       pageId: '/home',  
       pageAttributes: {
           template: 'artStudio'
       }
    });
    const awsCreds = localStorage.getItem('customAwsCreds');
    if(awsCreds) cwr('setAwsCredentials', awsCreds)
</script>
```

**런타임 시 페이지 속성 추가, 임베디드 스크립트 예제**

```
<script>
    function recordPageView() {
        cwr('recordPageView', { 
            pageId: '/home', 
            pageAttributes: {
                template: 'artStudio'
            }
        });
    }        
</script>
```

## 콘솔에서 메타데이터 속성별로 필터링
<a name="CloudWatch-RUM-custom-attiributes-console"></a>

CloudWatch RUM 콘솔에서 기본 제공 또는 사용자 지정 메타데이터 속성으로 시각화를 필터링하려면 검색 창을 사용하세요. 검색 창에서 시각화에 적용할 필터 용어를 **key=value** 형식으로 20개까지 지정할 수 있습니다. 예를 들어 Chrome 브라우저에 대한 데이터만 필터링하려면 **browserName=Chrome**이라는 필터 용어를 추가할 수 있습니다.

기본적으로 CloudWatch RUM 콘솔은 검색 창의 드롭다운에 표시할 가장 일반적인 속성 키 및 값 100개를 검색합니다. 더 많은 메타데이터 속성을 필터 용어로 추가하려면 검색 창에 전체 속성 키와 값을 입력합니다.

필터는 최대 20개의 필터 용어를 포함할 수 있으며 앱 모니터당 최대 20개의 필터를 저장할 수 있습니다. 필터를 저장하면 **Saved filters**(저장된 필터) 드롭다운에 저장됩니다. 저장된 필터를 삭제할 수도 있습니다.

# 사용자 지정 이벤트 전송
<a name="CloudWatch-RUM-custom-events"></a>

CloudWatch RUM은 [CloudWatch RUM 웹 클라이언트에서 수집한 정보](CloudWatch-RUM-datacollected.md)에 나열된 이벤트를 기록하고 수집합니다. CloudWatch RUM 웹 클라이언트 버전 1.12.0 이상을 사용하는 경우 추가 사용자 지정 이벤트를 정의, 기록 및 전송할 수 있습니다. 정의하는 각 이벤트 유형에 대해 전송할 이벤트 유형 이름과 데이터를 정의합니다. 각 사용자 지정 이벤트 페이로드는 최대 6KB일 수 있습니다.

사용자 지정 이벤트는 앱 모니터에 사용자 지정 이벤트가 활성화된 경우에만 수집됩니다. 앱 모니터의 구성 설정을 업데이트하려면 CloudWatch RUM 콘솔 또는 [UpdateAppMonitor](https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_UpdateAppMonitor.html) API를 사용하세요.

사용자 지정 이벤트를 활성화한 다음 정의하고 전송한 후 검색할 수 있습니다. 사용자 지정 이벤트를 검색하려면 CloudWatch RUM 콘솔의 **Events**(이벤트) 탭을 사용합니다. 이벤트 유형을 사용하여 검색합니다.

## 요구 사항 및 구문
<a name="CloudWatch-RUM-custom-event-syntax"></a>

사용자 지정 이벤트는 이벤트 유형과 이벤트 세부 정보로 구성됩니다. 다음은 이들에 대한 요구 사항입니다.
+ **이벤트 유형**
  + 이벤트의 **type**(유형) 또는 **name**(이름)일 수 있습니다. 예를 들어 **JsError**라는 CloudWatch RUM 기본 제공 이벤트 유형의 이벤트 유형은 `com.amazon.rum.js_error_event`입니다.
  + 1\$1256자여야 합니다.
  + 영숫자, 밑줄, 하이픈 및 마침표의 조합일 수 있습니다.
+ **이벤트 세부 정보**
  + CloudWatch RUM에 기록하려는 실제 데이터를 포함합니다.
  + 필드와 값으로 구성된 객체여야 합니다.

## 사용자 지정 이벤트 기록의 예
<a name="CloudWatch-RUM-custom-event-examples"></a>

CloudWatch RUM 웹 클라이언트에서 사용자 지정 이벤트를 기록하는 방법에는 두 가지가 있습니다.
+ CloudWatch RUM 웹 클라이언트의 `recordEvent` API를 사용합니다.
+ 사용자 지정 플러그인을 사용합니다.

**`recordEvent` API, NPM 예제를 사용하여 사용자 지정 이벤트 전송**

```
awsRum.recordEvent('my_custom_event', {
        location: 'IAD', 
        current_url: 'amazonaws.com', 
        user_interaction: {
            interaction_1 : "click",
            interaction_2 : "scroll"
        }, 
        visit_count:10
    }
)
```

**`recordEvent` API, 임베디드 스크립트 예제를 사용하여 사용자 지정 이벤트 전송**

```
cwr('recordEvent', {
    type: 'my_custom_event', 
    data: {
        location: 'IAD', 
        current_url: 'amazonaws.com', 
        user_interaction: {
            interaction_1 : "click",
            interaction_2 : "scroll"
        }, 
        visit_count:10
    }
})
```

**사용자 지정 플러그인을 사용하여 사용자 지정 이벤트를 전송하는 예**

```
// Example of a plugin that listens to a scroll event, and
// records a 'custom_scroll_event' that contains the timestamp of the event.
class MyCustomPlugin implements Plugin {
    // Initialize MyCustomPlugin.
    constructor() {
        this.enabled;
        this.context;
        this.id = 'custom_event_plugin';
    }
    // Load MyCustomPlugin.
    load(context) {
        this.context = context;
        this.enable();
    }
    // Turn on MyCustomPlugin.
    enable() {
        this.enabled = true;
        this.addEventHandler();
    }
    // Turn off MyCustomPlugin.
    disable() {
        this.enabled = false;
        this.removeEventHandler();
    }
    // Return MyCustomPlugin Id.
    getPluginId() {
        return this.id;
    }
    // Record custom event.
    record(data) {
        this.context.record('custom_scroll_event', data);
    }
    // EventHandler.
    private eventHandler = (scrollEvent: Event) => {
        this.record({timestamp: Date.now()})
    }
    // Attach an eventHandler to scroll event.
    private addEventHandler(): void {
        window.addEventListener('scroll', this.eventHandler);
    }
    // Detach eventHandler from scroll event.
    private removeEventHandler(): void {
        window.removeEventListender('scroll', this.eventHandler);
    }
}
```

# CloudWatch RUM 대시보드 보기
<a name="CloudWatch-RUM-view-data"></a>

CloudWatch RUM을 사용하면 로드 시간, Apdex 점수, 디바이스 정보, 사용자 세션의 지리적 위치, 오류가 있는 세션 등 애플리케이션 성능에 대한 사용자 세션에서 데이터를 수집할 수 있습니다. 이 모든 정보는 대시보드에 표시됩니다.

RUM 대시보드를 보려면:

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

1. 탐색 창에서 **Application Signals**, **RUM**을 선택합니다.

RUM 콘솔에는 모든 앱 모니터의 목록 보기가 표시됩니다. **플랫폼** 열은 각각의 앱 모니터가 웹, Android, iOS 애플리케이션용인지를 나타냅니다. 앱 모니터를 선택하면 **성능**, **오류**, **세션**, **지표**, **구성** 탭을 사용하여 세부 보기에 액세스할 수 있습니다.

## 웹 애플리케이션 대시보드
<a name="CloudWatch-RUM-web-dashboard"></a>

웹 애플리케이션 모니터를 선택하면 다음과 같은 탭이 표시됩니다.
+ **성능** 탭에는 로드 시간, 요청 정보, 웹 바이탈 및 시간 경과에 따른 페이지 로드를 포함한 페이지 성능 정보가 표시됩니다. 이 보기에는 대화형 웹 바이탈 그래프가 있습니다. 여기에서 페이지에 대한 코어 웹 바이탈의 다양한 백분위수 값을 확인하고, 그래프에서 데이터 포인트를 선택하여 CloudWatch RUM에서 캡처한 관련 이벤트를 볼 수 있습니다. 이를 통해 지표 스파이크와 관련된 이벤트를 추가로 살펴보거나, 선택한 이벤트에 대한 페이지 세부 정보를 확인한 후 성능 문제를 유발하는 특정한 조건을 파악할 수 있습니다.

  이 탭에서 **페이지 로드**, **요청**, **위치**를 번갈아 전환하여 보면서 페이지 성능에 대한 자세한 내용도 확인할 수도 있습니다.
+ **오류 및 세션** 탭에는 사용자에게 가장 자주 표시되는 오류 메시지와 오류가 가장 많이 발생한 디바이스 및 브라우저를 포함한 Javascript 오류 정보가 표시됩니다. 이 보기에는 오류 히스토그램과 오류 목록 보기가 포함되어 있습니다. 사용자 및 이벤트 세부 정보를 기준으로 오류 목록을 필터링할 수 있습니다. 오류 메시지를 선택하면 자세한 내용을 볼 수 있습니다.
+ **HTTP 요청** 탭에는 오류가 가장 많이 발생한 요청 URL, 오류가 가장 많이 발생한 장치 및 브라우저를 비롯한 HTTP 요청 정보가 표시됩니다. 이 탭에는 요청 히스토그램, 요청 목록 보기, 네트워크 오류 목록 보기가 포함됩니다. 사용자 및 이벤트 세부 정보별로 목록을 필터링할 수 있습니다. 응답 코드 또는 오류 메시지를 선택하면 각각 요청 또는 네트워크 오류에 대한 자세한 내용을 확인할 수 있습니다.
+ **세션** 탭에는 세션 지표가 표시됩니다. 이 탭에는 세션 시작 이벤트의 히스토그램과 세션의 목록 보기가 포함되어 있습니다. 이벤트 유형, 사용자 세부 정보, 이벤트 세부 정보별로 세션 목록을 필터링할 수 있습니다. 세션에 대한 자세한 내용을 보려면 **sessionId**를 선택하세요.
+ **이벤트** 탭에는 RUM 이벤트의 히스토그램과 이벤트 목록 보기가 표시됩니다. 이벤트 유형, 사용자 세부 정보, 이벤트 세부 정보별로 이벤트 목록을 필터링할 수 있습니다. RUM 이벤트를 선택하면 원시 이벤트를 볼 수 있습니다.
+ **브라우저 및 디바이스(Browsers & Devices)** 탭에는 애플리케이션에 액세스하기 위한 다양한 브라우저 및 디바이스의 성능 및 사용량 등의 정보가 표시됩니다. 이 보기에는 **브라우저** 및 **디바이스**에 초점을 맞추는 보기를 전환하는 제어가 포함되어 있습니다.

  범위를 단일 브라우저로 좁히면 브라우저 버전별로 분류된 데이터가 표시됩니다.
+ **사용자 여정(User Journey)** 탭에는 고객이 애플리케이션을 탐색하는 데 사용하는 경로가 표시됩니다. 고객이 애플리케이션에 들어가는 위치와 애플리케이션을 종료하는 페이지를 확인할 수 있습니다. 또한 고객이 사용하는 경로와 해당 경로를 따르는 고객의 비율도 확인할 수 있습니다. 노드에서 일시 중지하여 해당 페이지에 대한 세부 정보를 확인할 수 있습니다. 단일 경로를 선택하여 더 쉽게 볼 수 있도록 연결을 강조 표시할 수 있습니다.
+  **지표** 탭에는 성능 웹 바이탈, 오류 지표(JavaScript 오류, HTTP 오류/장애), 볼륨, 사용자 흐름 및 apdex 지표를 비롯하여 앱 모니터에서 게시한 모든 기본 CloudWatch 지표가 표시됩니다. 애플리케이션에 대한 확장 지표를 생성한 경우, 탭에는 확장 지표 섹션에 있는 이러한 지표의 하위 집합도 포함됩니다. 이 하위 집합에는 PageViewCount, PerformanceNavigationDuration, Http4xxCount, Http5xxCount, JsErrorCount 유형의 지표가 포함됩니다. 대시보드에는 지표 유형당 3가지 지표 변형이 표시됩니다. 이는 CloudWatch 지표이므로 **대시보드에 추가 옵션**을 사용하면 이 탭을 사용자의 고유한 대시보드로 내보낸 후 더 많은 지표를 포함하도록 업데이트할 수도 있습니다.

(선택 사항) 처음 6개의 탭 중 하나에서 **페이지** 버튼을 누르고 목록에서 페이지 또는 페이지 그룹을 선택합니다. 이렇게 하면 표시된 데이터가 애플리케이션의 단일 페이지 또는 페이지 그룹으로 좁아집니다. 목록의 페이지 또는 페이지 그룹을 즐겨찾기로 표시할 수도 있습니다.

## 모바일 애플리케이션 대시보드
<a name="CloudWatch-RUM-mobile-dashboard"></a>

모바일 애플리케이션 모니터를 선택하면 다음과 같은 탭이 표시됩니다.
+ **성능** 탭에서는 화면 로드 시간, 앱 시작 시간(콜드/웜), 성능 지표, 시간 경과에 따른 Apdex 점수 등 모바일 애플리케이션의 성능에 대한 인사이트를 제공합니다. 세부 보기에서는 화면 이름, OS 버전, 앱 버전, 디바이스, 국가별로 성능을 분류합니다. 차트에서 화면 로드 시간, 앱 시작 시간 또는 위치 데이터 포인트를 클릭하면 오른쪽에 진단 패널이 열립니다. 이 패널에서는 데이터 포인트와 관련된 추가 인사이트를 제공하는데, 이러한 데이터 포인트는 상관관계가 있는 최신 세션 및 **세션** 탭 연결 링크로 구성되어 문제 해결을 지원합니다.

  이 탭에서 **화면 로드**, **요청**, **위치**를 번갈아 전환하여 보면서 애플리케이션 성능에 대한 자세한 내용도 확인할 수도 있습니다.

  이 탭에서는 최종 사용자의 만족도를 나타내는 애플리케이션 성능 인덱스(Apdex) 점수도 제공합니다. 점수는 0(최소 만족)부터 1(가장 만족)까지입니다. 점수는 애플리케이션 성능만을 기준으로 합니다. Apdex 점수에 대한 자세한 내용은 [CloudWatch RUM에서 Apdex 점수를 설정하는 방법](#CloudWatch-RUM-apdex) 섹션을 참조하세요.
+ **오류** 탭에서는 애플리케이션 문제를 네트워크 오류, 충돌, ANR(Android)/앱 중단(iOS)이라는 3가지 범주로 분류합니다. **네트워크 오류** 탭에는 네트워크 지연 시간, 클라이언트 오류(4xx 상태 코드), 서버 오류(5xx 상태 코드)를 보여주는 선 차트가 있습니다. 차트에서 이러한 선에 대한 데이터 포인트를 클릭하면 진단 패널이 열립니다. 아래 표에는 가장 일반적인 네트워크 경로 100개가 나열되어 있습니다. 라디오 버튼을 클릭하면 선택한 네트워크 경로를 기준으로 선 차트가 필터링됩니다.

  이와 마찬가지로, **충돌** 및 **ANRs/App Hangs** 탭에는 각 오류의 개수에 대한 선 시리즈가 표시되며, 이를 추출할 수 있습니다. 아래 표에는 가장 일반적인 주요 충돌 메시지 또는 ANR/앱 중단 스택 트레이스가 나와 있습니다. 라디오 버튼을 클릭하면 차트가 필터링되고, 오류 메시지를 클릭하면 전체 스택 트레이스가 표시됩니다.
+ **세션** 탭에는 모든 세션을 시간별 내림차순으로 나열하는 테이블이 표시됩니다. 하단의 폭포 시각화는 선택한 세션의 모든 원격 분석을 보여주므로, 사용자 상호 작용을 추적하고 성능 문제를 식별하는 데 도움이 됩니다. 폭포의 각 행을 선택하여 진단 패널을 열 수 있습니다. HTTP 요청의 경우 트레이스 콘솔에 연결되는 **traceId**가 표시됩니다.

  2xx가 아닌 상태 코드, 충돌 또는 ANR(Android)/앱 중단(iOS)이 발생한 HTTP 요청의 경우, 진단 패널에는 스택 트레이스가 있는 **예외** 탭이 포함됩니다. 폭포의 **보기** 버튼을 사용하면 이러한 정보에 빠르게 액세스할 수 있습니다.
+ **지표** 탭에는 성능 지표(화면 로드 시간, 콜드 앱 시작 시간), 오류 지표(충돌, ANR/앱 중단, HTTP 오류/장애), 볼륨 및 apdex 지표를 비롯하여 앱 모니터에서 게시한 모든 기본 CloudWatch 지표가 표시됩니다. 애플리케이션에 대한 확장 지표를 생성한 경우, 탭에는 확장 지표 섹션에 있는 이러한 지표의 하위 집합도 포함됩니다. 이 하위 집합에는 ScreenLoadTime, ScreenLoadCount, CrashCount, Http4xxCount, Http5xxCount, ANRCount/AppHangCount, ColdLaunchTime, WarmLaunchTime 유형의 지표가 포함됩니다. 대시보드에는 지표 유형당 3가지 지표 변형이 표시됩니다. 이는 CloudWatch 지표이므로 **대시보드에 추가 옵션**을 사용하면 이 탭을 사용자의 고유한 대시보드로 내보낸 후 더 많은 지표를 포함하도록 업데이트할 수도 있습니다.
+ **구성** 탭에서는 앱 모니터의 일반 설정 및 구성 세부 정보에 액세스할 수 있습니다. 또한 **코드 조각** 탭에 액세스할 수 있습니다. 이 탭에는 수동 계측 및 제로 코드 계측 옵션을 비롯하여, ADOT SDK를 사용해 모바일 애플리케이션을 계측하기 위한 지침이 포함되어 있습니다.

### CloudWatch RUM에서 Apdex 점수를 설정하는 방법
<a name="CloudWatch-RUM-apdex"></a>

Apdex(애플리케이션 성능 인덱스)는 애플리케이션 응답 시간을 보고, 벤치마크 및 평가하기 위한 방법을 정의하는 개방형 표준입니다. Apdex 점수는 시간이 지남에 따라 애플리케이션 성능에 미치는 영향을 이해하고 식별하는 데 도움이 됩니다.

Apdex 점수는 최종 사용자의 만족도를 나타냅니다. 점수는 0(최소 만족)부터 1(가장 만족)까지입니다. 점수는 애플리케이션 성능만을 기준으로 합니다. 사용자에게 애플리케이션을 평가하라는 메시지가 표시되지 않습니다.

각 Apdex 점수는 세 가지 임곗값 중 하나에 해당합니다. Apdex 임곗값과 실제 애플리케이션 응답 시간에 따라 다음과 같은 세 가지 종류의 성능이 있습니다.
+ **만족** - 실제 애플리케이션 응답 시간이 Apdex 임곗값 이하입니다. CloudWatch RUM의 경우 이 임곗값은 2,000ms 이하입니다.
+ **나쁘지 않음** - 실제 애플리케이션 응답 시간이 Apdex 임곗값보다 크지만 Apdex 임곗값의 4배 이하입니다. CloudWatch RUM의 경우 이 범위는 2,000\$18,000ms입니다.
+ **실망** - 실제 애플리케이션 응답 시간이 Apdex 임곗값의 4배보다 큽니다. CloudWatch RUM의 경우 이 범위는 8,000ms 초과입니다.

총 0\$11의 Apdex 점수는 다음 공식을 사용하여 계산됩니다.

`(positive scores + tolerable scores/2)/total scores * 100`

# CloudWatch RUM을 사용하여 수집할 수 있는 CloudWatch 지표
<a name="CloudWatch-RUM-metrics"></a>

이 섹션의 표에는 CloudWatch RUM을 사용하여 웹 애플리케이션, 모바일 애플리케이션 또는 양쪽 모두에서 자동으로 수집되는 지표가 나열되어 있습니다. CloudWatch 콘솔에서 이러한 지표에 액세스할 수 있습니다. 자세한 내용은 [사용 가능한 지표 보기](viewing_metrics_with_cloudwatch.md) 섹션을 참조하세요.

필요에 따라 확장 지표를 CloudWatch로 전송할 수도 있습니다. 자세한 내용은 [확장 지표](CloudWatch-RUM-custom-and-extended-metrics.md#CloudWatch-RUM-vended-metrics) 섹션을 참조하세요.

이러한 지표는 `AWS/RUM`이라는 지표 네임스페이스에 게시됩니다. 다음 지표는 모두 `application_name` 차원으로 게시됩니다.. 이 차원값은 앱 모니터 이름입니다. 일부 지표는 아래 표에 나열된 대로 추가 차원으로 게시됩니다.


**웹 지표**  

| 지표 | 단위 | 설명 | 
| --- | --- | --- | 
|  `HttpStatusCodeCount` |  개수  |  응답 상태 코드에 의한 애플리케이션의 HTTP 응답 수입니다. 추가 차원: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-metrics.html)  | 
|  `Http4xxCount` |  개수  |  4xx 응답 상태 코드가 포함된 애플리케이션의 HTTP 응답 수입니다. 4xx 코드를 생성하는 `http_event` RUM 이벤트를 기반으로 계산됩니다.  | 
|  `Http4xxCountPerSession` |  개수  |  4xx 응답 상태 코드가 포함된 세션의 HTTP 응답 수입니다. 4xx 코드를 생성하는 `http_event` RUM 이벤트를 기반으로 계산됩니다.  | 
|  `Http4xxCountPerPageView` |  개수  |  4xx 응답 상태 코드가 포함된 페이지 검토의 HTTP 응답 수입니다. 4xx 코드를 생성하는 `http_event` RUM 이벤트를 기반으로 계산됩니다.  | 
|  `Http5xxCount` |  개수  |  5xx 응답 상태 코드가 포함된 애플리케이션의 HTTP 응답 수입니다. 5xx 코드를 생성하는 `http_event` RUM 이벤트를 기반으로 계산됩니다.  | 
|  `Http5xxCountPerSession` |  개수  |  5xx 응답 상태 코드가 포함된 세션의 HTTP 응답 수입니다. 5xx 코드를 생성하는 `http_event` RUM 이벤트를 기반으로 계산됩니다.  | 
|  `Http5xxCountPerPageView` |  개수  |  5xx 응답 상태 코드가 포함된 페이지 검토의 HTTP 응답 수입니다. 5xx 코드를 생성하는 `http_event` RUM 이벤트를 기반으로 계산됩니다.  | 
|  `JsErrorCount` |  개수  |  수집된 JavaScript 오류 이벤트의 수입니다.  | 
|  `JsErrorCountPerSession` |  개수  |  세션에서 수집된 JavaScript 오류 이벤트의 수입니다.  | 
|  `JsErrorCountPerPageView` |  개수  |  페이지 검토에서 수집된 JavaScript 오류 이벤트의 수입니다.  | 
|  `NavigationFrustratedTransaction` |  개수  |  실망 임곗값(8000ms)보다 높은 `duration`을 사용한 탐색 이벤트 수입니다. 탐색 이벤트의 기간은 `PerformanceNavigationDuration` 지표에서 추적됩니다.  | 
|  `NavigationSatisfiedTransaction` |  개수  |  Apdex 목표(2000ms)보다 작은 `duration`을 사용한 탐색 이벤트 수입니다. 탐색 이벤트의 기간은 `PerformanceNavigationDuration` 지표에서 추적됩니다.  | 
|  `NavigationToleratedTransaction` |  개수  |  2000ms\$18000ms의 `duration`을 사용한 탐색 이벤트 수입니다. 탐색 이벤트의 기간은 `PerformanceNavigationDuration` 지표에서 추적됩니다.  | 
|  `PageViewCount` |  개수  |  앱 모니터에서 수집한 페이지 조회 이벤트 수입니다. `page_view_event` RUM 이벤트를 계산하여 계산됩니다.  | 
|  `PageViewCountPerSession` |  개수  |  세션의 페이지 조회 이벤트 수입니다. | 
|  `PerformanceResourceDuration` |  밀리초  |  리소스 이벤트의 `duration`입니다. 추가 차원: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-metrics.html)  | 
|  `PerformanceNavigationDuration` |  밀리초  |  탐색 이벤트의 `duration`입니다.  | 
|  `RumEventPayloadSize` |  바이트  |  CloudWatch RUM에서 수집한 모든 이벤트의 크기입니다. 이 지표에 대한 `SampleCount` 통계를 사용하여 앱 모니터가 수집하고 있는 이벤트 수를 모니터링할 수 있습니다.  | 
|  `SessionCount` |  개수  |  앱 모니터에서 수집한 세션 시작 이벤트 수입니다. 다시 말해 시작된 새 세션 수입니다.  | 
|  `SessionDuration` |  밀리초  |  세션의 지속 시간입니다. 이는 세션의 첫 번째 이벤트와 마지막 이벤트 사이의 시간을 기준으로 계산됩니다.  | 
|  `TimeOnPage` |  밀리초  |  페이지 조회의 기간입니다. 이는 다음 페이지 조회까지의 시간을 기준으로 계산됩니다. 단, 세션의 마지막 페이지에서는 해당 페이지의 첫 번째 이벤트와 마지막 이벤트 사이의 시간을 기준으로 합니다.  | 
|  `WebVitalsCumulativeLayoutShift` |  없음  |  누적 레이아웃 시프트 이벤트의 값을 추적합니다.  | 
|  `WebVitalsFirstInputDelay` |  밀리초  |  첫 번째 입력 지연 이벤트의 값을 추적합니다.  | 
|  `WebVitalsLargestContentfulPaint` |  밀리초  |  가장 큰 콘텐츠 페인트 이벤트의 값을 추적합니다.  | 
|  `WebVitalsInteractionToNextPaint` |  밀리초  |  다음 페인트 이벤트에 대한 상호 작용의 값을 추적합니다.  | 

분석을 위한 추가 차원을 제공하도록 모바일 애플리케이션에 대한 확장 지표를 구성할 수 있습니다.


**모바일 지표**  

| 지표 | 단위 | 설명 | 
| --- | --- | --- | 
|  `ANRCount`  |  개수  |  Android 전용: 애플리케이션이 5초 이상 응답하지 않아 애플리케이션 충돌로 이어질 때 발생하는 ANR(애플리케이션 응답 중지) 인시던트 수입니다.  | 
|  `AppHangCount`  |  개수  |  iOS 전용: 기본 루프에서 애플리케이션이 250ms 이상 응답하지 않은 횟수입니다.  | 
|  `ColdAppLaunchFrustratedTransaction`  |  개수  |  완료하는 데 8초 이상 걸린 콜드 앱 시작 횟수로, 이로 인해 사용자 불만이 발생할 수 있습니다.  | 
|  `ColdAppLaunchSatisfiedTransaction`  |  개수  |  2초 이내에 완료된 콜드 앱 시작 횟수로, 이 경우 만족스러운 사용자 경험을 제공합니다.  | 
|  `ColdAppLaunchToleratedTransaction`  |  개수  |  2\$18초 사이에 완료된 콜드 앱 시작 횟수로, 이 경우 나쁘지 않지만 이상적이지는 않은 사용자 경험을 제공합니다.  | 
|  `ColdLaunchTime`  |  밀리초  |  종료된 상태에서 애플리케이션을 시작하는 데 걸리는 시간입니다. Android의 경우: 애플리케이션 `onCreate`에서 첫 번째 활동이 생성을 완료할 때까지 걸리는 시간입니다. iOS의 경우: 애플리케이션 시작(`sysctl` 프로세스 시작 명령에 따라 결정됨)에서 `didBecomeActiveNotification`까지 걸리는 시간입니다.  | 
|  `CrashCount`  |  개수  |  처리되지 않은 예외 또는 OS 종료로 인한 예상치 못한 애플리케이션 종료 횟수입니다. Android의 경우: 처리되지 않은 예외 또는 시스템 종료로 인한 충돌입니다. iOS의 경우: 처리되지 않은 예외, 치명적 오류 또는 시스템 종료로 인한 충돌입니다. 충돌 데이터는 로컬에 저장되며 다음번에 앱을 시작할 때 보고됩니다.  | 
|  `DroppedEventsCount`  |  개수  |  이벤트당 최대 크기 제한인 30KB를 초과하여 삭제된 로그 이벤트 수입니다.  | 
|  `DroppedSpansCount`  |  개수  |  스팬당 최대 크기 제한인 30KB를 초과하여 삭제된 스팬 수입니다.  | 
|  `Http4xxCount`  |  개수  |  HTTP 요청 중에 웹 또는 모바일 애플리케이션에서 발생한 HTTP 클라이언트 오류 수를 기록합니다.  | 
|  `Http5xxCount`  |  개수  |  HTTP 요청 중에 웹 또는 모바일 애플리케이션에서 발생한 HTTP 서버 오류 수를 기록합니다.  | 
|  `LogPayloadSize`  |  바이트  |  CloudWatch RUM으로 전송되는 로그 원격 분석 데이터의 바이트 크기입니다. 이 지표에 대한 `SampleCount` 통계를 사용하여 앱 모니터가 수집하고 있는 로그 이벤트 수를 모니터링할 수 있습니다.  | 
|  `NetworkLatency`  |  밀리초  |  네트워크 요청이 완료되는 데 걸리는 시간으로, 요청 시작부터 응답 완료까지 걸리는 왕복 시간을 측정합니다.  | 
|  `ScreenLoadCount`  |  개수  |  총 화면 로드 수입니다.  | 
|  `ScreenLoadToleratedTransaction`  |  개수  |  2\$18초 사이에 완료된 화면 로드 수로, 이 경우 나쁘지 않지만 이상적이지는 않은 사용자 경험을 제공합니다.  | 
|  `SessionCount`  |  개수  |  애플리케이션을 사용한 고유 사용자 세션의 총 수입니다. 세션은 사용자가 앱을 열 때 시작되며, 30분 동안 활동이 없거나 명시적으로 종료되면 종료됩니다.  | 
|  `SpanPayloadSize`  |  바이트  |  CloudWatch RUM으로 전송되는 스팬 원격 분석 데이터의 바이트 크기입니다. 이 지표에 대한 `SampleCount` 통계를 사용하여 앱 모니터가 수집하고 있는 스팬 수를 모니터링할 수 있습니다.  | 
|  `WarmAppLaunchFrustratedTransaction`  |  개수  |  완료하는 데 8초 이상 걸린 웜 앱 시작 횟수로, 이로 인해 사용자 불만이 발생할 수 있습니다.  | 
|  `WarmAppLaunchSatisfiedTransaction`  |  개수  |  2초 이내에 완료된 웜 앱 시작 횟수로, 이 경우 만족스러운 사용자 경험을 제공합니다.  | 
|  `WarmAppLaunchToleratedTransaction`  |  개수  |  2\$18초 사이에 완료된 웜 앱 시작 횟수로, 이 경우 나쁘지 않지만 이상적이지는 않은 사용자 경험을 제공합니다.  | 
|  `WarmLaunchTime`  |  밀리초  |  백그라운드 상태에서 애플리케이션을 시작하는 데 걸리는 시간입니다. Android의 경우: 애플리케이션 `onCreate`에서 첫 번째 활동이 생성을 완료할 때까지 걸리는 시간입니다. iOS의 경우: `UIApplicationWillEnterForegroundNotification`부터 `didBecomeActiveNotification`까지 걸리는 시간입니다.  | 

# 사용자 지정 지표 및 CloudWatch로 전송할 수 있는 확장 지표
<a name="CloudWatch-RUM-custom-and-extended-metrics"></a>

기본적으로 RUM 앱 모니터는 지표를 CloudWatch로 전송합니다. 이러한 기본 지표와 차원은 [CloudWatch RUM을 사용하여 수집할 수 있는 CloudWatch 지표](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-metrics.html)에 나열되어 있습니다.

앱 모니터를 설정하여 지표를 내보낼 수도 있습니다. 앱 모니터는 확장 지표, 사용자 지정 지표 또는 두 가지 모두를 전송할 수 있습니다. 그리고 이러한 지표를 CloudWatch로 전송할 수 있습니다.
+ **사용자 지정 지표** - 사용자 지정 지표는 사용자가 정의하는 지표입니다. 사용자 지정 지표를 사용하면 모든 지표 이름과 네임스페이스를 사용할 수 있습니다. 지표를 도출하기 위해 사용자 지정 이벤트, 기본 제공 이벤트, 사용자 지정 속성 또는 기본 속성을 사용할 수 있습니다.

  사용자 지정 지표를 CloudWatch로 전송할 수 있습니다.
+ **확장 지표** - 기본 CloudWatch RUM 지표를 추가 측정기준과 함께 CloudWatch로 전송할 수 있습니다. 이렇게 하면 이러한 지표를 통해 보다 세분화된 보기를 얻을 수 있습니다.

**Topics**
+ [사용자 지정 지표](#CloudWatch-RUM-custom-metrics)
+ [확장 지표](#CloudWatch-RUM-vended-metrics)

## 사용자 지정 지표
<a name="CloudWatch-RUM-custom-metrics"></a>

사용자 지정 지표를 보내려면 AWS API를 사용하거나 콘솔 대신 AWS CLI를 사용해야 합니다. AWS API 사용에 대한 자세한 내용은 [PutRumMetricsDestination](https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_PutRumMetricsDestination.html) 및 [BatchCreateRumMetricDefinitions](https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_BatchCreateRumMetricDefinitions.html)를 참조하세요.

하나의 대상에 포함할 수 있는 확장 지표 및 사용자 지정 지표 정의의 최대 개수는 2,000개입니다. 각 대상에 보내는 각 사용자 지정 지표 또는 확장 지표에 대해 측정기준 이름과 측정기준 값의 각 조합이 이 한도에 포함됩니다. CloudWatch RUM의 모든 종류의 이벤트 또는 속성에서 파생된 사용자 지정 지표에 대해서는 요금이 부과되지 않습니다.

다음 예에서는 사용자 지정 이벤트에서 파생된 사용자 지정 지표를 만드는 방법을 보여줍니다. 다음은 사용되는 사용자 지정 이벤트의 예입니다.

```
cwr('recordEvent', {
    type: 'my_custom_event', 
    data: {
        location: 'IAD', 
        current_url: 'amazonaws.com', 
        user_interaction: {
            interaction_1 : "click",
            interaction_2 : "scroll"
        }, 
        visit_count:10
    }
})
```

이 사용자 지정 이벤트가 주어지면 Chrome 브라우저에서 `amazonaws.com` URL에 대한 방문 횟수를 계산하는 사용자 지정 지표를 만들 수 있습니다. 다음 정의는 계정의 `RUM/CustomMetrics/PageVisits` 네임스페이스에 `AmazonVisitsCount`라는 지표를 생성합니다.

```
{
    "AppMonitorName":"customer-appMonitor-name",
    "Destination":"CloudWatch",
    "MetricDefinitions":[
        {
            "Name":"AmazonVisitsCount",
            "Namespace":"PageVisit",
            "ValueKey":"event_details.visit_count",
            "UnitLabel":"Count",
            "DimensionKeys":{
                "event_details.current_url": "URL"
            },
            "EventPattern":"{\"metadata\":{\"browserName\":[\"Chrome\"]},\"event_type\":[\"my_custom_event\"],\"event_details\": {\"current_url\": [\"amazonaws.com\"]}}" 
        }
    ]
}
```

## 확장 지표
<a name="CloudWatch-RUM-vended-metrics"></a>

확장 지표를 설정한 경우, 기본 CloudWatch RUM 지표를 추가 측정기준과 함께 CloudWatch로 전송하여 지표가 더욱 세분화된 보기를 제공하도록 할 수 있습니다.

기본 CloudWatch RUM 지표에 대한 자세한 내용은 [CloudWatch RUM을 사용하여 수집할 수 있는 CloudWatch 지표](CloudWatch-RUM-metrics.md) 섹션을 참조하세요.

하나의 대상에 포함할 수 있는 확장 지표 및 사용자 지정 지표 정의의 최대 개수는 2,000개입니다. 각 대상으로 전송하는 각 확장 또는 사용자 지정 지표에 대해 측정기준 이름과 측정기준 값의 각 조합이 이 한도에 대한 확장 지표 수 계산에 포함됩니다.

CloudWatch로 확장 지표를 전송할 때 CloudWatch RUM 콘솔을 사용하여 확장 지표에 대한 CloudWatch 경보를 생성할 수 있습니다.

CloudWatch RUM의 기본 지표를 위해 생성된 확장 지표에 대해서는 요금이 부과되지 않습니다.

### 웹 애플리케이션 확장 지표
<a name="CloudWatch-RUM-web-extended-metrics"></a>

웹 애플리케이션 확장 지표에는 다음과 같은 측정기준이 지원됩니다.
+ `BrowserName`

  차원 값의 예: `Chrome`, `Firefox`, `Chrome Headless` 
+ `CountryCode` 이 차원은 2자리 코드와 함께 ISO-3166 형식을 사용합니다.

  차원 값의 예: `US`, `JP`, `DE` 
+ `DeviceType`

  차원 값의 예: `desktop`, `mobile`, `tablet`, `embedded` 
+ `FileType`

  차원 값의 예: `Image`, `Stylesheet` 
+ `OSName`

  차원 값의 예: `Linux`, `Windows`, `iOS`, `Android` 
+ `PageId`

### 모바일 애플리케이션 확장 지표
<a name="CloudWatch-RUM-mobile-extended-metrics"></a>

모바일 애플리케이션 확장 지표에는 다음과 같은 측정기준이 지원됩니다.
+ `ScreenName`
  + 화면 이름 속성의 값 - 애플리케이션의 `attributes.screen.name`
  + 예제 값: HomeScreen, SettingsView, ProfilePage
+ `DeviceModel`
  + 디바이스 모델 속성의 값 - `resource.attributes.device.model.name`
  + 예제 값: iPhone14,3, SM-G998B
+ `OSVersion`
  + 운영 체제 버전 속성의 값 - `resource.attributes.os.version`
  + 예제 값: 16.0, 13.0

**참고**  
모바일 애플리케이션에 대해 현재 지원되는 기본 지표는 `ScreenLoadTime`, `ScreenLoadCount`, `NetworkLatency`, `Http4xxCount`, `Http5xxCount`, `CrashCount`, `ANRCount`, `AppHangCount`, `ColdLaunchTime`, `WarmLaunchTime`, `SessionCount`, `SpanPayloadSize`, `LogPayloadSize`입니다.

### 콘솔을 사용하여 확장 지표 설정
<a name="CloudWatch-RUM-extended-metrics-console"></a>

콘솔을 사용하여 CloudWatch로 확장 지표를 전송하려면 다음 단계를 사용하세요.

AWS API를 사용하여 확장 지표를 CloudWatch로 전송하는 방법에 대한 자세한 내용은 [PutRumMetricsDestination](https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_PutRumMetricsDestination.html) 및 [BatchCreateRumMetricDefinitions](https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_BatchCreateRumMetricDefinitions.html)를 참조하세요.

**콘솔을 사용하여 RUM 확장 지표를 CloudWatch로 전송하도록 앱 모니터를 설정하려면 다음을 수행하세요.**

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

1. 탐색 창에서 **Application Signals**, **RUM**을 선택합니다.

1. 지표를 전송할 앱 모니터의 이름을 선택합니다.

1. **Configuration**(구성) 탭을 선택한 다음 **RUM extended metrics**(RUM 확장 지표)를 선택합니다.

1. **Send metrics**(지표 전송)를 선택합니다.

1. 추가 차원과 함께 전송할 지표 이름을 하나 이상 선택합니다.

1. 이러한 지표의 차원으로 사용할 요소를 하나 이상 선택합니다. 선택 시 해당 항목이 생성하는 확장 지표 수가 **Number of extended metrics**(확장 지표 수)에 표시됩니다.

   이 숫자는 선택한 지표 이름의 수에 생성한 서로 다른 차원의 수를 곱하여 계산됩니다.

   1. 페이지 ID를 차원으로 사용하여 지표를 전송하려면 **Browse for page ID**(페이지 ID 찾아보기)를 선택한 다음 사용할 페이지 ID를 선택합니다.

   1. 디바이스 유형을 차원으로 사용하여 지표를 전송하려면 **Desktop devices**(데스크톱 디바이스) 또는 **Mobile and tablets**(모바일 및 태블릿)를 선택합니다.

   1. 운영 체제를 차원으로 사용하여 지표를 전송하려면 **Operating system**(운영 체제)에서 운영 체제를 하나 이상 선택합니다.

   1. 브라우저 유형을 차원으로 사용하여 지표를 전송하려면 **Browsers**(브라우저)에서 브라우저를 하나 이상 선택합니다.

   1. 지리적 위치를 차원으로 사용하여 지표를 전송하려면 **Locations**(위치)에서 위치를 하나 이상 선택합니다.

      이 앱 모니터가 지표를 보고한 위치만 선택할 수 있는 목록에 표시됩니다.

1. 선택을 마치면 **Send metrics**(지표 전송)를 선택합니다.

1. (선택 사항) **Extended metrics**(확장 지표) 목록에서 지표 중 하나를 관찰하는 경보를 생성하려면 해당 지표 행에서 **Create alarm**(경보 생성)을 선택합니다.

   CloudWatch 경보에 대한 일반적인 정보는 [Amazon CloudWatch 경보 사용](CloudWatch_Alarms.md) 섹션을 참조하세요. CloudWatch RUM 확장 지표에 대한 경보를 설정하는 방법에 대한 자습서는 [자습서: 확장 지표 생성 및 경보 설정](#CloudWatch-RUM-extended-metrics-alarmtutorial) 섹션을 참조하세요.

**확장 지표 전송 중지**

**콘솔을 사용하여 확장 지표 전송을 중지하려면 다음을 수행하세요.**

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

1. 탐색 창에서 **Application Signals**, **RUM**을 선택합니다.

1. 지표를 전송할 앱 모니터의 이름을 선택합니다.

1. **Configuration**(구성) 탭을 선택한 다음 **RUM extended metrics**(RUM 확장 지표)를 선택합니다.

1. 전송을 중지할 지표 이름과 차원 조합을 하나 이상 선택합니다. 그런 다음 **Actions**(작업), **Delete**(삭제)를 선택합니다.

### 자습서: 확장 지표 생성 및 경보 설정
<a name="CloudWatch-RUM-extended-metrics-alarmtutorial"></a>

이 자습서에서는 CloudWatch로 전송할 확장 지표를 설정하는 방법과 해당 지표에 대한 경보를 설정하는 방법을 설명합니다. 이 자습서에서는 Chrome 브라우저에서 JavaScript 오류를 추적하는 지표를 생성합니다.

**이 확장 지표를 설정하고 이에 대한 경보를 설정하려면 다음을 수행하세요.**

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

1. 탐색 창에서 **Application Signals**, **RUM**을 선택합니다.

1. 지표를 전송할 앱 모니터의 이름을 선택합니다.

1. **Configuration**(구성) 탭을 선택한 다음 **RUM extended metrics**(RUM 확장 지표)를 선택합니다.

1. **Send metrics**(지표 전송)를 선택합니다.

1. **JSErrorCount**를 선택합니다.

1. **Browsers**(브라우저)에서 **Chrome**을 선택합니다.

   **JSErrorCount**와 **Chrome**의 이러한 조합은 하나의 확장 지표를 CloudWatch로 전송합니다. 지표는 Chrome 브라우저를 사용하는 사용자 세션에 대해서만 JavaScript 오류를 계산합니다. 지표 이름은 **JsErrorCount**이고 차원 이름은 **Browser**(브라우저)입니다.

1. **Send metrics**(지표 전송)를 선택합니다.

1. **Extended metrics**(확장 지표) 목록에서 **Name**(이름) 아래에 **JsErrorCount**가 표시되고 **BrowserName** 아래에 **Chrome**이 표시되는 행에서 **Create alarm**(경보 생성)을 선택합니다.

1. **Specify metric and conditions**(지표 및 조건 지정)에서 **Metric name**(지표 이름) 및 **BrowserName** 필드가 올바른 값으로 미리 채워져 있는지 확인합니다.

1. **Statistic**(통계)에서 경보에 사용할 통계를 선택합니다. 이러한 유형의 계산 지표에는 **Average**(평균)가 적합합니다.

1. **기간**에 대해 **5분**을 선택합니다.

1. **조건(Conditions)**에서 다음을 수행하십시오:
   + **Static**(정적)을 선택합니다.
   + **Greater**(보다 큼)를 선택하여 오류 수가 지정하려는 임곗값보다 높을 때 경보가 ALARM 상태로 전환되도록 지정합니다.
   + **than...**(큼) 아래에 경보 임곗값의 숫자를 입력합니다. 5분 동안 오류 수가 이 숫자를 초과하면 경보가 ALARM 상태로 전환됩니다.

1. (선택 사항) 기본적으로 오류 수가 5분 동안 설정한 임곗값 숫자를 초과하는 즉시 경보가 ALARM 상태로 전환됩니다. 이 숫자가 5분 이상 초과되는 경우에만 경보가 ALARM 상태로 전환되도록 필요에 따라 이를 변경할 수 있습니다.

   이렇게 하려면 **Additional configuration**(추가 구성)을 선택한 다음 **Datapoints to alarm**(경보를 보낼 데이터 포인트)에서 경보를 트리거하기 위해 오류 번호가 임곗값을 초과해야 하는 5분 기간 수를 지정합니다. 예를 들어, 두 개의 연속된 5분 기간이 임곗값을 초과하는 경우에만 경보가 트리거되도록 2개 중 2개를 선택하거나, 3개의 연속된 5분 기간 중 2개가 임곗값을 초과하는 경우 경보가 트리거되도록 3개 중 2개를 선택할 수 있습니다.

   이러한 유형의 경보 평가에 대한 자세한 내용은 [경보 평가](alarm-evaluation.md) 섹션을 참조하세요.

1. **다음**을 선택합니다.

1. **Configure actions**(작업 구성)에서 경보가 경보 상태로 전환될 때 수행할 작업을 지정합니다. Amazon SNS로 알림을 받으려면 다음을 수행하세요.
   + **알림 추가**를 선택합니다.
   + **경보 내**를 선택합니다.
   + 기존의 SNS 주제를 선택하거나 새로 생성합니다. 새로 생성하는 경우 이름을 지정하고 이메일 주소를 하나 이상 추가합니다.

1. **다음**을 선택합니다.

1. 경보의 이름과 설명(선택 사항)을 입력하고 **Next**(다음)를 선택합니다.

1. 세부 정보를 검토하고 **Create alarm**(경보 생성)을 선택합니다.

# CloudWatch RUM을 통한 데이터 보호 및 데이터 프라이버시
<a name="CloudWatch-RUM-privacy"></a>

AWS [공동 책임 모델](https://aws.amazon.com/compliance/shared-responsibility-model/)은 Amazon CloudWatch RUM에 데이터 보호와 데이터 프라이버시를 적용합니다. 이 모델에서 설명하는 것처럼 AWS는 모든 AWS 클라우드를 실행하는 글로벌 인프라를 보호할 책임이 있습니다. 이 인프라에서 호스팅되는 콘텐츠에 대한 통제를 유지하는 것은 사용자의 책임입니다. 데이터 프라이버시에 대한 자세한 내용은 [데이터 프라이버시 FAQ](https://aws.amazon.com/compliance/data-privacy-faq/)를 참조하세요. 유럽의 데이터 보호에 대한 자세한 내용은 AWS 보안 블로그에서 [AWS 공동 책임 모델 및 GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 블로그 게시물을 참조하세요. GDPR 요구 사항 준수에 대한 자세한 리소스는 [일반 데이터 보호 규정(GDPR) 센터](https://aws.amazon.com/compliance/gdpr-center/)를 참조하세요.

Amazon CloudWatch RUM은 수집하려는 최종 사용자 데이터의 입력에 따라 웹 사이트 또는 웹 애플리케이션 코드에 심을 수 있는 코드 조각을 생성합니다. 코드 조각으로 다운로드 및 구성된 웹 클라이언트는 최종 사용자 데이터 수집을 돕기 위해 쿠키(또는 유사한 기술)를 사용합니다. 쿠키(또는 유사한 기술)의 사용은 특정 관할 지역의 데이터 프라이버시 보호 규정에 따라야 합니다. Amazon CloudWatch RUM을 사용하기 전에 법적으로 적절한 개인 정보 보호 고지를 제공하고 쿠키 사용 및 최종 사용자 데이터 처리(수집 포함)에 필요한 동의를 얻기 위한 모든 관련 법적 요구 사항을 포함하여 관련 법률에 따른 규정 준수 의무를 평가하는 것이 좋습니다. 웹 클라이언트가 쿠키(또는 유사한 기술)를 사용하는 방식과 웹 클라이언트가 수집하는 최종 사용자 데이터에 대한 자세한 내용은 [CloudWatch RUM 웹 클라이언트에서 수집한 정보](CloudWatch-RUM-datacollected.md) 및 [CloudWatch RUM 웹 클라이언트 쿠키(또는 유사한 기술)](#CloudWatch-RUM-cookies) 섹션을 참조하세요.

자유 형식 필드에 최종 사용자 계정 번호, 메일 주소, 기타 개인 정보와 같은 중요 식별 정보를 절대 입력하지 마세요. Amazon CloudWatch RUM 또는 기타 서비스에 입력하는 모든 데이터는 진단 로그에 포함될 수 있습니다.



## CloudWatch RUM 웹 클라이언트 쿠키(또는 유사한 기술)
<a name="CloudWatch-RUM-cookies"></a>

CloudWatch RUM 웹 클라이언트는 기본적으로 사용자 세션에 대한 특정 데이터를 수집합니다. 웹 클라이언트가 사용자 ID와 세션 ID를 수집하도록 페이지 로드 전반에 지속되는 쿠키를 활성화할 수 있습니다. 사용자 ID는 RUM에 의해 임의로 생성됩니다.

이러한 쿠키가 활성화되면 이 앱 모니터에 대한 RUM 대시보드를 볼 때 RUM은 다음과 같은 유형의 데이터를 표시할 수 있습니다.
+ 고유 사용자 수 및 오류를 겪은 여러 사용자 수와 같은 사용자 ID를 기반으로 집계된 데이터.
+ 세션 수 및 오류가 발생한 세션 수와 같은 세션 ID를 기반으로 집계된 데이터.
+ *사용자 여정*인 샘플링된 각 사용자 세션에 포함된 페이지 시퀀스.

**중요**  
이러한 쿠키(또는 유사한 기술)를 활성화하지 않아도 웹 클라이언트는 브라우저 유형 및 버전, 운영 체제 유형 및 버전, 디바이스 유형 등의 최종 사용자 세션에 대한 특정 정보를 기록합니다. 웹 바이탈, 페이지 보기, 오류가 발생한 페이지와 같은 집계된 페이지별 인사이트를 제공하기 위해 수집됩니다. 데이터 기록에 대한 자세한 내용은 [CloudWatch RUM 웹 클라이언트에서 수집한 정보](CloudWatch-RUM-datacollected.md) 섹션을 참조하세요.

# CloudWatch RUM 웹 클라이언트에서 수집한 정보
<a name="CloudWatch-RUM-datacollected"></a>

이 섹션에서는 **PutRumEvents** 스키마 즉, CloudWatch RUM을 사용하여 사용자 세션에서 수집할 수 있는 데이터의 구조를 정의합니다.

**PutRumEvents** 요청은 다음 필드가 있는 데이터 구조를 CloudWatch RUM으로 보냅니다.
+ 이 RUM 이벤트 배치의 ID
+ 다음을 포함하는 앱 모니터 세부 정보:
  + 앱 모니터 ID
  + 모니터링된 애플리케이션 버전
+ 다음을 포함하는 사용자 세부 정보.** 이 정보는 앱 모니터에 쿠키가 활성화된 경우에만 수집됩니다.**
  + 웹 클라이언트에서 생성된 사용자 ID
  + 세션 ID
+ 이 배치의 [RUM 이벤트](#CloudWatch-RUM-datacollected-event) 배열

## RUM 이벤트 스키마
<a name="CloudWatch-RUM-datacollected-event"></a>

각 RUM 이벤트의 구조에는 다음 필드가 포함됩니다.
+ 이벤트 ID
+ 타임스탬프
+ 이벤트 유형
+ 사용자 에이전트
+ [Metadata](#CloudWatch-RUM-datacollected-metadata)
+ [RUM 이벤트 세부 정보](#CloudWatch-RUM-datacollected-eventDetails)

## RUM 이벤트 메타데이터
<a name="CloudWatch-RUM-datacollected-metadata"></a>

메타데이터에는 페이지 메타데이터, 사용자 에이전트 메타데이터, 지리적 위치 메타데이터 및 도메인 메타데이터가 포함됩니다.

### 페이지 메타데이터
<a name="CloudWatch-RUM-datacollected-metadata-page"></a>

페이지 메타데이터에는 다음이 포함됩니다.
+ 페이지 ID
+ 페이지 제목
+ 상위 페이지 ID입니다. – **이 정보는 앱 모니터에 쿠키를 사용하도록 설정한 경우에만 수집됩니다.**
+ 상호 작용 깊이 - **이 정보는 앱 모니터에 쿠키가 사용하도록 설정된 경우에만 수집됩니다.**
+ 페이지 태그 - 페이지 이벤트에 태그를 추가하여 페이지를 그룹화할 수 있습니다. 자세한 내용은 [페이지 그룹 사용](CloudWatch-RUM-page-groups.md) 섹션을 참조하세요.

### 사용자 에이전트 메타데이터
<a name="CloudWatch-RUM-datacollected-metadata-useragent"></a>

사용자 에이전트 메타데이터에는 다음이 포함됩니다.
+ 브라우저 언어
+ 브라우저 이름
+ 브라우저 버전
+ 운영 체제 이름
+ 운영 체제 버전
+ 디바이스 유형
+ 플랫폼 유형

### 지리적 메타데이터
<a name="CloudWatch-RUM-datacollected-metadata-geolocation"></a>

지리적 메타데이터에는 다음이 포함됩니다.
+ 국가 코드
+ 세분화 코드

### 도메인 메타데이터
<a name="CloudWatch-RUM-datacollected-metadata-domain"></a>

도메인 메타데이터에는 URL 도메인이 포함됩니다.

## RUM 이벤트 세부 정보
<a name="CloudWatch-RUM-datacollected-eventDetails"></a>

이벤트 세부 정보는 이벤트 유형에 따라 다음 유형의 스키마 중 하나를 따릅니다.

### 세션 시작 이벤트
<a name="CloudWatch-RUM-datacollected-sessionstart"></a>

이 이벤트에는 필드가 없습니다. **이 정보는 앱 모니터에 쿠키가 활성화된 경우에만 수집됩니다.**

### 페이지 보기 스키마
<a name="CloudWatch-RUM-datacollected-pageview"></a>

**페이지 보기(Page view)** 이벤트에는 다음과 같은 속성이 포함됩니다. 웹 클라이언트를 구성하여 페이지 보기 모음을 비활성화할 수 있습니다. 자세한 내용은 [ CloudWatch RUM 웹 클라이언트 설명서](https://github.com/aws-observability/aws-rum-web/blob/main/docs/cdn_installation.md)를 참조하세요.


| 이름 | Type | 설명 | 
| --- | --- | --- | 
|  **페이지 ID** |  문자열  |  애플리케이션 내에서 이 페이지를 고유하게 나타내는 ID. 기본적으로 URL 경로입니다.  | 
|  **상위 페이지 ID** |  문자열  |  사용자가 현재 페이지로 이동할 때 사용했던 페이지 ID. **이 정보는 앱 모니터에 쿠키가 활성화된 경우에만 수집됩니다.**  | 
|  **상호 작용 깊이** |  문자열  |  **이 정보는 앱 모니터에 쿠키가 활성화된 경우에만 수집됩니다.**  | 

### JavaScript 오류 스키마
<a name="CloudWatch-RUM-datacollected-JavaScriptError"></a>

에이전트에서 생성된 JavaScript 오류 이벤트에는 다음 속성이 포함됩니다. 웹 클라이언트는 오류 원격 측정을 수집하도록 선택한 경우에만 이러한 이벤트를 수집합니다.


| 이름 | Type | 설명 | 
| --- | --- | --- | 
|  **오류 유형** |  문자열  |  오류 이름(존재하는 경우). 자세한 내용은 [Error.prototype.name](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/name)을 참조하세요. 일부 브라우저는 오류 유형을 지원하지 않을 수 있습니다.  | 
|  **오류 메시지** |  문자열  |  오류 메시지 자세한 내용은 [Error.prototype.message](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/message)를 참조하세요. 오류 필드가 없으면 오류 이벤트 메시지입니다. 자세한 내용은 [ErrorEvent](https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent)를 참조하세요. 여러 브라우저에서 오류 메시지가 일관되지 않을 수 있습니다.  | 
|  **스택 추적** |  문자열  |  오류의 스택 추적이 있는 경우 150자로 잘립니다. 자세한 내용은 [Error.prototype.stack](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Stack)을 참조하세요. 일부 브라우저는 스택 추적을 지원하지 않을 수 있습니다.  | 

### DOM 이벤트 스키마
<a name="CloudWatch-RUM-datacollected-DOMEvent"></a>

에이전트에서 생성된 문서 객체 모델(DOM) 이벤트에는 다음과 같은 속성이 포함되어 있습니다. 이러한 이벤트는 기본적으로 수집되지 않습니다. 상호 작용 원격 측정을 활성화하는 경우에만 수집됩니다. 자세한 내용은 [ CloudWatch RUM 웹 클라이언트 설명서](https://github.com/aws-observability/aws-rum-web/blob/main/docs/cdn_installation.md)를 참조하세요.


| 이름 | Type | 설명 | 
| --- | --- | --- | 
|  **Event** |  문자열  |  클릭, 스크롤 또는 마우스오버와 같은 DOM 이벤트의 유형. 자세한 내용은 [이벤트 참조](https://developer.mozilla.org/en-US/docs/Web/Events)를 참조하세요.  | 
|  **Element** |  문자열  |  DOM 요소 유형  | 
|  **ID 요소** |  문자열  |  이벤트를 생성한 요소에 ID가 있는 경우 이 속성은 해당 ID를 저장합니다. 자세한 내용은 [Element.id](https://developer.mozilla.org/en-US/docs/Web/API/Element/id)를 참조하세요.  | 
|  **CSSLocator** |  문자열  |  DOM 요소를 식별하는 데 사용되는 CSS 로케이터입니다.  | 
|  **InteractionId** |  문자열  |  사용자와 UI 간의 상호 작용을 위한 고유 ID입니다.  | 

### 탐색 이벤트 스키마
<a name="CloudWatch-RUM-datacollected-NavigationEvent"></a>

탐색 이벤트는 앱 모니터에 성능 원격 측정이 활성화된 경우에만 수집됩니다.

탐색 이벤트는 [탐색 타이밍 레벨 1](https://www.w3.org/TR/navigation-timing/#performancetiming) 및 [탐색 타이밍 레벨 2](https://w3c.github.io/navigation-timing) API를 사용합니다. 레벨 2 API는 모든 브라우저에서 지원되지 않으므로 이러한 최신 필드는 선택 사항입니다.

**참고**  
타임스탬프 지표는 [DOMHighResTimestamp](https://www.w3.org/TR/hr-time-2/#sec-domhighrestimestamp)를 기반으로 합니다. 레벨 2 API의 경우 모든 타이밍은 기본적으로 `startTime`과 관련되어 있습니다. 하지만 레벨 1의 경우 상대값을 얻기 위해 타임스탬프 지표에서 `navigationStart` 지표를 뺍니다. 모든 타임스탬프 값은 밀리초 단위입니다.

탐색 이벤트에는 다음 속성이 포함됩니다.


| 이름 | Type | 설명 | 참고 | 
| --- | --- | --- | --- | 
|  **initiatorType** |  문자열  |  성능 이벤트를 시작한 리소스 유형을 나타냅니다. |  **값:** "탐색" **레벨 1:** "탐색" **레벨 2:** entryData.initiatorType | 
|  **navigationType** |  문자열  |  탐색 유형을 나타냅니다.이 속성은 필수가 아닙니다. |  **값:** 값은 다음 중 하나여야 합니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-datacollected.html) | 
|  **startTime** |  숫자  |  이벤트가 트리거되는 시점을 나타냅니다. |  **값:** 0 **레벨 1:** entryData.navigationStart - entryData.navigationStart  **레벨 2:** entryData.startTime | 
|  **unloadEventStart** |  숫자  |  창의 이전 문서가 `unload` 이벤트가 발생 후 언로드되기 시작한 시간을 나타냅니다. |  **값:** 이전 문서가 없거나 이전 문서 또는 필요한 리디렉션 중 하나가 동일한 원본이 아닌 경우 반환되는 값은 0입니다. **레벨 1:** <pre>entryData.unloadEventStart > 0<br />  ? entryData.unloadEventStart - entryData.navigationStart<br />  : 0<br /></pre> **레벨 2:** entryData.unloadEventStart | 
|  **promptForUnload** |  숫자  |  문서를 언로드하는 데 걸린 시간입니다. 즉, `unloadEventStart` 및 `unloadEventEnd` 사이의 시간에서 `UnloadEventEnd`는 언로드 이벤트 핸들러가 완료된 순간을 밀리초로 나타냅니다. |  **값:** 이전 문서가 없거나 이전 문서 또는 필요한 리디렉션 중 하나가 동일한 원본이 아닌 경우 반환되는 값은 0입니다. **레벨 1:** entryData.unloadEventEnd - entryData.unloadEventStart **레벨 2:** entryData.unloadEventEnd - entryData.unloadEventStart | 
|  **redirectCount** |  숫자  |  현재 탐색 컨텍스트에서 마지막으로 리디렉션되지 않은 탐색 이후의 리디렉션 수를 나타내는 숫자입니다. 이 속성은 필수가 아닙니다. |  **값:** 리디렉션이 없거나 대상 문서와 같은 원본이 아닌 리디렉션이 있는 경우 반환되는 값은 0입니다. **레벨 1:** 사용할 수 없음 **레벨 2:** entryData.redirectCount | 
|  **redirectStart** |  숫자  |  첫 번째 HTTP 리디렉션이 시작되는 시간입니다.  |  **값:** 리디렉션이 없거나 대상 문서와 같은 원본이 아닌 리디렉션이 있는 경우 반환되는 값은 0입니다. **레벨 1:** <pre>entryData.redirectStart > 0<br />  ? entryData.redirectStart - entryData.navigationStart<br />  : 0</pre> **레벨 2:** entryData.redirectStart | 
|  **redirectTime** |  숫자  |  HTTP 리디렉션에 걸린 시간입니다. `redirectStart` 및 `redirectEnd`의 차이점입니다.  |  **레벨 1:**: entryData.redirectEnd - entryData.redirectStart **레벨 2:**: entryData.redirectEnd - entryData.redirectStart | 
|  **workerStart** |  숫자  |  이것은 `PerformanceResourceTiming` 인터페이스 속성입니다. 작업자 스레드 작업의 시작을 표시합니다. 이 속성은 필수가 아닙니다. |  **값:** 서비스 작업자 스레드가 이미 실행 중이거나 서비스 작업자 스레드를 시작하기 직전에 이 속성은 `FetchEvent` 디스패치 직전의 시간을 반환합니다. 서비스 작업자가 리소스를 가로채지 않으면 0을 반환합니다. **레벨 1:** 사용할 수 없음 **레벨 2:** entryData.workerStart | 
|  **workerTime** |  숫자  |  서비스 작업자가 리소스를 가로채면 작업자 스레드 작업에 필요한 시간이 반환됩니다. 이 속성은 필수가 아닙니다. |  **레벨 1:** 사용할 수 없음  **레벨 2:** <pre>entryData.workerStart > 0<br />   ? entryData.fetchStart - entryData.workerStart<br />   : 0</pre>  | 
|  **fetchStart** |  숫자  |  브라우저가 HTTP 요청을 사용하여 문서를 가져올 준비가 된 시간입니다. 이는 애플리케이션 캐시를 확인하기 전입니다. |  **레벨 1:**  <pre>: entryData.fetchStart > 0<br />  ? entryData.fetchStart - entryData.navigationStart<br />  : 0</pre> **레벨 2:** entryData.fetchStart | 
|  **domainLookupStart** |  숫자  |  도메인 조회가 시작되는 시간입니다. |  **값:** 영구 연결이 사용되거나 정보가 캐시 또는 로컬 리소스에 저장되어 있는 경우 값은 `fetchStart`와 같습니다. **레벨 1:** <pre>entryData.domainLookupStart > 0<br />  ? entryData.domainLookupStart - entryData.navigationStart<br />  : 0</pre> **레벨 2:** entryData.domainLookupStart | 
|  **dns** |  숫자  |  도메인 조회에 필요한 시간입니다. |  **값:** 리소스 및 DNS 레코드가 캐시된 경우 예상 값은 0입니다. **레벨 1:** entryData.domainLookupEnd - entryData.domainLookupStart **레벨 2:** entryData.domainLookupEnd - entryData.domainLookupStart | 
|  **nextHopProtocol** |  문자열  |  리소스를 가져오는 데 사용되는 네트워크 프로토콜을 나타내는 문자열입니다. 이 속성은 필수가 아닙니다. |  **레벨 1:** 사용할 수 없음 **레벨 2:** entryData.nextHopProtocol | 
|  **connectStart** |  숫자  |  사용자 에이전트가 문서 검색을 위해 서버에 대한 연결 설정을 시작하기 직전의 시간입니다. |  **값:** RFC2616 영구 연결이 사용되거나 현재 문서가 관련 애플리케이션 캐시 또는 로컬 리소스에서 검색되는 경우 이 속성은 `domainLookupEnd` 값을 반환합니다. **레벨 1:** <pre>entryData.connectStart > 0<br />  ? entryData.connectStart - entryData.navigationStart<br />  : 0</pre> **레벨 2:** entryData.connectStart  | 
|  **connect** |  숫자  |  전송 연결을 설정하거나 SSL 인증을 수행하는 데 필요한 시간을 측정합니다. 또한 브라우저에서 실행한 동시 요청이 너무 많을 때 걸리는 차단된 시간도 포함됩니다.  |  **레벨 1:** entryData.connectEnd - entryData.connectStart **레벨 2:** entryData.connectEnd - entryData.connectStart | 
|  **secureConnectionStart** |  숫자  |  현재 페이지의 URL 스키마가 "https"인 경우 이 속성은 사용자 에이전트가 현재 연결을 보호하기 위해 핸드셰이크 프로세스를 시작하기 직전의 시간을 반환합니다. HTTPS를 사용하지 않으면 0을 반환합니다. URL 스키마에 대한 자세한 내용은 [URL 표시](https://url.spec.whatwg.org/#concept-url-scheme)를 참조하세요.  |  **공식:** entryData.secureConnectionStart | 
|  **tlsTime** |  숫자  |  SSL 핸드셰이크를 완료하는 데 걸린 시간입니다.  |  **레벨 1:** <pre>entryData.secureConnectionStart > 0<br />   ? entryData.connectEnd - entryData.secureConnectionStart<br />   : 0</pre> **레벨 2:** <pre>entryData.secureConnectionStart > 0<br />   ? entryData.connectEnd - entryData.secureConnectionStart<br />   : 0</pre>  | 
|  **requestStart** |  숫자  |  사용자 에이전트가 서버나 관련 애플리케이션 캐시 또는 로컬 리소스에서 리소스 요청을 시작하기 직전의 시간입니다.  | **레벨 1:** <pre>: entryData.requestStart > 0<br />  ? entryData.requestStart - entryData.navigationStart<br />  : 0<br /></pre> **레벨 2:** entryData.requestStart | 
|  **timeToFirstByte** |  숫자  |  요청 후 첫 번째 바이트 정보를 수신하는 데 걸린 시간입니다. 이 시간은 `startTime`을 기준으로 합니다.  | **레벨 1:** entryData.responseStart - entryData.requestStart **레벨 2:** entryData.responseStart - entryData.requestStart | 
|  **responseStart** |  숫자  |  사용자 에이전트의 HTTP 파서가 관련 애플리케이션 캐시 또는 로컬 리소스 또는 서버에서 응답의 첫 번째 바이트를 수신한 직후의 시간입니다.  | **레벨 1:** <pre>entryData.responseStart > 0<br />   ? entryData.responseStart - entryData.navigationStart<br />   : 0</pre> **레벨 2:** entryData.responseStart   | 
|  **responseTime** |  문자열  |  관련 애플리케이션 캐시, 로컬 리소스 또는 서버에서 바이트 형식으로 전체 응답을 수신하는 데 걸린 시간입니다.  | **레벨 1:** <pre>entryData.responseStart > 0<br />  ? entryData.responseEnd - entryData.responseStart<br />  : 0</pre> **레벨 2:** <pre>entryData.responseStart > 0<br />  ? entryData.responseEnd - entryData.responseStart<br />  : 0</pre>  | 
|  **domInteractive** |  숫자  |  파서가 기본 문서에서 작업을 완료하고 HTML DOM이 생성되는 시간입니다. 현 시점에서 `Document.readyState`가 "대화식"으로 바뀌며 해당 `readystatechange` 이벤트가 발생합니다.  | **레벨 1:** <pre>entryData.domInteractive > 0<br />  ? entryData.domInteractive - entryData.navigationStart<br />  : 0</pre> **레벨 2:** entryData.domInteractive  | 
|  **domContentLoadedEventStart** |  숫자  |  사용자 에이전트가 현재 문서에서 DOMContentLoaded 이벤트를 실행하기 직전의 시간과 동일한 시간 값을 나타냅니다. DomContentLoad 이벤트는 초기 HTML 문서가 완전히 로드되고 구문 분석되면 발생합니다. 이때 기본 HTML 문서의 구문 분석이 완료되고, 브라우저가 렌더 트리를 구성하기 시작하며, 하위 리소스는 여전히 로드되어야 합니다. 이는 스타일 시트, 이미지 및 하위 프레임이 로드될 때까지 기다리지 않습니다.  | **레벨 1:** <pre>entryData.domContentLoadedEventStart > 0<br />  ? entryData.domContentLoadedEventStart - entryData.navigationStart<br />  : 0<br /></pre> **레벨 2:** entryData.domContentLoadedEventStart  | 
|  **domContentLoaded** |  숫자  |  렌더 트리 구성의 시작 시간과 종료 시간은 `domContentLoadedEventStart` 및 `domContentLoadedEventEnd`로 표시됩니다. CloudWatch RUM이 실행을 추적할 수 있습니다. 이 속성은 `domContentLoadedStart` 및 `domContentLoadedEnd`의 차이점입니다. 이 기간 동안 DOM과 CSSOM이 준비됩니다. 이 속성은 비동기 및 동적으로 생성된 스크립트를 제외하고 스크립트 실행을 기다립니다. 스크립트가 스타일 시트에 의존하는 경우 `domContentLoaded`는 스타일 시트에서도 기다립니다. 이미지를 기다리지 않습니다.  `domContentLoadedStart`와 `domContentLoadedEnd`의 실제 값은 Google Chrome의 네트워크 패널의 `domContentLoaded`에 근접합니다. 페이지 로딩 프로세스의 시작부터 HTML DOM \$1 CSSOM 렌더링 트리 생성 시간을 나타냅니다. 탐색 지표의 경우 `domContentLoaded` 값은 시작 값과 끝 값의 차이를 나타냅니다. 이 값은 하위 리소스와 렌더링 트리 구성만 다운로드하는 데 필요한 시간입니다.   | **레벨 2:** entryData.domContentLoadedEventEnd - entryData.domContentLoadedEventStart  **레벨 2:** entryData.domContentLoadedEventEnd - entryData.domContentLoadedEventStart  | 
|  **domComplete** |  숫자  |  브라우저가 현재 문서 준비를 완료하도록 설정하기 바로 전의 시간입니다. 이때 이미지와 같은 하위 리소스의 로드가 완료됩니다. 여기에는 CSS 및 동기식 JavaScript와 같은 차단 콘텐츠를 다운로드하는 데 걸리는 시간이 포함됩니다. 이 시간은 Google Chrome 네트워크 패널의 `loadTime`에 근접합니다.  | **레벨 1:** <pre>entryData.domComplete > 0<br />  ? entryData.domComplete - entryData.navigationStart<br />  : 0<br /></pre> **레벨 2:** entryData.domComplete  | 
|  **domProcessingTime** |  숫자  |  응답과 로드 이벤트 시작 간 총 시간입니다.  | **레벨 1:** entryData.loadEventStart - entryData.responseEnd **레벨 2:** entryData.loadEventStart - entryData.responseEnd  | 
|  **loadEventStart** |  숫자  |  현재 문서의 `load` 이벤트 직전 시간입니다. |  **레벨 1:** <pre>entryData.loadEventStart > 0<br />  ? entryData.loadEventStart - entryData.navigationStart<br />  : 0<br /></pre> **레벨 2:** entryData.loadEventStart | 
|  **loadEventTime** |  숫자  |  `loadEventStart`와 `loadEventEnd`의 차이점. 이 로드 이벤트를 기다리는 추가 함수 또는 로직은 이 시간 동안 실행됩니다. |  **레벨 1:** entryData.loadEventEnd - entryData.loadEventStart **레벨 2:** entryData.loadEventEnd - entryData.loadEventStart | 
|  **duration** |  문자열  |  기간은 총 페이지 로드 시간입니다. 기본 페이지와 모든 동기식 하위 리소스를 다운로드하고 페이지를 렌더링하는 타이밍을 기록합니다. 스크립트와 같은 비동기 리소스는 나중에 계속 다운로드됩니다. 이는 `loadEventEnd` 및 `startTime` 속성 간 차이점입니다.  | **레벨 1:** entryData.loadEventEnd - entryData.navigationStart **레벨 2:** entryData.duration | 
|  **headerSize** |  숫자  |  `transferSize` 및 `encodedBodySize` 간 차이를 반환합니다. 이 속성은 필수가 아닙니다.  | **레벨 1:** 사용할 수 없음 **레벨 2:** entryData.transferSize - entryData.encodedBodySize **레벨 2:** entryData.transferSize - entryData.encodedBodySize | 
|  **compressionRatio** |  숫자  |  `encodedBodySize` 및 `decodedBodySize`의 비율. `encodedBodySize` 값은 HTTP 헤더를 제외한 리소스의 압축된 크기입니다. `decodedBodySize` 값은 HTTP 헤더를 제외한 리소스의 압축 해제된 크기입니다. 이 속성은 필수가 아닙니다.  | **레벨 1:** 해당 사항 없음. **레벨 2:**<pre>entryData.encodedBodySize > 0<br />  ? entryData.decodedBodySize / entryData.encodedBodySize<br />  : 0</pre>  | 
|  **navigationTimingLevel** |  숫자  |  탐색 타이밍 API 버전.  | **값:** 1 또는 2  | 

### 리소스 이벤트 스키마
<a name="CloudWatch-RUM-datacollected-ResourceEvent"></a>

탐색 이벤트는 앱 모니터에 성능 원격 측정이 활성화된 경우에만 수집됩니다.

타임스탬프 지표는 [The DOMHighResTimeStamp typedef](https://www.w3.org/TR/hr-time-2/#sec-domhighrestimestamp)를 기반으로 합니다. 레벨 2 API의 경우 모든 타이밍은 기본적으로 `startTime`과 관련됩니다. 하지만 레벨 1 API의 경우 상대값을 얻기 위해 타임스탬프 지표에서 `navigationStart` 지표를 뺍니다. 모든 타임스탬프 값은 밀리초 단위입니다.

에이전트에서 생성된 리소스 이벤트에는 다음 속성이 포함됩니다.


| 이름 | Type | 설명 | 참고 | 
| --- | --- | --- | --- | 
|  **targetUrl** |  문자열  |  리소스 URL을 반환합니다. |  **공식:** [entryData.name](http://entrydata.name/) | 
|  **initiatorType** |  문자열  |  성능 리소스 이벤트를 시작한 리소스 유형을 나타냅니다. |  **값:** "리소스" **공식:** entryData.initiatorType | 
|  **duration** |  문자열  |  `responseEnd` 및 `startTime` 속성 간 차이를 반환합니다.이 속성은 필수가 아닙니다.  | **공식:** entryData.duration | 
|  **transferSize** |  숫자  |  응답 헤더 필드와 응답 페이로드 본문을 포함하여 가져온 리소스 크기(옥텟 단위)를 반환합니다.이 속성은 필수가 아닙니다.  | **공식:** entryData.transferSize | 
|  **fileType** |  문자열  |  대상 URL 패턴에서 파생된 확장입니다.  |   | 

### 가장 큰 콘텐츠 페인트 이벤트 스키마
<a name="CloudWatch-RUM-datacollected-LargestPaintEvent"></a>

가장 큰 콘텐츠 페인트 이벤트에는 다음 속성이 포함됩니다.

이러한 이벤트는 활성화된 성능 원격 측정이 앱 모니터에 있는 경우에만 수집됩니다.


| 이름 | 설명 | 
| --- | --- | 
|  **값** |  자세한 내용은 [웹 바이탈](https://web.dev/vitals/)을 참조하세요. | 

### 첫 번째 입력 지연 이벤트
<a name="CloudWatch-RUM-datacollected-FirstInputDelayEvent"></a>

첫 번째 입력 지연 이벤트는 다음 속성을 포함합니다.

이러한 이벤트는 활성화된 성능 원격 측정이 앱 모니터에 있는 경우에만 수집됩니다.


| 이름 | 설명 | 
| --- | --- | 
|  **값** |  자세한 내용은 [웹 바이탈](https://web.dev/vitals/)을 참조하세요. | 

### 누적 레이아웃 시프트 이벤트
<a name="CloudWatch-RUM-datacollected-CumulativeShift"></a>

누적 레이아웃 시프트 이벤트에는 다음 속성이 포함됩니다.

이러한 이벤트는 활성화된 성능 원격 측정이 앱 모니터에 있는 경우에만 수집됩니다.


| 이름 | 설명 | 
| --- | --- | 
|  **값** |  자세한 내용은 [웹 바이탈](https://web.dev/vitals/)을 참조하세요. | 

### HTTP 이벤트
<a name="CloudWatch-RUM-datacollected-HTTP"></a>

HTTP 이벤트에는 다음 속성이 포함될 수 있습니다. `Response` 필드 또는 `Error` 필드 중 하나를 포함하되 두 필드 모두를 포함하지는 않습니다.

이러한 이벤트는 활성화된 HTTP 원격 측정이 앱 모니터에 있는 경우에만 수집됩니다.


| 이름 | 설명 | 
| --- | --- | 
|  **요청** |  요청 필드에는 다음이 포함됩니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-datacollected.html)  | 
|  **응답** |  응답 필드에는 다음 항목이 포함됩니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-datacollected.html)  | 
|  **오류** |  응답 필드에는 다음 항목이 포함됩니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-datacollected.html)  | 

### X-Ray 추적 이벤트 스키마
<a name="CloudWatch-RUM-datacollected-xraytraceEvent"></a>

이러한 이벤트는 앱 모니터에 X-Ray 추적이 활성화된 경우에만 수집됩니다.

X-Ray 추적 이벤트 스키마에 대한 자세한 내용은 [AWS X-Ray 세그먼트 설명서](https://docs.aws.amazon.com/xray/latest/devguide/xray-api-segmentdocuments.html)를 참조하세요.

# 단일 페이지 애플리케이션의 경로 변경 타이밍
<a name="CloudWatch-RUM-route-change-timing"></a>

기존의 다중 페이지 애플리케이션에서 사용자가 새 콘텐츠를 로드하도록 요청하면 실제로 서버에서 새 HTML 페이지를 요청하게 됩니다. 결과적으로 CloudWatch RUM 웹 클라이언트는 일반 성능 API 지표를 사용하여 로드 시간을 캡처합니다.

하지만 단일 페이지 웹 애플리케이션은 JavaScript와 Ajax를 사용하여 서버에서 새 페이지를 로드하지 않고도 인터페이스를 업데이트합니다. 단일 페이지 업데이트는 브라우저 타이밍 API에 의해 기록되지 않으며, 대신 경로 변경 타이밍을 사용합니다.

CloudWatch RUM은 서버의 전체 페이지 로드와 단일 페이지 업데이트에 대한 모니터링을 모두 지원하지만 다음과 같은 차이점이 있습니다.
+ 경로 변경 타이밍의 경우 `tlsTime`, `timeToFirstByte` 등과 같은 브라우저에서 제공하는 지표가 없습니다.
+ 경로 변경 타이밍의 경우 `initiatorType` 필드가 `route_change`입니다.

CloudWatch RUM 웹 클라이언트는 경로 변경을 유발할 수 있는 사용자 상호 작용을 수신하며, 이러한 사용자 상호 작용이 기록되면 웹 클라이언트는 타임스탬프를 기록합니다. 그리고 다음 두 가지 조건을 모두 만족할 때 경로 변경 타이밍이 시작됩니다.
+ 경로 변경을 수행하는 데 브라우저 기록 API(브라우저 앞으로 및 뒤로 버튼 제외)가 사용되었습니다.
+ 경로 변경 감지 시간과 최신 사용자 상호 작용 타임스탬프 간의 차이가 1,000ms 미만입니다. 이는 데이터 스큐를 방지합니다.

그런 다음 경로 변경 타이밍이 시작되면 진행 중인 AJAX 요청 및 DOM 변형이 없는 경우 해당 타이밍이 완료됩니다. 그리고 마지막으로 완료된 활동의 타임스탬프가 완료 타임스탬프로 사용됩니다.

10초 이상 진행 중인 AJAX 요청 또는 DOM 변형이 있는 경우 경로 변경 타이밍이 시간 초과됩니다(기본값). 이 경우 CloudWatch RUM 웹 클라이언트는 더 이상 이 경로 변경에 대한 타이밍을 기록하지 않습니다.

결과적으로, 경로 변경 이벤트의 기간이 다음과 같이 계산됩니다.

```
(time of latest completed activity) - (latest user interaction timestamp)
```

# CloudWatch RUM을 사용하는 애플리케이션 관리
<a name="CloudWatch-RUM-manage"></a>

이 섹션의 단계에 따라 애플리케이션의 CloudWatch RUM 사용을 관리합니다.

**Topics**
+ [이미 생성한 코드 조각을 찾으려면 어떻게 해야 한가요?](CloudWatch-RUM-find-code-snippet.md)
+ [CloudWatch RUM 앱 모니터 설정 편집](CloudWatch-RUM-edit-application.md)
+ [CloudWatch RUM 사용 중지 또는 앱 모니터 삭제](CloudWatch-RUM-delete-appmonitor.md)

# 이미 생성한 코드 조각을 찾으려면 어떻게 해야 한가요?
<a name="CloudWatch-RUM-find-code-snippet"></a>

애플리케이션용으로 이미 생성한 CloudWatch RUM 코드 조각을 찾으려면 다음 단계를 수행하세요.

**이미 생성한 코드 조각 찾기**

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

1. 탐색 창에서 **Application Signals**, **RUM**을 선택합니다.

1. **구성** 탭, **코드 조각** 섹션으로 이동합니다.

1. 해당하는 계측에 대해 **Copy/Download**를 선택합니다.

# CloudWatch RUM 앱 모니터 설정 편집
<a name="CloudWatch-RUM-edit-application"></a>

앱 모니터 설정을 변경하려면 다음 단계를 따르세요. 앱 모니터 이름을 제외한 모든 설정을 변경할 수 있습니다.

**애플리케이션에서 CloudWatch RUM을 사용하는 방법 편집**

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

1. 탐색 창에서 **Application Signals**, **RUM**을 선택합니다.

1. 애플리케이션 이름 옆의 버튼을 선택한 다음 **작업(Actions)**에서 **편집(Edit)**을 선택합니다.

1. 애플리케이션 이름을 제외한 모든 설정을 변경할 수 있습니다. 설정에 대한 자세한 내용은 [웹 애플리케이션용 CloudWatch RUM 앱 모니터 생성](CloudWatch-RUM-get-started-create-app-monitor.md) 섹션을 참조하세요.

1. 완료하였으면 **저장**을 선택합니다.

   설정을 변경하면 코드 조각이 변경됩니다. 이제 업데이트된 코드 조각을 애플리케이션에 붙여넣어야 합니다.

1. 코드 조각이 생성된 후 **클립보드로 복사** 또는 **다운로드**를 선택한 다음, **완료**를 선택합니다.

   새 설정으로 모니터링을 시작하려면 애플리케이션에 코드 조각을 삽입합니다.

# CloudWatch RUM 사용 중지 또는 앱 모니터 삭제
<a name="CloudWatch-RUM-delete-appmonitor"></a>

애플리케이션에서 CloudWatch RUM 사용을 중지하려면 애플리케이션 코드에서 RUM이 생성한 코드 조각을 제거합니다.

RUM 앱 모니터를 삭제하려면 다음 단계를 따르세요.

**앱 모니터 삭제**

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

1. 탐색 창에서 **Application Signals**, **RUM**을 선택합니다.

1. 애플리케이션 이름 옆의 버튼을 선택한 다음 **작업(Actions)**에서 **삭제(Delete)**를 선택합니다.

1. 확인 필드에 **Delete**를 입력한 다음 **삭제(Delete)**를 선택합니다.

1. 아직 생성하지 않은 경우 애플리케이션 코드에서 CloudWatch RUM 코드 조각을 삭제합니다.

# CloudWatch RUM 문제 해결
<a name="CloudWatch-RUM-troubleshooting"></a>

이 섹션에서는 CloudWatch RUM 문제를 해결하는 데 도움이 되는 팁을 제공합니다.

## 내 애플리케이션에 대한 데이터가 없습니다
<a name="CloudWatch-RUM-troubleshooting-nodata"></a>

먼저 코드 조각이 애플리케이션에 올바르게 삽입되었는지 확인합니다. 자세한 내용은 [애플리케이션에 CloudWatch 앱 모니터 코드 조각 삽입](CloudWatch-RUM-get-started-insert-code-snippet.md) 섹션을 참조하세요.

해당 문제가 아닌 경우 아직 애플리케이션에 대한 트래픽이 없는 것일 수 있습니다. 사용자와 동일한 방식으로 애플리케이션에 액세스하여 일부 트래픽을 생성합니다.

## 내 애플리케이션에 대한 데이터 기록이 중지되었습니다
<a name="CloudWatch-RUM-troubleshooting-nonewdata"></a>

애플리케이션이 업데이트되었을 수 있으며 이제 CloudWatch RUM 코드 조각이 더 이상 포함되지 않습니다. 애플리케이션 코드를 확인합니다.

또 다른 가능성은 누군가가 코드 조각을 업데이트했지만 업데이트 된 코드 조각을 애플리케이션에 삽입하지 않았을 수도 있습니다. [이미 생성한 코드 조각을 찾으려면 어떻게 해야 한가요?](CloudWatch-RUM-find-code-snippet.md)의 지시에 따라 업데이트된 올바른 코드 조각을 찾고 애플리케이션에 붙여넣은 코드 조각과 비교합니다.