Partilhar via


plotly_anomaly_fl()

Aplica-se a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft 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:

Captura de tela do gráfico de anomalias do conjunto de dados de exemplo.

Você pode aumentar o zoom e passar o mouse sobre anomalias:

Captura de tela do zoom na região anômala.Captura de tela de passar o mouse sobre a anomalia.