근본 원인 분석을 위한 변칙 진단

KQL(Kusto 쿼리 언어)에는 비정상적인 동작을 위해 검사 기본 제공 변칙 검색 및 예측 함수가 있습니다. 이러한 패턴이 검색되면 RCA(근본 원인 분석)를 실행하여 변칙을 완화하거나 resolve 수 있습니다.

진단 프로세스는 복잡하고 길고 도메인 전문가가 수행합니다. 프로세스에는 다음이 포함됩니다.

  • 동일한 시간 프레임 동안 다른 원본에서 더 많은 데이터 가져오기 및 조인
  • 여러 차원에서 값 분포의 변경 검색
  • 더 많은 변수 차트
  • 도메인 지식과 직관을 기반으로 하는 기타 기술

이러한 진단 시나리오는 일반적이므로 기계 학습 플러그 인을 사용하여 진단 단계를 더 쉽게 만들고 RCA 기간을 단축할 수 있습니다.

다음 세 가지 Machine Learning 플러그 인은 모두 , 및 diffpatterns클러스터링 알고리즘을 구현합니다. basketautocluster autoclusterbasket 플러그 인은 단일 레코드 집합을 클러스터링하고 diffpatterns 플러그 인은 두 레코드 집합 간 차이를 클러스터링합니다.

단일 레코드 집합 클러스터링

일반적인 시나리오에는 다음과 같은 특정 기준에 의해 선택된 데이터 세트가 포함됩니다.

  • 비정상 동작을 보여 주는 시간 범위
  • 높은 온도 디바이스 판독값
  • 긴 지속 시간 명령
  • 상위 지출 사용자: 데이터에서 일반적인 패턴(세그먼트)을 찾는 빠르고 쉬운 방법을 원합니다. 패턴은 레코드가 여러 차원(범주 열)에 대해 동일한 값을 공유하는 데이터 세트의 하위 집합입니다.

다음 쿼리는 10분 bin에 1주 동안 서비스 예외의 시계열을 빌드하고 표시합니다.

let min_t = toscalar(demo_clustering1 | summarize min(PreciseTimeStamp));  
let max_t = toscalar(demo_clustering1 | summarize max(PreciseTimeStamp));  
demo_clustering1
| make-series num=count() on PreciseTimeStamp from min_t to max_t step 10m
| render timechart with(title="Service exceptions over a week, 10 minutes resolution")

서비스 예외 시간 차트

서비스 예외 수는 전체 서비스 트래픽과 상관 관계가 있습니다. 영업일인 월요일~금요일의 일일 패턴을 명확하게 확인할 수 있습니다. 정오에 서비스 예외 수가 증가하고 있으며 야간에는 수가 감소합니다. 주말에는 고르게 낮은 수가 표시됩니다. 시계열 변칙 검색을 사용하여 예외 급증을 검색할 수 있습니다.

데이터의 두 번째 급증은 화요일 오후에 발생합니다. 다음 쿼리를 사용하여 데이터가 급증하는지 여부를 추가로 진단하고 확인합니다. 이 쿼리는 1분 bin에 8시간의 더 높은 해상도로 급증 관련 차트를 다시 그립니다. 이후 해당 테두리를 살펴볼 수 있습니다.

let min_t=datetime(2016-08-23 11:00);
demo_clustering1
| make-series num=count() on PreciseTimeStamp from min_t to min_t+8h step 1m
| render timechart with(title="Zoom on the 2nd spike, 1 minute resolution")

급증 시간 차트에 집중합니다.

15:00에서 15:02로 2분 간 급증이 표시됩니다. 다음 쿼리에서 이 2분 시간 범위의 예외를 계산합니다.

let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| count
개수
972

다음 쿼리에서 972개 중 20개 예외를 샘플링합니다.

let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| take 20
PreciseTimeStamp 지역 ScaleUnit DeploymentId Tracepoint ServiceHost
2016-08-23 15:00:08.7302460 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 100005 00000000-0000-0000-0000-000000000000
2016-08-23 15:00:09.9496584 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 10007006 8d257da1-7a1c-44f5-9acd-f9e02ff507fd
2016-08-23 15:00:10.5911748 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 100005 00000000-0000-0000-0000-000000000000
2016-08-23 15:00:12.2957912 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 10007007 f855fcef-ebfe-405d-aaf8-9c5e2e43d862
2016-08-23 15:00:18.5955357 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 10007006 9d390e07-417d-42eb-bebd-793965189a28
2016-08-23 15:00:20.7444854 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 10007006 6e54c1c8-42d3-4e4e-8b79-9bb076ca71f1
2016-08-23 15:00:23.8694999 eus2 su2 89e2f62a73bb4efd8f545aeae40d7e51 36109 19422243-19b9-4d85-9ca6-bc961861d287
2016-08-23 15:00:26.4271786 ncus su1 e24ef436e02b4823ac5d5b1465a9401e 36109 3271bae4-1c5b-4f73-98ef-cc117e9be914
2016-08-23 15:00:27.8958124 scus su3 90d3d2fc7ecc430c9621ece335651a01 904498 8cf38575-fca9-48ca-bd7c-21196f6d6765
2016-08-23 15:00:32.9884969 scus su3 90d3d2fc7ecc430c9621ece335651a01 10007007 d5c7c825-9d46-4ab7-a0c1-8e2ac1d83ddb
2016-08-23 15:00:34.5061623 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 1002110 55a71811-5ec4-497a-a058-140fb0d611ad
2016-08-23 15:00:37.4490273 scus su3 90d3d2fc7ecc430c9621ece335651a01 10007006 f2ee8254-173c-477d-a1de-4902150ea50d
2016-08-23 15:00:41.2431223 scus su3 90d3d2fc7ecc430c9621ece335651a01 103200 8cf38575-fca9-48ca-bd7c-21196f6d6765
2016-08-23 15:00:47.2983975 ncus su1 e24ef436e02b4823ac5d5b1465a9401e 423690590 00000000-0000-0000-0000-000000000000
2016-08-23 15:00:50.5932834 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 10007006 2a41b552-aa19-4987-8cdd-410a3af016ac
2016-08-23 15:00:50.8259021 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 1002110 0d56b8e3-470d-4213-91da-97405f8d005e
2016-08-23 15:00:53.2490731 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 36109 55a71811-5ec4-497a-a058-140fb0d611ad
2016-08-23 15:00:57.0000946 eus2 su2 89e2f62a73bb4efd8f545aeae40d7e51 64038 cb55739e-4afe-46a3-970f-1b49d8ee7564
2016-08-23 15:00:58.2222707 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6 10007007 8215dcf6-2de0-42bd-9c90-181c70486c9c
2016-08-23 15:00:59.9382620 scus su3 90d3d2fc7ecc430c9621ece335651a01 10007006 451e3c4c-0808-4566-a64d-84d85cf30978

단일 레코드 집합 클러스터링에 autocluster() 사용

1,000개 미만의 예외가 있더라도 각 열에 여러 값이 있으므로 일반적인 세그먼트를 찾는 것은 여전히 어렵습니다. 다음 쿼리와 같이 autocluster() 플러그 인을 사용하여 일반적인 세그먼트의 짧은 목록을 즉시 추출하고 급증하는 2분 내에 원하는 클러스터를 찾을 수 있습니다.

let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| evaluate autocluster()
SegmentId 개수 백분율 지역 ScaleUnit DeploymentId ServiceHost
0 639 65.7407407407407 eau su7 b5d1d4df547d4a04ac15885617edba57 e7f60c5d-4944-42b3-922a-92e98a8e7dec
1 94 9.67078189300411 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6
2 82 8.43621399176955 ncus su1 e24ef436e02b4823ac5d5b1465a9401e
3 68 6.99588477366255 scus su3 90d3d2fc7ecc430c9621ece335651a01
4 55 5.65843621399177 weu su4 be1d6d7ac9574cbc9a22cb8ee20f16fc

위의 결과에서 가장 지배적인 세그먼트는 총 예외 레코드의 65.74%를 포함하고 4차원을 공유한다는 것을 알 수 있습니다. 다음 세그먼트는 훨씬 덜 일반적입니다. 레코드의 9.67%만 포함하며 3개 차원을 공유합니다. 다른 세그먼트는 이보다 더 일반적이지 않습니다.

Autocluster는 여러 차원을 마이닝하고 흥미로운 세그먼트를 추출하는 데 독자적인 알고리즘을 사용합니다. “흥미로운”은 각 세그먼트에서 레코드 집합과 기능 세트가 상당한 적용 범위를 가지고 있음을 의미합니다. 세그먼트도 분기됩니다. 즉, 각 세그먼트가 다른 세그먼트와 다릅니다. 이러한 세그먼트 중 하나 이상이 RCA 프로세스와 관련이 있을 수 있습니다. 세그먼트 검토와 평가를 최소화하기 위해 autocluster는 작은 세그먼트 목록만 추출합니다.

단일 레코드 집합 클러스터링에 basket() 사용

다음 쿼리와 같이 basket() 플러그 인을 사용할 수도 있습니다.

let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| evaluate basket()
SegmentId 개수 백분율 지역 ScaleUnit DeploymentId Tracepoint ServiceHost
0 639 65.7407407407407 eau su7 b5d1d4df547d4a04ac15885617edba57 e7f60c5d-4944-42b3-922a-92e98a8e7dec
1 642 66.0493827160494 eau su7 b5d1d4df547d4a04ac15885617edba57
2 324 33.3333333333333 eau su7 b5d1d4df547d4a04ac15885617edba57 0 e7f60c5d-4944-42b3-922a-92e98a8e7dec
3 315 32.4074074074074 eau su7 b5d1d4df547d4a04ac15885617edba57 16108 e7f60c5d-4944-42b3-922a-92e98a8e7dec
4 328 33.7448559670782 0
5 94 9.67078189300411 scus su5 9dbd1b161d5b4779a73cf19a7836ebd6
6 82 8.43621399176955 ncus su1 e24ef436e02b4823ac5d5b1465a9401e
7 68 6.99588477366255 scus su3 90d3d2fc7ecc430c9621ece335651a01
8 167 17.1810699588477 scus
9 55 5.65843621399177 weu su4 be1d6d7ac9574cbc9a22cb8ee20f16fc
10 92 9.46502057613169 10007007
11 90 9.25925925925926 10007006
12 57 5.8641975308642 00000000-0000-0000-0000-000000000000

Basket은 항목 세트 마이닝을 위해 “Apriori” 알고리즘을 구현합니다. 레코드 집합의 적용 범위가 임계값을 초과하는 모든 세그먼트를 추출합니다(기본값 5%). 더 많은 세그먼트가 세그먼트 0, 1 또는 2, 3과 같이 비슷한 세그먼트와 함께 추출됨을 알 수 있습니다.

두 플러그 인은 모두 강력하고 사용하기 쉽습니다. 해당 제한 사항은 레이블 없이 자율 방식으로 단일 레코드 집합을 클러스터링하는 것입니다. 추출된 패턴이 선택된 레코드 집합, 비정상 레코드 또는 전역 레코드 집합의 특징을 결정하는지 여부는 명확하지 않습니다.

두 레코드 집합의 차이 클러스터링

diffpatterns() 플러그 인은 autoclusterbasket의 한계를 극복합니다. Diffpatterns는 두 개의 레코드 집합을 사용하고 서로 다른 기본 세그먼트를 추출합니다. 한 집합은 일반적으로 조사 중인 비정상 레코드 집합을 포함합니다. 하나는 autoclusterbasket을 통해 분석됩니다. 다른 집합에는 참조 레코드 집합인 기준이 포함됩니다.

다음 쿼리에서 는 diffpatterns 스파이크의 2분 내에 기준 내의 클러스터와 다른 흥미로운 클러스터를 찾습니다. 기준 시간 범위는 급증이 시작된 15:00 이전 8분으로 정의됩니다. 이진 열(AB)을 기준으로 확장하고 특정 레코드가 기준 또는 비정상 집합에 속하는지 여부를 지정합니다. Diffpatterns는 두 클래스 레이블이 비정상 및 기준 플래그(AB)에 의해 생성된 감독 학습 알고리즘을 구현합니다.

let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
let min_baseline_t=datetime(2016-08-23 14:50);
let max_baseline_t=datetime(2016-08-23 14:58); // Leave a gap between the baseline and the spike to avoid the transition zone.
let splitime=(max_baseline_t+min_peak_t)/2.0;
demo_clustering1
| where (PreciseTimeStamp between(min_baseline_t..max_baseline_t)) or
        (PreciseTimeStamp between(min_peak_t..max_peak_t))
| extend AB=iff(PreciseTimeStamp > splitime, 'Anomaly', 'Baseline')
| evaluate diffpatterns(AB, 'Anomaly', 'Baseline')
SegmentId CountA CountB PercentA PercentB PercentDiffAB 지역 ScaleUnit DeploymentId Tracepoint
0 639 21 65.74 1.7 64.04 eau su7 b5d1d4df547d4a04ac15885617edba57
1 167 544 17.18 44.16 26.97 scus
2 92 356 9.47 28.9 19.43 10007007
3 90 336 9.26 27.27 18.01 10007006
4 82 318 8.44 25.81 17.38 ncus su1 e24ef436e02b4823ac5d5b1465a9401e
5 55 252 5.66 20.45 14.8 weu su4 be1d6d7ac9574cbc9a22cb8ee20f16fc
6 57 204 5.86 16.56 10.69

가장 주요한 세그먼트는 autocluster를 통해 추출된 세그먼트와 동일합니다. 2분 비정상 시간 범위의 적용 범위도 65.74%입니다. 그러나 8분 기준 시간 범위의 적용 범위는 1.7%뿐입니다. 차이는 64.04%입니다. 이 차이는 비정상 급증과 관련된 것으로 보입니다. 이 가정을 확인하기 위해 다음 쿼리는 원래 차트를 이 문제가 있는 세그먼트에 속한 레코드와 다른 세그먼트의 레코드로 분할합니다.

let min_t = toscalar(demo_clustering1 | summarize min(PreciseTimeStamp));  
let max_t = toscalar(demo_clustering1 | summarize max(PreciseTimeStamp));  
demo_clustering1
| extend seg = iff(Region == "eau" and ScaleUnit == "su7" and DeploymentId == "b5d1d4df547d4a04ac15885617edba57"
and ServiceHost == "e7f60c5d-4944-42b3-922a-92e98a8e7dec", "Problem", "Normal")
| make-series num=count() on PreciseTimeStamp from min_t to max_t step 10m by seg
| render timechart

diffpattern 세그먼트 시간 차트 유효성 검사

이 차트를 사용하여 화요일 오후의 급증이 diffpatterns 플러그 인을 통해 검색된 이 특정 세그먼트의 예외로 인해 발생했는지 확인할 수 있습니다.

요약

Machine Learning 플러그 인은 많은 시나리오에 유용합니다. autoclusterbasket은 자율 학습 알고리즘을 구현하고 사용하기 쉽습니다. Diffpatterns는 감독 학습 알고리즘을 구현하며 더 복잡하지만 RCA의 차별화 세그먼트를 추출하는 데는 더 강력합니다.

이 플러그 인은 임시 시나리오와 자동 근 실시간 모니터링 서비스에서 대화형으로 사용됩니다. 시계열 변칙 검색 뒤에 진단 프로세스가 수행됩니다. 이 프로세스는 필요한 성능 표준을 충족하도록 고도로 최적화되어 있습니다.