Freigeben über


plotly_anomaly_fl()

Gilt für: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

Die Funktion plotly_anomaly_fl() ist eine benutzerdefinierte Funktion (UDF), mit der Sie eine Zeichnungsvorlage anpassen können, um ein interaktives Anomaliediagramm zu erstellen.

Die Funktion akzeptiert eine Tabelle, die die Quelle und die geplante Zeitreihe enthält, Listen mit positiven und negativen Anomalien mit ihren jeweiligen Größen und Diagrammbezeichnungszeichenfolgen. Die Funktion gibt eine einzelne Zellentabelle zurück, die JSON-Zeichnung enthält. Optional können Sie die Daten in einer Azure Data Explorer-Dashboardkachel rendern. Weitere Informationen finden Sie unter Plotly (Vorschau).

Die Funktion akzeptiert eine Tabelle, die die Quelle und die geplante Zeitreihe enthält, Listen mit positiven und negativen Anomalien mit ihren jeweiligen Größen und Diagrammbezeichnungszeichenfolgen. Die Funktion gibt eine einzelne Zellentabelle zurück, die JSON-Zeichnung enthält. Optional können Sie die Daten in einer Echtzeit-Dashboardkachel rendern. Weitere Informationen finden Sie unter Plotly (Vorschau).

Hinweis

Erwägen Sie die verwendung der systemeigenen " | render anomalychart" Azure Data Explorer-Methode zum Rendern eines nicht interaktiven Anomaliediagramms.

Voraussetzungen

Extrahieren Sie die erforderliche Anomalievorlage aus der öffentlich verfügbaren PlotlyTemplate Tabelle. Kopieren Sie diese Tabelle aus der Beispieldatenbank in Ihre Datenbank, indem Sie den folgenden KQL-Befehl aus der Zieldatenbank ausführen:

.set PlotlyTemplate <| cluster('help.kusto.windows.net').database('Samples').PlotlyTemplate

Syntax

T | invoke plotly_anomaly_fl(, time_col val_col,, baseline_col time_high_col, val_high_col ,, , , size_high_col time_low_col val_low__col size_low_col, chart_title, series_name val_name, )

Erfahren Sie mehr über Syntaxkonventionen.

Parameter

Name Type Erforderlich Beschreibung
time_col string ✔️ Der Name der Spalte, die das dynamische Array der Zeitpunkte der ursprünglichen Zeitreihe enthält
val_col string ✔️ Der Name der Spalte, die die Werte der ursprünglichen Zeitreihe enthält
baseline_col string ✔️ Der Name der Spalte, die die Werte der geplanten Zeitreihe enthält. Anomalien werden in der Regel durch einen großen Wertversatz vom erwarteten Basisplanwert erkannt.
time_high_col string ✔️ Der Name der Spalte mit den Zeitpunkten hoher (über der Basislinie) Anomalien
val_high_col string ✔️ Der Name der Spalte, die die Werte der hohen Anomalien enthält
size_high_col string ✔️ Der Name der Spalte, die die Markierungsgrößen der hohen Anomalien enthält
time_low_col string ✔️ Der Name der Spalte, die die Zeitpunkte niedriger Anomalien enthält
val_low_col string ✔️ Der Name der Spalte, die die Werte der niedrigen Anomalien enthält
size_low_col string ✔️ Der Name der Spalte, die die Markierungsgrößen der niedrigen Anomalien enthält
chart_title string Diagrammtitel, Standard ist "Anomaliediagramm"
series_name string Name der Zeitreihe, Der Standardwert ist "Metrisch"
val_name string Name der Größenachse, Der Standardwert ist "Wert"

Funktionsdefinition

Sie können die Funktion definieren, indem Sie den Code entweder als abfragedefinierte Funktion einbetten oder wie folgt als gespeicherte Funktion in Ihrer Datenbank erstellen:

Definieren Sie die Funktion mithilfe der folgenden Let-Anweisung. Es sind keine Berechtigungen erforderlich.

Wichtig

Eine Let-Anweisung kann nicht alleine ausgeführt werden. Auf sie muss eine tabellarische Ausdrucksanweisung folgen. Informationen zum Ausführen eines funktionierenden Beispiels plotly_anomaly_fl()finden Sie unter Beispiel.

let plotly_anomaly_fl=(tbl:(*), time_col:string, val_col:string, baseline_col:string, time_high_col:string , val_high_col:string, size_high_col:string,
                                time_low_col:string, val_low_col:string, size_low_col:string,
                                chart_title:string='Anomaly chart', series_name:string='Metric', val_name:string='Value')
{
    let anomaly_chart = toscalar(PlotlyTemplate | where name == "anomaly" | project plotly);
    let tbl_ex = tbl | extend _timestamp = column_ifexists(time_col, datetime(null)), _values = column_ifexists(val_col, 0.0), _baseline = column_ifexists(baseline_col, 0.0),
                              _high_timestamp = column_ifexists(time_high_col, datetime(null)), _high_values = column_ifexists(val_high_col, 0.0), _high_size = column_ifexists(size_high_col, 1),
                              _low_timestamp = column_ifexists(time_low_col, datetime(null)), _low_values = column_ifexists(val_low_col, 0.0), _low_size = column_ifexists(size_low_col, 1);
    tbl_ex
    | extend plotly = anomaly_chart
    | extend plotly=replace_string(plotly, '$TIME_STAMPS$', tostring(_timestamp))
    | extend plotly=replace_string(plotly, '$SERIES_VALS$', tostring(_values))
    | extend plotly=replace_string(plotly, '$BASELINE_VALS$', tostring(_baseline))
    | extend plotly=replace_string(plotly, '$TIME_STAMPS_HIGH_ANOMALIES$', tostring(_high_timestamp))
    | extend plotly=replace_string(plotly, '$HIGH_ANOMALIES_VALS$', tostring(_high_values))
    | extend plotly=replace_string(plotly, '$HIGH_ANOMALIES_MARKER_SIZE$', tostring(_high_size))
    | extend plotly=replace_string(plotly, '$TIME_STAMPS_LOW_ANOMALIES$', tostring(_low_timestamp))
    | extend plotly=replace_string(plotly, '$LOW_ANOMALIES_VALS$', tostring(_low_values))
    | extend plotly=replace_string(plotly, '$LOW_ANOMALIES_MARKER_SIZE$', tostring(_low_size))
    | extend plotly=replace_string(plotly, '$TITLE$', chart_title)
    | extend plotly=replace_string(plotly, '$SERIES_NAME$', series_name)
    | extend plotly=replace_string(plotly, '$Y_NAME$', val_name)
    | project plotly
};
// Write your query to use the function here.

Beispiel

Im folgenden Beispiel wird der Aufrufoperator verwendet, um die Funktion auszuführen.

Um eine abfragedefinierte Funktion zu verwenden, rufen Sie sie nach der definition der eingebetteten Funktion auf.

let plotly_anomaly_fl=(tbl:(*), time_col:string, val_col:string, baseline_col:string, time_high_col:string , val_high_col:string, size_high_col:string,
                                time_low_col:string, val_low_col:string, size_low_col:string,
                                chart_title:string='Anomaly chart', series_name:string='Metric', val_name:string='Value')
{
    let anomaly_chart = toscalar(PlotlyTemplate | where name == "anomaly" | project plotly);
    let tbl_ex = tbl | extend _timestamp = column_ifexists(time_col, datetime(null)), _values = column_ifexists(val_col, 0.0), _baseline = column_ifexists(baseline_col, 0.0),
                              _high_timestamp = column_ifexists(time_high_col, datetime(null)), _high_values = column_ifexists(val_high_col, 0.0), _high_size = column_ifexists(size_high_col, 1),
                              _low_timestamp = column_ifexists(time_low_col, datetime(null)), _low_values = column_ifexists(val_low_col, 0.0), _low_size = column_ifexists(size_low_col, 1);
    tbl_ex
    | extend plotly = anomaly_chart
    | extend plotly=replace_string(plotly, '$TIME_STAMPS$', tostring(_timestamp))
    | extend plotly=replace_string(plotly, '$SERIES_VALS$', tostring(_values))
    | extend plotly=replace_string(plotly, '$BASELINE_VALS$', tostring(_baseline))
    | extend plotly=replace_string(plotly, '$TIME_STAMPS_HIGH_ANOMALIES$', tostring(_high_timestamp))
    | extend plotly=replace_string(plotly, '$HIGH_ANOMALIES_VALS$', tostring(_high_values))
    | extend plotly=replace_string(plotly, '$HIGH_ANOMALIES_MARKER_SIZE$', tostring(_high_size))
    | extend plotly=replace_string(plotly, '$TIME_STAMPS_LOW_ANOMALIES$', tostring(_low_timestamp))
    | extend plotly=replace_string(plotly, '$LOW_ANOMALIES_VALS$', tostring(_low_values))
    | extend plotly=replace_string(plotly, '$LOW_ANOMALIES_MARKER_SIZE$', tostring(_low_size))
    | extend plotly=replace_string(plotly, '$TITLE$', chart_title)
    | extend plotly=replace_string(plotly, '$SERIES_NAME$', series_name)
    | extend plotly=replace_string(plotly, '$Y_NAME$', val_name)
    | project plotly
};
let min_t = datetime(2017-01-05);
let max_t = datetime(2017-02-03 22:00);
let dt = 2h;
let marker_scale = 8;
let s_name = 'TS1';
demo_make_series2
| make-series num=avg(num) on TimeStamp from min_t to max_t step dt by sid
| where sid == s_name
| extend (anomalies, score, baseline) = series_decompose_anomalies(num, 1.5, -1, 'linefit')
| mv-apply num1=num to typeof(double), anomalies1=anomalies to typeof(double), score1=score to typeof(double), TimeStamp1=TimeStamp to typeof(datetime)  on (
    summarize pAnomalies=make_list_if(num1, anomalies1 > 0), pTimeStamp=make_list_if(TimeStamp1, anomalies1 > 0), pSize=make_list_if(toint(score1*marker_scale), anomalies1 > 0),
              nAnomalies=make_list_if(num1, anomalies1 < 0), nTimeStamp=make_list_if(TimeStamp1, anomalies1 < 0), nSize=make_list_if(toint(-score1*marker_scale), anomalies1 < 0)
)
| invoke plotly_anomaly_fl('TimeStamp', 'num', 'baseline', 'pTimeStamp', 'pAnomalies', 'pSize', 'nTimeStamp', 'nAnomalies', 'nSize',
                           chart_title='Anomaly chart using plotly_anomaly_fl()', series_name=s_name, val_name='# of requests')
| render plotly

Output

Die Ausgabe ist eine plotly JSON-Zeichenfolge, die mithilfe von '| gerendert werden kann. Rendern von Plotly' oder in einer Azure Data Explorer-Dashboardkachel. Weitere Informationen zum Erstellen von Dashboardkacheln finden Sie unter Visualisieren von Daten mit Azure Data Explorer-Dashboards .

Die Ausgabe ist eine Plotly JSON-Zeichenfolge, die in einer Echtzeit-Dashboardkachel gerendert werden kann. Weitere Informationen zum Erstellen von Dashboardkacheln finden Sie unter Echtzeit-Dashboards.

Die folgende Abbildung zeigt ein Beispiel für Anomaliediagramme mit der obigen Funktion:

Screenshot des Anomaliediagramms des Beispiel-Datasets.

Sie können auf Anomalien zoomen und darauf zeigen:

Screenshot des Zooms in einem omalen Bereich.Screenshot des Daraufzeigens über Anomalien.