

# 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 メトリクス*と*スパンメトリクス*の 2 つの方法を使用して、アプリケーションからカスタムメトリクスを生成できます。

**Topics**
+ [OpenTelemetry メトリクス](#AppSignals-CustomMetrics-OpenTelemetry)
+ [スパンメトリクス](#AppSignals-CustomMetrics-SpanMetrics)

### OpenTelemetry メトリクス
<a name="AppSignals-CustomMetrics-OpenTelemetry"></a>

Application Signals でカスタム OpenTelemetry メトリクスを使用するには、CloudWatch エージェントまたは OpenTelemetry Collector を使用する必要があります。カスタム OpenTelemetry メトリクスを使用すると、OpenTelemetry Metrics 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 を使用する場合は、メトリクスパイプラインを設定します。[CloudWatch EMF Exporter for OpenTelemetry Collector](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/awsemfexporter) を使用し、[Resource Attributes to Metric Labels](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 Metrics 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"));
   ```

   Operation 属性を追加する必要はありませんが、Application Signals サービスオペレーションをカスタム OpenTelemetry メトリクスに関連付けるのに役立ちます。

### スパンメトリクス
<a name="AppSignals-CustomMetrics-SpanMetrics"></a>

カスタムスパンメトリクスは現在、トランザクション検索でのみ機能します。カスタムスパンメトリクスを使用すると、以下のことができます。
+ メトリクスフィルターを使用してメトリクスを作成する
+ アプリケーションコードに追加されたスパン属性を処理する
+ 実装に OpenTelemetry Traces SDK を使用する

1. トランザクション検索で Application Signals モニタリングを有効にします。詳細については、「[Transaction Search](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Transaction-Search-getting-started.html)」を参照してください。

   100% のメトリクスサンプリングを確実に行うために、スパンの 100% をエンドポイントに送信することをお勧めします。

1. [OTEL Traces SDK](https://opentelemetry.io/docs/specs/otel/trace/sdk/) を使用してスパン属性を追加します。以下の 2 つの方法があります。
   + [推奨] 自動的に生成されたスパンに属性を追加します。例:

     ```
     Span.current().setAttribute("myattribute", value);
     ```
   + 手動で生成されたスパンに属性を追加します。例:

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

1. 以下の値を使用してメトリクスフィルターを作成します。メトリクスフィルターを作成する方法については、「[Create a metric filter for a log group](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CreateMetricFilterProcedure.html)」を参照してください。
   + ロググループ – aws/spans
   + フィルターパターン – \$1 \$1.attributes.['myattribute'] = \$1 \$1
   + メトリクス名 – myattribute (値は完全に一致する必要があります。一致しない場合、スパン相関は機能しません
   + メトリクス値 – \$1.attributes.['myattribute']
   + ディメンション – フィールド名: Service、フィールド値: \$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 は、同じ名前の 2 つの異なるサービスから生成されたカスタムメトリクスを、曖昧さを解消することなく正しいサービスに関連付けることはできません。

アプリケーションに環境設定を追加するには、「[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)」を参照してください