如何避免 KQL 查询中的数据点过多 (10000)?

Raz*_*azi 4 azure azure-monitoring kql azure-data-explorer azure-monitor-workbooks

在工作簿中,我显示了一个时间表,比较限制请求与非限制请求。该查询使用了汇总运算符,虽然其功能正常,但经常遇到“数据点过多 (10000)”错误。我尝试使用限制运算符,但它不起作用(我认为这是因为汇总运算符正在执行两项操作并且数据点超出其中一项操作)

此外,我在工作簿中包含了一个时间范围选择器来限制时间跨度,但即使在繁忙的一天中的一个小窗口也可能导致出现错误。

我也在考虑以另一种方式限制记录,但我不确定如何。该图表必须显示 RPS,因此不能将其更改为 RPM。

 Requests
    | project TimeGenerated, ResultType
    | summarize Throttled =  countif(ResultType == "Throttled") , Total_Requests = count() by  bin(TimeGenerated,1s);
  //| limit 9999 <-- This does not work
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Dav*_*itz 5

这是一个简单的渲染问题。

首先 -
总是存在限制,无论是图形可视化库、屏幕显示分辨率、网络浏览器可以处理的数据量而不被卡住等等。

其次 -
盯着这样的图表你不会得到任何好处:

过度堆积图

您需要降低图表的粒度。
这里有几个选项。

PS
我通常更喜欢make-series而不是summarise,因为它处理缺失的值。
请注意,这可能会带来额外的资源利用。

1. 增加bin大小

选择不在1s1m之间。
你有一个介于两者之间的整个范围,例如bin(TimeGenerated, 15s)

let Requests = materialize(range i from 1 to 1000000 step 1 | extend TimeGenerated = ago(1d*rand()), ResultType = case(rand() < 0.02, "Throttled", "Other"));
Requests
    | make-series Throttled = countif(ResultType == "Throttled") , Total_Requests = count() on TimeGenerated step 15s
    | render timechart 
Run Code Online (Sandbox Code Playgroud)

小提琴

增加垃圾箱

2.使用双重聚合

首先按1s聚合,然后按更大的时间跨度(例如10m )重新聚合,显示峰值。通过这种方式,您的图表会变得更加稀疏,但是您不会丢失1 秒粒度的异常值。

let Requests = materialize(range i from 1 to 1000000 step 1 | extend TimeGenerated = ago(1d*rand()), ResultType = case(rand() < 0.02, "Throttled", "Other"));
Requests
    | summarize Throttled = countif(ResultType == "Throttled") , Total_Requests = count() by bin(TimeGenerated,1s)
    | make-series max(Throttled), max(Total_Requests) on TimeGenerated step 10m
    | render timechart 
Run Code Online (Sandbox Code Playgroud)

小提琴

双聚合

3. 专注于你真正追求的东西

很多时候,我们可以采取额外的步骤来创建真正强调我们感兴趣的现象的可视化。
在本例中,它可能是ThrottledTotal_Requests之间的比率,然后我们可以使用一行,这样就可以很容易地理解发生了什么。 该图可以与前面的图一起使用,这样我们就不会丢失整个图片。

let Requests = materialize(range i from 1 to 1000000 step 1 | extend TimeGenerated = ago(1d*rand()), ResultType = case(rand() < 0.02, "Throttled", "Other"));
Requests
| summarize Throttled = countif(ResultType == "Throttled"), Total_Requests = count() by bin(TimeGenerated, 1s)
| make-series ratio = max(1.0 * Throttled / Total_Requests) on TimeGenerated step 5m
| render timechart 
Run Code Online (Sandbox Code Playgroud)

小提琴

比率