

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 통계
<a name="CWL_QuerySyntax-Stats"></a>

 `stats`를 사용하여 막대형 차트, 꺾은선형 차트, 누적 영역 차트와 같은 로그 데이터의 시각화를 생성합니다. 이를 통해 로그 데이터에서 패턴을 더 효율적으로 식별할 수 있습니다. CloudWatch Logs Insights는 `stats` 함수와 집계 함수를 하나 이상 사용하는 쿼리에 대한 시각화를 생성합니다.

예를 들어, Route 53 로그 그룹의 다음 쿼리는 시간당 Route 53 레코드의 분포를 쿼리 유형별로 보여주는 시각화를 반환합니다.

```
stats count(*) by queryType, bin(1h)
```

이러한 쿼리는 모두 막대 차트를 생성할 수 있습니다. 쿼리가 `bin()` 함수를 사용하여 필드별로 데이터를 그룹화하는 경우 선형 차트 및 누적 영역 차트도 볼 수 있습니다.

`bin` 함수에서는 다음과 같은 시간 단위 및 약어가 지원됩니다. 둘 이상의 문자를 포함하는 모든 단위 및 약어의 경우 s를 추가하여 복수화할 수 있습니다. 따라서 `hr` 및 `hrs` 모두 시간을 지정하는 데 사용됩니다.
+ `millisecond` `ms` `msec`
+ `second` `s` `sec`
+ `minute` `m` `min`
+ `hour` `h` `hr`
+ `day` `d` 
+ `week` `w` 
+ `month` `mo` `mon`
+ `quarter` `q` `qtr`
+ `year` `y` `yr`

**Topics**
+ [시계열 데이터 시각화](#CWL_Insights-Visualizing-TimeSeries)
+ [필드별로 그룹화된 로그 데이터 시각화](#CWL_Insights-Visualizing-ByFields)
+ [단일 쿼리에서 여러 통계 명령 사용](#CWL_QuerySyntax-stats-multi)
+ [통계와 함께 사용할 함수](#CWL_QuerySyntax-stats-functions)

## 시계열 데이터 시각화
<a name="CWL_Insights-Visualizing-TimeSeries"></a>

시계열 시각화는 다음과 같은 특성을 가진 쿼리에 사용할 수 있습니다.
+ 쿼리에 집계 함수가 하나 이상 포함되어 있습니다. 자세한 정보는 [Aggregation Functions in the Stats Command](#CWL_Insights_Aggregation_Functions) 섹션을 참조하세요.
+ 쿼리가 `bin()` 함수를 사용하여 필드 하나를 기준으로 데이터를 그룹화합니다.

이러한 쿼리는 선형 차트, 누적 영역 차트, 막대 차트 및 파이 차트를 생성할 수 있습니다.

**예제**

전체 자습서는 [자습서: 시계열 시각화를 생성하는 쿼리 실행](CWL_AnalyzeLogData_VisualizationQuery.md) 섹션을 참조하세요.

다음은 시계열 시각화에 사용할 수 있는 예제 쿼리입니다.

다음 쿼리는 5분마다 생성된 데이터 포인트와 함께 `myfield1` 필드의 평균 값에 대한 시각화를 생성합니다. 각 데이터 포인트는 이전 5분 동안 생성된 로그의 `myfield1` 값 평균을 집계한 것입니다.

```
stats avg(myfield1) by bin(5m)
```

다음 쿼리는 5분마다 생성된 데이터 포인트와 함께 여러 필드를 기준으로 세 값의 시각화를 생성합니다. 쿼리가 집계 함수를 포함하고 있고 그룹화 필드로 `bin()`을 사용하기 때문에 시각화가 생성됩니다.

```
stats avg(myfield1), min(myfield2), max(myfield3) by bin(5m)
```

**선형 차트 및 누적 영역 차트 제한 사항**

로그 항목 정보를 집계하지만 `bin()` 함수를 사용하지 않는 쿼리는 막대 차트를 생성할 수 있습니다. 그러나 이러한 쿼리는 선형 차트 또는 누적 영역 차트를 생성할 수 없습니다. 이러한 쿼리 유형에 대한 자세한 내용은 [필드별로 그룹화된 로그 데이터 시각화](#CWL_Insights-Visualizing-ByFields)을 참조하세요.

## 필드별로 그룹화된 로그 데이터 시각화
<a name="CWL_Insights-Visualizing-ByFields"></a>

`stats` 함수와 하나 이상의 집계 함수를 사용하는 쿼리에 대해 막대 차트를 생성할 수 있습니다. 자세한 정보는 [Aggregation Functions in the Stats Command](#CWL_Insights_Aggregation_Functions) 섹션을 참조하세요.

시각화를 보려면 쿼리를 실행합니다. 그런 다음 **시각화** 탭을 선택하고 **줄** 옆의 화살표를 선택한 다음, **막대**를 선택합니다. 막대 차트에서는 시각화가 최대 100개 막대로 제한됩니다.

**예제**

전체 자습서는 [자습서: 로그 필드로 그룹화된 시각화를 생성하는 쿼리 실행](CWL_AnalyzeLogData_VisualizationFieldQuery.md) 섹션을 참조하세요. 다음 단락에는 필드별 시각화에 대한 더 많은 예제 쿼리가 포함되어 있습니다.

다음 VPC 흐름 로그 쿼리는 각 대상 주소에 대해 세션당 전송된 평균 바이트의 수를 찾습니다.

```
stats avg(bytes) by dstAddr
```

각 결과 값에 대해 둘 이상의 막대가 포함된 차트를 생성할 수도 있습니다. 예를 들어, 다음 VPC 흐름 로그 쿼리는 각 대상 주소에 대해 세션당 전송된 평균 및 최대 바이트의 수를 찾습니다.

```
stats avg(bytes), max(bytes) by dstAddr
```

다음 쿼리는 각 쿼리 유형에 대해 Amazon Route 53 쿼리 로그의 수를 찾습니다.

```
stats count(*) by queryType
```

## 단일 쿼리에서 여러 통계 명령 사용
<a name="CWL_QuerySyntax-stats-multi"></a>

단일 쿼리에 최대 두 개의 `stats` 명령을 사용할 수 있습니다. 이렇게 하면 첫 번째 집계의 출력에 대해 추가 집계를 수행할 수 있습니다.

**예: 두 개의 `stats` 명령을 사용한 쿼리**

예를 들어, 다음 쿼리는 먼저 5분 빈(bin)의 총 트래픽 볼륨을 찾아낸 다음 해당 5분 빈 중 최고, 최저, 평균 트래픽 볼륨을 계산합니다.

```
FIELDS strlen(@message) AS message_length
| STATS sum(message_length)/1024/1024 as logs_mb BY bin(5m)
| STATS max(logs_mb) AS peak_ingest_mb, 
        min(logs_mb) AS min_ingest_mb, 
        avg(logs_mb) AS avg_ingest_mb
```

**예: 여러 통계 명령을 다른 함수(`filter`, `fields`, `bin`)와 결합**

단일 쿼리에서 두 개의 `stats` 명령을 다른 명령(`filter` 및 `fields`)과 결합할 수 있습니다. 예를 들어, 다음 쿼리는 세션에서 고유한 IP 주소의 수 및 클라이언트 플랫폼별 세션의 수를 찾고, 해당 IP 주소를 필터링한 다음, 마지막으로 클라이언트 플랫폼별 평균 세션 요청을 찾습니다.

```
STATS count_distinct(client_ip) AS session_ips, 
      count(*) AS requests BY session_id, client_platform
| FILTER session_ips > 1
| STATS count(*) AS multiple_ip_sessions, 
        sum(requests) / count(*) AS avg_session_requests BY client_platform
```

여러 `stats` 명령을 사용하여 쿼리에서 `bin` 및 `dateceil` 함수를 사용할 수 있습니다. 예를 들어, 다음 쿼리는 먼저 메시지를 5분 블록으로 결합한 다음 5분 블록을 10분 블록으로 집계하고 각 10분 블록 내의 최고, 최저 및 평균 트래픽 볼륨을 계산합니다.

```
FIELDS strlen(@message) AS message_length
| STATS sum(message_length) / 1024 / 1024 AS logs_mb BY BIN(5m) as @t
| STATS max(logs_mb) AS peak_ingest_mb, 
        min(logs_mb) AS min_ingest_mb,
        avg(logs_mb) AS avg_ingest_mb BY dateceil(@t, 10m)
```

**참고 및 제한 사항**

쿼리당 최대 두 개의 `stats` 명령을 사용할 수 있습니다. 이 할당량은 변경할 수 없습니다.

`sort` 또는 `limit` 명령을 사용하는 경우 이 명령은 두 번째 `stats` 명령 뒤에 나타나야 합니다. 두 번째 `stats` 명령 앞에 있는 경우 쿼리는 유효하지 않습니다.

쿼리에 두 개의 `stats` 명령이 있는 경우 첫 번째 `stats` 집계가 완료될 때까지 쿼리의 일부 결과가 표시되지 않습니다.

단일 쿼리의 두 번째 `stats` 명령에서는 첫 번째 `stats` 명령에 정의된 필드만 참조할 수 있습니다. 예를 들어, 첫 번째 `stats` 집계 후에는 `@message` 필드를 사용할 수 없으므로 다음 쿼리는 유효하지 않습니다.

```
FIELDS @message
| STATS SUM(Fault) by Operation
# You can only reference `SUM(Fault)` or Operation at this point
| STATS MAX(strlen(@message)) AS MaxMessageSize # Invalid reference to @message
```

첫 번째 `stats` 명령 이후에 참조하는 모든 필드는 첫 번째 `stats` 명령에서 정의해야 합니다.

```
STATS sum(x) as sum_x by y, z
| STATS max(sum_x) as max_x by z
# You can only reference `max(sum_x)`, max_x or z at this point
```

**중요**  
`bin` 함수는 항상 `@timestamp` 필드를 묵시적으로 사용합니다. 즉, 첫 번째 `stats` 명령을 사용하여 `timestamp` 필드를 전파하지 않으면 두 번째 `stats` 명령에서 `bin` 함수를 사용할 수 없습니다. 예를 들어, 다음 쿼리는 유효하지 않습니다.  

```
FIELDS strlen(@message) AS message_length
 | STATS sum(message_length) AS ingested_bytes BY @logStream
 | STATS avg(ingested_bytes) BY bin(5m) # Invalid reference to @timestamp field
```
대신 첫 번째 `stats` 명령에서 `@timestamp` 필드를 정의하면 다음 예제와 같이 두 번째 `stats` 명령에서 `dateceil`과 함께 필드를 사용할 수 있습니다.  

```
FIELDS strlen(@message) AS message_length
 | STATS sum(message_length) AS ingested_bytes, max(@timestamp) as @t BY @logStream
 | STATS avg(ingested_bytes) BY dateceil(@t, 5m)
```

## 통계와 함께 사용할 함수
<a name="CWL_QuerySyntax-stats-functions"></a><a name="CWL_Insights_Aggregation_Functions"></a>

CloudWatch Logs Insights는 통계 집계 함수와 통계 비집계 함수를 모두 지원합니다.

 `stats` 명령에서 statsaggregation 함수를 사용하고 다른 함수의 인수로 사용합니다.


| 함수 | 결과 유형 | 설명 | 
| --- | --- | --- | 
|  `avg(fieldName: NumericLogField)` |  number |  지정된 필드의 값 평균.  | 
|  `count()` `count(fieldName: LogField)` |  number |  로그 이벤트를 계산합니다. `count()`(또는`count(*)`)는 쿼리에서 반환하는 이벤트 수를 모두 세고 `count(fieldName)`은 지정한 필드 이름이 포함된 레코드 수를 모두 계산합니다.  | 
|  `count_distinct(fieldName: LogField)` |  number |  필드에 대해 고유한 값의 수를 반환합니다. 필드의 카디널리티가 매우 높은 경우(고유한 값이 많이 포함되어 있음) `count_distinct`가 반환하는 값은 근사치입니다.  | 
|  `max(fieldName: LogField)` |  LogFieldValue |  쿼리된 로그에서 이 로그 필드에 대한 최댓값입니다.  | 
|  `min(fieldName: LogField)` |  LogFieldValue |  쿼리된 로그에서 이 로그 필드에 대한 최솟값입니다.  | 
|  `pct(fieldName: LogFieldValue, percent: number)` |  LogFieldValue |  백분위수는 데이터세트에서 값의 상대적 위치를 나타냅니다. 예를 들어, `pct(@duration, 95)`는 `@duration`의 값 중 95퍼센트가 이 값보다 낮고 5퍼센트는 이 값보다 큰 `@duration` 값을 반환합니다.  | 
|  `stddev(fieldName: NumericLogField)` |  number |  지정된 필드의 값에 대한 표준 편차.  | 
|  `sum(fieldName: NumericLogField)` |  number |  지정된 필드의 값에 대한 합계.  | 

 **통계 비집계 함수** <a name="CWL_Insights_Non-Aggregation_Functions"></a>

 비집계 함수를 `stats` 명령에서 사용하고 다른 함수의 인수로 사용합니다.


| 함수 | 결과 유형 | 설명 | 
| --- | --- | --- | 
|  `earliest(fieldName: LogField)` |  LogField |  쿼리된 로그에서 가장 이른 타임스탬프가 있는 로그 이벤트에서 `fieldName`의 값을 반환합니다.  | 
|  `latest(fieldName: LogField)` |  LogField |  쿼리된 로그에서 최신 타임스탬프가 있는 로그 이벤트에서 `fieldName`의 값을 반환합니다.  | 
|  `sortsFirst(fieldName: LogField)` |  LogField |  쿼리된 로그에서 가장 빨리 정렬된 `fieldName`의 값을 반환합니다.  | 
|  `sortsLast(fieldName: LogField)` |  LogField |  쿼리된 로그에서 가장 늦게 정렬된 `fieldName`의 값을 반환합니다.  | 