

# メトリクスストリームを使用する
<a name="CloudWatch-Metric-Streams"></a>

*メトリクスストリーム*を使用すると、ほぼリアルタイムに着信するように低レイテンシーで、選択した送信先に CloudWatch メトリクスを継続的にストリーミングできます。サポートされる送信先には、Amazon Simple Storage Service などの AWS の送信先や、サードパーティーのサービスプロバイダーの送信先が含まれます。

CloudWatch メトリクスストリームには、主に次の 3 つの使用シナリオがあります。
+ **Firehose を使用したカスタムセットアップ** – メトリクスストリームを作成し、それを (CloudWatch メトリクスを必要な場所に配信するための) Amazon Data Firehose 配信ストリームに転送します。これらは、Amazon S3 などのデータレイク、または、サードパーティプロバイダーを含め Firehose でサポートされる任意の送信先またはエンドポイントにストリーミングすることができます。ネイティブでサポートされるのは JSON 形式、OpenTelemetry 1.0.0 形式、OpenTelemetry 0.7.0 形式です。また、Firehose 配信ストリームで変換を設定すると、データを Parquet などの別の形式に変換することもできます。メトリクスストリームにより、モニタリングデータの継続的な更新ができます。あるいは、この CloudWatch メトリクスデータを請求やパフォーマンスに関するデータと組み合わせることで、豊富なデータセットを作成できます。その後、Amazon Athena などのツールを使用して、コストの最適化、リソースのパフォーマンス、およびリソースの使用率に関するインサイトを得ることができます。
+ **クイック S3 セットアップ** – 簡単なプロセスで Amazon Simple Storage Service へのストリーミングを設定します。デフォルトでは、ストリームに必要なリソースを CloudWatch が作成します。サポートされている形式は、JSON、OpenTelemetry 1.0.0、OpenTelemetry 0.7.0 です。
+ **AWS パートナーのクイックセットアップ** – CloudWatch では、一部のサードパーティパートナー向けとして、素早い設定エクスペリエンスを用意しています。CloudWatch ストリーミングデータを使用したアプリケーションのモニタリング、トラブルシューティング、および分析のために、サードパーティーのサービスプロバイダーを利用できます。クイックパートナーセットアップのワークフローを使用すれば、ユーザーは送信先の URL と API キーを指定するだけで、残りの設定は CloudWatch が処理します。クイックパートナーセットアップは、次のサードパーティープロバイダーで利用できます。

  
  + Datadog
  + Dynatrace
  + Elastic
  + New Relic
  + Splunk Observability Cloud
  + SumoLogic

すべての CloudWatch メトリクスをストリーミングすることも、フィルターを使用して特定のメトリクスだけをストリーミングすることもできます。各メトリクスストリームには、メトリクス名前空間または特定のメトリクスを含めるか除外するためのフィルターを、最大 1000 個含めることができます。1 つのメトリクスストリームには、含めるフィルターまたは除外するフィルターのみを設定できますが、両方を含めることはできません。

メトリクスストリームが作成された後、適用されているフィルターに適合する新しいメトリクスが作成されると、新しいメトリクスは自動的にストリームに含まれます。

アカウントごとまたはリージョンごとのメトリクスストリーム数に制限はなく、ストリーミングされるメトリクス更新の数にも制限はありません。

各ストリームは、JSON、OpenTelemetry 1.0.0、OpenTelemetry 0.7.0 のいずれの形式でも構いません。メトリクスストリームの出力形式は、OpenTelemetry 0.7.0 から OpenTelemetry 1.0.0 にアップグレードする場合などいつでも編集できます。出力形式の詳細については、「[JSON 形式の CloudWatch メトリクスストリームの出力](CloudWatch-metric-streams-formats-json.md)」、「[OpenTelemetry 1.0.0 形式の CloudWatch メトリクスストリームの出力](CloudWatch-metric-streams-formats-opentelemetry-100.md)」、および「[OpenTelemetry 0.7.0 形式の CloudWatch メトリクスストリームの出力](CloudWatch-metric-streams-formats-opentelemetry.md)」を参照してください。

モニタリングアカウントのメトリクストリームについては、そのモニタリングアカウントにリンクされているソースアカウントからのメトリクスを含めるかどうかを選択できます。詳細については、「[CloudWatch のクロスアカウントオブザーバビリティ](CloudWatch-Unified-Cross-Account.md)」を参照してください。

メトリクスストリームには、常に `Minimum`、`Maximum`、`SampleCount`、および `Sum` の統計情報が含まれています。また、追加料金で、追加の統計情報を含めることもできます。詳細については、「[ストリーミングできる統計情報](CloudWatch-metric-streams-statistics.md)」を参照してください。

メトリクスストリームの料金は、メトリクス更新の件数によります。メトリクスストリームに使用される配信ストリームについても、Firehose からの料金が発生します。詳細については、「[Amazon CloudWatch 料金表](https://aws.amazon.com/cloudwatch/pricing/)」をご覧ください。

**Topics**
+ [メトリクスストリームをセットアップする](CloudWatch-metric-streams-setup.md)
+ [ストリーミングできる統計情報](CloudWatch-metric-streams-statistics.md)
+ [メトリクスストリームの操作とメンテナンス](CloudWatch-metric-streams-operation.md)
+ [CloudWatch メトリクスを使用したメトリクスストリームのモニターリング](CloudWatch-metric-streams-monitoring.md)
+ [CloudWatch と Firehose 間の信頼](CloudWatch-metric-streams-trustpolicy.md)
+ [JSON 形式の CloudWatch メトリクスストリームの出力](CloudWatch-metric-streams-formats-json.md)
+ [OpenTelemetry 1.0.0 形式の CloudWatch メトリクスストリームの出力](CloudWatch-metric-streams-formats-opentelemetry-100.md)
+ [OpenTelemetry 0.7.0 形式の CloudWatch メトリクスストリームの出力](CloudWatch-metric-streams-formats-opentelemetry.md)
+ [CloudWatch でのメトリクスストリームのトラブルシューティング](CloudWatch-metric-streams-troubleshoot.md)

# メトリクスストリームをセットアップする
<a name="CloudWatch-metric-streams-setup"></a>

以下のセクションの手順を使用して、CloudWatch メトリクスストリームを設定します。

メトリクスストリームが作成された後、メトリクスデータが送信先に表示されるまでにかかる時間は、Firehose 配信ストリームに設定されているバッファリング設定によって異なります。バッファリングは、最大ペイロードサイズまたは最大待機時間のいずれか最初に到達した方という形で表されます。これらの値が最小値 (60 秒、1 MB) に設定されている場合、選択した CloudWatch 名前空間にアクティブなメトリクス更新がある場合、予想されるレイテンシーは 3 分以内です。

CloudWatch メトリクスストリームでは、データは 1 分ごとに送信されます。データは最終送信先に順番通りに到着しない可能性があります。タイムスタンプからの経過時間が 3 日以上前のタイムスタンプを持つメトリクスを除き、指定した名前空間のすべての指定メトリクスがメトリクスストリームに送信されます。

ストリーミングするメトリクス名と名前空間の組み合わせごとに、そのメトリクス名と名前空間のすべてのディメンションの組み合わせがストリーミングされます。

モニタリングアカウントのメトリクストリームについては、そのモニタリングアカウントにリンクされているソースアカウントからのメトリクスを含めるかどうかを選択できます。詳細については、「[CloudWatch のクロスアカウントオブザーバビリティ](CloudWatch-Unified-Cross-Account.md)」を参照してください。

メトリクスストリームを作成および管理するには、** CloudWatchFullAccess** ポリシーと `iam:PassRole` アクセス許可を持つアカウント、または次のリストのアクセス許可を持つアカウントにログオンする必要があります。
+ `iam:PassRole`
+ `cloudwatch:PutMetricStream`
+ `cloudwatch:DeleteMetricStream`
+ `cloudwatch:GetMetricStream`
+ `cloudwatch:ListMetricStreams`
+ `cloudwatch:StartMetricStreams`
+ `cloudwatch:StopMetricStreams`

CloudWatch でメトリクスストリームに必要な IAM ロールを設定する場合は、`iam:CreateRole` および `iam:PutRolePolicy` アクセス許可も必要です。

**重要**  
`cloudwatch:PutMetricStream` を持つユーザーは、`cloudwatch:GetMetricData` アクセス許可がない場合でも、ストリーミングされる CloudWatch メトリクスデータにアクセスできます。

**Topics**
+ [Firehose でのカスタム設定](CloudWatch-metric-streams-setup-datalake.md)
+ [Amazon S3 のクイックセットアップを使用する](CloudWatch-metric-streams-setup-Quick-S3.md)
+ [クイックパートナーセットアップ](CloudWatch-metric-streams-QuickPartner.md)

# Firehose でのカスタム設定
<a name="CloudWatch-metric-streams-setup-datalake"></a>

このメソッドを使用してメトリクスストリームを作成し、それを (CloudWatch メトリクスを必要な場所に配信する) Amazon Data Firehose 配信ストリームに転送します。これらは、Amazon S3 などのデータレイク、または、サードパーティプロバイダーを含め Firehose でサポートされる任意の送信先またはエンドポイントにストリーミングすることができます。

ネイティブでサポートされるのは JSON 形式、OpenTelemetry 1.0.0 形式、OpenTelemetry 0.7.0 形式です。また、Firehose 配信ストリームで変換を設定すると、データを Parquet などの別の形式に変換することもできます。メトリクスストリームにより、モニタリングデータの継続的な更新ができます。あるいは、この CloudWatch メトリクスデータを請求やパフォーマンスに関するデータと組み合わせることで、豊富なデータセットを作成できます。その後、Amazon Athena などのツールを使用して、コストの最適化、リソースのパフォーマンス、およびリソースの使用率に関するインサイトを得ることができます。

CloudWatch コンソール、AWS CLI、AWS CloudFormation、または AWS Cloud Development Kit (AWS CDK) を使用して、メトリクスストリームを設定できます。

メトリクスストリームに使用する Firehose 配信ストリームは、メトリクスストリームを設定したのと同じアカウントかつ同じリージョンに存在する必要があります。別のアカウントまたは別のリージョンにある最終配信先にストリーミングするように Firehose 配信ストリームを設定すれば、クロスリージョン機能を実現できます。

## CloudWatch コンソール
<a name="CloudWatch-metric-streams-setup-datalake-console"></a>

このセクションでは、CloudWatch コンソールで Firehose を使用したメトリクスストリームの設定方法について説明します。

**Firehose を使用してカスタムメトリクスストリームを設定するには**

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1. ナビゲーションペインで、 **[Metrics]** (メトリクス)、**[Streams]** (ストリーム) の順に選択します。**[Create metric stream]** (メトリクスストリームの作成) を選択します。

1. (オプション) CloudWatch クロスアカウントオブザーバビリティのモニタリングアカウントとしてセットアップされたアカウントにサインインしている場合は、リンクされたソースアカウントからのメトリクスをこのメトリクスストリームに含めるかどうかを選択できます。ソースアカウントからのメトリクスを含めるには、**[Include source account metrics]** (ソースアカウントメトリクスを含める) を選択します。

1. **[Firehose でカスタム設定]** を選択します。

1. **[Kinesis Data Firehose ストリームを選択する]** で、使用する Firehose 配信ストリームを選択します。同じアカウントに存在する必要があります。このオプションのデフォルトの形式は OpenTelemetry 0.7.0 ですが、後でこの形式を変更することもできます。

   次に、**[Firehose 配信ストリームを選択する]** で、使用する Firehose 配信ストリームを選択します。

1. (オプション) CloudWatch に新しいロールを作成させる代わりに、**[既存のサービスロールを選択]** を選択して既存の IAM ロールを使用できます。

1. (オプション) シナリオのデフォルトの形式から出力形式を変更するには、[**出力形式を変更**] を選択します。サポートされている形式は、JSON、OpenTelemetry 1.0.0、OpenTelemetry 0.7.0 です。

1. **メトリクスをストリーミングする**には、**[すべてのメトリクス]** または **[メトリクスを選択]** を選択します。

   **[すべてのメトリクス]** を選択した場合には、このアカウントのすべてのメトリクスがストリームに含まれます。

   すべてのメトリクスをストリーミングするかどうかを慎重に検討してください。ストリーミングするメトリクスが多いほど、メトリクスストリームの料金は高くなります。

   **[メトリクスを選択]** を選択した場合には、以下のいずれかの操作を行います。
   + ほとんどのメトリクス名前空間をストリーミングするには、**[除外]** を選択し、除外する名前空間またはメトリクスを選択します。**[除外]** で名前空間を指定すると、オプションで、除外する特定のメトリクスをその名前空間から選択できます。メトリクスを選択せずに名前空間の除外のみを選択した場合には、その名前空間からすべてのメトリクスが除外されます。
   + メトリクスストリームにメトリクス名前空間またはメトリクスをいくつか含めるには、**[含める]** を選択し、含める名前空間またはメトリクスを選択します。メトリクスを選択せずに名前空間を含めるよう選択した場合には、その名前空間のすべてのメトリクスが含まれます。

1. (オプション) これらのメトリクスの一部について、Minimum (最小値)、Maximum (最大値)、SampleCount (サンプル数)、Sum (合計) 以外の追加の統計情報をストリーミングするには、**[統計をさらに追加]** を選択します。**[Add recommended metrics]** (推奨メトリクスを追加する) を選択してよく使用される統計情報を追加するか、名前空間とメトリクス名を手動で選択して追加の統計情報をストリーミングするかのどちらかを行います。次に、ストリーミングする追加の統計情報を選択します。

   別の追加の統計情報のセットをストリーミングする別のメトリクスグループを選択するには、**[Add additional statistics]** (統計情報の追加) を選択します。各メトリクスには最大 20 個の追加の統計情報を含めることができ、メトリクスストリーム内の最大 100 個のメトリクスに追加の統計情報を含めることができます。

   追加の統計情報をストリーミングすると、より多くの料金が発生します。詳細については、「[ストリーミングできる統計情報](CloudWatch-metric-streams-statistics.md)」を参照してください。

   追加の統計情報の定義については、「[CloudWatch 統計定義](Statistics-definitions.md)」を参照してください。

1. (オプション) [**メトリクスストリーム名**] で新しいメトリクスストリームの名前をカスタマイズします。

1. **[メトリクスストリームの作成]** を選択します。

## AWS CLI または AWS API
<a name="CloudWatch-metric-streams-setup-datalake-CLI"></a>

CloudWatch メトリクスストリームを作成するには、次の手順に従います。

**AWS CLI または AWS API を使用してメトリクスストリームを作成するには**

1. Amazon S3 にストリーミングする場合は、まずバケットを作成します。詳細については、「[バケットの作成](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)」を参照してください。

1. Firehose 配信ストリームを作成します。詳細については、「[Creating a Firehose stream](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)」をご参照ください。

1. CloudWatch が Firehose 配信ストリームに書き込むことを可能にする IAM ロールを作成します。このロールの内容の詳細については、「[CloudWatch と Firehose 間の信頼](CloudWatch-metric-streams-trustpolicy.md)」を参照してください。

1. `aws cloudwatch put-metric-stream` CLI コマンドまたは `PutMetricStream` API を使用して、CloudWatch メトリクスストリームを作成します。

## AWS CloudFormation
<a name="CloudWatch-metric-streams-setup-datalake-CFN"></a>

CloudFormation を使用して、メトリクスストリームを設定できます。詳細については、「[AWS::CloudWatch::MetricStream](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html)」を参照してください。

**CloudFormation を使用してメトリクスストリームを作成するには**

1. Amazon S3 にストリーミングする場合は、まずバケットを作成します。詳細については、「[バケットの作成](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)」を参照してください。

1. Firehose 配信ストリームを作成します。詳細については、「[Creating a Firehose stream](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)」をご参照ください。

1. CloudWatch が Firehose 配信ストリームに書き込むことを可能にする IAM ロールを作成します。このロールの内容の詳細については、「[CloudWatch と Firehose 間の信頼](CloudWatch-metric-streams-trustpolicy.md)」を参照してください。

1. CloudFormation でストリームを作成します。詳細については、「[AWS::CloudWatch::MetricStream](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-metricstream.html)」を参照してください。

## AWS Cloud Development Kit (AWS CDK)
<a name="CloudWatch-metric-streams-setup-datalake-CDK"></a>

AWS Cloud Development Kit (AWS CDK) を使用して、メトリクスストリームを設定できます。

**AWS CDK を使用してメトリクスストリームを作成するには**

1. Amazon S3 にストリーミングする場合は、まずバケットを作成します。詳細については、「[バケットの作成](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)」を参照してください。

1. Firehose 配信ストリームを作成します。詳細については、「[Creating an Amazon Data Firehose Delivery Stream](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)」を参照してください。

1. CloudWatch が Firehose 配信ストリームに書き込むことを可能にする IAM ロールを作成します。このロールの内容の詳細については、「[CloudWatch と Firehose 間の信頼](CloudWatch-metric-streams-trustpolicy.md)」を参照してください。

1. メトリクスストリームを作成します。メトリクスストリームのリソースは、`CfnMetricStream` という名前の Level 1 (L1) Constructとして AWS CDK で使用できます。詳細については、「[L1 Construct の使用](https://docs.aws.amazon.com/cdk/latest/guide/constructs.html#constructs_l1_using.html)」を参照してください。

# Amazon S3 のクイックセットアップを使用する
<a name="CloudWatch-metric-streams-setup-Quick-S3"></a>

サポートされている JSON、OpenTelemetry 1.0.0、OpenTelemetry 0.7.0 以外の形式に変換する必要がない場合は、**クイック S3 セットアップ**メソッドを使用すると、Amazon S3 へのストリームをすばやくセットアップできます。CloudWatch は、Firehose 配信ストリームや必要な IAM ロールを含む、必要なすべてのリソースを作成します。このオプションのデフォルトの形式は JSON ですが、ストリームの設定時に形式を変更することができます。

また、最終的な形式を Parquet または Optimized Row Columnar (ORC) にする場合は、「[Firehose でのカスタム設定](CloudWatch-metric-streams-setup-datalake.md)」の手順に従ってください。

## CloudWatch コンソール
<a name="CloudWatch-metric-streams-setup-quick-S3-console"></a>

このセクションでは、CloudWatch コンソールでクイック S3 セットアップを使用して、Amazon S3 のメトリクスストリームを設定する方法について説明します。

**クイック S3 セットアップ を使用してメトリクスストリームを設定するには**

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1. ナビゲーションペインで、 **[Metrics]** (メトリクス)、**[Streams]** (ストリーム) の順に選択します。**[Create metric stream]** (メトリクスストリームの作成) を選択します。

1. (オプション) CloudWatch クロスアカウントオブザーバビリティのモニタリングアカウントとしてセットアップされたアカウントにサインインしている場合は、リンクされたソースアカウントからのメトリクスをこのメトリクスストリームに含めるかどうかを選択できます。ソースアカウントからのメトリクスを含めるには、**[Include source account metrics]** (ソースアカウントメトリクスを含める) を選択します。

1. [**クイック S3 セットアップ**] を選択します。CloudWatch は、Firehose 配信ストリームや必要な IAM ロールを含む、必要なすべてのリソースを作成します。このオプションのデフォルトの形式は JSON ですが、後でこの形式を変更できます。

1. (オプション) CloudWatch に新しいリソースを作成させる代わりに、**[既存のリソースを選択]** を選択すれば、既存の S3 バケットか既存の IAM ロールを使用することができます。

1. (オプション) シナリオのデフォルトの形式から出力形式を変更するには、[**出力形式を変更**] を選択します。サポートされている形式は、JSON、OpenTelemetry 1.0.0、OpenTelemetry 0.7.0 です。

1. **メトリクスをストリーミングする**には、**[すべてのメトリクス]** または **[メトリクスを選択]** を選択します。

   **[すべてのメトリクス]** を選択した場合には、このアカウントのすべてのメトリクスがストリームに含まれます。

   すべてのメトリクスをストリーミングするかどうかを慎重に検討してください。ストリーミングするメトリクスが多いほど、メトリクスストリームの料金は高くなります。

   **[メトリクスを選択]** を選択した場合には、以下のいずれかの操作を行います。
   + ほとんどのメトリクス名前空間をストリーミングするには、**[除外]** を選択し、除外する名前空間またはメトリクスを選択します。**[除外]** で名前空間を指定すると、オプションで、除外する特定のメトリクスをその名前空間から選択できます。メトリクスを選択せずに名前空間の除外のみを選択した場合には、その名前空間からすべてのメトリクスが除外されます。
   + メトリクスストリームにメトリクス名前空間またはメトリクスをいくつか含めるには、**[含める]** を選択し、含める名前空間またはメトリクスを選択します。メトリクスを選択せずに名前空間を含めるよう選択した場合には、その名前空間のすべてのメトリクスが含まれます。

1. (オプション) これらのメトリクスの一部について、Minimum (最小値)、Maximum (最大値)、SampleCount (サンプル数)、Sum (合計) 以外の追加の統計情報をストリーミングするには、**[統計をさらに追加]** を選択します。**[Add recommended metrics]** (推奨メトリクスを追加する) を選択してよく使用される統計情報を追加するか、名前空間とメトリクス名を手動で選択して追加の統計情報をストリーミングするかのどちらかを行います。次に、ストリーミングする追加の統計情報を選択します。

   別の追加の統計情報のセットをストリーミングする別のメトリクスグループを選択するには、**[Add additional statistics]** (統計情報の追加) を選択します。各メトリクスには最大 20 個の追加の統計情報を含めることができ、メトリクスストリーム内の最大 100 個のメトリクスに追加の統計情報を含めることができます。

   追加の統計情報をストリーミングすると、より多くの料金が発生します。詳細については、「[ストリーミングできる統計情報](CloudWatch-metric-streams-statistics.md)」を参照してください。

   追加の統計情報の定義については、「[CloudWatch 統計定義](Statistics-definitions.md)」を参照してください。

1. (オプション) [**メトリクスストリーム名**] で新しいメトリクスストリームの名前をカスタマイズします。

1. **[メトリクスストリームの作成]** を選択します。

# クイックパートナーセットアップ
<a name="CloudWatch-metric-streams-QuickPartner"></a>

CloudWatch では、以下のサードパーティパートナー向けとして、クイックセットアップのエクスペリエンスを提供しています。このワークフローを使用するのに指定の必要があるのは、送信先のための URL と API キーのみです。Firehose 配信ストリームや必要な IAM ロールの作成など、その他のセットアップは、CloudWatch により処理されます。

**重要**  
クイックパートナーセットアップを使用してメトリクスストリームを作成する前に、以下のリストからリンクされている各パートナーのドキュメントを読むことを強くお勧めします。
+ [Datadog](https://docs.datadoghq.com/integrations/guide/aws-cloudwatch-metric-streams-with-kinesis-data-firehose/)
+ [Dynatrace](https://www.dynatrace.com/support/help/dynatrace-api/basics/dynatrace-api-authentication)
+ [Elastic](https://www.elastic.co/docs/current/integrations/awsfirehose)
+ [New Relic](https://docs.newrelic.com/install/aws-cloudwatch/)
+ [Splunk Observability Cloud](https://docs.splunk.com/observability/en/gdi/get-data-in/connect/aws/aws-console-ms.html)
+ [SumoLogic](https://www.sumologic.com)

これらのパートナーのいずれかに対してメトリクスストリームを設定すると、そのストリームは、以下のセクションで一覧されているようなデフォルト設定を使用して作成されます。

**Topics**
+ [クイックパートナーセットアップを使用してメトリクスストリームを設定する](#CloudWatch-metric-streams-QuickPartner-setup)
+ [Datadog ストリームのデフォルト](#CloudWatch-metric-streams-QuickPartner-Datadog)
+ [Dynatrace ストリームのデフォルト](#CloudWatch-metric-streams-QuickPartner-Dynatrace)
+ [Elastic ストリームのデフォルト](#CloudWatch-metric-streams-QuickPartner-Elastic)
+ [New Relic ストリームのデフォルト](#CloudWatch-metric-streams-QuickPartner-NewRelic)
+ [Splunk Observability Cloud ストリームのデフォルト](#CloudWatch-metric-streams-QuickPartner-Splunk)
+ [Sumo Logic ストリームのデフォルト](#CloudWatch-metric-streams-QuickPartner-Sumologic)

## クイックパートナーセットアップを使用してメトリクスストリームを設定する
<a name="CloudWatch-metric-streams-QuickPartner-setup"></a>

CloudWatch では、一部のサードパーティパートナー向けとしてクイックセットアップのオプションを提供しています。このセクションに記載されている手順を開始する前に、対象のパートナーについて一定の情報を確認する必要があります。通常こういった情報には、パートナー側の送信先に関する URL や API キーが含まれています。また、前のセクションからリンクしているパートナーのウェブサイトにあるドキュメントと、次のセクションに一覧されている、そのパートナーでのデフォルト設定も確認します。

Quick Setup でサポートされていないサードパーティを送信先としてストリーミングを行うには、「[Firehose でのカスタム設定](CloudWatch-metric-streams-setup-datalake.md)」の手順に従い、Firehose を使用してストリームをセットアップした後、Firehose から最終的な送信先に対象のメトリクスを送信します。

**クイックパートナーセットアップを使用してサードパーティプロバイダーへのメトリクスストリームを作成するには**

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1. ナビゲーションペインで、 **[Metrics]** (メトリクス)、**[Streams]** (ストリーム) の順に選択します。**[Create metric stream]** (メトリクスストリームの作成) を選択します。

1. (オプション) CloudWatch クロスアカウントオブザーバビリティのモニタリングアカウントとしてセットアップされたアカウントにサインインしている場合は、リンクされたソースアカウントからのメトリクスをこのメトリクスストリームに含めるかどうかを選択できます。ソースアカウントからのメトリクスを含めるには、**[Include source account metrics]** (ソースアカウントメトリクスを含める) を選択します。

1. **[Quick Amazon Web Services partner setup]** を選択します。

1. メトリクスのストリーミング先となるパートナーの名前を選択します。

1. **[エンドポイント URL]** には、送信先の URL を入力します。

1. **[アクセスキー]** または **[API キー]** には、パートナーのアクセスキーを入力します。すべてのパートナーにアクセスキーが必要なわけではありません。

1. **メトリクスをストリーミングする**には、**[すべてのメトリクス]** または **[メトリクスを選択]** を選択します。

   **[すべてのメトリクス]** を選択した場合には、このアカウントのすべてのメトリクスがストリームに含まれます。

   すべてのメトリクスをストリーミングするかどうかを慎重に検討してください。ストリーミングするメトリクスが多いほど、メトリクスストリームの料金は高くなります。

   **[メトリクスを選択]** を選択した場合には、以下のいずれかの操作を行います。
   + ほとんどのメトリクス名前空間をストリーミングするには、**[除外]** を選択し、除外する名前空間またはメトリクスを選択します。**[除外]** で名前空間を指定すると、オプションで、除外する特定のメトリクスをその名前空間から選択できます。メトリクスを選択せずに名前空間の除外のみを選択した場合には、その名前空間からすべてのメトリクスが除外されます。
   + メトリクスストリームにメトリクス名前空間またはメトリクスをいくつか含めるには、**[含める]** を選択し、含める名前空間またはメトリクスを選択します。メトリクスを選択せずに名前空間を含めるよう選択した場合には、その名前空間のすべてのメトリクスが含まれます。

1. (オプション) これらのメトリクスの一部について、Minimum (最小値)、Maximum (最大値)、SampleCount (サンプル数)、Sum (合計) 以外の追加の統計情報をストリーミングするには、**[統計をさらに追加]** を選択します。**[Add recommended metrics]** (推奨メトリクスを追加する) を選択してよく使用される統計情報を追加するか、名前空間とメトリクス名を手動で選択して追加の統計情報をストリーミングするかのどちらかを行います。次に、ストリーミングする追加の統計情報を選択します。

   別の追加の統計情報のセットをストリーミングする別のメトリクスグループを選択するには、**[Add additional statistics]** (統計情報の追加) を選択します。各メトリクスには最大 20 個の追加の統計情報を含めることができ、メトリクスストリーム内の最大 100 個のメトリクスに追加の統計情報を含めることができます。

   追加の統計情報をストリーミングすると、より多くの料金が発生します。詳細については、「[ストリーミングできる統計情報](CloudWatch-metric-streams-statistics.md)」を参照してください。

   追加の統計情報の定義については、「[CloudWatch 統計定義](Statistics-definitions.md)」を参照してください。

1. (オプション) [**メトリクスストリーム名**] で新しいメトリクスストリームの名前をカスタマイズします。

1. **[メトリクスストリームの作成]** を選択します。

## Datadog ストリームのデフォルト
<a name="CloudWatch-metric-streams-QuickPartner-Datadog"></a>

クイックパートナーセットアップによる Datadog へのストリームでは、次のデフォルト設定が使用されます。
+ **出力形式:** OpenTelemetry 0.7.0
+ **Firehose ストリームのコンテンツエンコーディング:** GZIP
+ **Firehose ストリームのバッファリングオプション:** 60 秒間隔、サイズ 4 MB
+ **Firehose ストリーム再試行オプション:** 所要時間 60 秒

クイックパートナーセットアップを使用して Datadog へのメトリクスストリームを作成し、特定のメトリクスをストリーミングする場合、それらのメトリクスにはデフォルトで追加の統計情報が含まれます。追加の統計情報をストリーミングすると、追加料金が発生する場合があります。統計情報とその課金の詳細については、「[ストリーミングできる統計情報](CloudWatch-metric-streams-statistics.md)」を参照してください。

ストリーミングすることを選択した場合にデフォルトで追加の統計情報が含まれるメトリクスを、以下のリストに示します。ストリーミングを開始する前に、これら追加の統計情報を選択解除することもできます。
+ **`AWS/Lambda` の `Duration`:** p50、p80、p95、p99、p99.9
+ **`AWS/Lambda` の `PostRuntimeExtensionDuration`:** p50、p99
+ **`AWS/S3` の `FirstByteLatency` と `TotalRequestLatency`:** p50、p90、p95、p99、p99.9
+ **`AWS/Polly` の `ResponseLatency` および AWS/ApplicationELB の `TargetResponseTime`:** p50、p90、p95、p99
+ **`AWS/ApiGateway` の `Latency` と `IntegrationLatency`:** p90、p95、p99
+ **`AWS/ELB` の `Latency` と `TargetResponseTime`:** p95、p99
+ **`AWS/AppRunner` の `RequestLatency`:** p50、p95、p99
+ **`AWS/States` の `ActivityTime`、`ExecutionTime`、`LambdaFunctionRunTime`、`LambdaFunctionScheduleTime`、`LambdaFunctionTime`、`ActivityRunTime`、および `ActivityScheduleTime`:** p95、p99
+ **`AWS/MediaLive` の `EncoderBitRate`、`ConfiguredBitRate`、`ConfiguredBitRateAvailable`:** p90
+ **`AWS/AppSync` の `Latency`:** p90

## Dynatrace ストリームのデフォルト
<a name="CloudWatch-metric-streams-QuickPartner-Dynatrace"></a>

クイックパートナーセットアップでは、以下のデフォルト設定で Dynatrace へのストリーミングが行われます。
+ **出力形式:** OpenTelemetry 0.7.0
+ **Firehose ストリームのコンテンツエンコーディング** GZIP
+ **Firehose ストリームのバッファリングオプション:** 60 秒間隔、サイズ 5 MB
+ **Firehose ストリーム再試行オプション:** 所要時間 600 秒

## Elastic ストリームのデフォルト
<a name="CloudWatch-metric-streams-QuickPartner-Elastic"></a>

クイックパートナーセットアップでは、以下のデフォルト設定で Elastic へのストリーミングが行われます。
+ **出力形式:** OpenTelemetry 1.0.0
+ **Firehose ストリームのコンテンツエンコーディング:** GZIP
+ **Firehose ストリームのバッファリングオプション:** 60 秒間隔、サイズ 1 MB
+ **Firehose ストリーム再試行オプション:** 所要時間 60 秒

## New Relic ストリームのデフォルト
<a name="CloudWatch-metric-streams-QuickPartner-NewRelic"></a>

クイックパートナーセットアップでは、以下のデフォルト設定で New Relic へのストリーミングが行われます。
+ **出力形式:** OpenTelemetry 0.7.0
+ **Firehose ストリームのコンテンツエンコーディング:** GZIP
+ **Firehose ストリームのバッファリングオプション:** 60 秒間隔、サイズ 1 MB
+ **Firehose ストリーム再試行オプション:** 所要時間 60 秒

## Splunk Observability Cloud ストリームのデフォルト
<a name="CloudWatch-metric-streams-QuickPartner-Splunk"></a>

クイックパートナーセットアップでは、以下のデフォルト設定で Splunk Observability Cloud へのストリーミングが行われます。
+ **出力形式:** OpenTelemetry 1.0.0
+ **Firehose ストリームのコンテンツエンコーディング:** GZIP
+ **Firehose ストリームのバッファリングオプション:** 60 秒間隔、サイズ 1 MB
+ **Firehose ストリーム再試行オプション:** 持続時間 300 秒

## Sumo Logic ストリームのデフォルト
<a name="CloudWatch-metric-streams-QuickPartner-Sumologic"></a>

クイックパートナーセットアップでは、以下のデフォルト設定で Sumo Logic へのストリーミングが行われます。
+ **出力形式:** OpenTelemetry 0.7.0
+ **Firehose ストリームのコンテンツエンコーディング:** GZIP
+ **Firehose ストリームのバッファリングオプション:** 60 秒間隔、サイズ 1 MB
+ **Firehose ストリーム再試行オプション:** 所要時間 60 秒

# ストリーミングできる統計情報
<a name="CloudWatch-metric-streams-statistics"></a>

メトリクスストリームには、常に次の統計情報が含まれます。`Minimum`、`Maximum`、`SampleCount`、および `Sum`。メトリクスストリームに次の追加の統計情報を含めることもできます。これは、メトリクスごとの選択になります。これらの統計情報の詳細については、「[CloudWatch 統計定義](Statistics-definitions.md)」を参照してください。
+ p95 や p99 などのパーセンタイル値 (JSON 形式または OpenTelemetry 形式のストリーム) 
+ トリミング平均 (JSON 形式のストリームのみ)
+ ウィンザー化平均 (JSON 形式のストリームのみ)
+ トリミング数 (JSON 形式のストリームのみ)
+ トリミング合計 (JSON 形式のストリームの場合のみ)
+ パーセンタイルランク (JSON 形式のストリームの場合のみ)
+ 四分位間平均 (JSON 形式のストリームのみ)

追加の統計情報をストリーミングすると、追加料金が発生します。特定のメトリクスに対してこれらの追加の統計情報を 1～5 種類ストリーミングすると、追加のメトリクス更新として課金されます。その後、これらの統計情報のうち 5 種類まで追加するごとに、別のメトリクス更新として請求されます。

 例えば、あるメトリクスについて、p95、p99、p99.9、トリミング平均、ウィンザー化平均、およびトリミング合計の 6 種類の統計情報をストリーミングするとします。このメトリクスの更新ごとに 3 つのメトリクス更新として課金されます。デフォルトの統計情報を含むメトリクス更新に対して 1 つ、最初の 5 種類の追加の統計情報に対して 1 つ、さらに 6 番目の追加の統計情報に対して 1 つです。さらに 4 種類までの統計情報を追加して合計 10 種類にしても、課金は増加しませんが、11 番目の統計情報を追加すると、課金が増加します。

追加の統計情報をストリーミングするためにメトリクス名と名前空間の組み合わせを指定すると、そのメトリクス名と名前空間のすべてのディメンションの組み合わせが、追加の統計情報とともにストリーミングされます。

CloudWatch メトリクスストリームによって、新しいメトリクス `TotalMetricUpdate` が公開されます。これは、基本のメトリクス更新数と、追加の統計情報のストリーミングによって発生する追加のメトリクス更新数を反映しています。詳細については、「[CloudWatch メトリクスを使用したメトリクスストリームのモニターリング](CloudWatch-metric-streams-monitoring.md)」を参照してください。

詳細については、「[Amazon CloudWatch 料金表](https://aws.amazon.com/cloudwatch/pricing/)」をご覧ください。

**注記**  
一部のメトリクスはパーセンタイルをサポートしていません。これらのメトリクスのパーセンタイル統計情報はストリームから除外され、メトリクスストリームの料金は発生しません。パーセンタイルをサポートしない統計情報の例としては、`AWS/ECS` 名前空間の一部のメトリクスがあります。

設定した追加の統計情報は、ストリームのフィルターと一致する場合にのみストリーミングされます。例えば、include フィルターに `EC2` と `RDS` のみを含むストリームを作成し、統計情報設定のリストに `EC2` と `Lambda` が含まれる場合、ストリームには、追加の統計情報を含む `EC2` メトリクスと、デフォルトの統計情報のみを含む `RDS` メトリクスが含まれ、`Lambda` 統計情報はまったく含まれません。

# メトリクスストリームの操作とメンテナンス
<a name="CloudWatch-metric-streams-operation"></a>

メトリクスストリームは、常に、**実行中**または**停止**の 2 つの状態のいずれかになります。
+ **実行中** – メトリクスストリームは正常に実行されています。ストリーム上のフィルターの設定によっては、送信先にストリーミングされるメトリクスデータがない可能性があります。
+ **停止** – メトリクスストリームは、エラーのためではなく、誰かによって明示的に停止されています。ストリームを削除せずにデータのストリーミングを一時的に停止するには、ストリームを停止すると便利です。

メトリクスストリームを停止して再起動すると、メトリクスストリームの停止中に CloudWatch にパブリッシュされたメトリクスデータは、メトリクスストリームにバックフィルされません。

メトリクスストリームの出力形式を変更すると、場合によっては、少量のメトリクスデータが古い形式と新しい形式の両方で送信先に書き込まれることがあります。このような状況を回避するには、現在の配信ストリームと同じ構成で新しい Firehose 配信ストリームを作成し、新しい Firehose 配信ストリームに変更して、出力形式を同時に変更することができます。このようにして、異なる出力形式の Kinesis レコードは、Amazon S3 に別々のオブジェクトとして格納されます。その後、トラフィックを元の Firehose 配信ストリームに戻し、2 番目の配信ストリームを削除できます。

**メトリクスストリームを表示、編集、停止、開始するには**

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1. ナビゲーションペインで、 **[Metrics]** (メトリクス)、**[Streams]** (ストリーム) の順に選択します。

   ストリームのリストが表示され、[**ステータス**] 列には、各ストリームが実行中か停止しているかが表示されます。

1. メトリクスストリームを停止または開始するには、ストリームを選択して [**停止**] または [**開始**] をクリックします。

1. メトリクスストリームの詳細を表示するには、ストリームを選択し、[**詳細を表示**] をクリックします。

1. ストリームの出力形式、フィルタ、送信先 Firehose ストリーム、またはロールを変更するには、**[編集]** を選択して必要な変更を行います。

   フィルタを変更すると、移行中にメトリクスデータにギャップが生じることがあります。

# CloudWatch メトリクスを使用したメトリクスストリームのモニターリング
<a name="CloudWatch-metric-streams-monitoring"></a>

メトリクスストリームは、その健全性と `AWS/CloudWatch/MetricStreams` 名前空間内の操作に関する CloudWatch メトリクスを出力します。以下のメトリクスが出力されます。これらのメトリクスは、`MetricStreamName` ディメンション付きで出力され、ディメンションなしでも出力されます。ディメンションなしのメトリクスを使用すると、すべてのメトリクスストリームを集計したメトリクスを確認できます。`MetricStreamName` ディメンション付きのメトリクスを使用すると、そのメトリクスストリームに関するメトリクスだけを表示できます。

これらのメトリクスのすべてについて、値は **[Running]** (実行中) 状態のメトリクスストリームに対してのみ出力されます。


| メトリクス | 説明 | 
| --- | --- | 
|  `MetricUpdate`  |  メトリクスストリーミングに送信されたメトリクス更新の数。一定期間中にメトリクスの更新がストリーミングされない場合、このメトリクスはその期間中に出力されません。 メトリクスストリームを停止すると、メトリクスストリームが再び開始されるまで、このメトリクスの出力が停止します。 有効な統計: `Sum` 単位: なし | 
|  `TotalMetricUpdate`  |  これは、次のように計算されます。**MetricUpdate \$1 ストリーミングされる追加の統計情報に基づく数値**。 一意の名前空間とメトリクス名の組み合わせごとに、追加の統計情報を 1～5 種類ストリーミングすると、`TotalMetricUpdate` に 1 が加算され、追加の統計情報を 6～10 種類ストリーミングすると、`TotalMetricUpdate` に 2 が加算され、以下同様となります。 有効な統計: `Sum` 単位: なし | 
|  `PublishErrorRate`  |  データを Firehose 配信ストリームに入れるときに発生する、回復不能なエラーの数。一定期間中にエラーが発生しない場合、このメトリクスはその期間中に出力されません。 メトリクスストリームを停止すると、メトリクスストリームが再び開始されるまで、このメトリクスの出力が停止します。 有効な統計: `Average` メトリクスの更新が書き込めない割合が確認できます。この値は 0.0 から 1.0 の間になります。 単位: なし  | 

# CloudWatch と Firehose 間の信頼
<a name="CloudWatch-metric-streams-trustpolicy"></a>

Firehose 配信ストリームは、Firehose への書き込みアクセス許可を持つ IAM ロールを通じて CloudWatch を信頼する必要があります。このアクセス許可は、CloudWatch メトリクスストリームが使用する 1 つの Firehose 配信ストリームに制限できます。IAM ロールは、`streams.metrics.cloudwatch.amazonaws.com` サービスプリンシパルを信頼する必要があります。

CloudWatch コンソールを使用してメトリクスストリームを作成する場合は、CloudWatch で、適切なアクセス許可があるロールを作成できます。別の方法を使用してメトリクスストリームを作成する場合、または IAM ロール自体を作成する場合は、次のアクセス許可ポリシーと信頼ポリシーを含める必要があります。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "firehose:PutRecord",
                "firehose:PutRecordBatch"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:firehose:us-east-1:123456789012:deliverystream/*"
        }
    ]
}
```

------

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

****  

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

------

メトリクスデータは、メトリクスストリームリソースを所有するソースに代わって、CloudWatch によって送信先の Firehose 配信ストリームにストリーミングされます。

# JSON 形式の CloudWatch メトリクスストリームの出力
<a name="CloudWatch-metric-streams-formats-json"></a>

JSON 形式を使用する CloudWatch メトリクスストリームでは、各 Firehose レコードには、改行文字 (\$1n) で区切られた複数の JSON オブジェクトが含まれます。各オブジェクトには、1 つのメトリクスの 1 つのデータポイントが含まれます。

使用される JSON 形式は、AWS Glue および Amazon Athena との完全な互換性があります。Firehose 配信ストリームと AWS Glue テーブルの形式が正しい場合は、S3 に格納する前に、その形式を Parquet 形式または Optimized Row Columnar (ORC) 形式に自動的に変換できます。形式の変換の詳細については、「[Converting Your Input Record Format in Firehose](https://docs.aws.amazon.com/firehose/latest/dev/record-format-conversion.html)」を参照してください。AWS Glue の正しい形式の詳細については、[JSON 出力フォーマットにはどの AWS Glue スキーマを使用すればよいですか?](#CloudWatch-metric-streams-format-glue) を参照してください。

JSON 形式では、`unit` の有効な値は、`MetricDatum` API 構造体の `unit` の値と同じです。詳細については、「[MetricDatum](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html)」を参照してください。`timestamp` フィールドの値は、`1616004674229` のようなエポックミリ秒単位の値です。

この形式の例を次に示します。この例では、JSON は読みやすいようにフォーマットされていますが、実際にはフォーマット全体が 1 行になっています。

```
{
    "metric_stream_name": "MyMetricStream",
    "account_id": "1234567890",
    "region": "us-east-1",
    "namespace": "AWS/EC2",
    "metric_name": "DiskWriteOps",
    "dimensions": {
        "InstanceId": "i-123456789012"
    },
    "timestamp": 1611929698000,
    "value": {
        "count": 3.0,
        "sum": 20.0,
        "max": 18.0,
        "min": 0.0,
        "p99": 17.56,
        "p99.9": 17.8764,
        "TM(25%:75%)": 16.43
    },
    "unit": "Seconds"
}
```

## JSON 出力フォーマットにはどの AWS Glue スキーマを使用すればよいですか?
<a name="CloudWatch-metric-streams-format-glue"></a>

AWS Glue テーブルの `StorageDescriptor` を JSON 表現した例を次に示します。これはその後 Firehose で使用されます。`StorageDescriptor` の詳細については、「[StorageDescriptor](https://docs.aws.amazon.com/glue/latest/webapi/API_StorageDescriptor.html)」を参照してください。

```
{
  "Columns": [
    {
      "Name": "metric_stream_name",
      "Type": "string"
    },
    {
      "Name": "account_id",
      "Type": "string"
    },
    {
      "Name": "region",
      "Type": "string"
    },
    {
      "Name": "namespace",
      "Type": "string"
    },
    {
      "Name": "metric_name",
      "Type": "string"
    },
    {
      "Name": "timestamp",
      "Type": "timestamp"
    },
    {
      "Name": "dimensions",
      "Type": "map<string,string>"
    },
    {
      "Name": "value",
      "Type": "struct<min:double,max:double,count:double,sum:double,p99:double,p99.9:double>"
    },
    {
      "Name": "unit",
      "Type": "string"
    }
  ],
  "Location": "s3://amzn-s3-demo-bucket/",
  "InputFormat": "org.apache.hadoop.mapred.TextInputFormat",
  "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
  "SerdeInfo": {
    "SerializationLibrary": "org.apache.hive.hcatalog.data.JsonSerDe"
  },
  "Parameters": {
    "classification": "json"
  }
}
```

前の例は、JSON 形式で Amazon S3 に書き込まれたデータの場合です。次のフィールドの値を指定された値に置き換えて、Parquet 形式またはOptimized Row Columnar (ORC) 形式でデータを格納します。
+ **Parquet:**
  + inputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat
  + outputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat
  + SerDeInfo.serializationLib: org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
  + parameters.classification: parquet
+ **ORC:**
  + inputFormat: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
  + outputFormat: org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
  + SerDeInfo.serializationLib: org.apache.hadoop.hive.ql.io.orc.OrcSerde
  + parameters.classification: orc

# OpenTelemetry 1.0.0 形式の CloudWatch メトリクスストリームの出力
<a name="CloudWatch-metric-streams-formats-opentelemetry-100"></a>

**注記**  
OpenTelemetry 1.0.0 形式では、メトリクス属性は 0.7.0 形式に使用されている `StringKeyValue` タイプではなく `KeyValue` オブジェクトのリストとしてエンコードされます。コンシューマーから見て、0.7.0 形式と 1.0.0 形式との大きな違いはこれだけです。0.7.0 プロトファイルから生成されたパーサーは、1.0.0 形式でエンコードされたメトリクス属性を解析しません。同じことが逆方向にも言えます。1.0.0 プロトファイルから生成されたパーサーは、0.7.0 形式でエンコードされたメトリクス属性を解析しません。

OpenTelemetry は、ツール、API、および SDK を集めたものです。これを使用して、分析用のテレメトリデータ (メトリクス、ログ、トレース) を計測し、生成し、収集し、エクスポートできます。OpenTelemetry は Cloud Native Computing Foundation の一部です。詳細については、「[OpenTelemetry](https://opentelemetry.io/)」を参照してください。

OpenTelemetry 1.0.0 の完全な仕様については、「[Release version 1.0.0](https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v1.0.0)」を参照してください。

Kinesis レコードには、1 つ以上の `ExportMetricsServiceRequest` OpenTelemetry データ構造を含めることができます。各データ構造は、レコード長をバイト単位で示す `UnsignedVarInt32` のヘッダーで始まります。各 `ExportMetricsServiceRequest` には、一度に複数のメトリクスのデータを含めることができます。

`ExportMetricsServiceRequest` OpenTelemetry データ構造のメッセージの文字列表現を次に示します。OpenTelemetry では、Google Protocol Buffers バイナリプロトコルを使用してシリアル化しますが、これは人には読み取り不可能です。

```
resource_metrics {
  resource {
    attributes {
      key: "cloud.provider"
      value {
        string_value: "aws"
      }
    }
    attributes {
      key: "cloud.account.id"
      value {
        string_value: "123456789012"
      }
    }
    attributes {
      key: "cloud.region"
      value {
        string_value: "us-east-1"
      }
    }
    attributes {
      key: "aws.exporter.arn"
      value {
        string_value: "arn:aws:cloudwatch:us-east-1:123456789012:metric-stream/MyMetricStream"
      }
    }
  }
  scope_metrics {
    metrics {
      name: "amazonaws.com/AWS/DynamoDB/ConsumedReadCapacityUnits"
      unit: "NoneTranslated"
      summary {
        data_points {
          start_time_unix_nano: 60000000000
          time_unix_nano: 120000000000
          count: 1
          sum: 1.0
          quantile_values {
            value: 1.0
          }
          quantile_values {
            quantile: 0.95
            value: 1.0
          }
          quantile_values {
            quantile: 0.99
            value: 1.0
          }
          quantile_values {
            quantile: 1.0
            value: 1.0
          }
          attributes {
            key: "Namespace"
            value {
              string_value: "AWS/DynamoDB"
            }
          }
          attributes {
            key: "MetricName"
            value {
              string_value: "ConsumedReadCapacityUnits"
            }
          }
          attributes {
            key: "Dimensions"
            value {
              kvlist_value {
                values {
                  key: "TableName"
                  value {
                    string_value: "MyTable"
                  }
                }
              }
            }
          }
        }
        data_points {
          start_time_unix_nano: 70000000000
          time_unix_nano: 130000000000
          count: 2
          sum: 5.0
          quantile_values {
            value: 2.0
          }
          quantile_values {
            quantile: 1.0
            value: 3.0
          }
          attributes {
            key: "Namespace"
            value {
              string_value: "AWS/DynamoDB"
            }
          }
          attributes {
            key: "MetricName"
            value {
              string_value: "ConsumedReadCapacityUnits"
            }
          }
          attributes {
            key: "Dimensions"
            value {
              kvlist_value {
                values {
                  key: "TableName"
                  value {
                    string_value: "MyTable"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
```

**OpenTelemetry メトリクスデータをシリアル化するトップレベルオブジェクト**

`ExportMetricsServiceRequest` は、OpenTelemetry エクスポーターペイロードをシリアル化するトップレベルのラッパーです。これには、`ResourceMetrics` が 1 つ以上含まれています 。

```
message ExportMetricsServiceRequest {
  // An array of ResourceMetrics.
  // For data coming from a single resource this array will typically contain one
  // element. Intermediary nodes (such as OpenTelemetry Collector) that receive
  // data from multiple origins typically batch the data before forwarding further and
  // in that case this array will contain multiple elements.
  repeated opentelemetry.proto.metrics.v1.ResourceMetrics resource_metrics = 1;
}
```

`ResourceMetrics` は、MetricData オブジェクトを表すトップレベルオブジェクトです。

```
// A collection of ScopeMetrics from a Resource.
message ResourceMetrics {
  reserved 1000;

  // The resource for the metrics in this message.
  // If this field is not set then no resource info is known.
  opentelemetry.proto.resource.v1.Resource resource = 1;

  // A list of metrics that originate from a resource.
  repeated ScopeMetrics scope_metrics = 2;

  // This schema_url applies to the data in the "resource" field. It does not apply
  // to the data in the "scope_metrics" field which have their own schema_url field.
  string schema_url = 3;
}
```

**Resource オブジェクト**

`Resource` オブジェクトは、値のペアを持つオブジェクトで、メトリクスを生成したリソースに関する情報が含まれます。AWS で作成されたメトリクスの場合、データ構造には、EC2 インスタンスや S3 バケットなど、メトリクスに関連するリソースの Amazon リソースネーム (ARN) が含まれます。

`Resource` オブジェクトには、`attributes` という属性が含まれています。これには、キーと値のペアが格納されています。
+ `cloud.account.id` にはアカウント ID が含まれています
+ `cloud.region` にはリージョンが含まれています
+ `aws.exporter.arn` にはメトリクスストリーム ARN が含まれています
+ 「`cloud.provider`」 は常に 「`aws`」 です。

```
// Resource information.
message Resource {
  // Set of attributes that describe the resource.
  // Attribute keys MUST be unique (it is not allowed to have more than one
  // attribute with the same key).
  repeated opentelemetry.proto.common.v1.KeyValue attributes = 1;

  // dropped_attributes_count is the number of dropped attributes. If the value is 0, then
  // no attributes were dropped.
  uint32 dropped_attributes_count = 2;
}
```

**ScopeMetrics オブジェクト**

`scope` フィールドには値を入力しません。エクスポートするメトリクスフィールドにのみ入力します。

```
// A collection of Metrics produced by an Scope.
message ScopeMetrics {
  // The instrumentation scope information for the metrics in this message.
  // Semantically when InstrumentationScope isn't set, it is equivalent with
  // an empty instrumentation scope name (unknown).
  opentelemetry.proto.common.v1.InstrumentationScope scope = 1;

  // A list of metrics that originate from an instrumentation library.
  repeated Metric metrics = 2;

  // This schema_url applies to all metrics in the "metrics" field.
  string schema_url = 3;
}
```

**Metric オブジェクト**

Metric オブジェクトには、いくつかのメタデータのほか、`SummaryDataPoint` のリストを含む `Summary` データフィールドが含まれています。

メトリクスストリームの場合、メタデータは次のとおりです。
+ `name` は `amazonaws.com/metric_namespace/metric_name` になります。
+ `description` は空白です。
+ `unit` には、メトリクスデータの単位をユニファイドコードの形式 (大文字と小文字が区別される) の計量単位に変換したものが入力されます。詳細については、「[CloudWatch での OpenTelemetry 1.0.0 形式への変換](CloudWatch-metric-streams-formats-opentelemetry-translation-100.md)」および「[The Unified Code For Units of Measure](https://ucum.org/ucum.html)」を参照してください。
+ `type` は `SUMMARY` になります。

```
message Metric {
  reserved 4, 6, 8;

  // name of the metric, including its DNS name prefix. It must be unique.
  string name = 1;

  // description of the metric, which can be used in documentation.
  string description = 2;

  // unit in which the metric value is reported. Follows the format
  // described by http://unitsofmeasure.org/ucum.html.
  string unit = 3;

  // Data determines the aggregation type (if any) of the metric, what is the
  // reported value type for the data points, as well as the relatationship to
  // the time interval over which they are reported.
  oneof data {
    Gauge gauge = 5;
    Sum sum = 7;
    Histogram histogram = 9;
    ExponentialHistogram exponential_histogram = 10;
    Summary summary = 11;
  }
}

message Summary {
  repeated SummaryDataPoint data_points = 1;
}
```

**SummaryDataPoint オブジェクト**

SummaryDataPoint オブジェクトには、DoubleSummary メトリクスの時系列内にあるいずれかのデータポイントの値が含まれます。

```
// SummaryDataPoint is a single data point in a timeseries that describes the
// time-varying values of a Summary metric.
message SummaryDataPoint {
  reserved 1;

  // The set of key/value pairs that uniquely identify the timeseries from
  // where this point belongs. The list may be empty (may contain 0 elements).
  // Attribute keys MUST be unique (it is not allowed to have more than one
  // attribute with the same key).
  repeated opentelemetry.proto.common.v1.KeyValue attributes = 7;

  // StartTimeUnixNano is optional but strongly encouraged, see the
  // the detailed comments above Metric.
  //
  // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January
  // 1970.
  fixed64 start_time_unix_nano = 2;

  // TimeUnixNano is required, see the detailed comments above Metric.
  //
  // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January
  // 1970.
  fixed64 time_unix_nano = 3;

  // count is the number of values in the population. Must be non-negative.
  fixed64 count = 4;

  // sum of the values in the population. If count is zero then this field
  // must be zero.
  //
  // Note: Sum should only be filled out when measuring non-negative discrete
  // events, and is assumed to be monotonic over the values of these events.
  // Negative events *can* be recorded, but sum should not be filled out when
  // doing so.  This is specifically to enforce compatibility w/ OpenMetrics,
  // see: https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#summary
  double sum = 5;

  // Represents the value at a given quantile of a distribution.
  //
  // To record Min and Max values following conventions are used:
  // - The 1.0 quantile is equivalent to the maximum value observed.
  // - The 0.0 quantile is equivalent to the minimum value observed.
  //
  // See the following issue for more context:
  // https://github.com/open-telemetry/opentelemetry-proto/issues/125
  message ValueAtQuantile {
    // The quantile of a distribution. Must be in the interval
    // [0.0, 1.0].
    double quantile = 1;

    // The value at the given quantile of a distribution.
    //
    // Quantile values must NOT be negative.
    double value = 2;
  }

  // (Optional) list of values at different quantiles of the distribution calculated
  // from the current snapshot. The quantiles must be strictly increasing.
  repeated ValueAtQuantile quantile_values = 6;

  // Flags that apply to this specific data point.  See DataPointFlags
  // for the available flags and their meaning.
  uint32 flags = 8;
}
```

詳細については、「[CloudWatch での OpenTelemetry 1.0.0 形式への変換](CloudWatch-metric-streams-formats-opentelemetry-translation-100.md)」を参照してください。

# CloudWatch での OpenTelemetry 1.0.0 形式への変換
<a name="CloudWatch-metric-streams-formats-opentelemetry-translation-100"></a>

CloudWatch では、CloudWatch データを OpenTelemetry 形式に配置するために、いくつかの変換が実行されます。

**名前空間、メトリクス名、ディメンションの変換**

これらの属性は、変換によってエンコードされたキーと値のペアになります。
+ 1 つの属性にキー `Namespace` があり、その値はメトリクスの名前空間です。
+ 1 つの属性にキー `MetricName` があり、その値はメトリクスの名前です。
+ 1 つのペアにキー `Dimensions` があり、その値はキーと値のペアからなるネストされたリストです。このリストの各ペアは、CloudWatch メトリクスディメンションにマッピングされます。ペアのキーはディメンションの名前で、その値はディメンションの値です。

**Average、Sum、SampleCount、Min、および Max の変換**

Summary データポイントを使用すると、CloudWatch で 1 つのデータポイントを使用してこれらの統計情報をすべてエクスポートできます。
+ `startTimeUnixNano` には CloudWatch `startTime` が含まれています
+ `timeUnixNano` には CloudWatch `endTime` が含まれています
+ `sum` には Sum の統計が含まれています
+ `count` には SampleCount の統計が含まれています
+ `quantile_values` には 2 つの `valueAtQuantile.value` オブジェクトが含まれています
  + `valueAtQuantile.quantile = 0.0` ( を含む)`valueAtQuantile.value = Min value`
  + `valueAtQuantile.quantile = 0.99` ( を含む)`valueAtQuantile.value = p99 value`
  + `valueAtQuantile.quantile = 0.999` ( を含む)`valueAtQuantile.value = p99.9 value`
  + `valueAtQuantile.quantile = 1.0` ( を含む)`valueAtQuantile.value = Max value`

メトリクスストリームを消費するリソースは、Average (**Sum/SampleCount**) の統計で計算できます。

**単位の変換**

CloudWatch 単位は、次の表に示すように、計量単位のユニファイドコードの形式 (大文字と小文字を区別する) に変換されます。詳細については、「[The Unified Code For Units of Measure](https://ucum.org/ucum.html)」を参照してください。


| CloudWatch | OpenTelemetry | 
| --- | --- | 
|  秒 |  s | 
|  Second または Seconds |  s | 
|  マイクロ秒 |  us | 
|  Milliseconds |  ms | 
|  バイト |  方法 | 
|  Kilobytes |  kBy | 
|  Megabytes |  MBy | 
|  Gigabytes |  GBy | 
|  Terabytes |  TBy | 
|  Bits |  bit | 
|  Kilobits |  kbit | 
|  Megabits |  MBit | 
|  Gigabits |  GBit | 
|  Terabits |  Tbit | 
|  割合 (%) |  % | 
|  カウント |  \$1Count\$1 | 
|  なし |  1 | 

単位がスラッシュで結合されている場合は、両方の単位に OpenTelemetry 変換を適用して変換されます。たとえば、Bytes/Second は By/s に変換されます。

# OpenTelemetry 1.0.0 メッセージを解析する方法
<a name="CloudWatch-metric-streams-formats-opentelemetry-parse-100"></a>

このセクションでは、OpenTelemetry 1.0.0 の解析を開始する際に役立つ情報を提供します。

まず、言語固有のバインディングを取得する必要があります。これにより、OpenTelemetry 1.0.0 のメッセージを任意の言語で解析できます。

**言語固有のバインディングを取得するには**
+ 手順は、使用する言語によって異なります。
  + Java を使用するには、次の Maven 依存関係を Java プロジェクトに追加します。[OpenTelemetry Java >> 0.14.1](https://mvnrepository.com/artifact/io.opentelemetry/opentelemetry-proto/0.14.1)。
  + 他の言語を使用するには、次の手順を実行します。

    1. 「[Generating Your Classes](https://developers.google.com/protocol-buffers/docs/proto3#generating)」のリストをチェックして、言語がサポートされていることを確認します。

    1. 「[Download Protocol Buffers](https://developers.google.com/protocol-buffers/docs/downloads)」の手順に従って、Protobuf コンパイラをインストールします。

    1. 「[Release version 1.0.0](https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v1.0.0)」で OpenTelemetry 1.0.0 ProtoBuf 定義をダウンロードします。

    1. ダウンロードした OpenTelemetry 1.0.0 ProtoBuf 定義のルートフォルダにいることを確認します。次に、`src` フォルダを作成し、言語固有のバインディングを生成するコマンドを実行します。詳細は、「[Generating Your Classes](https://developers.google.com/protocol-buffers/docs/proto3#generating)」を参照してください。

       以下は、Javascript バインディングを生成する方法の例です。

       ```
       protoc --proto_path=./ --js_out=import_style=commonjs,binary:src \
       opentelemetry/proto/common/v1/common.proto \
       opentelemetry/proto/resource/v1/resource.proto \
       opentelemetry/proto/metrics/v1/metrics.proto \
       opentelemetry/proto/collector/metrics/v1/metrics_service.proto
       ```

次のセクションでは、前の手順を使用して構築できる言語固有のバインディングの使用例について説明します。

**Java**

```
package com.example;

import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MyOpenTelemetryParser {

    public List<ExportMetricsServiceRequest> parse(InputStream inputStream) throws IOException {
        List<ExportMetricsServiceRequest> result = new ArrayList<>();

        ExportMetricsServiceRequest request;
        /* A Kinesis record can contain multiple `ExportMetricsServiceRequest`
           records, each of them starting with a header with an
           UnsignedVarInt32 indicating the record length in bytes:
            ------ --------------------------- ------ -----------------------
           |UINT32|ExportMetricsServiceRequest|UINT32|ExportMetricsService...
            ------ --------------------------- ------ -----------------------
         */
        while ((request = ExportMetricsServiceRequest.parseDelimitedFrom(inputStream)) != null) {
            // Do whatever we want with the parsed message
            result.add(request);
        }

        return result;
    }
}
```

**Javascript**

この例では、生成されたバインディングを含むルートフォルダが `./` であるとしています。

関数 `parseRecord` の data 引数には、次のいずれかの型を指定できます。
+ `Uint8Array` これが最適です
+ `Buffer` ノードの下では最適です
+ `Array.number` 8 ビット整数

```
const pb = require('google-protobuf')
const pbMetrics =
    require('./opentelemetry/proto/collector/metrics/v1/metrics_service_pb')

function parseRecord(data) {
    const result = []

    // Loop until we've read all the data from the buffer
    while (data.length) {
        /* A Kinesis record can contain multiple `ExportMetricsServiceRequest`
           records, each of them starting with a header with an
           UnsignedVarInt32 indicating the record length in bytes:
            ------ --------------------------- ------ -----------------------
           |UINT32|ExportMetricsServiceRequest|UINT32|ExportMetricsService...
            ------ --------------------------- ------ -----------------------
         */
        const reader = new pb.BinaryReader(data)
        const messageLength = reader.decoder_.readUnsignedVarint32()
        const messageFrom = reader.decoder_.cursor_
        const messageTo = messageFrom + messageLength

        // Extract the current `ExportMetricsServiceRequest` message to parse
        const message = data.subarray(messageFrom, messageTo)

        // Parse the current message using the ProtoBuf library
        const parsed =
            pbMetrics.ExportMetricsServiceRequest.deserializeBinary(message)

        // Do whatever we want with the parsed message
        result.push(parsed.toObject())

        // Shrink the remaining buffer, removing the already parsed data
        data = data.subarray(messageTo)
    }

    return result
}
```

**Python**

`var-int` デリミタは自分で読み取るか、内部メソッド `_VarintBytes(size)` と `_DecodeVarint32(buffer, position)` を使用する必要があります。これらは、バッファ内でのサイズバイトの直後の位置を返します。読み取り側は、メッセージからそのバイトのみを読み取る新しいバッファを構築します。

```
size = my_metric.ByteSize()
f.write(_VarintBytes(size))
f.write(my_metric.SerializeToString())
msg_len, new_pos = _DecodeVarint32(buf, 0)
msg_buf = buf[new_pos:new_pos+msg_len]
request = metrics_service_pb.ExportMetricsServiceRequest()
request.ParseFromString(msg_buf)
```

**Go**

`Buffer.DecodeMessage()` を使用します。

**C\$1**

`CodedInputStream` を使用します。このクラスは、サイズ区切りのメッセージを読み取ることができます。

**C\$1\$1**

`google/protobuf/util/delimited_message_util.h` に記述されている関数は、サイズ区切りのメッセージを読み取ることができます。

**その他の言語**

その他の言語については、「[Download Protocol Buffers](https://developers.google.com/protocol-buffers/docs/downloads)」を参照してください。

パーサーを実装するときは、Kinesis レコードに複数の `ExportMetricsServiceRequest` Protocol Buffers メッセージを含めることができることを考慮してください。各メッセージは、レコードの長さをバイト単位で示す `UnsignedVarInt32` のヘッダーで始まります。

# OpenTelemetry 0.7.0 形式の CloudWatch メトリクスストリームの出力
<a name="CloudWatch-metric-streams-formats-opentelemetry"></a>

OpenTelemetry は、ツール、API、および SDK を集めたものです。これを使用して、分析用のテレメトリデータ (メトリクス、ログ、トレース) を計測し、生成し、収集し、エクスポートできます。OpenTelemetry は Cloud Native Computing Foundation の一部です。詳細については、「[OpenTelemetry](https://opentelemetry.io/)」を参照してください。

OpenTelemetry 0.7.0 の完全な仕様については、「[v0.7.0 release](https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v0.7.0)」を参照してください。

Kinesis レコードには、1 つ以上の `ExportMetricsServiceRequest` OpenTelemetry データ構造を含めることができます。各データ構造は、レコード長をバイト単位で示す `UnsignedVarInt32` のヘッダーで始まります。各 `ExportMetricsServiceRequest` には、一度に複数のメトリクスのデータを含めることができます。

`ExportMetricsServiceRequest` OpenTelemetry データ構造のメッセージの文字列表現を次に示します。OpenTelemetry では、Google Protocol Buffers バイナリプロトコルを使用してシリアル化しますが、これは人には読み取り不可能です。

```
resource_metrics {
  resource {
    attributes {
      key: "cloud.provider"
      value {
        string_value: "aws"
      }
    }
    attributes {
      key: "cloud.account.id"
      value {
        string_value: "2345678901"
      }
    }
    attributes {
      key: "cloud.region"
      value {
        string_value: "us-east-1"
      }
    }
    attributes {
      key: "aws.exporter.arn"
      value {
        string_value: "arn:aws:cloudwatch:us-east-1:123456789012:metric-stream/MyMetricStream"
      }
    }
  }
  instrumentation_library_metrics {
    metrics {
      name: "amazonaws.com/AWS/DynamoDB/ConsumedReadCapacityUnits"
      unit: "1"
      double_summary {
        data_points {
          labels {
            key: "Namespace"
            value: "AWS/DynamoDB"
          }
          labels {
            key: "MetricName"
            value: "ConsumedReadCapacityUnits"
          }
          labels {
            key: "TableName"
            value: "MyTable"
          }
          start_time_unix_nano: 1604948400000000000
          time_unix_nano: 1604948460000000000
          count: 1
          sum: 1.0
          quantile_values {
            quantile: 0.0
            value: 1.0
          }
          quantile_values {
            quantile: 0.95
            value: 1.0
          }          
          quantile_values {
            quantile: 0.99
            value: 1.0
          }
          quantile_values {
            quantile: 1.0
            value: 1.0
          }
        }
        data_points {
          labels {
            key: "Namespace"
            value: "AWS/DynamoDB"
          }
          labels {
            key: "MetricName"
            value: "ConsumedReadCapacityUnits"
          }
          labels {
            key: "TableName"
            value: "MyTable"
          }
          start_time_unix_nano: 1604948460000000000
          time_unix_nano: 1604948520000000000
          count: 2
          sum: 5.0
          quantile_values {
            quantile: 0.0
            value: 2.0
          }
          quantile_values {
            quantile: 1.0
            value: 3.0
          }
        }
      }
    }
  }
}
```

**OpenTelemetry メトリクスデータをシリアル化するトップレベルオブジェクト**

`ExportMetricsServiceRequest` は、OpenTelemetry エクスポーターペイロードをシリアル化するトップレベルのラッパーです。これには、`ResourceMetrics` が 1 つ以上含まれています 。

```
message ExportMetricsServiceRequest {
  // An array of ResourceMetrics.
  // For data coming from a single resource this array will typically contain one
  // element. Intermediary nodes (such as OpenTelemetry Collector) that receive
  // data from multiple origins typically batch the data before forwarding further and
  // in that case this array will contain multiple elements.
  repeated opentelemetry.proto.metrics.v1.ResourceMetrics resource_metrics = 1;
}
```

`ResourceMetrics` は、MetricData オブジェクトを表すトップレベルオブジェクトです。

```
// A collection of InstrumentationLibraryMetrics from a Resource.
message ResourceMetrics {
  // The resource for the metrics in this message.
  // If this field is not set then no resource info is known.
  opentelemetry.proto.resource.v1.Resource resource = 1;
  
  // A list of metrics that originate from a resource.
  repeated InstrumentationLibraryMetrics instrumentation_library_metrics = 2;
}
```

**Resource オブジェクト**

`Resource` オブジェクトは、値のペアを持つオブジェクトで、メトリクスを生成したリソースに関する情報が含まれます。AWS で作成されたメトリクスの場合、データ構造には、EC2 インスタンスや S3 バケットなど、メトリクスに関連するリソースの Amazon リソースネーム (ARN) が含まれます。

`Resource` オブジェクトには、`attributes` という属性が含まれています。これには、キーと値のペアが格納されています。
+ `cloud.account.id` にはアカウント ID が含まれています
+ `cloud.region` にはリージョンが含まれています
+ `aws.exporter.arn` にはメトリクスストリーム ARN が含まれています
+ 「`cloud.provider`」 は常に 「`aws`」 です。

```
// Resource information.
message Resource {
  // Set of labels that describe the resource.
  repeated opentelemetry.proto.common.v1.KeyValue attributes = 1;
  
  // dropped_attributes_count is the number of dropped attributes. If the value is 0,
  // no attributes were dropped.
  uint32 dropped_attributes_count = 2;
}
```

**InstrumentationLibraryMetrics オブジェクト**

instrumentation\$1library フィールドには入力されません。エクスポートするメトリクスフィールドのみに入力されます。

```
// A collection of Metrics produced by an InstrumentationLibrary.
message InstrumentationLibraryMetrics {
  // The instrumentation library information for the metrics in this message.
  // If this field is not set then no library info is known.
  opentelemetry.proto.common.v1.InstrumentationLibrary instrumentation_library = 1;
  // A list of metrics that originate from an instrumentation library.
  repeated Metric metrics = 2;
}
```

**Metric オブジェクト**

Metric オブジェクトには、`DoubleSummaryDataPoint` のリストを含む `DoubleSummary` データフィールドが含まれています。

```
message Metric {
  // name of the metric, including its DNS name prefix. It must be unique.
  string name = 1;

  // description of the metric, which can be used in documentation.
  string description = 2;

  // unit in which the metric value is reported. Follows the format
  // described by http://unitsofmeasure.org/ucum.html.
  string unit = 3;

  oneof data {
    IntGauge int_gauge = 4;
    DoubleGauge double_gauge = 5;
    IntSum int_sum = 6;
    DoubleSum double_sum = 7;
    IntHistogram int_histogram = 8;
    DoubleHistogram double_histogram = 9;
    DoubleSummary double_summary = 11;
  }
}

message DoubleSummary {
  repeated DoubleSummaryDataPoint data_points = 1;
}
```

**MetricDescriptor オブジェクト**

MetricDescriptor オブジェクトには、メタデータが含まれています。詳細については、GitHub の「[metrics.proto](https://github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/metrics/v1/metrics.proto#L110)」を参照してください。

メトリクスストリームの場合、MetricDescriptor には次の内容があります。
+ `name` は `amazonaws.com/metric_namespace/metric_name` になります。
+ `description` は空白になります。
+ `unit` には、メトリクスデータの単位をユニファイドコードの形式 (大文字と小文字が区別される) の計量単位に変換したものが入力されます。詳細については、「[CloudWatch での OpenTelemetry 0.7.0 形式への変換](CloudWatch-metric-streams-formats-opentelemetry-translation.md)」および「[The Unified Code For Units of Measure](https://ucum.org/ucum.html)」を参照してください。
+ `type` は `SUMMARY` になります。

**DoubleSummaryDataPoint オブジェクト**

DoubleSumMaryDataPointオブジェクトには、DoubleSumMaryメトリクスの時系列内の 1 つのデータポイントの値が含まれます。

```
// DoubleSummaryDataPoint is a single data point in a timeseries that describes the
// time-varying values of a Summary metric.
message DoubleSummaryDataPoint {
  // The set of labels that uniquely identify this timeseries.
  repeated opentelemetry.proto.common.v1.StringKeyValue labels = 1;

  // start_time_unix_nano is the last time when the aggregation value was reset
  // to "zero". For some metric types this is ignored, see data types for more
  // details.
  //
  // The aggregation value is over the time interval (start_time_unix_nano,
  // time_unix_nano].
  //
  // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January
  // 1970.
  //
  // Value of 0 indicates that the timestamp is unspecified. In that case the
  // timestamp may be decided by the backend.
  fixed64 start_time_unix_nano = 2;

  // time_unix_nano is the moment when this aggregation value was reported.
  //
  // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January
  // 1970.
  fixed64 time_unix_nano = 3;

  // count is the number of values in the population. Must be non-negative.
  fixed64 count = 4;

  // sum of the values in the population. If count is zero then this field
  // must be zero.
  double sum = 5;

  // Represents the value at a given quantile of a distribution.
  //
  // To record Min and Max values following conventions are used:
  // - The 1.0 quantile is equivalent to the maximum value observed.
  // - The 0.0 quantile is equivalent to the minimum value observed.
  message ValueAtQuantile {
    // The quantile of a distribution. Must be in the interval
    // [0.0, 1.0].
    double quantile = 1;

    // The value at the given quantile of a distribution.
    double value = 2;
  }

  // (Optional) list of values at different quantiles of the distribution calculated
  // from the current snapshot. The quantiles must be strictly increasing.
  repeated ValueAtQuantile quantile_values = 6;
}
```

詳細については、「[CloudWatch での OpenTelemetry 0.7.0 形式への変換](CloudWatch-metric-streams-formats-opentelemetry-translation.md)」を参照してください。

# CloudWatch での OpenTelemetry 0.7.0 形式への変換
<a name="CloudWatch-metric-streams-formats-opentelemetry-translation"></a>

CloudWatch では、CloudWatch データを OpenTelemetry 形式に配置するために、いくつかの変換が実行されます。

**名前空間、メトリクス名、ディメンションの変換**

これらの属性は、変換によってエンコードされたキーと値のペアになります。
+ メトリクスの名前空間が含まれるペアが 1 つあります
+ メトリクスの名前が含まれるペアが 1 つあります
+ CloudWatch は、ディメンションごとに、`metricDatum.Dimensions[i].Name, metricDatum.Dimensions[i].Value` のペアを保存します。

**Average、Sum、SampleCount、Min、および Max の変換**

Summary データポイントを使用すると、CloudWatch で 1 つのデータポイントを使用してこれらの統計情報をすべてエクスポートできます。
+ `startTimeUnixNano` には CloudWatch `startTime` が含まれています
+ `timeUnixNano` には CloudWatch `endTime` が含まれています
+ `sum` には Sum の統計が含まれています
+ `count` には SampleCount の統計が含まれています
+ `quantile_values` には 2 つの `valueAtQuantile.value` オブジェクトが含まれています
  + `valueAtQuantile.quantile = 0.0` ( を含む)`valueAtQuantile.value = Min value`
  + `valueAtQuantile.quantile = 0.99` ( を含む)`valueAtQuantile.value = p99 value`
  + `valueAtQuantile.quantile = 0.999` ( を含む)`valueAtQuantile.value = p99.9 value`
  + `valueAtQuantile.quantile = 1.0` ( を含む)`valueAtQuantile.value = Max value`

メトリクスストリームを消費するリソースは、Average (**Sum/SampleCount**) の統計で計算できます。

**単位の変換**

CloudWatch 単位は、次の表に示すように、計量単位のユニファイドコードの形式 (大文字と小文字を区別する) に変換されます。詳細については、「[The Unified Code For Units of Measure](https://ucum.org/ucum.html)」を参照してください。


| CloudWatch | OpenTelemetry | 
| --- | --- | 
|  秒 |  s | 
|  Second または Seconds |  s | 
|  Microsecond |  us | 
|  Milliseconds |  ms | 
|  バイト |  方法 | 
|  Kilobytes |  kBy | 
|  Megabytes |  MBy | 
|  Gigabytes |  GBy | 
|  Terabytes |  TBy | 
|  Bits |  bit | 
|  Kilobits |  kbit | 
|  Megabits |  MBit | 
|  Gigabits |  GBit | 
|  Terabits |  Tbit | 
|  割合 (%) |  % | 
|  カウント |  \$1Count\$1 | 
|  なし |  1 | 

単位がスラッシュで結合されている場合は、両方の単位に OpenTelemetry 変換を適用して変換されます。たとえば、Bytes/Second は By/s に変換されます。

# OpenTelemetry 0.7.0 メッセージを解析する方法
<a name="CloudWatch-metric-streams-formats-opentelemetry-parse"></a>

このセクションでは、OpenTelemetry 0.7.0 の解析を開始する際に役立つ情報を提供します。

まず、言語固有のバインディングを取得する必要があります。これにより、OpenTelemetry 0.7.0 のメッセージを適宜の言語で解析できます。

**言語固有のバインディングを取得するには**
+ 手順は、使用する言語によって異なります。
  + Java を使用するには、次の Maven 依存関係を Java プロジェクトに追加します。[OpenTelemetry Java >> 0.14.1](https://mvnrepository.com/artifact/io.opentelemetry/opentelemetry-proto/0.14.1)。
  + 他の言語を使用するには、次の手順を実行します。

    1. 「[Generating Your Classes](https://developers.google.com/protocol-buffers/docs/proto3#generating)」のリストをチェックして、言語がサポートされていることを確認します。

    1. 「[Download Protocol Buffers](https://developers.google.com/protocol-buffers/docs/downloads)」の手順に従って、Protobuf コンパイラをインストールします。

    1. 「[v0.7.0 release](https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v0.7.0)」で OpenTelemetry 0.7.0 ProtoBuf 定義をダウンロードします。

    1. ダウンロードした OpenTelemetry 0.7.0 ProtoBuf 定義のルートフォルダにいることを確認します。次に、`src` フォルダを作成し、言語固有のバインディングを生成するコマンドを実行します。詳細は、「[Generating Your Classes](https://developers.google.com/protocol-buffers/docs/proto3#generating)」を参照してください。

       以下は、Javascript バインディングを生成する方法の例です。

       ```
       protoc --proto_path=./ --js_out=import_style=commonjs,binary:src \
       opentelemetry/proto/common/v1/common.proto \
       opentelemetry/proto/resource/v1/resource.proto \
       opentelemetry/proto/metrics/v1/metrics.proto \
       opentelemetry/proto/collector/metrics/v1/metrics_service.proto
       ```

次のセクションでは、前の手順を使用して構築できる言語固有のバインディングの使用例について説明します。

**Java**

```
package com.example;

import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MyOpenTelemetryParser {

    public List<ExportMetricsServiceRequest> parse(InputStream inputStream) throws IOException {
        List<ExportMetricsServiceRequest> result = new ArrayList<>();

        ExportMetricsServiceRequest request;
        /* A Kinesis record can contain multiple `ExportMetricsServiceRequest`
           records, each of them starting with a header with an
           UnsignedVarInt32 indicating the record length in bytes:
            ------ --------------------------- ------ -----------------------
           |UINT32|ExportMetricsServiceRequest|UINT32|pExportMetricsService...
            ------ --------------------------- ------ -----------------------
         */
        while ((request = ExportMetricsServiceRequest.parseDelimitedFrom(inputStream)) != null) {
            // Do whatever we want with the parsed message
            result.add(request);
        }

        return result;
    }
}
```

**Javascript**

この例では、生成されたバインディングを含むルートフォルダが `./` であるとしています。

関数 `parseRecord` の data 引数には、次のいずれかの型を指定できます。
+ `Uint8Array` これが最適です
+ `Buffer` ノードの下では最適です
+ `Array.number` 8 ビット整数

```
const pb = require('google-protobuf')
const pbMetrics =
    require('./opentelemetry/proto/collector/metrics/v1/metrics_service_pb')

function parseRecord(data) {
    const result = []

    // Loop until we've read all the data from the buffer
    while (data.length) {
        /* A Kinesis record can contain multiple `ExportMetricsServiceRequest`
           records, each of them starting with a header with an
           UnsignedVarInt32 indicating the record length in bytes:
            ------ --------------------------- ------ -----------------------
           |UINT32|ExportMetricsServiceRequest|UINT32|ExportMetricsService...
            ------ --------------------------- ------ -----------------------
         */
        const reader = new pb.BinaryReader(data)
        const messageLength = reader.decoder_.readUnsignedVarint32()
        const messageFrom = reader.decoder_.cursor_
        const messageTo = messageFrom + messageLength

        // Extract the current `ExportMetricsServiceRequest` message to parse
        const message = data.subarray(messageFrom, messageTo)

        // Parse the current message using the ProtoBuf library
        const parsed =
            pbMetrics.ExportMetricsServiceRequest.deserializeBinary(message)

        // Do whatever we want with the parsed message
        result.push(parsed.toObject())

        // Shrink the remaining buffer, removing the already parsed data
        data = data.subarray(messageTo)
    }

    return result
}
```

**Python**

`var-int` デリミタは自分で読み取るか、内部メソッド `_VarintBytes(size)` と `_DecodeVarint32(buffer, position)` を使用する必要があります。これらは、バッファ内でのサイズバイトの直後の位置を返します。読み取り側は、メッセージからそのバイトのみを読み取る新しいバッファを構築します。

```
size = my_metric.ByteSize()
f.write(_VarintBytes(size))
f.write(my_metric.SerializeToString())
msg_len, new_pos = _DecodeVarint32(buf, 0)
msg_buf = buf[new_pos:new_pos+msg_len]
request = metrics_service_pb.ExportMetricsServiceRequest()
request.ParseFromString(msg_buf)
```

**Go**

`Buffer.DecodeMessage()` を使用します。

**C\$1**

`CodedInputStream` を使用します。このクラスは、サイズ区切りのメッセージを読み取ることができます。

**C\$1\$1**

`google/protobuf/util/delimited_message_util.h` に記述されている関数は、サイズ区切りのメッセージを読み取ることができます。

**その他の言語**

その他の言語については、「[Download Protocol Buffers](https://developers.google.com/protocol-buffers/docs/downloads)」を参照してください。

パーサーを実装するときは、Kinesis レコードに複数の `ExportMetricsServiceRequest` Protocol Buffers メッセージを含めることができることを考慮してください。各メッセージは、レコードの長さをバイト単位で示す `UnsignedVarInt32` のヘッダーで始まります。

# CloudWatch でのメトリクスストリームのトラブルシューティング
<a name="CloudWatch-metric-streams-troubleshoot"></a>

最終送信先にメトリクスデータが表示されない場合は、次の点を確認してください。
+ メトリクスストリームが実行中状態であることを確認します。CloudWatch コンソールを使用してこれを行う手順については、「[メトリクスストリームの操作とメンテナンス](CloudWatch-metric-streams-operation.md)」を参照してください。
+ 過去 3 日以上公開されたメトリクスはストリーミングされません。メトリクスがストリーミングされるかどうかを判断するには、CloudWatch コンソールでメトリクスをグラフ化して、表示される最新のデータポイントの時間を確認します。3 日以上経過している場合、メトリックスストリームで取得されません。
+ メトリクスストリームが出力するメトリクスを確認します。CloudWatch コンソールの **[Metrics]** (メトリクス) で、**[MetricUpdate]**、**[TotalMetricUpdate]**、および **[PublishErrorRate]** メトリクスの **[AWS/CloudWatch/MetricStreams]** 名前空間を確認します。
+ **PublishErrorRate** メトリクスが高い場合は、Firehose 配信ストリームで使用される送信先が存在すること、およびメトリクスストリームの設定で指定された IAM ロールが `CloudWatch` サービスプリンシパルに書き込み許可を与えていることを確認します。詳細については、「[CloudWatch と Firehose 間の信頼](CloudWatch-metric-streams-trustpolicy.md)」を参照してください。
+ Firehose 配信ストリームに最終送信先への書き込み許可があることを確認します。
+ Firehose コンソールで、メトリクスストリームに使用される Firehose 配信ストリームを表示し、**[モニタリング]** タブをチェックして、Firehose 配信ストリームがデータを受信しているかどうかを確認します。
+ Firehose 配信ストリームに正しい内容が設定されていることを確認します。
+ Firehose 配信ストリームが書き込む最終送信先について、ログまたはメトリクスがあればチェックします。
+ 詳細情報を取得するには、Firehose 配信ストリームで CloudWatch Logs エラーログを有効にします。詳細については、「[Monitoring Amazon Data Firehose Using CloudWatch Logs](https://docs.aws.amazon.com/firehose/latest/dev/monitoring-with-cloudwatch-logs.html)」を参照してください。

**注記**  
特定のメトリクスとタイムスタンプのデータポイントが送信された後でデータポイントの値が変更されても、そのデータポイントは再度送信されません。