4tdg-20250916 [PS] Kusto Query Language (KQL) from Scratch 3

4tdg-20250916 [PS] Kusto Query Language (KQL) from Scratch 3

https://app.pluralsight.com/library/courses/kusto-query-language-kql-from-scratch/table-of-contents

 

 

 

 

 

 

Advanced Aggreations

 

The arg_max and arg_min Commands

1. 기본 집계 함수

  • min() : 최소값 반환

  • max() : 최대값 반환

 

2. 고급 집계 함수

1) arg_max(max값, 기타 컬럼들...)

  • 최댓값을 가진 행(row)에서 지정된 컬럼들까지 함께 반환

  • 예:

    summarize arg_max(CounterValue, *) by CounterName

    → 각 CounterName에 대해 최대 CounterValue + 해당 행의 모든 컬럼 반환

  • 선택된 컬럼만 가져오고 싶을 때:

    summarize arg_max(CounterValue, Computer, ObjectName) by CounterName

     

2) arg_min(min값, 기타 컬럼들...)

  • arg_max()와 동일한 원리로 최솟값 기준 행의 컬럼들 반환

  • 단, summarize 이전에 project로 컬럼 제한하면 결과가 축소됨

 

3. 주의 사항

  • arg_max / arg_min추가 컬럼 지정이 가능한 것이 핵심 장점

  • 단순히 최소/최대 숫자만 필요하다면 min(), max() 사용으로 충분

 

4. 활용 예시

집계 함수

사용 목적

집계 함수

사용 목적

max(CounterValue)

최대값만 확인할 때

arg_max(CounterValue, *)

최대값을 가진 행 전체를 확인할 때

arg_max(CounterValue, Computer, ObjectName)

최대값과 관련 컬럼만 선택적으로 확인할 때

 

 

 

The makeset and makelist Commands

1. makeset()

  • 중복 없이 특정 값을 배열(array)로 수집

  • 사용 예:

    summarize makeset(CounterName) by ObjectName

    → ObjectName별로 관련된 고유한 CounterName 목록을 배열로 생성

  • 활용 예:

    where CounterName == "Free Space" and CounterValue <= 30 summarize makeset(Computer) by CounterName

    → 특정 조건을 만족하는 컴퓨터 목록 배열 생성 (중복 제거)

 

2. makelist()

  • 중복 허용하여 값을 배열로 수집

  • 사용 예:

    summarize makelist(Computer) by CounterName

    → 동일 컴퓨터가 여러 번 나타나도 모두 포함

 

3. 공통 옵션

  • 최대 배열 크기 지정 가능 (기본: 128개)

    summarize makeset(Computer, 256) by CounterName summarize makelist(Computer, 256) by CounterName

     

4. 차이점 요약

연산자

중복 제거

기본 최대 길이

주 용도

연산자

중복 제거

기본 최대 길이

주 용도

makeset()

O

128

고유 값 목록을 만들 때

makelist()

X

128

값의 빈도나 순서를 유지할 때

 

 

The mvexpand Command

1. 기본 개념

  • mvexpand배열(array) 또는 JSON 속성 목록행(row) 단위로 펼치는(확장하는) 데 사용됨

 

2. 사용 예시 1 – 배열 행으로 변환

Perf | where CounterName == "Free Space" and CounterValue <= 30 | summarize makeset(Computer) by CounterName | mvexpand Computer
  • makeset()으로 만든 컴퓨터 배열을 mvexpand하나씩 행으로 펼침

 

3. 사용 예시 2 – JSON Key-Value 확장

MyAlerts | extend Props = todynamic(ExtendedProperties) | mvexpand Props | project TimeGenerated, DisplayName, AlertName, Severity, Props
  • todynamic()으로 JSON을 변환한 뒤 mvexpand각 key-value 쌍을 개별 행으로 분리

  • 각 행에는 동일한 Alert 정보 + 다른 속성이 나옴

 

4. 주요 활용처

용도

설명

용도

설명

배열 값을 개별 행으로 분리

makeset, makelist 결과를 행으로 펼칠 때

JSON key-value 분해

todynamic과 함께 사용하여 JSON 내부 속성 추출

각 항목별 상세 분석 필요 시

배열 또는 다중 속성 데이터를 분석 단위로 쪼개기

 

5. 정리

함수

기능

함수

기능

makeset

중복 없이 배열 생성

makelist

중복 포함 배열 생성

mvexpand

배열 또는 JSON을 개별 행으로 분해

 

 

The percentiles Command

1. 기본 개념

  • percentiles() 함수는 샘플 값 중 x%보다 큰 값을 계산함

  • 통계 분석 시 분포 파악에 매우 유용함

 

2. 사용 예시

Perf | where CounterName == "AvailableMBytes" | summarize percentiles(CounterValue, 5, 50, 95) by Computer
  • CounterValue 값을 5%, 50%, 95% 기준으로 계산

  • 결과 열: percentile_CounterValue_5, percentile_CounterValue_50, percentile_CounterValue_95

 

3. 열 이름 사용자 지정 방법

  1. project-rename 사용

    | project-rename Percent05 = percentile_CounterValue_5

     

    요약 구문 내 직접 명명

    summarize (Percent05, Percent50, Percent95) = percentiles(CounterValue, 5, 50, 95)

     

4. 다양한 백분위 지정 가능

kql

복사편집

percentiles(CounterValue, 10, 30, 50, 70, 90)

  • 원하는 만큼 세분화 가능

 

5. 배열 형태 반환: percentiles_array

summarize percentiles_array(CounterValue, 5, 50, 95) by Computer
  • 단일 배열로 백분위 결과를 반환

  • 이후 mvexpand를 이용해 행 단위로 분해 가능

 

6. 정리

함수

설명

함수

설명

percentiles()

각 백분위에 해당하는 값을 개별 열로 반환

percentiles_array()

백분위 값들을 배열로 반환

mvexpand

배열 형태 반환 시 각 값을 행으로 변환할 때 사용

percentiles 함수는 성능 지표나 로그 데이터의 분포를 이해하고 임계값을 설정하는 데 유용한 통계 함수입니다.

 

 

The dcount Command

1. 기본 개념

  • dcount()고속으로 고유값의 개수를 추정하는 함수

  • 정확한 distinct count보다 빠름 (대신 약간의 오차 허용)

 

2. 사용 예시

SecurityEvent | summarize dcount(EventID) by Computer
  • 각 컴퓨터별로 고유한 EventID 수 추정

 

3. 정확도 옵션 (2번째 인자)

오차율

특징

오차율

특징

0

~1.6%

가장 빠름, 오차 큼

1

~0.8%

기본값 (속도/정확도 균형)

2

~0.4%

정확하지만 더 느림

3

~0.28%

가장 정확하지만 가장 느림

 

4. 비교: distinct count vs dcount

항목

distinct + summarize

dcount()

항목

distinct + summarize

dcount()

정확도

100% 정확

추정값 (약간의 오차 있음)

속도

느림 (대량 데이터일수록)

빠름

사용 예

소규모/정확성 중요 시

대규모/속도 우선 시

 

5. 활용 예시

SecurityEvent | where TimeGenerated > ago(90d) | summarize dcount(EventID, 1) by Computer
  • 최근 90일 동안 각 컴퓨터에 대해 발생한 고유 보안 이벤트 수 추정

 

 

The dcountIf Command

1. 기능

  • 조건부 고유값 개수 추정 (boolean 조건이 true인 행만 포함)

  • dcount()의 변형으로, 필터링된 행에 대해서만 추정된 고유값 개수 반환

 

2. 기본 구조

summarize dcountif(ColumnToCount, Condition)

 

예시:

SecurityEvent | summarize dcountif(EventID, EventID in (4625, 4688)) by Computer
  • 각 컴퓨터별로 4625 또는 4688 이벤트 ID가 몇 종류 있었는지 추정

 

3. 정확도 조절 (3번째 매개변수)

정확도 값

오차율

특징

정확도 값

오차율

특징

0

약 1.6%

가장 빠름, 오차 큼

1 (기본)

약 0.8%

속도/정확도 균형

2

약 0.4%

가장 정확, 가장 느림

3

사용 불가

dcountif()에서는 지원 안함

 

4. 비교 요약

항목

dcount()

dcountif()

항목

dcount()

dcountif()

사용 목적

전체 고유값 추정

조건을 만족하는 고유값만 추정

입력

컬럼

컬럼 + 조건식

정확도 조절

0, 1, 2, 3 가능

0, 1, 2만 가능

 

5. 활용 예

SecurityEvent | summarize dcountif(EventID, EventID in (4625, 4688), 1) by Computer
  • 각 컴퓨터에서 특정 보안 이벤트 종류 수를 추정 (오차율 0.8%)

 

 

The countif Command

1. 기능

  • count()의 변형으로, 특정 조건을 만족하는 행만 집계

  • 조건이 참(true)인 경우만 카운트

 

2. 기본 구조

summarize countif(조건) by 그룹기준

 

예시:

Perf | summarize RowCount = countif(CounterName contains "Bytes") by CounterName
  • CounterName별로 "Bytes"를 포함하는 경우만 카운트

  • "Bytes"가 없는 항목은 0으로 표시됨

 

3. count vs countif 차이

항목

count 사용 예

countif 사용 예

항목

count 사용 예

countif 사용 예

쿼리 예시

`where ...

summarize count()`

0 포함 여부

조건을 만족하지 않으면 행이 아예 없음

조건을 만족하지 않으면 행은 있고 값은 0

후처리 가능 여부

불필요한 행이 이미 제거됨

where RowCount > 0으로 0인 행 제거 가능

 

4. 활용 팁

  • 조건부 통계가 필요한 경우 유용
    (예: 특정 문자열 포함 여부, 날짜 조건 등)

  • 후속 필터링을 통해 0 건수 제거 가능

 

5. 예시

Perf | summarize RowCount = countif(CounterName contains "Bytes") by CounterName | where RowCount > 0
  • "Bytes"를 포함한 항목만 카운트

  • 0인 결과는 필터링하여 제거

 

 

The pivot Command

1. 기능

  • 행 기반 데이터를 열 기반 데이터로 전환

  • 특정 열의 값을 새로운 열 이름(Column) 으로 만들고, 각 값에 대한 집계(Aggregation) 수행

 

2. 활용 목적

  • 같은 컴퓨터에 대한 다양한 이벤트 수준(예: Error, Warning)한 행에 나란히 표시하고 싶을 때 사용(→ 가독성과 분석 용이성 증가)

 

3. 사용 예시

Event | summarize count() by Computer, EventLevelName | evaluate pivot(EventLevelName)
  • EventLevelName 값(Error, Warning 등)을 열로 전환

  • 각 컴퓨터별로 열당 이벤트 수를 합산하여 표시

 

4. 결과 예시

Computer

Error

Warning

Computer

Error

Warning

AZTest

16

0

ContosoRetail

3

2

 

5. 핵심 요점

  • pivotevaluate pivot(<열이름>) 형태로 사용

  • 자동으로 집계 함수(count, sum 등) 를 적용하여 열 생성

  • 행을 열로 변환하고 요약 정보를 쉽게 확인 가능

 

 

The top-nested Command

1. 기능

  • 계층 구조(그룹 내 그룹) 에서 각각의 Top N 항목을 추출할 수 있도록 해주는 연산자

  • 단일 수준(top)과 달리 다단계(Nested) Top N 결과 제공

 

2. 사용 목적

  • 예:

    • 상위 3개의 ObjectName을 찾고

    • ObjectName에 대해 상위 3개의 CounterName을 찾고

    • 추가로 각 CounterName에 대해 상위 3개의 InstanceName도 찾고 싶을 때

 

3. 형식 예시

Perf | summarize count() by ObjectName, CounterName | top-nested 3 of ObjectName by ObjectCount = count() top-nested 3 of CounterName by CounterNameCount = count()

 

4. 주요 특징

항목

설명

항목

설명

다중 그룹화

그룹 내부에서 또 다른 그룹의 상위 N개 추출

지원 함수

count(), sum(), min(), max()

결과 계층화

출력 결과가 Object → Counter → Instance 등 계층 구조로 정렬됨

with others 옵션

상위 N개 외 나머지 값을 하나로 묶어 "All Other ..." 등으로 표시

 

5. 활용 예

| top-nested 3 of ObjectName by count() with others = "All Other Objects" top-nested 3 of CounterName by count() with others = "All Other Counters"
  • 결과에는 상위 3개 항목 외에 "기타 나머지(All Other ...)" 그룹도 포함되어 분석 가능

 

6. 요약

  • top-nested다단계 그룹별 상위 데이터를 추출할 수 있는 고급 연산자

  • 복잡한 계층형 데이터 요약이나 분석 리포트 작성 시 매우 유용함

 

 

The max and min Commands

1. 기능

  • 최대값(max) 또는 최소값(min)을 계산함

  • arg_max, arg_min과 달리 추가 열을 반환하지 않음

 

2. 사용 예시

Perf | where CounterName == "Free Megabytes" | summarize max(CounterValue)
  • Free Megabytes최댓값 반환: 예) 2,718,479

Perf | where CounterName == "Free Megabytes" | summarize min(CounterValue)
  • Free Megabytes최솟값 반환: 예) 60

 

3. 차이점 비교

연산자

설명

연산자

설명

arg_max

최대값이 있는 행 전체(추가 열 포함)를 반환

max

최대값 하나만 반환

arg_min

최소값이 있는 행 전체를 반환

min

최소값 하나만 반환

 

4. 사용 목적

  • 단순 통계가 필요할 때 사용

  • 데이터의 최대/최소 범위를 파악할 때 유용

 

 

The sum and sumif Commands

1. sum()

  • 특정 열의 전체 합계를 계산

  • 주로 숫자형 데이터의 총합을 구할 때 사용

예시

Perf | where CounterName == "Free Megabytes" | summarize sum(CounterValue)
  • Free Megabytes의 총합을 계산

 

2. sumif()

  • 조건이 참인 경우에만 합산

  • countif()와 유사하게 조건 필터링이 가능

예시

Perf | summarize sumif(CounterValue, CounterName == "Free Megabytes")
  • CounterName"Free Megabytes"인 행만 합산

 

3. 차이점 비교

함수

설명

함수

설명

sum()

조건절이 필요할 경우 where 사용

sumif()

조건을 함수 내부에서 바로 적용 가능


4. 활용 예시

  • 전체 사용량, 총 수치, 리소스 합계 계산에 유용

  • 조건부 합산이 필요한 경우 sumif() 사용

 

 

The any Command

1. 기능

  • 데이터셋에서 무작위로 행(Row) 하나를 선택하여 반환함

  • 성능 테스트나 샘플 데이터 추출에 유용

 

2. 기본 사용법

Perf | summarize any(*)
  • 전체 열에서 임의의 한 행 전체 컬럼값 반환

Perf | summarize any(Computer)
  • Computer 열에서 임의의 값 반환

Perf | summarize any(ObjectName), any(CounterName), any(CounterValue)
  • 지정한 여러 열의 무작위 행 값 추출

 

3. 그룹화와 함께 사용

Perf | summarize any(*) by CounterName
  • CounterName별로 각 그룹에서 무작위 행 하나씩 반환

 

4. 활용 목적

용도

설명

용도

설명

샘플 데이터 조회

무작위로 행을 선택해 테이블 상태 점검 가능

데이터 탐색 초기 분석

특정 컬럼의 대표 예시 값 확인

성능 개선을 위한 테스트

전체가 아닌 무작위 한 줄만 조회해 빠르게 테스트 가능

 

5. 특징

  • 매 실행 시마다 결과가 달라질 수 있음

  • 무작위성을 활용한 간단한 유효성 검사데이터 확인에 유리