

# Application Signals에서 사용자 지정 지표
<a name="AppSignals-CustomMetrics"></a>

애플리케이션 성능 및 가용성을 모니터링하기 위해 Application Signals는 사용자가 활성화한 후 검색된 애플리케이션에서 표준 지표(결함, 오류, 지연 시간) 및 런타임 지표를 수집합니다.

사용자 지정 지표는 애플리케이션 모니터링에 중요한 컨텍스트를 추가하고 문제 해결을 가속화하는 데 도움이 됩니다. 이를 사용하여 다음을 수행할 수 있습니다.
+ 원격 분석 데이터 분석 사용자 지정
+  문제의 근본 원인 식별
+ 정확한 비즈니스 및 운영에 대한 신속한 의사 결정

Application Signals를 사용하면 서비스에서 생성된 사용자 지정 지표를 보고 표준 및 런타임 지표와 연관시킬 수 있습니다. 예를 들어 애플리케이션은 요청 크기 및 캐시 누락 수에 대한 지표를 생성할 수 있습니다. 이러한 사용자 지정 지표는 성능 문제에 대한 보다 세분화된 통찰력을 제공하여 가용성 저하 및 지연 시간 스파이크를 더 빠르게 진단하고 해결하는 데 도움이 됩니다.

**Topics**
+ [Application Signals에 대한 사용자 지정 지표 구성](#AppSignals-CustomMetrics-Adding)
+ [Application Signals에서 사용자 지정 지표 보기](#AppSignals-CustomMetrics-Viewing)
+ [FAQ](#AppSignals-CustomMetrics-FAQ)

## Application Signals에 대한 사용자 지정 지표 구성
<a name="AppSignals-CustomMetrics-Adding"></a>

*OpenTelemetry 지표* 및 *스팬 지표*라는 두 가지 방법을 사용하여 애플리케이션에서 사용자 지정 지표를 생성할 수 있습니다.

**Topics**
+ [OpenTelemetry 지표](#AppSignals-CustomMetrics-OpenTelemetry)
+ [스팬 지표](#AppSignals-CustomMetrics-SpanMetrics)

### OpenTelemetry 지표
<a name="AppSignals-CustomMetrics-OpenTelemetry"></a>

Application Signals에서 사용자 지정 OpenTelemetry 지표를 사용하려면 CloudWatch 에이전트 또는 OpenTelemetry Collector를 사용해야 합니다. 사용자 지정 OpenTelemetry 지표를 사용하면 OpenTelemetry 지표 SDK를 사용하여 애플리케이션 코드에서 직접 지표를 생성하고 내보낼 수 있습니다.

1. Application Signals에 서비스를 온보딩하세요.

1. 에이전트 또는 수집기를 구성하세요.
   + CloudWatch 에이전트를 사용하는 경우 `otlp`와 함께 `metrics_collected`를 [구성](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-OpenTelemetry-metrics.html)해야 합니다. 예: `cloudwatch-config.json`

     ```
     {
       "traces": {
         "traces_collected": {
           "application_signals": {}
         }
       },
       "logs": {
         "metrics_collected": {
           "application_signals": {},
           "otlp": {
             "grpc_endpoint": "0.0.0.0:4317",
             "http_endpoint": "0.0.0.0:4318"
           }
         }
       }
     }
     ```
   + OpenTelemetry Collector를 사용하는 경우 지표 파이프라인을 구성합니다. [OpenTelemetry Collector용 CloudWatch EMF Exporter](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/awsemfexporter)를 사용하고 [지표 레이블에 대한 리소스 속성](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/awsemfexporter#resource-attributes-to-metric-labels)을 활성화해야 합니다. 많은 지표 집계를 내보내지 않도록 ` dimension_rollup_option: NoDimensionRollup`을 구성하는 것이 좋습니다. 예를 들어 `config.yaml`을 참조하세요.

     ```
     receivers:
       otlp:
         protocols:
           grpc:
             endpoint: 0.0.0.0:4317
           http:
             endpoint: 0.0.0.0:4318
     
     exporters:
       awsemf:
         region: $REGION
         namespace: $NAMESPACE
         log_group_name:$LOG_GROUP_NAME
         resource_to_telemetry_conversion:
           enabled: true
         dimension_rollup_option: "NoDimensionRollup"
         
       otlphttp/traces:
         compression: gzip
         traces_endpoint: https://xray.$REGION.amazonaws.com/v1/traces
         auth:
           authenticator: sigv4auth/traces
     
     extensions:
       sigv4auth/logs:
         region: "$REGION"
         service: "logs"
       sigv4auth/traces:
         region: "$REGION"
         service: "xray"
     
     processors:
       batch:
     
     service:
       telemetry:
       extensions: [sigv4auth/logs, sigv4auth/traces]
       pipelines:
         metrics:
           receivers: [otlp]
           processors: [batch]
           exporters: [awsemf]
         traces:
           receivers: [otlp]
           processors: [batch]
           exporters: [otlphttp/traces]
     ```

1. 환경을 구성합니다. 동일한 서비스 이름의 서비스가 여러 개 있고 Application Signals 지표를 올바른 서비스 이름과 정확하게 연관시키려면 리소스 속성 `deployment.environment.name`을 구성하는 것이 좋습니다. 이 리소스 속성은 일반적으로 환경 변수를 통해 구성됩니다.

   ```
   OTEL_RESOURCE_ATTRIBUTES="service.name=$YOUR_SVC_NAME,deployment.environment.name=$YOUR_ENV_NAME"
   ```

1. CloudWatch 에이전트 또는 OpenTelemetry Collector로 지표 내보내기를 구성하세요. 다음 접근 방법 중 하나를 사용할 수 있습니다.
   + (권장) 사용자 지정 내보내기 파이프라인 - 애플리케이션 코드에서 구성된 에이전트 또는 수집기 엔드포인트로 내보내는 전용 [MeterProvider](https://opentelemetry.io/docs/specs/otel/metrics/sdk/#meterprovider)를 생성합니다. 예:

     ```
     Resource resource = Resource.getDefault().toBuilder()
             .put(AttributeKey.stringKey("service.name"), serviceName)
             .put(AttributeKey.stringKey("deployment.environment.name"), environment)
             .build();
     
     MetricExporter metricExporter = OtlpHttpMetricExporter.builder()
             .setEndpoint("http://localhost:4318/v1/metrics")
             .build();
     
     MetricReader metricReader = PeriodicMetricReader.builder(metricExporter)
             .setInterval(Duration.ofSeconds(10))
             .build()
     
     SdkMeterProvider meterProvider = SdkMeterProvider.builder()
         .setResource(resource)
         .registerMetricReader()
         .build();
         
     Meter meter = meterProvider.get("myMeter");
     ```
   + 에이전트 기반 내보내기 - 에이전트 환경 변수 [OTEL\$1METRICS\$1EXPORTER](https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/#exporter-selection) 및 [OTEL\$1EXPORTER\$1OTLP\$1METRICS\$1ENDPOINT](https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/#otel_exporter_otlp_metrics_endpoint)를 구성합니다. 예:

     ```
     OTEL_METRICS_EXPORTER=otlp
     OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=http://localhost:4318/v1/metrics
     ```

     애플리케이션 코드에서 에이전트가 생성한 글로벌 MeterProvider를 사용합니다. 예:

     ```
     Meter meter = GlobalOpenTelemetry.getMeter("myMeter");
     ```

1. 애플리케이션 코드에서 [OTEL 지표 SDK](https://opentelemetry.io/docs/specs/otel/metrics/sdk/)를 사용하여 OTEL 지표를 추가합니다. 예를 들어 Python에서 OTEL 지표를 추가하는 방법:

   ```
   counter = meter.counterBuilder("myCounter").build();
   counter.add(value);
   counter.add(value, Attributes.of(AttributeKey.stringKey("Operation"), "myOperation"));
   ```

   작업 속성을 추가할 필요는 없지만 Application Signals 서비스 작업을 사용자 지정 OpenTelemetry 지표와 연관시키는 데 유용할 수 있습니다.

### 스팬 지표
<a name="AppSignals-CustomMetrics-SpanMetrics"></a>

사용자 지정 스팬 지표는 현재 트랜잭션 검색에서만 작동합니다. 사용자 지정 스팬 지표를 사용하면 다음을 수행할 수 있습니다.
+ 지표 필터를 사용하여 지표 생성
+ 애플리케이션 코드에 추가된 스팬 속성 처리
+ 구현을 위해 OpenTelemetry 트레이스 SDK 사용

1. 트랜잭션 검색을 사용하여 Application Signals 모니터링을 활성화하세요. 자세한 내용은 [트랜잭션 검색](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Transaction-Search-getting-started.html) 섹션을 참조하세요.

   100% 지표 샘플링을 보장하려면 스팬의 100%를 엔드포인트로 보내는 것이 좋습니다.

1. [OTEL 트레이스 SDK](https://opentelemetry.io/docs/specs/otel/trace/sdk/)를 사용하여 스팬 속성을 추가하세요. 두 가지 방법이 있습니다.
   + [권장] 자동으로 생성된 스팬에 속성을 추가합니다. 예:

     ```
     Span.current().setAttribute("myattribute", value);
     ```
   + 수동으로 생성된 스팬에 속성을 추가합니다. 예:

     ```
     Span span = tracer.spanBuilder("myspan").startSpan();
     try (Scope scope = span.makeCurrent()) {
        span.setAttribute("myattribute",  value);
     }
     ```

1. 다음 값을 사용하여 지표 필터를 생성하세요. 지표 필터를 생성하는 방법에 대한 자세한 내용은 [로그 그룹에 대한 지표 필터 생성](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CreateMetricFilterProcedure.html)을 참조하세요.
   + 로그 그룹 – aws/spans
   + 필터 패턴 - \$1 \$1.attributes.['myattribute'] = \$1 \$1
   + 지표 이름 - myattribute(값이 정확히 일치해야 하며, 그렇지 않으면 스팬 상관관계가 작동하지 않음)
   + 지표 값 - \$1.attributes.['myattribute']
   + 차원 – 필드 이름: 서비스, 필드 값: \$1.attributes.['aws.local.service'], 필드 이름: Environment, 필드 값: \$1.attributes.['aws.local.environment'], 필드 이름: Operation, 필드 값: \$1.attributes.['aws.local.operation']
**참고**  
수동으로 생성된 스팬에 속성을 추가하는 경우 `aws.local.operation`에 스팬 데이터에 존재하지 않으므로 `Operation`을 설정할 수 없습니다.

## Application Signals에서 사용자 지정 지표 보기
<a name="AppSignals-CustomMetrics-Viewing"></a>

이제 Application Signals 콘솔에서 서비스 및 작업에 대한 사용자 지정 지표를 볼 수 있습니다.
+ **서비스** 목록에서 서비스를 선택하여 새 **관련 지표** 탭 확인
+  선택한 서비스에 대한 표준 지표, 런타임 지표 및 관련 지표 보기
+ 목록에서 여러 지표 필터링 및 선택
+ 선택한 지표를 그래프로 작성하여 상관관계와 문제의 근본 원인 식별

관련 지표에 대한 자세한 내용은 [관련 지표 보기](ServiceDetail.md#ServiceDetail-relatedmetrics) 섹션을 참조하세요.

## FAQ
<a name="AppSignals-CustomMetrics-FAQ"></a>

### 사용자 지정 지표에 대한 환경 구성을 추가하지 않으면 어떤 영향이 있나요?
<a name="AppSignals-CustomMetrics-FAQ-Environment"></a>

Application Signals는 애플리케이션의 차이를 명확하게 구분하도록 `deployment.environment.name` 리소스 속성을 구성합니다. Application Signals는 이와 같은 명확한 구분을 통해서만 동일한 이름의 서로 다른 두 서비스에서 생성된 사용자 지정 지표를 올바른 서비스에 연관시킬 수 있습니다.

애플리케이션에 환경 구성을 추가하려면 [OpenTelemetry 지표](#AppSignals-CustomMetrics-OpenTelemetry) 섹션을 참조하세.

### 지표 필터에 제한이 있나요?
<a name="AppSignals-CustomMetrics-FAQ-Limits"></a>

CloudWatch Logs 로그 그룹당 최대 100개의 지표 필터만 생성할 수 있습니다. 각 지표는 최대 3개의 차원을 정의할 수 있습니다. 여기 [OpenTelemetry 지표](#AppSignals-CustomMetrics-OpenTelemetry)에서 지표 필터에 대한 제한을 볼 수 있습니다.

### 지표 그래프가 지표 테이블에 표시되지 않는 이유는 무엇인가요?
<a name="AppSignals-CustomMetrics-FAQ-Graph"></a>

솔루션은 지표 유형에 따라 다릅니다.
+ 사용자 지정 지표 - 지표 구성을 확인하려면 [Application Signals에 대한 사용자 지정 지표 구성](#AppSignals-CustomMetrics-Adding) 섹션 참조
+ 표준 또는 런타임 지표 - [Application Signals 설치 문제 해결](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-Enable-Troubleshoot.html) 참조