

# JSON 형식의 CloudWatch 지표 스트림 출력
<a name="CloudWatch-metric-streams-formats-json"></a>

JSON 형식을 사용하는 CloudWatch 지표 스트림에서는 각 Firehose 레코드에 줄 바꿈 문자(\\n)로 구분된 여러 JSON 객체가 포함됩니다. 각 객체에는 단일 지표의 단일 데이터 요소가 포함됩니다.

사용되는 JSON 형식은 AWS Glue 및 Amazon Athena와 완전히 호환됩니다. Firehose 전송 스트림 및 AWS Glue 테이블을 올바르게 형식 지정한 경우 형식은 S3에 저장되기 전에 Parquet 형식 또는 ORC(Optimized Row Columnar) 형식으로 자동 변환될 수 있습니다. 형식 변환에 대한 자세한 내용은 [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`와 같은 Epoch 밀리초 단위입니다.

다음은 형식의 예입니다. 이 예에서 JSON은 읽기 쉽도록 형식이 지정되어 있지만 실제로는 전체 형식이 한 줄에 있습니다.

```
{
    "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>

다음은 Firehose에서 사용하게 될 AWS Glue 테이블의 `StorageDescriptor`에 대한 JSON 표현 예입니다. `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"
  }
}
```

앞의 예는 Amazon S3에 JSON 형식으로 작성된 데이터에 대한 것입니다. 데이터를 Parquet 형식 또는 ORC(Optimized Row Columnar) 형식으로 저장하려면 다음 필드의 값을 표시된 값으로 바꿉니다.
+ **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