plotly_anomaly_fl()
Aplica-se a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
A função plotly_anomaly_fl()
é uma UDF (função definida pelo usuário) que permite personalizar um modelo de plotagem para criar um gráfico de anomalias interativo.
A função aceita uma tabela que contém a origem e a série temporal de linha de base, listas de anomalias positivas e negativas com seus respectivos tamanhos e cadeia de caracteres de rotulagem de gráfico. A função retorna uma única tabela de células contendo JSON plotly. Opcionalmente, você pode renderizar os dados em um bloco de painel do Azure Data Explorer. Para obter mais informações, consulte Plotly (versão prévia).
A função aceita uma tabela que contém a origem e a série temporal de linha de base, listas de anomalias positivas e negativas com seus respectivos tamanhos e cadeia de caracteres de rotulagem de gráfico. A função retorna uma única tabela de células contendo JSON plotly. Opcionalmente, você pode renderizar os dados em um bloco de painel em tempo real. Para obter mais informações, consulte Plotly (versão prévia).
Observação
Considere usar o método nativo " | render anomalychart"
do Azure Data Explorer para renderizar um gráfico de anomalias não interativo.
Pré-requisito
Extraia o modelo de "anomalia" necessário da tabela disponível PlotlyTemplate
publicamente. Copie esta tabela do banco de dados Samples para seu banco de dados executando o seguinte comando KQL do seu banco de dados de destino:
.set PlotlyTemplate <| cluster('help.kusto.windows.net').database('Samples').PlotlyTemplate
Sintaxe
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,
)
Saiba mais sobre as convenções de sintaxe.
Parâmetros
Nome | Digitar | Obrigatória | Descrição |
---|---|---|---|
time_col | string |
✔️ | O nome da coluna que contém a matriz dinâmica dos pontos de tempo da série temporal original |
val_col | string |
✔️ | O nome da coluna que contém os valores da série temporal original |
baseline_col | string |
✔️ | O nome da coluna que contém os valores da série temporal da linha de base. As anomalias geralmente são detectadas por um grande deslocamento de valor do valor de linha de base esperado. |
time_high_col | string |
✔️ | O nome da coluna que contém os pontos de tempo de anomalias altas (acima da linha de base) |
val_high_col | string |
✔️ | O nome da coluna que contém os valores das anomalias altas |
size_high_col | string |
✔️ | O nome da coluna que contém os tamanhos dos marcadores das anomalias altas |
time_low_col | string |
✔️ | O nome da coluna que contém os pontos de tempo de anomalias baixas |
val_low_col | string |
✔️ | O nome da coluna que contém os valores das anomalias baixas |
size_low_col | string |
✔️ | O nome da coluna que contém os tamanhos dos marcadores das anomalias baixas |
chart_title | string |
Título do gráfico, o padrão é 'Gráfico de anomalias' | |
series_name | string |
Nome da série temporal, o padrão é 'Métrica' | |
val_name | string |
Nome do eixo de valor, o padrão é 'Valor' |
Definição de função
Você pode definir a função inserindo seu código como uma função definida por consulta ou criando-a como uma função armazenada em seu banco de dados, da seguinte maneira:
Defina a função usando a instrução let a seguir. Nenhuma permissão é necessária.
Importante
Uma instrução let não pode ser executada sozinha. Ele deve ser seguido por uma instrução de expressão tabular. Para executar um exemplo funcional de plotly_anomaly_fl()
, consulte Exemplo.
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.
Exemplo
O exemplo a seguir usa o operador invoke para executar a função.
Para usar uma função definida por consulta, invoque-a após a definição da função inserida.
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
Saída
A saída é uma string JSON Plotly que pode ser renderizada usando '| render plotly' ou em um bloco de painel do Azure Data Explorer. Para obter mais informações sobre como criar blocos de painel, consulte Visualizar dados com painéis do Azure Data Explorer.
A saída é uma cadeia de caracteres JSON Plotly que pode ser renderizada em um bloco de painel em tempo real. Para obter mais informações sobre como criar blocos de painel, consulte Painéis em tempo real.
A imagem a seguir mostra um gráfico de anomalias de exemplo usando a função acima:
Você pode aumentar o zoom e passar o mouse sobre anomalias: