

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Managed Service for Apache Flink의 로깅 및 모니터링
<a name="monitoring-overview"></a>

모니터링은 Managed Service for Apache Flink 애플리케이션의 신뢰성, 가용성 및 성능을 유지하는 중요한 역할을 합니다. 다중 지점 실패가 발생할 경우 보다 쉽게 디버깅할 수 있도록 AWS 솔루션의 모든 부분에서 모니터링 데이터를 수집해야 합니다.

Managed Service for Apache Flink에 대한 모니터링을 시작하기 전에 다음 질문에 대한 답변을 포함하는 모니터링 계획을 작성해야 합니다
+ 모니터링의 목표
+ 모니터링할 리소스
+ 이러한 리소스를 모니터링하는 빈도
+ 사용할 모니터링 도구
+ 모니터링 작업을 수행할 사람
+ 문제 발생 시 알려야 할 대상

다음 단계는 환경의 정상 Managed Service for Apache Flink 성능에 대한 기준을 설정하는 것입니다. 이렇게 하려면 다양한 시간과 다양한 부하 조건에서 성능을 측정해야 합니다. Managed Service for Apache Flink를 모니터링하면서 모니터링 데이터를 저장할 수 있습니다. 이러면 현재 성능 데이터와 비교하고, 일반적인 성능 패턴과 성능 이상을 식별하고, 문제를 해결할 방법을 강구할 수 있습니다.

**Topics**
+ [Managed Service for Apache Flink 로깅](logging.md)
+ [Managed Service for Apache Flink 모니터링](monitoring.md)
+ [Managed Service for Apache Flink 애플리케이션 로깅 설정](cloudwatch-logs.md)
+ [CloudWatch Logs Insights로 로그 분석](cloudwatch-logs-reading.md)
+ [Managed Service for Apache Flink의 지표 및 차원](metrics-dimensions.md)
+ [CloudWatch Logs에 사용자 지정 메시지 작성](cloudwatch-logs-writing.md)
+ [를 사용하여 Managed Service for Apache Flink API 호출 로깅 AWS CloudTrail](logging-using-cloudtrail.md)

# Managed Service for Apache Flink 로깅
<a name="logging"></a>

로깅은 프로덕션 애플리케이션에서 오류와 장애를 파악하는 데 중요합니다. 그러나 로깅 하위 시스템은 로그 항목을 수집하여 CloudWatch Logs에 전달해야 합니다. 일부 로깅은 괜찮고 바람직하지만 광범위한 로깅은 서비스에 과부하가 걸리고 Flink 애플리케이션이 지연될 수 있습니다. 예외 및 경고를 기록하는 것은 분명 좋은 생각입니다. 하지만 Flink 애플리케이션에서 처리하는 모든 메시지에 대해 로그 메시지를 생성할 수는 없습니다. Flink는 높은 처리량과 짧은 지연 시간에 최적화되어 있지만 로깅 하위 시스템은 그렇지 않습니다. 처리된 모든 메시지에 대해 로그 출력을 생성해야 하는 경우 Flink 애플리케이션 내에 있는 추가 DataStream과 적절한 싱크를 사용하여 데이터를 Amazon S3 또는 CloudWatch로 전송하세요. 이러한 용도로는 Java 로깅 시스템을 사용하지 마세요. 게다가 Managed Service for Apache Flink' `Debug Monitoring Log Level` 설정은 대량의 트래픽을 생성하므로 배압(backpressure)이 발생할 수 있습니다. 애플리케이션 관련 문제를 적극적으로 조사할 때만 사용해야 합니다.

## CloudWatch Logs Insights로 로그 쿼리
<a name="logging-querying"></a>

CloudWatch Logs Insights는 로그를 대규모로 쿼리할 수 있는 강력한 서비스입니다. 고객은 이 기능을 활용하여 로그를 신속하게 검색하여 운영 이벤트 중 오류를 식별하고 완화할 수 있습니다.

 다음 쿼리는 모든 작업 관리자 로그에서 예외를 찾아 발생 시간에 따라 예외를 정렬합니다.

```
fields @timestamp, @message
| filter isPresent(throwableInformation.0) or isPresent(throwableInformation) or @message like /(Error|Exception)/
| sort @timestamp desc
```

기타 유용한 쿼리는 [쿼리 예](https://docs.aws.amazon.com/managed-flink/latest/java/cloudwatch-logs-reading.html#cloudwatch-logs-reading-examples)를 참조하세요.

# Managed Service for Apache Flink 모니터링
<a name="monitoring"></a>

프로덕션 환경에서 스트리밍 애플리케이션을 실행할 때는 애플리케이션을 지속적으로 그리고 무기한으로 실행하도록 설정해야 합니다. Flink 애플리케이션뿐만 아니라 모든 구성 요소에 대한 모니터링과 적절한 경보를 구현하는 것이 중요합니다. 그렇지 않으면 새로운 문제를 조기에 발견하지 못하고 문제가 완전히 전개되어 완화하기 훨씬 더 어려워진 후에야 운영상의 이벤트를 인지하게 될 수 있습니다. 모니터링해야 할 일반적인 사항은 다음과 같습니다.
+ 소스가 데이터를 수집하고 있나요?
+ 소스에서 데이터를 읽나요(소스의 관점에서 볼 때)?
+ Flink 애플리케이션에서 데이터를 수신하고 있나요?
+ Flink 애플리케이션이 이를 따라잡을 수 있나요, 아니면 뒤처지고 있나요?
+ Flink 애플리케이션이 데이터를 싱크에 보관하고 있나요(애플리케이션 관점에서 볼 때)?
+ 싱크가 데이터를 수신하고 있나요?

그런 다음 Flink 애플리케이션에 대해 좀 더 구체적인 지표를 고려해야 합니다. 이 [CloudWatch 대시보드](https://github.com/aws-samples/kda-metrics-dashboard)는 좋은 출발점을 제공합니다. 프로덕션 애플리케이션에 대해 모니터링할 지표에 대한 자세한 내용은 [Amazon Managed Service for Apache Flink에서 CloudWatch 경보 사용](monitoring-metrics-alarms.md) 섹션을 참조하세요. 이러한 지표에는 다음이 포함됩니다.
+ **records\$1lag\$1max** 및 **millisBehindLatest —** 애플리케이션이 Kinesis 또는 Kafka를 사용하고 있는 경우, 이러한 지표는 애플리케이션이 지연되고 있는지 여부를 나타내며 현재 로드를 따라잡으려면 규모를 조정(스케일 인)해야 합니다. 이는 모든 종류의 애플리케이션에서 쉽게 추적할 수 있는 유용한 일반 지표입니다. 하지만 애플리케이션이 이미 뒤쳐진 경우 등 반응형 스케일링에만 사용할 수 있습니다.
+ **cpuUtilization** 및 **heapMemoryUtilization** - 이러한 지표는 애플리케이션의 전체 리소스 사용률을 잘 나타내며 애플리케이션이 I/O에 바인딩되지 않는 한 사전 예방적 스케일링에 사용할 수 있습니다.
+ **다운타임** - 다운타임이 0보다 크면 애플리케이션에 장애가 발생한 것입니다. 값이 0보다 크면 애플리케이션에서 데이터를 처리하지 않는 것입니다.
+ **LastCheckpointSize** 및 *LastCheckpointDuration* — 이 지표는 상태에 저장된 데이터의 양과 체크포인트를 생성하는 데 걸리는 시간을 모니터링합니다. 체크포인트가 늘어나거나 시간이 오래 걸리면 애플리케이션은 체크포인트에 지속적으로 시간을 소비하게 되고 실제 처리에 소요되는 주기도 줄어듭니다. 어떤 지점에서는 체크포인트가 너무 커지거나 너무 오래 걸려 실패할 수 있습니다. 절대값을 모니터링하는 것 외에도 고객은 `RATE(lastCheckpointSize)` 및 `RATE(lastCheckpointDuration)`를 사용하여 변경률을 모니터링하는 것도 고려해야 합니다.
+ **numberOfFailedCheckpoints** — 이 지표는 애플리케이션 시작 이후 실패한 체크포인트 수를 계산합니다. 애플리케이션에 따라 가끔 체크포인트에 장애가 발생해도 괜찮을 수 있습니다. 그러나 체크포인트에 정기적으로 장애가 발생하면 애플리케이션이 비정상일 가능성이 높으므로 추가 주의가 필요합니다. 절대값이 아닌 경사에 대한 경보를 위해 `RATE(numberOfFailedCheckpoints)`를 모니터링하는 것이 좋습니다.

# Managed Service for Apache Flink 애플리케이션 로깅 설정
<a name="cloudwatch-logs"></a>

Managed Service for Apache Flink 애플리케이션에 Amazon CloudWatch 로깅 옵션을 추가하면 애플리케이션 이벤트 또는 구성 문제를 모니터링할 수 있습니다.

이 주제에서는 CloudWatch Logs 스트림에 애플리케이션 이벤트를 기록하도록 애플리케이션을 구성하는 방법을 설명합니다. CloudWatch 로깅 옵션은 애플리케이션이 CloudWatch Logs에 애플리케이션 이벤트를 기록하는 방식을 구성하는 데 사용하는 애플리케이션 설정 및 권한 모음입니다. AWS Management Console 또는 ()를 사용하여 CloudWatch 로깅 옵션을 추가하고 구성할 수 있습니다 AWS Command Line Interface AWS CLI.

애플리케이션에 CloudWatch 로깅 옵션을 추가하는 방법에 대한 내용은 다음과 같습니다.
+ 콘솔을 사용하여 CloudWatch 로깅 옵션을 추가하면 Managed Service for Apache Flink가 자동으로 CloudWatch 로그 그룹과 로그 스트림을 생성하고 애플리케이션이 로그 스트림에 기록하는 데 필요한 권한을 추가합니다.
+ API를 사용하여 CloudWatch 로깅 옵션을 추가하는 경우 애플리케이션의 로그 그룹과 로그 스트림도 만들어야 하며, 애플리케이션이 로그 스트림에 쓰기 하는 데 필요한 권한도 추가해야 합니다.

## 콘솔을 사용하여 CloudWatch 로깅 설정
<a name="cloudwatch-logs-console"></a>

콘솔에서 애플리케이션에 대한 CloudWatch 로깅을 활성화하면 CloudWatch 로그 그룹과 로그 스트림이 자동으로 생성됩니다. 또한 스트림에 쓸 수 있는 권한으로 애플리케이션의 권한 정책이 업데이트됩니다.

Managed Service for Apache Flink는 다음 규칙에 따라 이름이 지정된 로그 그룹을 생성합니다. 여기서 *ApplicationName*은 애플리케이션의 이름입니다.

```
/aws/kinesis-analytics/ApplicationName
```

Managed Service for Apache Flink는 새 로그 그룹에 다음과 같은 이름으로 로그 스트림을 생성합니다.

```
kinesis-analytics-log-stream
```

**애플리케이션 구성** 페이지의 **모니터링 로그 수준** 섹션을 사용하여 애플리케이션 모니터링 지표 수준 및 모니터링 로그 수준을 설정합니다. 애플리케이션 로그 수준에 대한 자세한 내용은 [애플리케이션 모니터링 수준 제어](#cloudwatch_levels) 섹션을 참조하세요.

## CLI을 사용하여 CloudWatch 로깅 설정
<a name="cloudwatch-logs-api"></a>

를 사용하여 CloudWatch 로깅 옵션을 추가하려면 다음을 AWS CLI완료합니다.
+ CloudWatch 로그 그룹과 로그 스트림을 생성합니다.
+ [CreateApplication](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 작업을 사용하여 애플리케이션을 만들 때 로깅 옵션을 추가하거나 [AddApplicationCloudWatchLoggingOption](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_AddApplicationCloudWatchLoggingOption.html) 작업을 사용하여 기존 애플리케이션에 로깅 옵션을 추가합니다.
+ 애플리케이션 정책에 로그에 쓸 수 있는 권한을 추가합니다.

### CloudWatch 로그 그룹과 로그 스트림 생성
<a name="cloudwatch-logs-api-create"></a>

CloudWatch 로그 콘솔 또는 API를 사용하여 CloudWatch 로그 그룹을 생성하고 스트리밍합니다. CloudWatch 로그 그룹 및 로그 스트림 생성에 대한 자세한 내용은 [로그 그룹 및 로그 스트림 작업](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)을 참조하세요.

### 애플리케이션 CloudWatch 로깅 옵션 작업
<a name="adding_cloudwatch"></a>

다음 API 작업을 통해 CloudWatch 로그 옵션을 신규 혹은 기존 애플리케이션에 추가하거나 기존 애플리케이션에 대한 로그 옵션을 변경합니다. JSON 파일을 사용하여 API 작업을 입력하는 방법에 대한 자세한 방법은 [Managed Service for Apache Flink API 예 코드](api-examples.md) 섹션을 참조하세요.

#### 애플리케이션 생성 시 CloudWatch 로그 옵션 추가
<a name="add_cloudwatch_create"></a>

다음 예제는 애플리케이션을 생성할 때 `CreateApplication` 작업을 사용하여 CloudWatch 로그 옵션을 추가하는 방법을 보여 줍니다. 이 예제에서는 *새 애플리케이션에 추가할 CloudWatch 로그 스트림의 Amazon 리소스 이름(ARN)*을 자신의 정보로 바꿉니다. 이러한 작업에 대한 자세한 내용은 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 섹션을 참조하세요.

```
{
    "ApplicationName": "test",
    "ApplicationDescription": "test-application-description",
    "RuntimeEnvironment": "FLINK-1_15",
    "ServiceExecutionRole": "arn:aws:iam::123456789123:role/myrole",
    "ApplicationConfiguration": {
        "ApplicationCodeConfiguration": {
            "CodeContent": {
                "S3ContentLocation":{
                              "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket",
                              "FileKey": "myflink.jar"
                }
            },
            "CodeContentType": "ZIPFILE"
        }
    },
    "CloudWatchLoggingOptions": [{
      "LogStreamARN": "<Amazon Resource Name (ARN) of the CloudWatch log stream to add to the new application>"
	}]
}
```

#### 기존 애플리케이션에 CloudWatch 로그 옵션 추가
<a name="add_to_existing_app"></a>

다음 예제는 `AddApplicationCloudWatchLoggingOption` 작업을 사용하여 기존 애플리케이션에 CloudWatch 로그 옵션을 추가하는 방법을 보여 줍니다. 예제에서 각 *사용자 입력 자리 표시자*를 자신의 정보로 바꿉니다. 이러한 작업에 대한 자세한 내용은 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_AddApplicationCloudWatchLoggingOption.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_AddApplicationCloudWatchLoggingOption.html) 섹션을 참조하세요.

```
{
   "ApplicationName": "<Name of the application to add the log option to>",
   "CloudWatchLoggingOption": { 
      "LogStreamARN": "<ARN of the log stream to add to the application>"
   },
   "CurrentApplicationVersionId": <Version of the application to add the log to>
}
```

#### 기존 CloudWatch 로그 옵션 업데이트
<a name="update_existing"></a>

다음 예제는 `UpdateApplication` 작업을 사용하여 기존 CloudWatch 로그 옵션을 수정하는 방법을 보여 줍니다. 예제에서 각 *사용자 입력 자리 표시자*를 자신의 정보로 바꿉니다. 이러한 작업에 대한 자세한 내용은 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 섹션을 참조하세요.

```
{
   "ApplicationName": "<Name of the application to update the log option for>",
   "CloudWatchLoggingOptionUpdates": [ 
         { 
            "CloudWatchLoggingOptionId": "<ID of the logging option to modify>",
            "LogStreamARNUpdate": "<ARN of the new log stream to use>"
         }
      ],
   "CurrentApplicationVersionId": <ID of the application version to modify>
}
```

#### 애플리케이션에서 CloudWatch 로그 옵션 삭제
<a name="delete-log"></a>

다음 예제는 `DeleteApplicationCloudWatchLoggingOption` 작업을 사용하여 기존 CloudWatch 로그 옵션을 삭제하는 방법을 보여 줍니다. 예제에서 각 *사용자 입력 자리 표시자*를 자신의 정보로 바꿉니다. 이러한 작업에 대한 자세한 내용은 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DeleteApplicationCloudWatchLoggingOption.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DeleteApplicationCloudWatchLoggingOption.html) 섹션을 참조하세요.

```
{
   "ApplicationName": "<Name of application to delete log option from>",
   "CloudWatchLoggingOptionId": "<ID of the application log option to delete>",
   "CurrentApplicationVersionId": <Version of the application to delete the log option from>
}
```

#### 애플리케이션 로깅 수준 설정
<a name="cloudwatch-level"></a>

애플리케이션 로깅 수준을 설정하려면 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 작업의 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_MonitoringConfiguration.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_MonitoringConfiguration.html) 파라미터 또는 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 작업의 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_MonitoringConfigurationUpdate.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_MonitoringConfigurationUpdate.html) 파라미터를 사용합니다.

애플리케이션 로그 수준에 대한 자세한 내용은 [애플리케이션 모니터링 수준 제어](#cloudwatch_levels) 섹션을 참조하세요.

##### 애플리케이션을 생성할 때 애플리케이션 로깅 수준 설정
<a name="cloudwatch-level-create"></a>

다음 예제의 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html)요청은 애플리케이션 로그 수준을 `INFO`로 설정합니다.

```
{
   "ApplicationName": "MyApplication",                    
   "ApplicationDescription": "My Application Description",
   "ApplicationConfiguration": {
      "ApplicationCodeConfiguration":{
      "CodeContent":{
        "S3ContentLocation":{
          "BucketARN":"arn:aws:s3:::amzn-s3-demo-bucket",
          "FileKey":"myflink.jar",
          "ObjectVersion":"AbCdEfGhIjKlMnOpQrStUvWxYz12345"
        }
      },
      "CodeContentType":"ZIPFILE"
      },
      "FlinkApplicationConfiguration": 
         "MonitoringConfiguration": { 
            "ConfigurationType": "CUSTOM",
            "LogLevel": "INFO"
         }
      },
   "RuntimeEnvironment": "FLINK-1_15",
   "ServiceExecutionRole": "arn:aws:iam::123456789123:role/myrole"
}
```

##### 애플리케이션 로깅 수준 업데이트
<a name="cloudwatch-level-update"></a>

다음 예제의 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html)요청은 애플리케이션 로그 수준을 `INFO`로 설정합니다.

```
{
   "ApplicationConfigurationUpdate": {
      "FlinkApplicationConfigurationUpdate": { 
         "MonitoringConfigurationUpdate": { 
            "ConfigurationTypeUpdate": "CUSTOM",
            "LogLevelUpdate": "INFO"
         }
      }
   }
}
```

### CloudWatch 로그 스트림에 쓰기 권한 추가
<a name="enable_putlogevents"></a>

Managed Service for Apache Flink에는 잘못된 구성 오류를 CloudWatch에 쓰기 할수 있는 권한이 필요합니다. Managed Service for Apache Flink가 수임하는 AWS Identity and Access Management (IAM) 역할에 이러한 권한을 추가할 수 있습니다.

Managed Service for Apache Flink에 IAM 역할을 사용하는 방법에 대한 자세한 내용은 [Amazon Managed Service for Apache Flink의 자격 증명 및 액세스 관리](security-iam.md) 섹션을 참조하세요.

#### 신뢰 정책
<a name="enable_putlogevents_trust_policy"></a>

Managed Service for Apache Flink에 권한을 부여하여 IAM 역할을 맡게하려면 다음의 신뢰 정책을 해당 역할에 연결합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "kinesisanalytics.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

#### 권한 정책
<a name="enable_putlogevents_permissions_policy"></a>

Managed Service for Apache Flink 리소스에서 CloudWatch에 로그 이벤트를 쓸 수 있는 권한을 애플리케이션에 부여하려면 다음 IAM 권한 정책을 사용할 수 있습니다. 로그 그룹과 스트림에 대한 올바른 Amazon 리소스 이름(ARN)을 입력합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Stmt0123456789000",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:123456789012:log-group:my-log-group:log-stream:my-log-stream*",
                "arn:aws:logs:us-east-1:123456789012:log-group:my-log-group:*",
                "arn:aws:logs:us-east-1:123456789012:log-group:*"
            ]
        }
    ]
}
```

------

## 애플리케이션 모니터링 수준 제어
<a name="cloudwatch_levels"></a>

애플리케이션의 *모니터링 지표 수준* 및 *모니터링 로그 수준*을 사용하여 애플리케이션 로그 메시지 생성을 제어할 수 있습니다.

애플리케이션의 모니터링 지표 수준은 로그 메시지의 세분성을 제어합니다. 모니터링 지표 수준은 다음과 같이 정의됩니다.
+ **애플리케이션**: 지표의 범위는 전체 애플리케이션으로 지정됩니다.
+ **작업**: 지표의 범위는 각 작업별로 지정됩니다. 작업에 대한 자세한 내용은 [Managed Service for Apache Flink의 애플리케이션 조정 구현](how-scaling.md) 섹션을 참조하세요.
+ **연산자**: 지표의 범위는 각 연산자별로 지정됩니다. 연산자에 대한 자세한 내용은 [DataStream API를 사용한 Managed Service for Apache Flink의 연산자를 사용하여 데이터 변환](how-operators.md) 섹션을 참조하세요.
+ **병렬 처리**: 지표의 범위는 애플리케이션 병렬 처리로 지정됩니다. [UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html) API의 [MonitoringConfigurationUpdate](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_MonitoringConfigurationUpdate.html) 파라미터를 사용해서만 이 지표 수준을 설정할 수 있습니다. 콘솔을 사용하여 이 지표 수준을 설정할 수는 없습니다. 병렬 처리에 대한 자세한 내용은 [Managed Service for Apache Flink의 애플리케이션 조정 구현](how-scaling.md) 섹션을 참조하세요

애플리케이션의 모니터링 로그 수준은 애플리케이션 로그의 상세 정보를 제어합니다. 모니터링 로그 수준은 다음과 같이 정의됩니다.
+ **오류**: 애플리케이션의 잠재적 재해 이벤트.
+ **경고**: 애플리케이션의 잠재적으로 위험한 상황입니다.
+ **정보**: 애플리케이션의 정보 및 일시적 오류 이벤트. 이 로그 수준을 사용하는 것이 좋습니다.
+ **디버그**: 애플리케이션을 디버깅하는 데 가장 유용한 세분화된 정보 이벤트입니다. *참고*: 이 수준은 임시 디버깅 용도로만 사용하세요.

## 로깅 모범 사례 적용
<a name="cloudwatch_bestpractices"></a>

애플리케이션에서는 **정보** 로깅 수준을 사용하는 것이 좋습니다. **오류** 수준이 아닌 **정보** 수준에서 기록되는 Apache Flink 오류가 표시되도록 하려면 이 수준을 사용하는 것이 좋습니다.

애플리케이션 문제를 조사하는 동안에는 **디버그** 수준을 일시적으로만 사용하는 것이 좋습니다. 문제가 해결되면 **정보** 수준으로 다시 전환하세요. **디버그** 로깅 수준을 사용하면 애플리케이션 성능이 크게 영향을 받습니다.

과도한 로깅은 애플리케이션 성능에도 상당한 영향을 미칠 수 있습니다. 예를 들어 처리된 모든 레코드에 대해 로그 항목을 작성하지 않는 것이 좋습니다. 과도한 로깅은 데이터 처리에 심각한 병목 현상을 일으킬 수 있으며, 소스에서 데이터를 읽는 데 배압이 발생할 수 있습니다.

## 로깅 문제 해결 수행
<a name="cloudwatch_troubleshooting"></a>

애플리케이션 로그가 로그 스트림에 기록되지 않는 경우 다음을 확인하세요.
+ 애플리케이션의 IAM 역할 및 정책이 올바른지 확인하세요. 로그 스트림에 액세스하려면 애플리케이션 정책에 다음과 같은 권한이 필요합니다.
  + `logs:PutLogEvents`
  + `logs:DescribeLogGroups`
  + `logs:DescribeLogStreams`

  자세한 내용을 알아보려면 [CloudWatch 로그 스트림에 쓰기 권한 추가](#enable_putlogevents) 섹션을 참조하세요.
+ 애플리케이션이 실행 중인지 확인합니다. 애플리케이션 상태를 확인하려면 콘솔에서 내 애플리케이션의 페이지를 보거나 [DescribeApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_DescribeApplication.html) 또는 [ListApplications](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_ListApplications.html) 작업을 사용하세요.
+ 다른 애플리케이션 문제를 진단하기 위해 `downtime`와 같은 CloudWatch 지표를 모니터링하세요. CloudWatch 지표 판독에 대한 자세한 내용은 [Managed Service for Apache Flink의 지표 및 차원](metrics-dimensions.md) 섹션을 참조하세요.

## CloudWatch Logs Insights 사용
<a name="cloudwatch_next"></a>

애플리케이션에서 CloudWatch 로깅을 활성화한 후에는 CloudWatch Logs Insights를 사용하여 애플리케이션 로그를 분석할 수 있습니다. 자세한 내용은 [CloudWatch Logs Insights로 로그 분석](cloudwatch-logs-reading.md) 단원을 참조하십시오.

# CloudWatch Logs Insights로 로그 분석
<a name="cloudwatch-logs-reading"></a>

이전 섹션에서 설명한 대로 애플리케이션에 CloudWatch 로깅 옵션을 추가한 후에는 CloudWatch Logs Insights를 사용하여 로그 스트림에서 특정 이벤트 또는 오류를 쿼리할 수 있습니다.

CloudWatch Logs Insights를 사용하면 CloudWatch Logs 내 로그 데이터를 대화식으로 검색해 분석할 수 있습니다.

CloudWatch Logs Insights 사용법에 관한 자세한 내용은 [CloudWatch Logs Insights를 사용한 로그 데이터 분석](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html)을 참조하세요.

## 샘플 쿼리 실행
<a name="cloudwatch-logs-reading-run"></a>

이 섹션에서는 샘플 CloudWatch Logs Insights 쿼리를 실행하는 방법을 설명합니다.

**사전 조건**
+ CloudWatch Logs 내에 설정된 기존 로그 그룹 및 로그 스트림.
+ CloudWatch Logs에 저장된 기존 로그입니다.

 AWS CloudTrail Amazon Route 53 또는 Amazon VPC와 같은 서비스를 사용하는 경우 CloudWatch Logs로 이동하도록 해당 서비스의 로그를 이미 설정했을 것입니다. CloudWatch Logs로 로그를 전송하는 방법에 관한 자세한 내용은 [Amazon CloudWatch Logs 시작하기](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_GettingStarted.html)를 참조하세요.

CloudWatch Logs Insights의 쿼리가 로그 이벤트에서 일련의 필드를 반환하거나 로그 이벤트에 대해 수행된 수학적 집계 또는 다른 작업의 결과를 반환합니다. 이 섹션에서는 로그 이벤트 목록을 반환하는 쿼리를 보여줍니다.

**CloudWatch Logs Insights 샘플 쿼리를 실행하려면**

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

1. 탐색 창에서 **Insights**를 선택합니다.

   

1. 화면 상단의 쿼리 편집기에는 가장 최근의 로그 이벤트 20개를 반환하는 기본 쿼리가 포함되어 있습니다. 쿼리 편집기 위에서 쿼리할 로그 그룹을 선택합니다.

   

   로그 그룹을 선택하면 CloudWatch Logs Insights가 로그 그룹의 데이터에서 필드를 자동으로 감지하고 오른쪽 창의 [**검색된 필드(Discovered fields)**]에 해당 필드를 표시합니다. 또한 이 로그 그룹의 로그 이벤트를 시간의 흐름에 따라 보여주는 막대 그래프도 표시합니다. 이 막대 그래프는 단순히 테이블에 표시된 이벤트가 아니라 쿼리 및 시간 범위와 일치하는 로그 그룹 내 이벤트의 분포를 보여줍니다.

1. **쿼리 실행**을 선택합니다.

   쿼리의 결과가 표시됩니다. 이 예제에서 결과는 모든 유형의 최신 로그 이벤트 20개입니다.

1. 반환된 로그 이벤트 중 하나에 대한 모든 필드를 보려면 해당 로그 이벤트 왼쪽에 있는 화살표를 선택합니다.

CloudWatch Logs Insights 쿼리를 실행하고 수정하는 방법에 대한 자세한 내용은 [샘플 쿼리 실행 및 수정](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_RunSampleQuery.html)을 참조하세요.

## 예제 쿼리 검토
<a name="cloudwatch-logs-reading-examples"></a>

이 섹션에는 Managed Service for Apache Flink 애플리케이션 로그를 분석하기 위한 CloudWatch Logs Insights 예제 쿼리가 포함되어 있습니다. 이러한 쿼리는 몇 가지 예제 오류 조건을 검색하고 다른 오류 조건을 찾는 쿼리를 작성하기 위한 템플릿 역할을 합니다.

**참고**  
다음 쿼리 예제의 리전(*us-west-2*), 계정 ID(*012345678901*) 및 애플리케이션 이름(*YourApplication*)을 애플리케이션의 리전 및 계정 ID로 바꾸세요.

**Topics**
+ [작업 분석: 작업 분배](#cloudwatch-logs-reading-tm)
+ [작업 분석: 병렬 변경](#cloudwatch-logs-reading-auto)
+ [오류 분석: 액세스 거부됨](#cloudwatch-logs-reading-access)
+ [오류 분석: 소스 또는 싱크를 찾을 수 없음](#cloudwatch-logs-reading-con)
+ [오류 분석: 애플리케이션 작업 관련 실패](#cloudwatch-logs-reading-apps)

### 작업 분석: 작업 분배
<a name="cloudwatch-logs-reading-tm"></a>

다음 CloudWatch Logs Insights 쿼리는 Apache Flink Job Manager가 작업 관리자 간에 배포하는 작업 수를 반환합니다. 쿼리가 이전 작업의 작업을 반환하지 않도록 쿼리 시간을 한 작업 실행과 일치하도록 설정해야 합니다. 병렬에 관한 자세한 내용은 [애플리케이션 규모 조정 구현](how-scaling.md) 섹션을 참조하세요.

```
fields @timestamp, message
| filter message like /Deploying/
| parse message " to flink-taskmanager-*" as @tmid
| stats count(*) by @tmid
| sort @timestamp desc
| limit 2000
```

다음 CloudWatch Logs Insights 쿼리는 각 작업 관리자에 할당된 하위 작업을 반환합니다. 총 하위 작업 수는 모든 작업의 병렬 처리 수를 합한 값입니다. 작업 병렬은 연산자 병렬에서 파생되며 코드에서 `setParallelism`을 지정하여 변경하지 않는 한 기본적으로 애플리케이션의 병렬과 동일합니다. 연산자 병렬 처리 설정에 대한 자세한 내용은 [Apache Flink 설명서](https://nightlies.apache.org/flink/flink-docs-release-1.15/)의 [병렬 처리 설정: 연산자 수준](https://nightlies.apache.org/flink/flink-docs-release-1.15/dev/parallel.html#operator-level)을 참조하세요.

```
fields @timestamp, @tmid, @subtask
| filter message like /Deploying/
| parse message "Deploying * to flink-taskmanager-*" as @subtask, @tmid
| sort @timestamp desc
| limit 2000
```

작업 예약에 대한 자세한 내용은 [Apache Flink 설명서](https://nightlies.apache.org/flink/flink-docs-release-1.15/)의 [작업 및 예약](https://nightlies.apache.org/flink/flink-docs-release-1.15/internals/job_scheduling.html)을 참조하세요.

### 작업 분석: 병렬 변경
<a name="cloudwatch-logs-reading-auto"></a>

다음 CloudWatch Logs Insights 쿼리는 애플리케이션의 병렬 처리(예: 자동 스케일링)에 대한 변경 사항을 반환합니다. 또한 이 쿼리는 애플리케이션 병렬 처리에 대한 수동 변경 내용을 반환합니다. 자동 스케일링에 대한 자세한 내용은 [Managed Service for Apache Flink에서 자동 규모 조정 사용](how-scaling-auto.md) 섹션을 참조하세요.

```
fields @timestamp, @parallelism
| filter message like /property: parallelism.default, /
| parse message "default, *" as @parallelism
| sort @timestamp asc
```

### 오류 분석: 액세스 거부됨
<a name="cloudwatch-logs-reading-access"></a>

다음 CloudWatch Logs Insights 쿼리는 `Access Denied` 로그를 반환합니다.

```
fields @timestamp, @message, @messageType
| filter applicationARN like /arn:aws:kinesisanalyticsus-west-2:012345678901:application\/YourApplication/
| filter @message like /AccessDenied/
| sort @timestamp desc
```

### 오류 분석: 소스 또는 싱크를 찾을 수 없음
<a name="cloudwatch-logs-reading-con"></a>

다음 CloudWatch Logs Insights 쿼리는 `ResourceNotFound` 로그를 반환합니다. Kinesis 소스 또는 싱크를 찾을 수 없는 경우 `ResourceNotFound` 로그 결과를 기록합니다.

```
fields @timestamp,@message
| filter applicationARN like /arn:aws:kinesisanalyticsus-west-2:012345678901:application\/YourApplication/
| filter @message like /ResourceNotFoundException/
| sort @timestamp desc
```

### 오류 분석: 애플리케이션 작업 관련 실패
<a name="cloudwatch-logs-reading-apps"></a>

다음 CloudWatch Logs Insights 쿼리는 애플리케이션의 작업 관련 실패 로그를 반환합니다. 이러한 로그는 애플리케이션 상태가 `RUNNING`에서 `RESTARTING`로 전환될 때 발생합니다.

```
fields @timestamp,@message
| filter applicationARN like /arn:aws:kinesisanalyticsus-west-2:012345678901:application\/YourApplication/
| filter @message like /switched from RUNNING to RESTARTING/
| sort @timestamp desc
```

Apache Flink 버전 1.8.2 이하를 사용하는 애플리케이션의 경우 작업 관련 오류가 발생하면 애플리케이션 상태가 `RUNNING`에서 `FAILED`로 전환되는 결과를 낳습니다. Apache Flink 1.8.2 이전 버전을 사용하는 경우 다음 쿼리를 사용하여 애플리케이션 작업 관련 실패를 검색하세요.

```
fields @timestamp,@message
| filter applicationARN like /arn:aws:kinesisanalyticsus-west-2:012345678901:application\/YourApplication/
| filter @message like /switched from RUNNING to FAILED/
| sort @timestamp desc
```

# Managed Service for Apache Flink의 지표 및 차원
<a name="metrics-dimensions"></a>

Managed Service for Apache Flink가 데이터 소스를 처리할 때 Managed Service for Apache Flink는 Amazon CloudWatch에 다음과 같은 지표와 차원을 보고합니다.

**Flink 2.2 지표 변경 사항**  
Flink 2.2는 모니터링 및 경보에 영향을 미칠 수 있는 지표 변경을 도입합니다. 업그레이드하기 전에 다음 변경 사항을 검토합니다.  
`fullRestarts` 지표가 제거되었습니다. 대신 `numRestarts`을 사용하세요.
`uptime` 및 `downtime` 지표는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 새 상태별 지표로 마이그레이션합니다.
Kinesis Data Streams 커넥터 `bytesRequestedPerFetch` 6.0.0에 대한 지표가 제거되었습니다.

## 애플리케이션 지표
<a name="metrics-dimensions-jobs"></a>


| 지표 | 단위 | 설명 | 수준 | 사용 관련 참고 사항 | 
| --- | --- | --- | --- | --- | 
| backPressuredTimeMsPerSecond\$1 | 밀리초 | 이 작업 또는 연산자가 초당 배압을 받는 시간(밀리초)입니다. | 작업, 연산자, 병렬 | \$1Flink 버전 1.13을 구동하는 Managed Service for Apache Flink에서만 사용할 수 있습니다. 이러한 지표는 애플리케이션의 병목 현상을 식별하는 데 유용할 수 있습니다. | 
| busyTimeMsPerSecond\$1 | 밀리초 | 이 작업 또는 연산자가 초당 사용 중인(유휴 상태도 배압 상태도 아닌) 시간(밀리초)입니다. 값을 계산할 수 없는 경우 NaN이 될 수 있습니다. | 작업, 연산자, 병렬 | \$1Flink 버전 1.13을 구동하는 Managed Service for Apache Flink에서만 사용할 수 있습니다. 이러한 지표는 애플리케이션의 병목 현상을 식별하는 데 유용할 수 있습니다. | 
| cpuUtilization | 백분율 | 작업 관리자 전체에서 CPU 사용률의 전체 비율입니다. 예를 들어 작업 관리자가 5명인 경우 Managed Service for Apache Flink는 보고 간격당 이 지표의 샘플 5개를 게시합니다. | 애플리케이션 | 이 지표를 사용하여 애플리케이션의 최소, 평균 및 최대 CPU 사용률을 모니터링할 수 있습니다. CPUUtilization 지표는 컨테이너 내부에서 실행 중인 TaskManager JVM 프로세스의 CPU 사용량만 설명합니다. | 
| containerCPUUtilization | 백분율 | Flink 애플리케이션 클러스터의 작업 관리자 컨테이너 전체 CPU 사용률 비율입니다. 예를 들어, 작업 관리자가 5명인 경우, 그에 상응하는 5개의 TaskManager 컨테이너가 있으며, Managed Service for Apache Flink는 1분 보고 간격마다 이 지표의 샘플 2 \$1 5개를 게시합니다. | 애플리케이션 | 컨테이너별로 다음과 같이 계산됩니다. *컨테이너가 사용한 총 CPU 시간(초) \$1 100 / 컨테이너 CPU 제한(CPU/초)* `CPUUtilization` 지표는 컨테이너 내부에서 실행 중인 TaskManager JVM 프로세스의 CPU 사용량만 설명합니다. 동일한 컨테이너 내에서 JVM 외부에서 실행되는 다른 구성 요소도 있습니다. 이 `containerCPUUtilization` 지표는 컨테이너의 CPU 소모 및 이로 인한 장애 측면에서 모든 프로세스를 포함하여 보다 완전한 그림을 제공합니다.  | 
| containerMemoryUtilization | 백분율 | Flink 애플리케이션 클러스터의 작업 관리자 컨테이너 전체 메모리 사용률입니다. 예를 들어, 작업 관리자가 5명인 경우, 그에 상응하는 5개의 TaskManager 컨테이너가 있으며, Managed Service for Apache Flink는 1분 보고 간격마다 이 지표의 샘플 2 \$1 5개를 게시합니다. | 애플리케이션 | 컨테이너별로 다음과 같이 계산됩니다. *컨테이너 메모리 사용량(바이트) \$1 100/ 포드 배포 사양에 따른 컨테이너 메모리 제한(바이트)* `HeapMemoryUtilization` 및 `ManagedMemoryUtilzations` 지표는 TaskManager JVM의 힙 메모리 사용량 또는 관리형 메모리([RocksDB State Backend](https://flink.apache.org/2021/01/18/rocksdb.html#:~:text=Conclusion-,The%20RocksDB%20state%20backend%20(i.e.%2C%20RocksDBStateBackend)%20is%20one%20of,with%20exactly%2Donce%20processing%20guarantees.)와 같은 네이티브 프로세스의 JVM 외부 메모리 사용량)와 같은 특정 메모리 지표만 설명합니다. 이 `containerMemoryUtilization` 지표는 작업 세트 메모리를 포함함으로써 전체 메모리 소모를 더 잘 추적할 수 있는 작업 세트 메모리를 포함하여 더 완전한 그림을 제공합니다. 용량이 모두 소모되면 TaskManager 포드에 `Out of Memory Error`가 발생합니다.  | 
| containerDiskUtilization | 백분율 | Flink 애플리케이션 클러스터의 작업 관리자 컨테이너 전체 디스크 사용률입니다. 예를 들어, 작업 관리자가 5명인 경우, 그에 상응하는 5개의 TaskManager 컨테이너가 있으며, Managed Service for Apache Flink는 1분 보고 간격마다 이 지표의 샘플 2 \$1 5개를 게시합니다. | 애플리케이션 | 컨테이너별로 다음과 같이 계산됩니다. *디스크 사용량(바이트) \$1 100 / 컨테이너의 디스크 제한(바이트)* 컨테이너의 경우 컨테이너의 루트 볼륨이 설정된 파일 시스템의 사용률을 나타냅니다.  | 
| currentInputWatermark | 밀리초 | 이 애플리케이션/연산자/작업/스레드가 받은 마지막 워터마크 | 애플리케이션, 연산자, 작업, 병렬 처리 | 이 레코드는 입력이 두 개 있는 차원에 대해서만 생성됩니다. 이는 마지막으로 수신한 워터마크의 최소값입니다. | 
| currentOutputWatermark | 밀리초 | 이 애플리케이션/연산자/작업/스레드가 생성한 마지막 워터마크 | 애플리케이션, 연산자, 작업, 병렬 처리 |  | 
| downtime [사용되지 않음] | 밀리초 | 현재 실패/복구 중인 작업의 경우 이 중단이 발생한 동안 경과된 시간입니다. | 애플리케이션 | 이 지표는 작업이 실패하거나 복구되는 동안 경과된 시간을 측정합니다. 이 지표는 실행 중인 작업의 경우 0을 반환하고 완료된 작업에 대해 -1을 반환합니다. 이 지표가 0 또는 -1이 아닌 경우 애플리케이션의 Apache Flink 작업이 실행되지 않았음을 나타냅니다.**Flink 2.2에서는 더 이상 사용되지 않습니다.** `failingTime` 대신 `cancellingTime`, 및/또는 `restartingTime`를 사용합니다. | 
| failingTime | 밀리초 | 애플리케이션이 실패 상태에서 소요한 시간(밀리초)입니다. 이 지표를 사용하여 애플리케이션 장애를 모니터링하고 알림을 트리거합니다. | 애플리케이션, 흐름 | Flink 2.2에서 사용할 수 있습니다. 더 이상 사용되지 않는 downtime 지표의 일부를 대체합니다. | 
| heapMemoryUtilization | 백분율 | 작업 관리자 전반의 전체 힙 메모리 사용률입니다. 예를 들어 작업 관리자가 5명인 경우 Managed Service for Apache Flink는 보고 간격당 이 지표의 샘플 5개를 게시합니다. | 애플리케이션 | 이 지표를 사용하여 애플리케이션의 최소, 평균 및 최대 힙 메모리 사용률을 모니터링할 수 있습니다. HeapMemoryUtilization은 TaskManager JVM의 힙 메모리 사용량과 같은 특정 메모리 지표만 설명합니다. | 
| idleTimeMsPerSecond\$1 | 밀리초 | 이 작업 또는 연산자가 유휴 상태(처리할 데이터가 없음)인 초당 시간(밀리초)입니다. 유휴 시간에는 배압이 가해진 시간이 제외되므로 작업에 배압이 가해져도 작업이 유휴 상태가 아닙니다. | 작업, 연산자, 병렬 | \$1Flink 버전 1.13을 구동하는 Managed Service for Apache Flink에서만 사용할 수 있습니다. 이러한 지표는 애플리케이션의 병목 현상을 식별하는 데 유용할 수 있습니다. | 
| lastCheckpointSize | 바이트 | 마지막 체크포인트의 총 크기 | 애플리케이션 | 이 지표를 사용하여 실행 중인 애플리케이션 스토리지 사용률을 확인할 수 있습니다.이 지표의 값이 증가하면 메모리 누수 또는 병목 현상 등 애플리케이션에 문제가 있음을 의미할 수 있습니다. | 
| lastCheckpointDuration | 밀리초 | 마지막 체크포인트를 완료하는 데 걸린 시간 | 애플리케이션 | 이 지표는 가장 최근의 체크포인트를 완료하는 데 걸린 시간을 측정합니다. 이 지표의 값이 증가하면 메모리 누수 또는 병목 현상 등 애플리케이션에 문제가 있음을 의미할 수 있습니다. 경우에 따라 체크포인트를 사용하지 않도록 설정하여 이 문제를 해결할 수 있습니다. | 
| managedMemoryUsed\$1 | 바이트 | 현재 사용 중인 관리형 메모리의 양입니다. | 애플리케이션, 연산자, 작업, 병렬 처리 | \$1Flink 버전 1.13을 구동하는 Managed Service for Apache Flink에서만 사용할 수 있습니다. 이는 Java 힙 외부에서 Flink가 관리하는 메모리와 관련이 있습니다. RocksDB 상태 백엔드에 사용되며 애플리케이션에서도 사용할 수 있습니다. | 
| managedMemoryTotal\$1 | 바이트 | 관리형 메모리의 총량입니다. | 애플리케이션, 연산자, 작업, 병렬 처리 | \$1Flink 버전 1.13을 구동하는 Managed Service for Apache Flink에서만 사용할 수 있습니다. 이는 Java 힙 외부에서 Flink가 관리하는 메모리와 관련이 있습니다. RocksDB 상태 백엔드에 사용되며 애플리케이션에서도 사용할 수 있습니다. `ManagedMemoryUtilzations` 지표는 관리형 메모리([RocksDB State Backend](https://flink.apache.org/2021/01/18/rocksdb.html#:~:text=Conclusion-,The%20RocksDB%20state%20backend%20(i.e.%2C%20RocksDBStateBackend)%20is%20one%20of,with%20exactly%2Donce%20processing%20guarantees.) 등 네이티브 프로세스의 JVM 외부 메모리 사용량)와 같은 특정 메모리 지표만 설명합니다. | 
| managedMemoryUtilization\$1 | 백분율 | managedMemoryUsed/managedMemoryTotal을 기준으로 산출됩니다. | 애플리케이션, 연산자, 작업, 병렬 처리 | \$1Flink 버전 1.13을 구동하는 Managed Service for Apache Flink에서만 사용할 수 있습니다. 이는 Java 힙 외부에서 Flink가 관리하는 메모리와 관련이 있습니다. RocksDB 상태 백엔드에 사용되며 애플리케이션에서도 사용할 수 있습니다. | 
| numberOfFailedCheckpoints | 개수 | 체크포인트가 실패한 횟수입니다. | 애플리케이션 | 이 지표를 사용하여 애플리케이션 상태 및 진행 상황을 모니터링할 수 있습니다. 처리량 또는 권한 문제와 같은 애플리케이션 문제로 인해 체크포인트가 실패할 수 있습니다. | 
| numRecordsIn\$1 | 개수 | 해당 애플리케이션, 연산자 또는 작업이 수신한 총 레코드 수입니다. | 애플리케이션, 연산자, 작업, 병렬 처리 | \$1일정 기간(초/분)에 대한 SUM 통계를 적용하려면: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/metrics-dimensions.html) 지표의 수준은 이 지표가 전체 애플리케이션, 특정 운영자 또는 특정 작업에서 받은 총 레코드 수를 측정할지 여부를 지정합니다. | 
| numRecordsInPerSecond\$1 | 개수/초 | 이 애플리케이션, 연산자 또는 작업이 초당 수신한 총 레코드 수입니다. | 애플리케이션, 연산자, 작업, 병렬 처리 | \$1일정 기간(초/분)에 대한 SUM 통계를 적용하려면: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/metrics-dimensions.html) 지표의 수준은 이 지표가 전체 애플리케이션, 특정 연산자 또는 특정 작업이 초당 수신한 총 레코드 수를 측정하는지 여부를 지정합니다. | 
| numRecordsOut\$1 | 개수 | 해당 애플리케이션, 연산자 또는 작업이 생성한 총 레코드 수입니다. | 애플리케이션, 연산자, 작업, 병렬 처리 |  \$1일정 기간(초/분)에 대한 SUM 통계를 적용하려면: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/metrics-dimensions.html) 지표의 수준은 이 지표가 전체 애플리케이션, 특정 운영자 또는 특정 작업에서 내보낸 총 레코드 수를 측정할지 여부를 지정합니다. | 
| numLateRecordsDropped\$1 | 개수 | 애플리케이션, 연산자, 작업, 병렬 처리 |  | \$1일정 기간(초/분)에 대한 SUM 통계를 적용하려면: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/metrics-dimensions.html) 이 연산자 또는 작업이 늦게 도착하여 삭제한 레코드 수입니다. | 
| numRecordsOutPerSecond\$1 | 개수/초 | 해당 애플리케이션, 연산자 또는 작업이 초당 생성한 총 레코드 수입니다. | 애플리케이션, 연산자, 작업, 병렬 처리 |  \$1일정 기간(초/분)에 대한 SUM 통계를 적용하려면: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/metrics-dimensions.html) 지표의 수준은 이 지표가 전체 애플리케이션, 특정 연산자 또는 특정 작업이 초당 생성한 총 레코드 수를 측정하는지 여부를 지정합니다. | 
| oldGenerationGCCount | 개수 | 모든 작업 관리자에서 발생한 이전 가비지 수집 작업의 총 수입니다. | 애플리케이션 |  | 
| oldGenerationGCTime | 밀리초 | 이전 가비지 수집 작업을 수행하는 데 소요된 총 시간입니다. | 애플리케이션 | 이 지표를 사용하여 가비지 수집 시간 합계, 평균 및 최대 시간을 모니터링할 수 있습니다. | 
| threadsCount | 개수 | 애플리케이션에서 사용한 총 라이브 스레드 수입니다. | 애플리케이션 | 이 지표는 애플리케이션 코드에서 사용하는 스레드 수를 측정합니다. 이는 애플리케이션 병렬 처리와는 다릅니다. | 
| cancellingTime | 밀리초 | 애플리케이션이 취소 상태에서 소요한 시간(밀리초)입니다. 이 지표를 사용하여 애플리케이션 취소 작업을 모니터링합니다. | 애플리케이션, 흐름 | Flink 2.2에서 사용할 수 있습니다. 더 이상 사용되지 않는 downtime 지표의 일부를 대체합니다. | 
| restartingTime | 밀리초 | 애플리케이션이 재시작 상태에서 소요한 시간(밀리초)입니다. 이 지표를 사용하여 애플리케이션 재시작 동작을 모니터링합니다. | 애플리케이션, 흐름 | Flink 2.2에서 사용할 수 있습니다. 더 이상 사용되지 않는 downtime 지표의 일부를 대체합니다. | 
| runningTime | 밀리초 | 애플리케이션이 중단 없이 실행된 시간(밀리초)입니다. 더 이상 사용되지 않는 uptime 지표를 대체합니다. | 애플리케이션, 흐름 | Flink 2.2에서 사용할 수 있습니다. 를 더 이상 사용되지 않는 지표의 직접 대체uptime물로 사용합니다. | 
| uptime [사용되지 않음] | 밀리초 | 작업이 중단 없이 실행된 시간. | 애플리케이션 | 이 지표를 사용하여 작업이 성공적으로 실행되고 있는지 확인할 수 있습니다. 이 지표는 완료된 작업에 대해 -1을 반환합니다.**Flink 2.2에서는 더 이상 사용되지 않습니다.** 대신 `runningTime`을 사용하세요. | 
| jobmanagerFileDescriptorsMax | 개수 | JobManager에서 사용할 수 있는 최대 파일 설명자 수입니다. | 애플리케이션, 흐름, 호스트 | 이 지표를 사용하여 파일 설명자 용량을 모니터링합니다. | 
| jobmanagerFileDescriptorsOpen | 개수 | JobManager에 대한 현재 열린 파일 설명자 수입니다. | 애플리케이션, 흐름, 호스트 | 이 지표를 사용하여 파일 설명자 사용량을 모니터링하고 잠재적 리소스 소진을 감지합니다. | 
| taskmanagerFileDescriptorsMax | 개수 | 각 TaskManager에서 사용할 수 있는 최대 파일 설명자 수입니다. | 애플리케이션, 흐름, 호스트, tm\$1id | 이 지표를 사용하여 파일 설명자 용량을 모니터링합니다. | 
| taskmanagerFileDescriptorsOpen | 개수 | 각 TaskManager에 대한 현재 열린 파일 설명자 수입니다. | 애플리케이션, 흐름, 호스트, tm\$1id | 이 지표를 사용하여 파일 설명자 사용량을 모니터링하고 잠재적 리소스 소진을 감지합니다. | 
| KPUs\$1 | 개수 | 애플리케이션에서 사용한 총 KPU 수입니다. | 애플리케이션 | \$1이 지표는 결제 기간(1시간)마다 하나의 샘플을 수신합니다. 시간 경과에 따른 KPU 수를 시각화하려면 1시간 이상의 기간 동안 MAX 또는 AVG를 사용합니다. KPU 수에는 `orchestration` KPU가 포함됩니다. 자세한 내용은 [Managed Service for Apache Flink 요금](https://aws.amazon.com/managed-service-apache-flink/pricing/)을 참조하세요. | 

**Flink 2.2 지표 마이그레이션 지침**  
**fullRestarts에서 마이그레이션:** Flink `fullRestarts` 2.2에서 지표가 제거되었습니다. 대신 `numRestarts` 지표를 사용합니다. `numRestarts` 지표는 동일한 기능을 제공하며 임계값 조정 없이 CloudWatch 경보를 직접 대체하는 데 사용할 수 있습니다.  
**가동 시간으로부터의 마이그레이션:** 지표는 Flink `uptime` 2.2에서 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신 `runningTime` 지표를 사용합니다. `runningTime` 지표는 동일한 기능을 제공하며 임계값 조정 없이 CloudWatch 경보를 직접 대체하는 데 사용할 수 있습니다.  
**가동 중지 시간으로부터의 마이그레이션:** 지표는 Flink `downtime` 2.2에서 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 모니터링하려는 항목에 따라 다음 지표 중 하나 이상을 사용합니다.  
`restartingTime`: 애플리케이션 재시작에 소요된 시간 모니터링
`cancellingTime`: 애플리케이션 취소에 소요된 시간 모니터링
`failingTime`: 실패 상태에서 소요된 시간 모니터링

## Kinesis Data Streams 커넥터 지표
<a name="metrics-dimensions-stream"></a>

AWS 는 다음과 함께 Kinesis Data Streams에 대한 모든 레코드를 내보냅니다.


| 지표 | 단위 | 설명 | 수준 | 사용 관련 참고 사항 | 
| --- | --- | --- | --- | --- | 
| millisbehindLatest | 밀리초 | 소비자가 스트림 헤드보다 뒤처진 시간(밀리초)으로, 소비자가 현재 시간보다 얼마나 뒤처져 있는지를 나타냅니다. | 애플리케이션(Stream용), 병렬(샤드ID용) | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/managed-flink/latest/java/metrics-dimensions.html)  | 

**참고**  
지표는 Flink AWS 커넥터 버전 `bytesRequestedPerFetch` 6.0.0(Flink 2.2와 호환되는 유일한 커넥터 버전)에서 제거되었습니다. Flink 2.2에서 사용할 수 있는 유일한 Kinesis Data Streams 커넥터 지표는 입니다`millisBehindLatest`.

## Amazon MSK 커넥터 지표
<a name="metrics-dimensions-msk"></a>

AWS 는 다음과 함께 Amazon MSK에 대한 모든 레코드를 내보냅니다.


| 지표 | 단위 | 설명 | 수준 | 사용 관련 참고 사항 | 
| --- | --- | --- | --- | --- | 
| currentoffsets | 해당 사항 없음 | 각 파티션에 대한 소비자의 현재 읽기 오프셋입니다. 특정 파티션의 지표는 주제 이름 및 파티션 ID로 지정할 수 있습니다. | 애플리케이션(주제용), 병렬(파티션ID용) |  | 
| commitsFailed | 해당 사항 없음 | 오프셋 커밋과 체크포인트가 활성화된 경우, Kafka에 대한 총 오프셋 커밋 실패 횟수입니다. | 애플리케이션, 연산자, 작업, 병렬 처리 | 오프셋을 카프카에 다시 커밋하는 것은 소비자 진행 상황을 노출하기 위한 수단일 뿐이므로, 커밋 실패는 Flink의 체크포인트 파티션 오프셋의 무결성에 영향을 미치지 않습니다. | 
| commitsSucceeded | 해당 사항 없음 | 오프셋 커밋과 체크포인트가 활성화된 경우, Kafka에 성공적으로 커밋한 총 오프셋 횟수입니다. | 애플리케이션, 연산자, 작업, 병렬 처리 |  | 
| committedoffsets | 해당 사항 없음 | 각 파티션에 대해 Kafka에 마지막으로 성공적으로 커밋된 오프셋 특정 파티션의 지표는 주제 이름 및 파티션 ID로 지정할 수 있습니다. | 애플리케이션(주제용), 병렬(파티션ID용) |  | 
| records\$1lag\$1max | 개수 | 이 창에 있는 파티션의 레코드 수 기준 최대 지연 시간 | 애플리케이션, 연산자, 작업, 병렬 처리 |  | 
| bytes\$1consumed\$1rate | 바이트 | 초당 사용된 주제의 평균 바이트 수 | 애플리케이션, 연산자, 작업, 병렬 처리 |  | 

## Apache Zeppelin 지표
<a name="metrics-dimensions-zeppelin"></a>

Studio 노트북의 경우 애플리케이션 수준에서 , `KPUs`, `cpuUtilization`, `heapMemoryUtilization`, 및 지표를 AWS 내보냅니다`oldGenerationGCTime``oldGenerationGCCount``threadCount`. 또한 애플리케이션 수준에서도 다음 테이블에 표시된 지표를 내보냅니다.


****  

| 지표 | 단위 | 설명 | Prometheus 이름 | 
| --- | --- | --- | --- | 
| zeppelinCpuUtilization | 백분율 | Apache Zeppelin 서버의 전체 CPU 사용률입니다. | process\$1cpu\$1usage | 
| zeppelinHeapMemoryUtilization | 백분율 | Apache Zeppelin 서버의 전체 힙 메모리 사용률입니다. | jvm\$1memory\$1used\$1bytes | 
| zeppelinThreadCount | 개수 | Apache Zeppelin 서버에서 사용한 총 라이브 스레드 수입니다. | jvm\$1threads\$1live\$1threads | 
| zeppelinWaitingJobs | 개수 | 스레드를 기다리는 대기 중인 Apache Zeppelin 작업 수입니다. | jetty\$1threads\$1jobs | 
| zeppelinServerUptime | 초 | 서버가 가동되어 실행된 총 시간. | process\$1uptime\$1seconds | 

# CloudWatch 지표 보기
<a name="metrics-dimensions-viewing"></a>

Amazon CloudWatch 콘솔 또는 AWS CLI를 사용하여 애플리케이션에 대한 CloudWatch 지표를 볼 수 있습니다.

**CloudWatch 콘솔을 사용하여 지표를 보려면**

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

1. 탐색 창에서 **지표**를 선택합니다.

1. Managed Service for Apache Flink의 **범주별 CloudWatch 지표** 창에서 지표 범주를 선택합니다.

1. 위쪽 창에서 지표의 전체 목록이 보일 때까지 아래로 스크롤합니다.

**를 사용하여 지표를 보려면 AWS CLI**
+ 명령 프롬프트에서 다음 명령을 사용합니다.

  ```
  1. aws cloudwatch list-metrics --namespace "AWS/KinesisAnalytics" --region region
  ```

# CloudWatch 지표 보고 수준 설정
<a name="cloudwatch-logs-levels"></a>

애플리케이션이 생성하는 애플리케이션 지표의 수준을 제어할 수 있습니다. Managed Service for Apache Flink는 다음 지표 수준을 지원합니다.
+ **애플리케이션:** 애플리케이션은 각 애플리케이션에 대해 최고 수준의 지표만 보고합니다. Managed Service for Apache Flink 지표는 기본적으로 애플리케이션 수준에서 게시됩니다.
+ **작업:** 애플리케이션은 초당 애플리케이션에서 들어오고 나가는 레코드 수와 같이 작업 지표 보고 수준으로 정의된 지표에 대한 작업별 지표 차원을 보고합니다.
+ **연산자:** 애플리케이션은 각 필터 또는 맵 작업에 대한 지표와 같이 연산자 지표 보고 수준으로 정의된 지표에 대한 연산자별 지표 차원을 보고합니다.
+ **병렬 처리:** 각 실행 스레드에 대한 애플리케이션 보고서 `Task` 및 `Operator` 수준 지표입니다. 이 보고 수준은 과도한 비용으로 인해 병렬 처리 설정이 64 이상인 애플리케이션에는 권장되지 않습니다.
**참고**  
서비스에서 생성하는 지표 데이터의 양이 많으므로 이 지표 수준은 문제 해결에만 사용해야 합니다. 이 지표 수준은 CLI를 통해서만 설정할 수 있습니다. 콘솔에서는 이 지표 수준을 사용할 수 없습니다.

기본 수준은 **애플리케이션**입니다. 애플리케이션은 현재 수준 및 모든 상위 수준에서 지표를 보고합니다. 예를 들어 보고 수준이 **연산자**로 설정된 경우 애플리케이션은 **애플리케이션**, **작업** 및 **연산자** 지표를 보고합니다.

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 작업의 `MonitoringConfiguration` 파라미터 또는 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 작업의 `MonitoringConfigurationUpdate` 파라미터를 사용하여 CloudWatch 지표 보고 수준을 설정합니다. 다음 예제 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 작업 요청은 CloudWatch 지표 보고 수준을 **작업**으로 설정합니다.

```
{
   "ApplicationName": "MyApplication",  
   "CurrentApplicationVersionId": 4,
   "ApplicationConfigurationUpdate": { 
      "FlinkApplicationConfigurationUpdate": { 
         "MonitoringConfigurationUpdate": { 
            "ConfigurationTypeUpdate": "CUSTOM",
            "MetricsLevelUpdate": "TASK"
         }
      }
   }
}
```

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 작업의 `LogLevel` 파라미터 또는 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 작업의 `LogLevelUpdate` 파라미터를 사용하여 로깅 수준을 구성할 수도 있습니다. 다음 로그 수준을 사용할 수 있습니다.
+ `ERROR`: 잠재적으로 복구 가능한 오류 이벤트를 기록합니다.
+ `WARN`: 오류로 이어질 수 있는 경고 이벤트를 기록합니다.
+ `INFO`: 정보 이벤트를 기록합니다.
+ `DEBUG`: 일반 디버깅 이벤트를 기록합니다.

Log4j 로깅 수준에 대한 자세한 내용은 [Apache Log4j](https://logging.apache.org/log4j/2.x/) 설명서의 [사용자 지정 로그 수준](https://logging.apache.org/log4j/2.x/manual/customloglevels.html)을 참조하세요.

# Amazon Managed Service for Apache Flink에서 사용자 지정 지표 사용
<a name="monitoring-metrics-custom"></a>

Managed Service for Apache Flink는 리소스 사용량과 처리량에 대한 지표 포함하여 19개의 지표를 CloudWatch에 노출합니다. 또한 자체 지표를 만들어 이벤트 처리 또는 외부 리소스 액세스 등 애플리케이션별 데이터를 추적할 수 있습니다.

**Topics**
+ [작동 방식](#monitoring-metrics-custom-howitworks)
+ [매핑 클래스 생성 예제 보기](#monitoring-metrics-custom-examples)
+ [사용자 지정 지표 보기](#monitoring-metrics-custom-examples-viewing)

## 작동 방식
<a name="monitoring-metrics-custom-howitworks"></a>

Managed Service for Apache Flink의 사용자 지정 지표는 Apache Flink 지표 시스템을 사용합니다. Amazon Flink 지표에는 다음과 같은 속성이 있습니다.
+ **유형:** 지표 유형은 데이터를 측정하고 보고하는 방법을 설명합니다. 사용 가능한 Apache Flink 지표 유형에는 개수, 게이지, 히스토그램, 미터 등이 있습니다. Apache Flink 지표 유형에 대한 자세한 내용은 [지표 유형](https://nightlies.apache.org/flink/flink-docs-release-1.15/monitoring/metrics.html#metric-types)을 참조하세요.
**참고**  
AWS CloudWatch 지표는 히스토그램 Apache Flink 지표 유형을 지원하지 않습니다. CloudWatch는 카운트, 게이지 및 미터 유형의 Apache Flink 지표만 표시할 수 있습니다.
+ **범위:** 지표의 범위는 해당 식별자와 지표가 CloudWatch에 보고되는 방식을 나타내는 키-값 쌍의 집합으로 구성됩니다. 지표 식별자는 다음과 같은 요소로 구성됩니다.
  + 지표가 보고되는 수준을 나타내는 시스템 범위(예: 연산자).
  + 사용자 변수 또는 지표 그룹 이름과 같은 속성을 정의하는 사용자 범위입니다. 이러한 속성은 [https://ci.apache.org/projects/flink/flink-docs-master/api/java/org/apache/flink/metrics/MetricGroup.html#addGroup-java.lang.String-java.lang.String-](https://ci.apache.org/projects/flink/flink-docs-master/api/java/org/apache/flink/metrics/MetricGroup.html#addGroup-java.lang.String-java.lang.String-) 또는 [https://ci.apache.org/projects/flink/flink-docs-master/api/java/org/apache/flink/metrics/MetricGroup.html#addGroup-java.lang.String-](https://ci.apache.org/projects/flink/flink-docs-master/api/java/org/apache/flink/metrics/MetricGroup.html#addGroup-java.lang.String-)를 사용하여 정의됩니다.

  범위에 대한 자세한 내용은 [범위](https://nightlies.apache.org/flink/flink-docs-release-1.15/monitoring/metrics.html#scope)를 참조하세요.

Apache Flink 지표에 대한 자세한 내용은 [Apache Flink 설명서](https://nightlies.apache.org/flink/flink-docs-release-1.15/)의 [지표](https://nightlies.apache.org/flink/flink-docs-release-1.15/monitoring/metrics.html)를 참조하세요.

Managed Service for Apache Flink에서 사용자 정의 지표를 생성하려면, `RichFunction`를 확장하는 모든 사용자 함수에서 [https://nightlies.apache.org/flink/flink-docs-release-1.15/api/java/org/apache/flink/api/common/functions/RuntimeContext.html#getMetricGroup--](https://nightlies.apache.org/flink/flink-docs-release-1.15/api/java/org/apache/flink/api/common/functions/RuntimeContext.html#getMetricGroup--)를 호출하여 Apache Flink 지표 시스템에 액세스할 수 있습니다. 이 메서드는 사용자 지정 지표를 만들고 등록하는 데 사용할 수 있는 [MetricGroup](https://nightlies.apache.org/flink/flink-docs-release-1.15/api/java/org/apache/flink/metrics/MetricGroup.html) 객체를 반환합니다. Apache Flink용 관리형 서비스는 그룹 키 `KinesisAnalytics`로 생성된 모든 지표를 CloudWatch에 보고합니다. 내가 정의하는 사용자 지정 지표에는 다음과 같은 특성이 있습니다.
+ 내 사용자 지정 지표에는 지표 이름과 그룹 이름이 있습니다. 이러한 이름은 [Prometheus 이름 지정 규칙](https://prometheus.io/docs/instrumenting/writing_exporters/#naming)에 따라 영숫자 문자로 구성되어야 합니다.
+ 사용자 범위에서 정의한 속성(`KinesisAnalytics` 지표 그룹 제외)은 CloudWatch 차원으로 게시됩니다.
+ 사용자 지정 지표는 기본적으로 해당 `Application` 수준에 게시됩니다.
+ 차원(작업/연산자/병렬 처리)은 애플리케이션의 모니터링 수준에 따라 지표에 추가됩니다. [CreateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_CreateApplication.html) 작업의 [MonitoringConfiguration](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_MonitoringConfiguration.html) 파라미터 또는 [UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html) 작업의 [MonitoringConfigurationUpdate](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_MonitoringConfigurationUpdate.html) 파라미터를 사용하여 애플리케이션의 모니터링 수준을 설정합니다.

## 매핑 클래스 생성 예제 보기
<a name="monitoring-metrics-custom-examples"></a>

다음 코드 예제는 사용자 지정 지표를 생성하고 증가시키는 매핑 클래스를 만드는 방법과 매핑 클래스를 `DataStream` 객체에 추가하여 애플리케이션에서 구현하는 방법을 보여 줍니다.

### 레코드 수 사용자 지정 지표
<a name="monitoring-metrics-custom-examples-recordcount"></a>

다음 코드 예제는 데이터 스트림의 레코드 수를 세는 지표를 생성하는 매핑 클래스를 만드는 방법을 보여줍니다(`numRecordsIn` 지표와 동일한 기능).

```
    private static class NoOpMapperFunction extends RichMapFunction<String, String> {
        private transient int valueToExpose = 0;
        private final String customMetricName;
 
        public NoOpMapperFunction(final String customMetricName) {
            this.customMetricName = customMetricName;
        }
 
        @Override
        public void open(Configuration config) {
            getRuntimeContext().getMetricGroup()
                    .addGroup("KinesisAnalytics")
                    .addGroup("Program", "RecordCountApplication")
                    .addGroup("NoOpMapperFunction")
                    .gauge(customMetricName, (Gauge<Integer>) () -> valueToExpose);
        }
 
        @Override
        public String map(String value) throws Exception {
            valueToExpose++;
            return value;
        }
    }
```

위 예제에서는 애플리케이션이 처리하는 각 레코드에 대해 `valueToExpose` 변수가 증가합니다.

매핑 클래스를 정의한 후 맵을 구현하는 인애플리케이션 스트림을 생성합니다.

```
DataStream<String> noopMapperFunctionAfterFilter =
    kinesisProcessed.map(new NoOpMapperFunction("FilteredRecords"));
```

이 애플리케이션의 전체 코드는 [레코드 수 사용자 지정 지표 애플리케이션](https://github.com/aws-samples/amazon-managed-service-for-apache-flink-examples/tree/main/java/CustomMetrics/RecordCount)을 참조하세요.

### 단어 수 사용자 지정 지표
<a name="monitoring-metrics-custom-examples-wordcount"></a>

다음 코드 예제는 데이터 스트림에서 단어 수를 계산하는 지표를 생성하는 매핑 클래스를 만드는 방법을 보여 줍니다.

```
private static final class Tokenizer extends RichFlatMapFunction<String, Tuple2<String, Integer>> {
     
            private transient Counter counter;
     
            @Override
            public void open(Configuration config) {
                this.counter = getRuntimeContext().getMetricGroup()
                        .addGroup("KinesisAnalytics")
                        .addGroup("Service", "WordCountApplication")
                        .addGroup("Tokenizer")
                        .counter("TotalWords");
            }
     
            @Override
            public void flatMap(String value, Collector<Tuple2<String, Integer>>out) {
                // normalize and split the line
                String[] tokens = value.toLowerCase().split("\\W+");
     
                // emit the pairs
                for (String token : tokens) {
                    if (token.length() > 0) {
                        counter.inc();
                        out.collect(new Tuple2<>(token, 1));
                    }
                }
            }
        }
```

위 예제에서는 애플리케이션이 처리하는 각 단어마다 `counter` 변수가 증가합니다.

매핑 클래스를 정의한 후 맵을 구현하는 인애플리케이션 스트림을 생성합니다.

```
// Split up the lines in pairs (2-tuples) containing: (word,1), and
// group by the tuple field "0" and sum up tuple field "1"
DataStream<Tuple2<String, Integer>> wordCountStream = input.flatMap(new Tokenizer()).keyBy(0).sum(1);
     
// Serialize the tuple to string format, and publish the output to kinesis sink
wordCountStream.map(tuple -> tuple.toString()).addSink(createSinkFromStaticConfig());
```

이 애플리케이션의 전체 코드는 [단어 수 사용자 지정 지표](https://github.com/aws-samples/amazon-managed-service-for-apache-flink-examples/tree/main/java/CustomMetrics/WordCount) 애플리케이션을 참조하세요.

## 사용자 지정 지표 보기
<a name="monitoring-metrics-custom-examples-viewing"></a>

내 애플리케이션에 대한 사용자 지정 지표는 **AWS/KinesisAnalytics** 대시보드의 CloudWatch Metrics 콘솔에 있는 **애플리케이션** 지표 그룹 아래에 표시됩니다.

# Amazon Managed Service for Apache Flink에서 CloudWatch 경보 사용
<a name="monitoring-metrics-alarms"></a>

Amazon CloudWatch 경보를 사용하면 지정한 기간 동안 CloudWatch 지표를 모니터링할 수 있습니다. 이러한 경보는 여러 기간에 대해 지정된 임계값과 지표 또는 표현식의 값을 비교하여 하나 이상의 작업을 수행합니다. 작업의 한 예로는 Amazon Simple Notification Service(SNS) 주제에 알림을 보내는 것이 있습니다.

CloudWatch 경보에 대한 자세한 내용은 [Amazon CloudWatch 경보 사용](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)을 참조하세요.

## 권장 경보 검토
<a name="monitoring-metrics-alarms-recommended"></a>

이 섹션은 Managed Service for Apache Flink 애플리케이션을 모니터링할 때 권장되는 경보를 설명합니다.

이 표에는 권장 경보가 설명되어 있으며 다음과 같은 열이 있습니다.
+ **지표 표현식:** 임계값에 비춰 테스트할 지표나 지표 표현식입니다.
+ **통계:** 지표를 확인하는 데 사용되는 통계**(예: 평균)**입니다.
+ **임계값:** 이 경보를 사용하려면 예상 애플리케이션 성능의 한계를 정의하는 임계값을 결정해야 합니다. 이 임계값은 정상적인 조건에서 애플리케이션을 모니터링하여 결정해야 합니다.
+ **설명:** 이 경보를 트리거할 수 있는 원인과 해당 조건에 대한 가능한 해결 방법.


| 지표 표현식 | 통계 | Threshold | 설명 | 
| --- |--- |--- |--- |
| 다운타임 > 0 | Average | 0 |  A downtime greater than zero indicates that the application has failed. If the value is larger than 0, the application is not processing any data. Recommended for all applications. The 다운타임 metric measures the duration of an outage. A downtime greater than zero indicates that the application has failed. For troubleshooting, see [애플리케이션 다시 시작 중](troubleshooting-rt-restarts.md). | 
| RATE (numberOfFailedCheckpoints) > 0 | Average | 0 | This metric counts the number of failed checkpoints since the application started. Depending on the application, it can be tolerable if checkpoints fail occasionally. But if checkpoints are regularly failing, the application is likely unhealthy and needs further attention. We recommend monitoring RATE(numberOfFailedCheckpoints) to alarm on the gradient and not on absolute values. Recommended for all applications. Use this metric to monitor application health and checkpointing progress. The application saves state data to checkpoints when it's healthy. Checkpointing can fail due to timeouts if the application isn't making progress in processing the input data. For troubleshooting, see [체크포인트 시간이 초과되었습니다.](troubleshooting-chk-timeout.md). | 
| Operator.numRecordsOutPerSecond < threshold | Average | The minimum number of records emitted from the application during normal conditions.  | Recommended for all applications. Falling below this threshold can indicate that the application isn't making expected progress on the input data. For troubleshooting, see [처리량이 너무 느림](troubleshooting-rt-throughput.md). | 
| records\$1lag\$1max\$1millisbehindLatest > threshold | Maximum | The maximum expected latency during normal conditions. | If the application is consuming from Kinesis or Kafka, these metrics indicate if the application is falling behind and needs to be scaled in order to keep up with the current load. This is a good generic metric that is easy to track for all kinds of applications. But it can only be used for reactive scaling, i.e., when the application has already fallen behind. Recommended for all applications. Use the records\$1lag\$1max metric for a Kafka source, or the millisbehindLatest for a Kinesis stream source. Rising above this threshold can indicate that the application isn't making expected progress on the input data. For troubleshooting, see [처리량이 너무 느림](troubleshooting-rt-throughput.md). | 
| lastCheckpointDuration > threshold | Maximum | The maximum expected checkpoint duration during normal conditions. | Monitors how much data is stored in state and how long it takes to take a checkpoint. If checkpoints grow or take long, the application is continuously spending time on checkpointing and has less cycles for actual processing. At some points, checkpoints may grow too large or take so long that they fail. In addition to monitoring absolute values, customers should also considering monitoring the change rate with RATE(lastCheckpointSize) and RATE(lastCheckpointDuration). If the lastCheckpointDuration continuously increases, rising above this threshold can indicate that the application isn't making expected progress on the input data, or that there are problems with application health such as backpressure. For troubleshooting, see [영구 지속적 성장](troubleshooting-rt-stateleaks.md). | 
| lastCheckpointSize > threshold | Maximum | The maximum expected checkpoint size during normal conditions. | Monitors how much data is stored in state and how long it takes to take a checkpoint. If checkpoints grow or take long, the application is continuously spending time on checkpointing and has less cycles for actual processing. At some points, checkpoints may grow too large or take so long that they fail. In addition to monitoring absolute values, customers should also considering monitoring the change rate with RATE(lastCheckpointSize) and RATE(lastCheckpointDuration). If the lastCheckpointSize continuously increases, rising above this threshold can indicate that the application is accumulating state data. If the state data becomes too large, the application can run out of memory when recovering from a checkpoint, or recovering from a checkpoint might take too long. For troubleshooting, see [영구 지속적 성장](troubleshooting-rt-stateleaks.md). | 
| heapMemoryUtilization > threshold | Maximum | This gives a good indication of the overall resource utilization of the application and can be used for proactive scaling unless the application is I/O bound. The maximum expected heapMemoryUtilization size during normal conditions, with a recommended value of 90 percent. | You can use this metric to monitor the maximum memory utilization of task managers across the application. If the application reaches this threshold, you need to provision more resources. You do this by enabling automatic scaling or increasing the application parallelism. For more information about increasing resources, see [애플리케이션 규모 조정 구현](how-scaling.md). | 
| cpuUtilization > threshold | Maximum | This gives a good indication of the overall resource utilization of the application and can be used for proactive scaling unless the application is I/O bound. The maximum expected cpuUtilization size during normal conditions, with a recommended value of 80 percent. | You can use this metric to monitor the maximum CPU utilization of task managers across the application. If the application reaches this threshold, you need to provision more resources You do this by enabling automatic scaling or increasing the application parallelism. For more information about increasing resources, see [애플리케이션 규모 조정 구현](how-scaling.md). | 
| threadsCount > threshold | Maximum | The maximum expected threadsCount size during normal conditions. | You can use this metric to watch for thread leaks in task managers across the application. If this metric reaches this threshold, check your application code for threads being created without being closed. | 
| (oldGarbageCollectionTime\$1 100) /1분 동안 60\$1000') > threshold | Maximum | The maximum expected oldGarbageCollectionTime duration. We recommend setting a threshold such that typical garbage collection time is 60 percent of the specified threshold, but the correct threshold for your application will vary. | If this metric is continually increasing, this can indicate that there is a memory leak in task managers across the application. | 
| 비율(oldGarbageCollectionCount)  > threshold | Maximum | The maximum expected oldGarbageCollectionCount under normal conditions. The correct threshold for your application will vary. | If this metric is continually increasing, this can indicate that there is a memory leak in task managers across the application. | 
| Operator.currentOutputWatermark - Operator.currentInputWatermark  > threshold | Minimum | The minimum expected watermark increment under normal conditions. The correct threshold for your application will vary. | If this metric is continually increasing, this can indicate that either the application is processing increasingly older events, or that an upstream subtask has not sent a watermark in an increasingly long time. | 

# CloudWatch Logs에 사용자 지정 메시지 작성
<a name="cloudwatch-logs-writing"></a>

Managed Service for Apache Flink 애플리케이션의 CloudWatch 로그에 사용자 지정 메시지를 작성할 수 있습니다. Apache [https://logging.apache.org/log4j/](https://logging.apache.org/log4j/) 라이브러리 또는 [https://www.slf4j.org/](https://www.slf4j.org/) 라이브러리를 사용하여 이 작업을 수행할 수 있습니다.

**Topics**
+ [Log4J를 사용하여 CloudWatch 로그에 작성](#cloudwatch-logs-writing-log4j)
+ [SLF4J를 사용하여 CloudWatch 로그에 작성](#cloudwatch-logs-writing-slf4j)

## Log4J를 사용하여 CloudWatch 로그에 작성
<a name="cloudwatch-logs-writing-log4j"></a>

1. 애플리케이션의 `pom.xml` 파일에 다음 종속 항목을 추가합니다.

   ```
   <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-api</artifactId>
       <version>2.6.1</version>
   </dependency>
   <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-core</artifactId>
       <version>2.6.1</version>
   </dependency>
   ```

1. 라이브러리의 객체를 포함시키세요.

   ```
   import org.apache.logging.log4j.Logger;
   ```

1. 애플리케이션 클래스를 전달하여 `Logger` 객체를 인스턴스화합니다.

   ```
   private static final Logger log = LogManager.getLogger.getLogger(YourApplicationClass.class);
   ```

1. `log.info`를 사용하여 로그에 기록합니다. 많은 수의 메시지가 애플리케이션 로그에 기록됩니다. 사용자 지정 메시지를 더 쉽게 필터링하려면 `INFO` 애플리케이션 로그 수준을 사용하세요.

   ```
   log.info("This message will be written to the application's CloudWatch log");
   ```

애플리케이션은 다음과 유사한 메시지와 함께 레코드를 로그에 기록합니다.

```
{
  "locationInformation": "com.amazonaws.services.managed-flink.StreamingJob.main(StreamingJob.java:95)", 
  "logger": "com.amazonaws.services.managed-flink.StreamingJob", 
  "message": "This message will be written to the application's CloudWatch log", 
  "threadName": "Flink-DispatcherRestEndpoint-thread-2", 
  "applicationARN": "arn:aws:kinesisanalyticsus-east-1:123456789012:application/test", 
  "applicationVersionId": "1", "messageSchemaVersion": "1", 
  "messageType": "INFO" 
}
```

## SLF4J를 사용하여 CloudWatch 로그에 작성
<a name="cloudwatch-logs-writing-slf4j"></a>

1. 애플리케이션의 `pom.xml` 파일에 다음 종속 항목을 추가합니다.

   ```
   <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-log4j12</artifactId>
       <version>1.7.7</version>
       <scope>runtime</scope>
   </dependency>
   ```

1. 라이브러리의 객체를 포함시키세요.

   ```
   import org.slf4j.Logger;
   import org.slf4j.LoggerFactory;
   ```

1. 애플리케이션 클래스를 전달하여 `Logger` 객체를 인스턴스화합니다.

   ```
   private static final Logger log = LoggerFactory.getLogger(YourApplicationClass.class);
   ```

1. `log.info`를 사용하여 로그에 기록합니다. 많은 수의 메시지가 애플리케이션 로그에 기록됩니다. 사용자 지정 메시지를 더 쉽게 필터링하려면 `INFO` 애플리케이션 로그 수준을 사용하세요.

   ```
   log.info("This message will be written to the application's CloudWatch log");
   ```

애플리케이션은 다음과 유사한 메시지와 함께 레코드를 로그에 기록합니다.

```
{
  "locationInformation": "com.amazonaws.services.managed-flink.StreamingJob.main(StreamingJob.java:95)", 
  "logger": "com.amazonaws.services.managed-flink.StreamingJob", 
  "message": "This message will be written to the application's CloudWatch log", 
  "threadName": "Flink-DispatcherRestEndpoint-thread-2", 
  "applicationARN": "arn:aws:kinesisanalyticsus-east-1:123456789012:application/test", 
  "applicationVersionId": "1", "messageSchemaVersion": "1", 
  "messageType": "INFO" 
}
```

# 를 사용하여 Managed Service for Apache Flink API 호출 로깅 AWS CloudTrail
<a name="logging-using-cloudtrail"></a>

Managed Service for Apache Flink는 Managed Service for Apache Flink에서 사용자, 역할 또는 AWS 서비스가 수행한 작업에 대한 레코드를 AWS CloudTrail제공하는 서비스와 통합됩니다. CloudTrail은 Apache Flink용 Managed Service for Apache Flink의 모든 API 호출을 이벤트로 캡처합니다. 캡처된 호출에는 Managed Service for Apache Flink 콘솔에서 수행한 호출과 Managed Service for Apache Flink API 작업에 대한 코드 호출이 포함됩니다. 추적을 생성하면 Managed Service for Apache Flink에 대한 이벤트를 포함한 CloudTrail 이벤트를 지속해서 Amazon S3 버킷에 배포할 수 있습니다. 추적을 구성하지 않은 경우에도 **이벤트 기록**에서 CloudTrail 콘솔의 최신 이벤트를 볼 수 있습니다. CloudTrail에서 수집한 정보를 사용하여 Managed Service for Apache Flink에 수행된 요청, 요청이 수행된 IP 주소, 요청을 수행한 사람, 요청이 수행된 시간 및 추가 세부 정보를 확인할 수 있습니다.

CloudTrail에 대한 자세한 내용은 [AWS CloudTrail 사용 설명서](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)를 참조하세요.

## CloudTrail에서의 Managed Service for Apache Flink 정보 관리
<a name="service-name-info-in-cloudtrail"></a>

 AWS 계정을 생성할 때 계정에서 CloudTrail이 활성화됩니다. Managed Service for Apache Flink에서 활동이 발생하면 해당 활동이 **이벤트 기록**의 다른 AWS 서비스 이벤트와 함께 CloudTrail 이벤트에 기록됩니다. AWS 계정에서 최근 이벤트를 보고 검색하고 다운로드할 수 있습니다. 자세한 설명은 [CloudTrail 이벤트 기록으로 이벤트 보기](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)를 참조하세요.

Managed Service for Apache Flink에 대한 이벤트를 포함하여 AWS 계정에 이벤트를 지속적으로 기록하려면 추적을 생성합니다. CloudTrail은 *추적*을 사용하여 Amazon S3 버킷으로 로그 파일을 전송할 수 있습니다. 기본적으로 콘솔에서 추적을 생성하면 추적이 모든 AWS 리전에 적용됩니다. 추적은 AWS 파티션의 모든 리전에서 이벤트를 로깅하고 지정한 Amazon S3 버킷으로 로그 파일을 전송합니다. 또한 CloudTrail 로그에서 수집된 이벤트 데이터를 추가로 분석하고 조치를 취하도록 다른 AWS 서비스를 구성할 수 있습니다. 자세한 내용은 다음 자료를 참조하세요.
+ [추적 생성 개요](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)
+ [CloudTrail 지원 서비스 및 통합](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-aws-service-specific-topics.html#cloudtrail-aws-service-specific-topics-integrations)
+ [CloudTrail에서 Amazon SNS 알림 구성](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/getting_notifications_top_level.html)
+ [여러 리전으로부터 CloudTrail 로그 파일 받기](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html) 및 [여러 계정으로부터 CloudTrail 로그 파일 받기](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-receive-logs-from-multiple-accounts.html)

모든 Managed Service for Apache Flink 작업은 CloudTrail에서 로깅되며 [Managed Service for Apache Flink API 참조](/managed-flink/latest/apiv2/Welcome.html)에서 설명을 볼 수 있습니다. 예를 들어 `[CreateApplication](/managed-flink/latest/apiv2/API_CreateApplication.html)` 및 ` [UpdateApplication](/managed-flink/latest/apiv2/API_UpdateApplication.html)` 작업을 호출하면 CloudTrail 로그 파일에 항목이 생성됩니다.

모든 이벤트 및 로그 항목에는 요청을 생성한 사용자에 대한 정보가 들어 있습니다. ID 정보를 이용하면 다음을 쉽게 판단할 수 있습니다.
+ 요청이 루트 또는 AWS Identity and Access Management (IAM) 사용자 자격 증명으로 이루어졌는지 여부입니다.
+ 역할 또는 페더레이션 사용자의 임시 자격 증명을 사용하여 요청이 생성되었는지 여부.
+ 요청이 다른 AWS 서비스에서 이루어졌는지 여부입니다.

자세한 설명은 [CloudTrail userIdentity 요소](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html)를 참조하세요.

## Managed Service for Apache Flink 로그 파일 항목 이해
<a name="understanding-service-name-entries"></a>

트레일이란 지정한 S3 버킷에 이벤트를 로그 파일로 입력할 수 있게 하는 구성입니다. CloudTrail 로그 파일에는 하나 이상의 로그 항목이 포함될 수 있습니다. 이벤트는 모든 소스로부터의 단일 요청을 나타내며 요청 작업, 작업 날짜와 시간, 요청 파라미터 등에 대한 정보가 들어 있습니다. CloudTrail 로그 파일은 퍼블릭 API 직접 호출의 주문 스택 트레이스가 아니므로 특정 순서로 표시되지 않습니다.

다음 예는 [AddApplicationCloudWatchLoggingOption](/managed-flink/latest/apiv2/API_AddApplicationCloudWatchLoggingOption.html) 및 [DescribeApplication](/managed-flink/latest/apiv2/API_DescribeApplication.html) 작업을 나타내는 CloudTrail 로그 항목을 보여줍니다.

```
{
    "Records": [
        {
            "eventVersion": "1.05",
            "userIdentity": {
                "type": "IAMUser",
                "principalId": "EX_PRINCIPAL_ID",
                "arn": "arn:aws:iam::012345678910:user/Alice",
                "accountId": "012345678910",
                "accessKeyId": "EXAMPLE_KEY_ID",
                "userName": "Alice"
            },
            "eventTime": "2019-03-07T01:19:47Z",
            "eventSource": "kinesisanlaytics.amazonaws.com",
            "eventName": "AddApplicationCloudWatchLoggingOption",
            "awsRegion": "us-east-1",
            "sourceIPAddress": "127.0.0.1",
            "userAgent": "aws-sdk-java/unknown-version Linux/x.xx",
            "requestParameters": {
                "applicationName": "cloudtrail-test",
                "currentApplicationVersionId": 1,
                "cloudWatchLoggingOption": {
                    "logStreamARN": "arn:aws:logs:us-east-1:012345678910:log-group:cloudtrail-test:log-stream:flink-cloudwatch"
                }
            },
            "responseElements": {
                "cloudWatchLoggingOptionDescriptions": [
                    {
                        "cloudWatchLoggingOptionId": "2.1",
                        "logStreamARN": "arn:aws:logs:us-east-1:012345678910:log-group:cloudtrail-test:log-stream:flink-cloudwatch"
                    }
                ],
                "applicationVersionId": 2,
                "applicationARN": "arn:aws:kinesisanalyticsus-east-1:012345678910:application/cloudtrail-test"
            },
            "requestID": "18dfb315-4077-11e9-afd3-67f7af21e34f",
            "eventID": "d3c9e467-db1d-4cab-a628-c21258385124",
            "eventType": "AwsApiCall",
            "apiVersion": "2018-05-23",
            "recipientAccountId": "012345678910"
        },
        {
            "eventVersion": "1.05",
            "userIdentity": {
                "type": "IAMUser",
                "principalId": "EX_PRINCIPAL_ID",
                "arn": "arn:aws:iam::012345678910:user/Alice",
                "accountId": "012345678910",
                "accessKeyId": "EXAMPLE_KEY_ID",
                "userName": "Alice"
            },
            "eventTime": "2019-03-12T02:40:48Z",
            "eventSource": "kinesisanlaytics.amazonaws.com",
            "eventName": "DescribeApplication",
            "awsRegion": "us-east-1",
            "sourceIPAddress": "127.0.0.1",
            "userAgent": "aws-sdk-java/unknown-version Linux/x.xx",
            "requestParameters": {
                "applicationName": "sample-app"
            },
            "responseElements": null,
            "requestID": "3e82dc3e-4470-11e9-9d01-e789c4e9a3ca",
            "eventID": "90ffe8e4-9e47-48c9-84e1-4f2d427d98a5",
            "eventType": "AwsApiCall",
            "apiVersion": "2018-05-23",
            "recipientAccountId": "012345678910"
        }
    ]
}
```