4tdg-20250912 [PS] Kusto Query Language (KQL) from Scratch 1

4tdg-20250912 [PS] Kusto Query Language (KQL) from Scratch 1

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

 

 

 

 

 

 

Introduction

 

  • 주요 학습 내용

    • 기초 연산자 학습 (초기 모듈): 전체의 80%를 차지하는 주요 연산자 집중 소개

    • 스칼라 연산자: 계산, 조건 처리, 문자열/날짜 처리

    • 고급 집계: max, sum 외에도 makeset, makelist, mvexpand 등 KQL 고유 기능

    • 데이터셋 다루기: join, union, datatable, materialize 등 SQL과 유사 + 고급 기능

    • 시계열 분석: 시간 기반 분석 도구

    • 기초 머신러닝 기능: 장바구니 분석, 군집화 등

    • 데이터 내보내기: CSV 파일 또는 Power BI로 출력

  • KQL이 사용되는 플랫폼

    • Azure Log Analytics

    • Azure Application Insights

    • Microsoft Defender ATP

    • Azure Security Center

    • 쿼리 문법은 동일, 데이터만 다름

  • 실습 환경

    • Microsoft 제공 무료 데모 플랫폼 활용

    • 수강 중 직접 Azure Log Analytics에서 실습 가능

 

 

 

80% of the Operator You’ll Ever Use

 

The Search Command

Log Analytics 데모 환경

1. search 연산자

  • 기본 기능

    • 하나 이상의 테이블과 컬럼에서 특정 텍스트 문자열 검색

    • 예시: Perf | search "Memory"

  • 주요 특징

    • 기본적으로 대소문자 구분 없음

    • 대소문자 구분 검색: search kind=case_sensitive "Memory"

search kind=case_sensitive "Memory"
image-20250613-004553.png
  • 검색 범위

    • 전체 데이터베이스 검색 가능 (성능 저하 가능성 있음)

    • 특정 테이블 지정 가능: search in (Perf, Event, Alert) "Contoso"

  • 시간 범위 설정

    • UI에서 설정 가능 (예: 최근 24시간, 7일 등)

    • 쿼리 내에서도 설정 가능

 

2. 특정 컬럼 검색

  • 정확한 값 검색:
    Perf | search CounterName == "Available MBytes"

AppPerformanceCounters | search Counter == "Available Bytes"
image-20250613-010007.png
  • 부분 문자열 검색:
    Perf | search CounterName : "MBytes"

 

3. 와일드카드 검색

  • 전체 컬럼에서 포함 여부 검색:
    search "*Bytes*"

AppPerformanceCounters | search "*Bytes*"
image-20250613-010400.png
  • 시작 문자열 검색:
    search * startswith "Bytes"

AppPerformanceCounters | search * startswith "Pri"
image-20250613-012918.png

 

  • 끝 문자열 검색:
    search * endswith "Bytes"

  • 중간 문자열 무시:
    search * "Free*bytes"

AppPerformanceCounters | search "c9*94"
image-20250613-014408.png

 

4. 복합 조건 검색

  • 예시: "Free*bytes" 포함 + InstanceNameC: 또는 D:인 경우

AppPerformanceCounters | search "c9*94" and ("Process" or "ASP")
image-20250613-014930.png

 

5. 정규 표현식 검색

  • 특정 패턴 검색 가능
    예: InstanceNameA:~Z: 형식인 경우

AppPerformanceCounters | search Category matches regex "[A-Z]SP"
image-20250613-020752.png

 

6. 성능 팁

  • 가능한 경우 특정 컬럼을 지정하여 검색 → 성능 향상

  • 다양한 검색 방식 (==, :, startswith, endswith, regex)을 상황에 맞게 활용

 

 

The Where Command

Log Analytics 데모 환경

1. where 절의 기본 기능

  • 특정 조건에 따라 결과를 필터링하는 데 사용

  • search는 여러 열에서 특정 값(텍스트)를 찾고, where특정 열에 대한 조건식을 기반으로 필터링함

 

2. 시간 기반 필터링 (TimeGenerated + ago)

  • 대부분의 테이블에 있는 TimeGenerated 열을 기준으로 시간 조건 적용

  • ago() 함수: 현재 시간 기준 상대적 시간 범위를 지정
    예: where TimeGenerated >= ago(1h) (최근 1시간 데이터)

  • ms (밀리초), us (마이크로초)) 등 원하는 만큼 능

 

3. 조건 조합

  • AND / OR 조합 가능
    예:

    where CounterName == "Bytes Received/sec" or CounterName == "% Processor Time" and CounterValue > 0

     

  • 다단 필터링 (파이프 사용)
    중간 계산, 가독성 향상에 유리

    | where TimeGenerated >= ago(1h) | where CounterName == "Bytes Received/sec"

     

4. 문자열 매칭 연산자

연산자

설명

연산자

설명

contains

문자열 포함

startswith / endswith

시작 또는 끝 위치에서 매칭

hasprefix / hassuffix

단어 기준으로 시작/끝 매칭

matches regex

정규표현식 사용

  • hasprefix

AppPerformanceCounters | where * hasprefix "petclinic" //| where * hassuffix "petclinic"
image-20250614-112639.png
  • hassuffix : 정상 동작 ??

AppPerformanceCounters //| where * hasprefix "petclinic" | where * hassuffix "petclinic"
image-20250614-113320.png

 

5. search처럼 활용하는 방법

  • where * contains "Bytes" 형태로 전체 컬럼 검색도 가능

contains vs has

// contains 예시 Perf | where CounterName contains "tes" // "Bytes", "test", "Interest" 모두 포함됨 // has 예시 Perf | where CounterName has "Bytes" // "Bytes Received/sec" 가능 // "ByteStream" X (단어가 아님)
  • 정확한 단어 매칭이 필요하면 has

  • 부분 문자열 검색이 필요하면 contains 사용

 

6. 예시 쿼리

Perf | where TimeGenerated >= ago(1h) | where (CounterName == "Bytes Received/sec" or CounterName == "% Processor Time") | where CounterValue > 0

→ 최근 1시간 내, 특정 성능 카운터에서 실제 값이 있는 데이터만 추출

 

 

The Take Command

Log Analytics 데모 환경

1. take 연산자 기본 기능

  • take은 입력 데이터에서 무작위로 지정된 수의 행을 반환하는 명령어

→ 명령 실행할 때마다 결과가 달라질 수 있음.

  • 주로 쿼리 결과의 작동 여부를 빠르게 확인하거나 대용량 데이터셋의 처리 시간을 줄이기 위해 사용

  • limittake의 동의어로, 동일한 기능을 수행

 

2. 사용 예시

Perf | take 10 Perf | limit 10 Perf | where CounterValue > 0 | take 5

 

 

 

The Summarize Command

Log Analytics 데모 환경

1. summarize 연산자요약

항목

설명

항목

설명

기능

데이터를 하나 이상의 열 기준으로 집계(aggregate)

구문

summarize [새_열_이름 =] 집계함수() by 열이름 [, 열이름...]

유사 용어

SQL의 GROUP BY와 유사

주요 집계 함수

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

 

2. 예제 및 설명

예제

설명

예제

설명

`Perf

summarize count() by CounterName`

`Perf

summarize PerfCount = count() by ObjectName, CounterName`

→ count() by 만을 사용하면 컬럼 이름이 기본적으로 _count로 표기됨. 이를 PerfCount라는 원하는 컬럼 이름으로 변경.

`Perf

where CounterName == "% Free Space"
summarize NumberOfEntries = count(), AverageFreeSpace = avg(CounterValue) by CounterName`

`Perf

summarize NumberOfEntries = count() by bin(TimeGenerated, 1d)`

`Perf

summarize count() by bin(CounterValue, 10)`

 

3. 추가 팁

  • bin(열, 시간/숫자) : 시간 또는 숫자를 그룹으로 묶을 때 사용

  • summarize열 순서에 따라 결과 정렬 및 해석에 영향을 줄 수 있음

  • 시간 기반 분석에는 startofday(), endofday(), between 함수와 함께 사용 시 더욱 정확한 결과 가능

 

 

 

The Extend Command

Log Analytics 데모 환경

1. 기능

  • 쿼리 결과에 새 컬럼(기존 컬럼 값 기반으로 계산된 값 또는 조합된 문자열)을 추가함

  • extend 연산자는 데이터를 분석하거나 보고서를 만들 때 필요한 추가 정보를 유연하게 생성할 수 있게 해주는 강력한 도구입니다. 기존 데이터만으로는 부족할 때, 새로운 관점의 데이터를 만들어 분석에 활용할 수 있습니다.

 

2. 사용 예시

Perf | where CounterName == "Free Megabytes" | extend FreeGB = CounterValue / 1000
  • CounterValue 값을 기준으로 GB 단위를 계산하여 FreeGB라는 새로운 컬럼 생성

 

3. 여러 컬럼 동시에 생성

| extend FreeGB = CounterValue / 1000, FreeKB = CounterValue * 1000
  • 복수의 새 컬럼을 한 줄에서 생성 가능

 

4. 컬럼 이름 변경 목적 사용

| extend FreeMB = CounterValue
  • 기존 값 그대로 다른 이름으로 출력 가능 (원본 컬럼은 그대로 유지됨)

 

5. 문자열 결합

| extend ObjectCounter = strcat(ObjectName, " - ", CounterName)
  • strcat() 함수로 문자열 컬럼들 연결 (예: "Memory - %Available Memory")

 

6. 주의 사항

  • 새로 생성된 컬럼은 기본적으로 출력의 맨 오른쪽에 위치

  • 본래 컬럼은 삭제되지 않고 유지됨

 

 

 

The Project Command

Log Analytics 데모 환경

1. project

  • 원하는 컬럼만 선택해서 출력

  • SELECT column1, column2 ... 와 유사 (SQL 관점)

  • 예시:

    Perf | project ObjectName, CounterName, InstanceName, CounterValue, TimeGenerated

     

2. project + extend 조합

  • 먼저 필요한 컬럼만 project, 이후 extend로 계산 컬럼 추가

  • 또는 반대로 extend 후 다시 project로 불필요 컬럼 제거

    Perf | extend FreeGB = CounterValue / 1000 | project ObjectName, FreeGB

     

3. project 내 계산도 가능

  • extend 없이 project 내부에서 새로운 컬럼 정의 가능

    Perf | project FreeGB = CounterValue / 1000, FreeMB = CounterValue, FreeKB = CounterValue * 1000

     

4. project-away

  • 특정 컬럼만 제외하고 나머지 모두 출력

  • 새로운 컬럼이 나중에 추가되더라도 자동 포함됨

    Perf | project-away TenantId, SourceSystem

     

5. project-rename

  • 컬럼 이름 변경

    Perf | project-rename myRenamedComputer = Computer

     

6. 요약 핵심

연산자

역할

연산자

역할

project

원하는 컬럼만 출력

project-away

특정 컬럼 제외하고 모두 출력

project-rename

컬럼 이름 변경

이 연산자들은 결과를 간결하게 정리하고 불필요한 정보 제거에 매우 유용합니다.

 

 

 

The Distinct Command

Log Analytics 데모 환경

1. 기능

  • 지정한 컬럼 조합의 고유한 값만 출력

  • 중복된 데이터는 제거되어 1번만 표시

 

2. 예시

Perf | distinct ObjectName, CounterName
  • ObjectName + CounterName 조합이 동일한 값이 여러 번 존재해도 1행만 출력됨

 

3. 활용 예

  • 오류 이벤트의 고유한 소스(Source) 목록 추출:

Event | where EventLevelName == "Error" | distinct Source
  • 특정 이벤트가 한 번이라도 발생한 Source 목록만 반환

 

4. 요약 표

목적

사용법 예시

목적

사용법 예시

중복 제거된 고유 조합 출력

distinct ObjectName, CounterName

고유한 에러 소스 목록 조회

`Event

distinct고유한 데이터 파악, 목록 추출 등에 유용하게 쓰입니다.

 

 

 

The Top Command

Log Analytics 데모 환경

1. 기능

  • 결과에서 상위 N개의 행만 추출

  • 주로 정렬 기준과 함께 사용

 

2. 기본 문법

Perf | top 20 by TimeGenerated desc
  • TimeGenerated 기준으로 최신 데이터를 기준으로 20개 추출