You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Sumo日志查询中获取目标日志±1秒范围内的日志信息?

Sumo日志查询问题解决:获取目标日志前后±1秒日志

问题说明

尝试用以下Sumo查询获取目标日志行前后±1秒的日志但未成功,且使用maxspan和transaction子句时出现“未找到”错误:

"BlockedThreadChecker" AND " - Thread Thread" AND " has been blocked"
| parse regex "Thread Thread\[.*?\] has been blocked for (?<blocked_time_ms>\d+) ms" 
| where blocked_time_ms != ""
| fields _raw, _messageTime , blocked_time_ms

// Step 2: Create a transaction around the identified log entry within a +/-1 second window

| where _messageTime >= _messageTime - 1000ms and _messageTime <= _messageTime + 1000ms
| parse regex "io.vertx.core.VertxException: (?<exception_message>[^\n]+)" nodrop
| fields _raw, _messageTime, exception_message

// Step 3: Extract relevant details from the surrounding logs
| parse regex "Thread Thread\[(?<thread_name>[^,]+),.*?has been blocked for (?<blocked_time_ms>\d+) ms" nodrop

| fields thread_name, blocked_time_ms, exception_message, _sourceCategory, _raw

// Step 4: Display the results
| sort by _messageTime

问题根源

  1. 时间过滤逻辑无效:where _messageTime >= _messageTime - 1000ms这行条件永远为真,等于没做任何时间范围筛选——每条日志的时间减去1秒必然小于等于自身。
  2. 数据集范围错误:查询一开始就只筛选出了阻塞线程的日志,后续操作无法获取周围的其他日志。
  3. transaction用法错误:使用transaction时未指定正确的分组关联字段(如线程名),或未设置合理的时间跨度,导致无法聚合相关日志。

解决方案

方案一:用lookup关联目标日志与前后日志

先捕获目标日志的时间和线程信息,再匹配对应时间范围内的所有日志:

// 1. 捕获目标阻塞日志,提取关键信息
"BlockedThreadChecker" AND " - Thread Thread" AND " has been blocked"
| parse regex "Thread Thread\[(?<thread_name>[^,]+),.*?has been blocked for (?<blocked_time_ms>\d+) ms" 
| fields _messageTime, thread_name, blocked_time_ms

// 2. 关联所有在目标日志±1秒内的日志(可根据_sourceCategory缩小范围)
| lookup from (
    *
    | fields _raw, _messageTime
    | parse regex "Thread Thread\[(?<thread_name>[^,]+)" nodrop
  ) on thread_name
  where _messageTime between (lookup._messageTime - 1000ms) and (lookup._messageTime + 1000ms)

// 3. 提取异常信息并整理结果
| parse regex "io.vertx.core.VertxException: (?<exception_message>[^\n]+)" nodrop
| fields thread_name, blocked_time_ms, exception_message, _sourceCategory, _raw, _messageTime
| sort by thread_name, _messageTime

方案二:正确使用transaction子句

通过transaction按线程分组,以阻塞日志为起点聚合前后1秒的日志:

// 1. 获取所有相关日志(不要提前过滤,确保包含目标和周围日志)
*
| parse regex "Thread Thread\[(?<thread_name>[^,]+)" nodrop

// 2. 按线程分组,聚合前后1秒的日志(总跨度设为2秒)
| transaction thread_name maxspan=2s startswith=("BlockedThreadChecker" AND " has been blocked")

// 3. 提取所需字段并整理
| parse regex "Thread Thread\[.*?\] has been blocked for (?<blocked_time_ms>\d+) ms" nodrop
| parse regex "io.vertx.core.VertxException: (?<exception_message>[^\n]+)" nodrop
| fields thread_name, blocked_time_ms, exception_message, _sourceCategory, _raw, _messageTime

注意事项

  • 使用lookup时,若不需要按线程关联,可去掉on thread_name条件,仅按时间范围匹配。
  • 使用transaction时,必须指定分组字段(如thread_name),否则无法将相关日志聚合在一起;maxspan需设置为覆盖前后1秒的总跨度(即2秒)。
  • 查询时可通过_sourceCategory等字段缩小日志范围,提升查询效率。

内容的提问来源于stack exchange,提问作者Dnyaneshwar Jadhav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:26:18