근본 원인 분석을 위한 변칙 진단
KQL(Kusto 쿼리 언어)에는 비정상적인 동작을 위해 검사 기본 제공 변칙 검색 및 예측 함수가 있습니다. 이러한 패턴이 검색되면 RCA(근본 원인 분석)를 실행하여 변칙을 완화하거나 resolve 수 있습니다.
진단 프로세스는 복잡하고 길고 도메인 전문가가 수행합니다. 프로세스에는 다음이 포함됩니다.
- 동일한 시간 프레임 동안 다른 원본에서 더 많은 데이터 가져오기 및 조인
- 여러 차원에서 값 분포의 변경 검색
- 더 많은 변수 차트
- 도메인 지식과 직관을 기반으로 하는 기타 기술
이러한 진단 시나리오는 일반적이므로 기계 학습 플러그 인을 사용하여 진단 단계를 더 쉽게 만들고 RCA 기간을 단축할 수 있습니다.
다음 세 가지 Machine Learning 플러그 인은 모두 , 및 diffpatterns
클러스터링 알고리즘을 구현합니다. basket
autocluster
autocluster
및 basket
플러그 인은 단일 레코드 집합을 클러스터링하고 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()
플러그 인은 autocluster
와 basket
의 한계를 극복합니다. Diffpatterns
는 두 개의 레코드 집합을 사용하고 서로 다른 기본 세그먼트를 추출합니다. 한 집합은 일반적으로 조사 중인 비정상 레코드 집합을 포함합니다. 하나는 autocluster
및 basket
을 통해 분석됩니다. 다른 집합에는 참조 레코드 집합인 기준이 포함됩니다.
다음 쿼리에서 는 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
이 차트를 사용하여 화요일 오후의 급증이 diffpatterns
플러그 인을 통해 검색된 이 특정 세그먼트의 예외로 인해 발생했는지 확인할 수 있습니다.
요약
Machine Learning 플러그 인은 많은 시나리오에 유용합니다. autocluster
및 basket
은 자율 학습 알고리즘을 구현하고 사용하기 쉽습니다. Diffpatterns
는 감독 학습 알고리즘을 구현하며 더 복잡하지만 RCA의 차별화 세그먼트를 추출하는 데는 더 강력합니다.
이 플러그 인은 임시 시나리오와 자동 근 실시간 모니터링 서비스에서 대화형으로 사용됩니다. 시계열 변칙 검색 뒤에 진단 프로세스가 수행됩니다. 이 프로세스는 필요한 성능 표준을 충족하도록 고도로 최적화되어 있습니다.
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기