Azure Monitor에서 Kusto 쿼리 언어(KQL) 소개

Azure Monitor를 사용하면 애플리케이션, 서비스 및 서버의 가용성 및 성능을 분석할 수 있습니다.
Azure Monitor를 사용하면 로그와 지표를 기준으로 질의를 작성할 수 있습니다.이러한 질의는 Kusto 질의 언어 또는 KQL로 작성됩니다.이 언어는 Azure Monitor 쿼리는 물론 Azure Data Explorer에도 사용되는 SQL 사투리와 유사합니다.
KQL은 MS SQL Server나 MySql 같은 표준 데이터베이스 쿼리 언어를 기반으로 하며 테이블과 열 등의 개념을 지원합니다.
각 환경마다 다르기 때문에 본고에서 사용한 코드를 사용할 수 있도록 Azure가 제공하는 프레젠테이션 환경을 사용하도록 하겠습니다.너는 그것을 찾을 수 있다here
너는 마땅히 이 페이지에서 끝내야 한다

왼쪽에서, 모든 테이블을 분류별로 볼 수 있고, 오른쪽 상단에서 조회 편집기를 볼 수 있습니다.
질의에 술어를 추가하려면 | 문자를 사용해야 합니다.파이프 문자는 KQL에서 다른 표현식을 나타냅니다.
관례에 따르면, 더욱 좋은 가독성을 위해서는 어떤 표현식이나 술어 전에 리턴 문자를 추가해야 한다.
특정 컴퓨터 DC01을 검색하는 방법나나야.콘토소 호텔.예를 들면 com입니다.
할 수 있는 첫 번째 질의는 검색 연산자를 사용하는 것입니다.검색 연산자는 테이블의 모든 열에서 값을 검색합니다.
InsightsMetrics 
| search  "DC01.NA.contosohotels.com"
KQL에 대해 알아야 할 것은 이 언어는 대소문자, 표, 연산자, 값이 대소문자를 구분한다는 것이다.이벤트 검색 작업은 대소문자를 구분합니다.
조회 편집기에 잘못된 테이블 이름을 입력하면 '테이블, 열, 표량 표현식...' 을 처리할 수 없습니다.
조회 편집기에 Insightsmetrics를 입력하고 '실행' 단추를 눌러 보세요.질의는 실패해야 하지만 Insightsmetrics를 Insightsmetrics로 변경하여 테이블 이름을 수정하면 질의가 정상적으로 실행되어야 합니다.
InsightsMetrics 테이블에는 심박수, CPU, 디스크 등 VM Insights에서 수집한 모든 지표가 포함됩니다.
편집기에서 테이블 이름을 입력하면 전체 테이블이 표시됩니다.SQL로 변환하면 TableName에서 *을 선택합니다.
이 검색을 실행하면 데이터 집합을 제공합니다.그러나 필터가 없습니다. 데이터 집합이 전체 테이블입니다.결과를 제한하려면 술어를 사용해야 한다.
그러나 성능은 매우 중요하기 때문에 검색 업체는 좋은 선택이 아니다.대신 WHERE 연산자와 필터링할 열의 이름을 사용할 수 있습니다.컴퓨터 이름은 컴퓨터 열에 저장됩니다.
InsightsMetrics 
| where Computer ==  "DC01.NA.contosohotels.com"
==표현식은 열의 정확한 항목을 검사합니다.이 말
대소문자를 구분하기 때문에 "dc01.NA.contosohots.com"을 입력하는 것으로 변경하면 검색이 아무런 결과도 돌아오지 않습니다.
대소문자를 구분하지 않는 검색을 수행하려면 =~표현식을 사용합니다.
InsightsMetrics 
| where Computer =~ "dc01.NA.contosohotels.com"
has 조작부호도 사용할 수 있습니다
InsightsMetrics 
| where Computer has "dc01.NA.contosohotels.com"
has 연산자는 전체 컴퓨터 이름이 아닌 문자열의 일부 dc01을 검색하는 데 사용할 수 있습니다.
InsightsMetrics 
| where Computer has "dc01"
그러나 조회표에서는 최신 데이터나 특정 시간대의 데이터만 필요할 수 있다.
2020년 12월 27일 오전 7시 30분에서 8시 30분 사이의 데이터를 얻으려면 다음과 같은 조회를 사용할 수 있습니다.
InsightsMetrics 
| where TimeGenerated  >= datetime('2020-12-27 07:30:00') and  TimeGenerated <= datetime('2020-12-27 08:30:00')
TimeGenerated 열의 데이터 형식은 DateTime이기 때문에 DateTime 함수를 사용하여 데이터를 DateTime 데이터 형식으로 변환해야 합니다.
현재 시간과 시간 경계에서 결과를 얻으려면ago() 함수를 사용할 수 있습니다.이 함수는 현재 날짜와 시간을 시간 간격으로 줄입니다.
지금부터 1시간 사이의 데이터를 필터합니다.
InsightsMetrics 
| where TimeGenerated  >= ago(1h)
시간 간격을 지정하려면 다음 식별자 중 하나를 사용하십시오
  • 시간
  • m
  • ms
  • 만약 당신이 지난 이틀간의 데이터를 얻고 싶다면
    InsightsMetrics 
    | where TimeGenerated  >= ago(2d)
    
    질의에 필터를 결합할 수 있습니다.한 컴퓨터에서 데이터를 선택하고 선택한 시간 범위 내에서 데이터를 선택할 수 있습니다.
    InsightsMetrics 
    | where TimeGenerated  >= ago(1h)
    | where Computer ==  "DC01.NA.contosohotels.com"
    
    첫 번째 필터는 시간 필터입니다.Kusto는 시간 필터를 관리하기 위해 최적화되었습니다.첫 번째 위치에서 시간 필터를 사용하면 성능 문제가 발생하지 않고 쉽게 조회할 수 있는 데이터 집합을 만들 수 있습니다.
    이제 표에서 더 많은 데이터를 어떻게 추출하는지 발굴해 봅시다.
    InsightsMetrics표는 가상 기기의 지표를 저장하는데 프로세서 이용률, 네트워크, 메모리, 네트워크와 디스크 계수기를 포함한다.이 도량은 이름 공간과 계수기 이름 (name) 에 따라 구성됩니다.
    가상 시스템의 전체 목록은 어떻게 얻을 수 있습니까?이 동작을 실행하려면 이름 공간과 이름을 집합해야 합니다.
    InsightsMetrics 
    | where Computer ==  "DC01.NA.contosohotels.com"
    | summarize by Namespace, Name
    
    연산자는 이름 공간과 이름을 새 테이블에 집합합니다.카운터가 결과에 나타나는 횟수를 보기 위해 계수를 추가할 수 있습니다.
    InsightsMetrics 
    | where Computer ==  "DC01.NA.contosohotels.com"
    | summarize count() by Namespace, Name
    
    지난 10분 동안의 도량 값을 기록하기 위해 필터를 추가할 수도 있습니다.
    InsightsMetrics 
    | where TimeGenerated >= ago(10m)
    | where Computer ==  "DC01.NA.contosohotels.com"
    | summarize  count() by Namespace, Name
    
    약 10개의 프로세서/사용률 비율을 볼 수 있습니다.그들을 보러 가다
    InsightsMetrics 
    | where TimeGenerated >= ago(10m)
    | where Computer ==  "DC01.NA.contosohotels.com"
    | where Namespace == "Processor" and Name == "UtilizationPercentage"
    
    프로젝트 조작부호를 출력할 열 목록과 함께 사용하면 출력을 필요한 열로 제한할 수 있습니다.
    InsightsMetrics 
    | where TimeGenerated >= ago(10m)
    | where Computer ==  "DC01.NA.contosohotels.com"
    | where Namespace == "Processor" and Name == "UtilizationPercentage"
    | project TimeGenerated, Val
    
    마지막 검색에서 값 목록과 해당하는 도량 시간을 포함하는 표를 얻을 수 있습니다.그러나 쿠스토는 우리에게 더 좋은 방식으로 이 데이터를 보여 주었다.Kusto에서는 렌더 작업자를 사용하여 도면을 작성할 수 있습니다.출력을 그래픽으로 변경합니다.시간도, 산점도, 면적도, 줄무늬도, 기둥모양도, 기둥모양도를 선택할 수도 있고, 기본 출력 표를 선택할 수도 있습니다.
    InsightsMetrics 
    | where TimeGenerated >= ago(30m)
    | where Computer ==  "DC01.NA.contosohotels.com"
    | where Namespace == "Processor" and Name == "UtilizationPercentage"
    | project Val, TimeGenerated
    | render areachart 
    
    얘가 돌아왔어요.

    CPU 활용도를 분석하려면 이 결과를 다른 컴퓨터와 비교하는 것이 좋습니다.== 연산자가 아닌 in 연산자를 사용해야 합니다.에서 (및)로 묶인 데이터 세트에 따라 결과를 필터링합니다.
    InsightsMetrics 
    | where TimeGenerated >= ago(1h)
    | where Computer in ("DC01.NA.contosohotels.com" , "DC11.NA.contosohotels.com") 
    | where Namespace == "Processor" and Name == "UtilizationPercentage"
    | project Val , TimeGenerated,Computer
    | render timechart   
    
    in 표현식은 두 대의 컴퓨터 DC01과 DC11을 포함한다.당신은 또한 두 가지 변화를 주의할 수 있습니다.프로젝트 연산자는 새 열 컴퓨터의 출력을 제한하는 데 사용됩니다.이것은 도표의 필수 과목이다.마지막으로, 더 좋은 가독성을 위해 렌더링 옵션이 시간 그래프로 변경되었습니다.
    결과는요

    같은 도표를 만들려고 할 수도 있지만, 두 대 이상의 컴퓨터를 사용해야 합니다.
    DC로 시작하는 컴퓨터의 이름을 사용하여 차트를 만들려면 startswith 또는 startswith cs를 사용합니다.두 번째 선택이 더 좋다.우리는 모든 컴퓨터 이름이 DC로 시작하여 대소문자를 구분하는 검색 효율이 높다는 것을 알고 있기 때문에 startswith cs를 사용할 수 있습니다.
    InsightsMetrics 
    | where TimeGenerated >= ago(1h)
    | where Computer startswith_cs "DC" 
    | where Namespace == "Processor" and Name == "UtilizationPercentage"
    | project Val , TimeGenerated,Computer
    | render timechart   
    
    질의에서 계산할 수 있습니다.예를 들어, 사용 가능한 메모리 양을 얻기 위해 이름 공간 메모리를 질의하면 반환되는 값은 MB 단위입니다.extend 연산자를 사용하여 값을 GB로 변환할 수 있습니다.
    InsightsMetrics 
    | where TimeGenerated >= ago(10m)
    | where Computer ==  "DC01.NA.contosohotels.com"
    | where Namespace == "Memory" and Name == "AvailableMB"
    | extend FreeMemGb = Val/1024
    | project TimeGenerated, FreeMemGb
    
    extend를 사용하려면, 다음에 따라 = 과 계산된 다른 열에 속하지 않는 새 값인 FreeGb를 만들어야 합니다.프로젝트 조작부호를 사용하여 출력을 추가할 수 있는 새 열FreeMemGb를 만들 것입니다.
    그러나 만약에 빈 메모리의 수량, 절대값을 가지고 싶지 않다면 빈 메모리의 비율이 얼마나 되는지 알고 싶으세요?이 질의를 사용하여 테이블에 더 가까이 이동하는 경우:
    InsightsMetrics 
    | where TimeGenerated >= ago(10m)
    | where Computer ==  "DC01.NA.contosohotels.com"
    | where Namespace == "Memory" and Name == "AvailableMB"
    
    Tags라는 열이 표시됩니다.여기에는 다음 값 {"vm.azm.ms/memorySizemB":8191.55078125}이 포함되어 있습니다.백분율을 계산하려면 JSON에서 데이터를 추출해야 합니다(819.155078125).
    첫 번째 질문은 Val 및 Tags 열의 데이터 유형입니다.KQL은 이 질문에 대답할 수 있습니다.
    InsightsMetrics 
    | where TimeGenerated >= ago(10m)
    | where Computer ==  "DC01.NA.contosohotels.com"
    | where Namespace == "Memory" and Name == "AvailableMB"
    | extend typeVal = gettype(Val)
    | extend typeTags = gettype(Tags)
    
    Val은 실수이고 Tags는 문자열입니다.
    두 번째 질문은 백분율을 계산하기 전에 JSON 데이터를 태그에서 실제 값으로 어떻게 변환하는가입니다.
    vm의 값을 추출하는 두 가지 절차가 있습니다.azm.JSON 데이터의 ms/memory SizemB입니다.toobject() 함수를 사용하여col을 JSON 데이터로 사용하고 결과를 [vm.azm.ms/memorySizemB]에서 가져올 수 있습니다.
    toobject(Tags)["vm.azm.ms/memorySizeMB"]
    
    두 번째 단계에서는 문자열에서 실수로 값을 변환합니다.이를 위해서는 함수 toreal () 을 사용해야 합니다.
    toreal(toobject(Tags)["vm.azm.ms/memorySizeMB"])
    
    너는 새로운 백분율로 계산할 수 있다
    | extend AvailableMemoryPercentage = (Val / toreal(toobject(Tags)["vm.azm.ms/memorySizeMB"])) * 100.0
    
    결과는 진실이다. 너는 결과를 반올림하려고 할지도 모른다.함수 round ()를 사용해야 합니다.그것은 반올림할 숫자와 정밀도 두 개의 매개 변수를 필요로 한다
    | extend AvailableMemoryPercentage = round((Val / toreal(toobject(Tags)["vm.azm.ms/memorySizeMB"])) * 100.0, 2)
    
    전체 질의
    InsightsMetrics 
    | where TimeGenerated >= ago(10m)
    | where Computer ==  "DC01.NA.contosohotels.com"
    | where Namespace == "Memory" and Name == "AvailableMB"
    | extend AvailableMemoryPercentage = round((Val / toreal(toobject(Tags)["vm.azm.ms/memorySizeMB"])) * 100.0, 2)
    | project AvailableMemoryPercentage
    
    이렇게 질의를 다시 작성할 수 있습니다.
    InsightsMetrics 
    | where TimeGenerated >= ago(10m)
    | where Computer ==  "DC01.NA.contosohotels.com"
    | where Namespace == "Memory" and Name == "AvailableMB"
    | extend AvailableMemoryPercentage = round(
            (Val / toreal(
                toobject(Tags)["vm.azm.ms/memorySizeMB"]
                )
            ) * 100.0
            , 2
        )
    | project AvailableMemoryPercentage
    
    너는 백분율의 계산이 여기에 그치지 않는다고 생각할 수도 있다.다른 질의나 다른 값에서 이 공식을 사용하기를 원할 수도 있습니다.
    let 문을 사용하여 Kusto에서 함수를 만들 수 있는 방법이 있습니다.이것은 검색의 다른 부분에서 사용할 수 있는 명칭에 표현식을 연결합니다.
    를 사용하여 변수 만들기
    let vmName = "DC01.NA.contosohotels.com";
    
    InsightsMetrics 
    | where TimeGenerated >= ago(10m)
    | where Computer ==  vmName
    | where Namespace == "Memory" and Name == "AvailableMB"
    
    변수를 만들려면, 변수 이름 뒤에 let 문장, = 기호, 데이터를 사용해야 합니다.let 문장은 반드시 반열로 끝내야 한다.
    우리도 완전한 표현식을 포함하고 함수를 만들 수 있도록 허용합니다.이 예에서let문장은 두 부분으로 나뉘는데 첫 번째 부분은 처음에 괄호로 묶고 함수의 매개 변수를 정의한다.함수 중의 매개 변수는 유형화된 것이다.매개 변수를 설명하려면, 매개 변수의 이름을 입력해야 합니다. 다음: 데이터 형식paramName: type (real,string,...).
    두 번째 부분은 {}로 묶어서 표현식을 정의하고 값을 되돌려줍니다.
    반올림 비율을 되돌려주는 함수 만들기
    let roundedFreePercentage = (
            freeValue: real,
            TotalValue: real 
        )
    {
        round(
            (freeValue / TotalValue) * 100.0
            , 2
        )
    };
    
    InsightsMetrics 
    | where TimeGenerated >= ago(10m)
    | where Computer ==  "DC01.NA.contosohotels.com"
    | where Namespace == "Memory" and Name == "AvailableMB"
    | extend AvailableMemoryPercentage = roundedFreePercentage(Val, toreal(toobject(Tags)["vm.azm.ms/memorySizeMB"]))
    | project AvailableMemoryPercentage
    
    Kusto 쿼리 언어에 대한 간략한 설명은 Azure Monitor를 쿼리하여 Azure Monitor 메트릭과 이벤트에서 데이터를 추출하는 방법을 더 잘 알 수 있습니다.KQL에 대한 자세한 내용을 보려면Microsoft Documentation 또는 보기MS Learn Module

    좋은 웹페이지 즐겨찾기