다음을 통해 공유


근본 원인 분석을 위한 이상 진단

적용 대상: ✅Microsoft Fabric

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

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

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

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

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

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

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

  • 비정상적인 동작을 보여 주는 시간 창
  • 고온 디바이스 판독값
  • 긴 기간 명령
  • 상위 지출 사용자

데이터에서 공통 패턴(세그먼트)을 빠르고 쉽게 찾을 수 있는 방법을 원합니다. 패턴은 레코드가 여러 차원(범주 열)에 대해 동일한 값을 공유하는 데이터 세트의 하위 집합입니다.

다음 쿼리는 1주일 동안의 서비스 예외의 일련의 시간대를 10분 간격으로 구성하고 보여줍니다.

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
정확한시간표시 지역 ScaleUnit 배포ID 추적점 서비스 호스트
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 엔커스 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

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()
세그먼트 ID 수량 백분율 지역 ScaleUnit 배포ID ServiceHost
0 639 65.7407407407407 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 프로세스와 관련이 있을 수 있습니다. 세그먼트 검토 및 평가를 최소화하기 위해 자동 클러스터는 작은 세그먼트 목록만 추출합니다.

다음 쿼리에 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()
세그먼트 ID 수량 백분율 지역 ScaleUnit 배포ID 추적점 서비스 호스트
0 639 65.7407407407407 su7 b5d1d4df547d4a04ac15885617edba57 e7f60c5d-4944-42b3-922a-92e98a8e7dec
1 642 66.0493827160494 su7 b5d1d4df547d4a04ac15885617edba57
2 324 33.3333333333333 su7 b5d1d4df547d4a04ac15885617edba57 0 e7f60c5d-4944-42b3-922a-92e98a8e7dec
3 315 32.4074074074074 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')
세그먼트 ID CountA (카운트A) CountB PercentA PercentB 퍼센트 차이 AB 지역 ScaleUnit 배포ID 추적점
0 639 21 65.74 1.7 64.04 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 플러그 인은 많은 시나리오에 유용합니다. autocluster 감독되지 않는 학습 알고리즘을 구현하고 basket 구현하며 사용하기 쉽습니다. Diffpatterns 는 감독 학습 알고리즘을 구현하며, 더 복잡하지만 RCA에 대한 차별화 세그먼트를 추출하는 데 더 강력합니다.

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