KQL(Kusto Query Language)에는 비정상적인 동작을 확인하는 기본 제공 변칙 검색 및 예측 함수가 있습니다. 이러한 패턴이 검색되면 RCA(근본 원인 분석)를 실행하여 변칙을 완화하거나 해결할 수 있습니다.
진단 프로세스는 복잡하고 길며 도메인 전문가가 수행합니다. 프로세스에는 다음이 포함됩니다.
- 동일한 시간 프레임 동안 다른 원본에서 더 많은 데이터 가져오기 및 조인
- 여러 차원의 값 분포에 대한 변경 내용 검색
- 더 많은 변수를 차트로 작성하기
- 도메인 지식 및 직관을 기반으로 하는 기타 기술
이러한 진단 시나리오는 일반적이므로 기계 학습 플러그 인을 사용하여 진단 단계를 더 쉽게 만들고 RCA 기간을 단축할 수 있습니다.
다음 Machine Learning 플러그 인 세 가지 모두 클러스터링 알고리즘을 구현합니다. autocluster
basket
diffpatterns
및 autocluster
플러그 인은 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()
및 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')
세그먼트 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
이 차트를 사용하면 화요일 오후의 급증이 플러그 인을 사용하여 diffpatterns
검색된 이 특정 세그먼트의 예외 때문임을 확인할 수 있습니다.
요약
Machine Learning 플러그 인은 많은 시나리오에 유용합니다.
autocluster
감독되지 않는 학습 알고리즘을 구현하고 basket
구현하며 사용하기 쉽습니다.
Diffpatterns
는 감독 학습 알고리즘을 구현하며, 더 복잡하지만 RCA에 대한 차별화 세그먼트를 추출하는 데 더 강력합니다.
이러한 플러그 인은 임시 시나리오 및 거의 실시간에 가까운 자동 모니터링 서비스에서 대화형으로 사용됩니다. 시계열 변칙 검색 뒤에 진단 프로세스가 수행됩니다. 이 프로세스는 필요한 성능 표준을 충족하도록 고도로 최적화되어 있습니다.