plotly_anomaly_fl()
Gilt für: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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:
Sie können auf Anomalien zoomen und darauf zeigen: