

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

# 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 콘솔에 있는 **애플리케이션** 지표 그룹 아래에 표시됩니다.