

# 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