【问题标题】:Azure Log Analytics - Search REST API - How to Paginate through resultsAzure Log Analytics - 搜索 REST API - 如何对结果进行分页
【发布时间】:2021-04-28 19:25:48
【问题描述】:

使用Azure Log Analytics Search REST API 抓取搜索结果时 我只能收到前 5000 个结果(根据规范,在文档顶部),但知道还有更多(通过响应中元数据中的“total”属性)。

有没有办法分页以获得整个结果集?

一种 hacky 方法是尝试迭代地分解所需的时间范围,直到该时间范围内的“总数”小于 5000,然后在整个所需的时间范围内迭代地执行此过程 - 但这是猜测将花费许多冗余请求。

【问题讨论】:

    标签: azure


    【解决方案1】:

    虽然它似乎不是一种使用 REST API 本身进行分页的方法,但您可以使用查询来执行分页。这里的两个关键运算符是 TOP 和 SKIP:

    假设您希望第 n 页的页面大小为 x(从第 1 页开始),然后附加到您的查询中: query | skip (n-1) * x | top x.

    如需完整参考列表,请参阅https://docs.microsoft.com/en-us/azure/log-analytics/log-analytics-search-reference

    【讨论】:

    • 对于未来的读者:这很奇怪,但在 REST API 中它们有一个单独的参数。对于正文中的“top”,以及查询字段中 UI 中的其他属性也有专用参数。但是“skip X”作为“查询”参数中的字符串。
    【解决方案2】:

    是的,跳过操作不再可用,但如果您想创建分页,仍然有一个选项。您需要计算条目总数,使用简单的数学运算和两个相反的排序。

    此查询的先决条件是值:ContainerName、Namespace、Page、PageSize。 我在工作簿中使用它,这些值由字段设置。

    let containers = KubePodInventory 
    | where ContainerName matches regex '^.*{ContainerName}$' and Namespace == '{Namespace}'
    | distinct ContainerID
    | project ContainerID;
    let TotalCount = toscalar(ContainerLog 
    | where ContainerID in (containers)
    | where LogEntry contains '{SearchText}'
    | summarize CountOfLogs = count()
    | project CountOfLogs);
    ContainerLog 
    | where ContainerID in (containers)
    | where LogEntry contains '{SearchText}'
    | extend Log=replace(@'(\x1b\[[0-9]*m|\x1b\[0 [0-9]*m)','', LogEntry)
    | project TimeGenerated, Log
    | sort by TimeGenerated asc
    | take {PageSize}*{Page}
    | top iff({PageSize}*{Page} > TotalCount, TotalCount - ({PageSize}*({Page} - 1)) , {PageSize}) by TimeGenerated desc;
    

    // '|如果日志中不是烦人的特殊字符,则不需要 extend'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多