Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Usługi w chmurze i urządzenia IoT generują dane telemetryczne, które mogą służyć do uzyskiwania szczegółowych informacji, takich jak monitorowanie kondycji usługi, fizycznych procesów produkcyjnych i trendów użycia. Przeprowadzanie analizy szeregów czasowych jest jednym ze sposobów identyfikowania odchyleń we wzorcu tych metryk w porównaniu z typowym wzorcem odniesienia.
Język Kusto Query Language (KQL) zawiera natywną obsługę tworzenia, manipulowania i analizowania wielu szeregów czasowych. W tym artykule dowiesz się, jak język KQL jest używany do tworzenia i analizowania tysięcy szeregów czasowych w sekundach, umożliwiając rozwiązania i przepływy pracy monitorowania niemal w czasie rzeczywistym.
Tworzenie szeregów czasowych
W tej sekcji utworzymy duży zestaw zwykłych szeregów czasowych po prostu i intuicyjnie przy użyciu make-series operatora, a w razie potrzeby uzupełnimy brakujące wartości.
Pierwszym krokiem analizy szeregów czasowych jest partycjonowanie i przekształcenie oryginalnej tabeli telemetrii w zestaw szeregów czasowych. Tabela zwykle zawiera kolumnę znacznika czasu, wymiary kontekstowe i opcjonalne metryki. Wymiary są używane do partycjonowania danych. Celem jest utworzenie tysięcy szeregów czasowych dla każdej partycji w regularnych interwałach czasowych.
Tabela wejściowa demo_make_series1 zawiera 600 000 rekordów dowolnego ruchu usługi internetowej. Użyj następującego polecenia, aby próbkować 10 rekordów:
demo_make_series1 | take 10
Tabela wynikowa zawiera kolumnę znacznika czasu, trzy kolumny wymiarów kontekstowych i bez metryk:
| Sygnatura czasowa | BrowserVer | OsVer | Kraj/region |
|---|---|---|---|
| 2016-08-25 09:12:35.4020000 | Chrome 51.0 | Windows 7 | Wielka Brytania |
| 2016-08-25 09:12:41.1120000 | Chrome 52.0 | Windows 10 | |
| 2016-08-25 09:12:46.2300000 | Chrome 52.0 | Windows 7 | Wielka Brytania |
| 2016-08-25 09:12:46.5100000 | Chrome 52.0 | Windows 10 | Wielka Brytania |
| 2016-08-25 09:12:46.5570000 | Chrome 52.0 | Windows 10 | Republika Litwy |
| 2016-08-25 09:12:47.0470000 | Chrome 52.0 | Windows 8.1 | Indie |
| 2016-08-25 09:12:51.3600000 | Chrome 52.0 | Windows 10 | Wielka Brytania |
| 2016-08-25 09:12:51.6930000 | Chrome 52.0 | Windows 7 | Holandia |
| 2016-08-25 09:12:56.4240000 | Chrome 52.0 | Windows 10 | Wielka Brytania |
| 2016-08-25 09:13:08.7230000 | Chrome 52.0 | Windows 10 | Indie |
Ponieważ nie ma metryk, możemy utworzyć tylko zestaw szeregów czasowych reprezentujących samą liczbę ruchu, partycjonowaną przez system operacyjny przy użyciu następującego zapytania:
let min_t = toscalar(demo_make_series1 | summarize min(TimeStamp));
let max_t = toscalar(demo_make_series1 | summarize max(TimeStamp));
demo_make_series1
| make-series num=count() default=0 on TimeStamp from min_t to max_t step 1h by OsVer
| render timechart
-
make-seriesUżyj operatora , aby utworzyć zestaw trzech szeregów czasowych, gdzie:-
num=count(): szereg czasowy ruchu -
from min_t to max_t step 1h: szereg czasowy jest tworzony w przedziałach 1-godzinnych w zakresie czasu (najstarsze i najnowsze znaczniki czasu rekordów tabeli) -
default=0: określ metodę wypełnienia dla brakujących pojemników, aby utworzyć szeregi czasowe regularne. Alternatywnie należy użyć funkcjiseries_fill_const(),series_fill_forward()series_fill_backward()iseries_fill_linear()w przypadku zmian -
by OsVer: partycja według systemu operacyjnego
-
- Rzeczywista struktura danych szeregów czasowych to tablica liczbowa zagregowanej wartości dla każdego przedziału czasowego. Używamy
render timechartdo wizualizacji.
W wyżej tabeli mamy trzy podziały. Możemy utworzyć oddzielny szereg czasowy: Windows 10 (czerwony), 7 (niebieski) i 8.1 (zielony) dla każdej wersji systemu operacyjnego, jak pokazano na wykresie:
Funkcje analizy szeregów czasowych
W tej sekcji wykonamy typowe funkcje przetwarzania serii. Po utworzeniu zestawu szeregów czasowych język KQL obsługuje rosnącą listę funkcji do ich przetwarzania i analizowania. Opiszemy kilka reprezentatywnych funkcji przetwarzania i analizowania szeregów czasowych.
Filtrowanie
Filtrowanie to powszechna praktyka w zakresie przetwarzania sygnałów i jest przydatne w przypadku zadań związanych z przetwarzaniem szeregów czasowych (na przykład wygładzenie hałaśliwego sygnału, detekcja zmian).
- Istnieją dwie ogólne funkcje filtrowania:
-
series_fir(): Stosowanie filtru FIR. Służy do prostego obliczania średniej ruchomej i różnicowania szeregów czasowych na potrzeby wykrywania zmian. -
series_iir(): Stosowanie filtru IIR. Służy do wygładzania wykładniczego i sumy skumulowanej.
-
-
Extendzestaw szeregów czasowych przez dodanie nowej serii średniej ruchomej o rozmiarze 5 pojemników (o nazwie ma_num) do zapytania:
let min_t = toscalar(demo_make_series1 | summarize min(TimeStamp));
let max_t = toscalar(demo_make_series1 | summarize max(TimeStamp));
demo_make_series1
| make-series num=count() default=0 on TimeStamp from min_t to max_t step 1h by OsVer
| extend ma_num=series_fir(num, repeat(1, 5), true, true)
| render timechart
Analiza regresji
Analiza regresji liniowej segmentowanej może służyć do oszacowania trendu szeregów czasowych.
- Użyj series_fit_line(), aby dopasować najlepszą linię do szeregu czasowego w celu ogólnego wykrywania trendów.
- Użyj series_fit_2lines(), aby wykryć zmiany trendów względem punktu odniesienia, które są przydatne w scenariuszach monitorowania.
Przykład funkcji series_fit_line() i series_fit_2lines() w zapytaniu szeregów czasowych:
demo_series2
| extend series_fit_2lines(y), series_fit_line(y)
| render linechart with(xcolumn=x)
- Niebieski: oryginalny szereg czasowy
- Zielony: dopasowana linia
- Czerwony: dwie dopasowane linie
Uwaga / Notatka
Funkcja dokładnie wykryła punkt skoku (zmiany poziomu).
Wykrywanie sezonowości
Wiele metryk jest zgodne ze wzorcami sezonowymi (okresowymi). Ruch użytkowników usług w chmurze zwykle zawiera wzorce dzienne i tygodniowe, które są najwyższe w środku dnia roboczego i najniższe w nocy i w weekend. Czujniki IoT są mierzyne w okresowych odstępach czasu. Pomiary fizyczne, takie jak temperatura, ciśnienie lub wilgotność, mogą również wykazywać sezonowe zachowanie.
W poniższym przykładzie zastosowano wykrywanie sezonowości na miesięcznym ruchu w usłudze internetowej (przedziały 2-godzinne):
demo_series3
| render timechart
- Użyj series_periods_detect(), aby automatycznie wykrywać okresy w szeregach czasowych, w których:
-
num: szereg czasowy do przeanalizowania -
0.: minimalna długość okresu w dniach (0 oznacza brak minimum) -
14d/2h: maksymalna długość okresu w dniach, czyli 14 dni podzielona na przedziały dwugodzinne -
2: liczba okresów do wykrycia
-
- Użyj series_periods_validate(), jeśli wiemy, że metryka powinna mieć określone odrębne okresy i chcemy sprawdzić, czy istnieją.
Uwaga / Notatka
Jest to anomalia, jeśli nie istnieją określone odrębne okresy
demo_series3
| project (periods, scores) = series_periods_detect(num, 0., 14d/2h, 2) //to detect the periods in the time series
| mv-expand periods, scores
| extend days=2h*todouble(periods)/1d
| Okresy | Wyniki | Dni |
|---|---|---|
| 84 | 0.820622786055595 | 7 |
| 12 | 0.764601405803502 | 1 |
Funkcja wykrywa sezonowość dzienną i tygodniową. Dzienne wyniki są mniejsze niż co tydzień, ponieważ dni weekendowe różnią się od dni tygodnia.
Funkcje na elementach
Operacje arytmetyczne i logiczne można wykonywać na szeregach czasowych. Korzystając z series_subtract() możemy obliczyć resztowy szereg czasowy, czyli różnicę między oryginalną surową metryką a wygładzoną metryką, i wyszukiwać anomalie w sygnale resztowym.
let min_t = toscalar(demo_make_series1 | summarize min(TimeStamp));
let max_t = toscalar(demo_make_series1 | summarize max(TimeStamp));
demo_make_series1
| make-series num=count() default=0 on TimeStamp from min_t to max_t step 1h by OsVer
| extend ma_num=series_fir(num, repeat(1, 5), true, true)
| extend residual_num=series_subtract(num, ma_num) //to calculate residual time series
| where OsVer == "Windows 10" // filter on Win 10 to visualize a cleaner chart
| render timechart
- Niebieski: oryginalny szereg czasowy
- Czerwony: wygładzony szereg czasowy
- Zielony: pozostałe szeregi czasowe
Przepływ pracy szeregów czasowych w skali
W poniższym przykładzie pokazano, jak te funkcje mogą być uruchamiane na dużą skalę w tysiącach szeregów czasowych w sekundach na potrzeby wykrywania anomalii. Aby wyświetlić kilka przykładowych rekordów telemetrycznych metryki liczby odczytów usługi DB w ciągu czterech dni, uruchom następujące zapytanie:
demo_many_series1
| take 4
| ZNACZNIK CZASU | Lokalizacja | Op | baza danych | DataRead |
|---|---|---|---|---|
| 2016-09-11 21:00:00.0000000 | Loc 9 | 5117853934049630089 | 262 | 0 |
| 2016-09-11 21:00:00.0000000 | Loc 9 | 5117853934049630089 | 241 | 0 |
| 2016-09-11 21:00:00.0000000 | Loc 9 | -865998331941149874 | 262 | 279862 |
| 2016-09-11 21:00:00.0000000 | Loc 9 | 371921734563783410 | 255 | 0 |
A proste statystyki:
demo_many_series1
| summarize num=count(), min_t=min(TIMESTAMP), max_t=max(TIMESTAMP)
| Num | min_t | max_t |
|---|---|---|
| 2177472 | 2016-09-08 00:00:00.0000000 | 2016-09-11 23:00:00.0000000 |
Tworzenie szeregu czasowego w przedziałach 1-godzinnych metryki odczytów (łącznie cztery dni * 24 godziny = 96 punktów) powoduje typowe wahania wzorca.
let min_t = toscalar(demo_many_series1 | summarize min(TIMESTAMP));
let max_t = toscalar(demo_many_series1 | summarize max(TIMESTAMP));
demo_many_series1
| make-series reads=avg(DataRead) on TIMESTAMP from min_t to max_t step 1h
| render timechart with(ymin=0)
Powyższe zachowanie jest mylące, ponieważ pojedynczy normalny szereg czasowy jest agregowany z tysięcy różnych wystąpień, które mogą mieć nieprawidłowe wzorce. W związku z tym tworzymy szeregi czasowe dla każdego wystąpienia. Wystąpienie jest definiowane przez lokalizację, operację i konkretną maszynę.
Ile szeregów czasowych możemy utworzyć?
demo_many_series1
| summarize by Loc, Op, DB
| count
| Liczba |
|---|
| 18339 |
Teraz utworzymy zestaw 18339 szeregów czasowych metryki liczby odczytów. Dodajemy klauzulę by do instrukcji make-series, następnie stosujemy regresję liniową i wybieramy dwie serie czasowe, które miały najbardziej znaczący trend malejący.
let min_t = toscalar(demo_many_series1 | summarize min(TIMESTAMP));
let max_t = toscalar(demo_many_series1 | summarize max(TIMESTAMP));
demo_many_series1
| make-series reads=avg(DataRead) on TIMESTAMP from min_t to max_t step 1h by Loc, Op, DB
| extend (rsquare, slope) = series_fit_line(reads)
| top 2 by slope asc
| render timechart with(title='Service Traffic Outage for 2 instances (out of 18339)')
Wyświetl wystąpienia:
let min_t = toscalar(demo_many_series1 | summarize min(TIMESTAMP));
let max_t = toscalar(demo_many_series1 | summarize max(TIMESTAMP));
demo_many_series1
| make-series reads=avg(DataRead) on TIMESTAMP from min_t to max_t step 1h by Loc, Op, DB
| extend (rsquare, slope) = series_fit_line(reads)
| top 2 by slope asc
| project Loc, Op, DB, slope
| Lokalizacja | Op | baza danych | zbocze |
|---|---|---|---|
| Loc 15 | 37 | 1151 | -102743.910227889 |
| Loc 13 | 37 | 1249 | -86303.2334644601 |
W mniej niż dwie minuty przeanalizowano blisko 20 000 szeregów czasowych i dwa nietypowe szeregi czasowe, w których liczba odczytów nagle spadła.
Te zaawansowane możliwości połączone z szybką wydajnością zapewniają unikatowe i zaawansowane rozwiązanie do analizy szeregów czasowych.
Treści powiązane
- Dowiedz się więcej o wykrywaniu anomalii i prognozowaniu za pomocą języka KQL.
- Dowiedz się więcej o możliwościach uczenia maszynowego za pomocą języka KQL.