背景
检索分析日志时提示查询超时的处理方法:
1. 如果是由于查询时间范围过长,导致单次查询的数据量过大,推荐您使用定时 SQL 分析,将该查询拆分成多个小范围查询,然后再汇总结果。
2. 如果您的查询结果都是数值类型,也可通过定时SQL分析,将 日志转为指标 Metric,再使用 PromQL 对指标计算分析,其查询性能比日志要高,可有效解决日志查询超时的问题。
本文介绍将查询拆分成多个小范围查询,然后再汇总结果的详细操作。
操作步骤
思路:拆分查询时间范围
通过定时 SQL,可将在日志主题 A 一个长时间范围查询拆成多个短时间范围的查询:例如查询1天的数据,可以拆成12个2小时的查询,并将查询结果保存至新的日志主题B,您可在日志主题 B 中查看查询结果,或者在日志主题 B 中继续做检索分析,该方案已经在生产中得到应用,可有效解决检索分析超时问题。
案例:
1. 假定用户在源日志主题:cls_service_log,查询数据范围2023-12-13 12:00:00 - 2023-12-13 12:15:00,查询超时,语句如下:
select
sum
(
etl_input_line
)
as
input_lines
,
sum
(
etl_failure_line
)
as
failed_lines
,
etl_task_id
group
by
etl_task_id
2. 使用定时 SQL 分析预计算源日志数据,参考 新建定时 SQL 任务。
定时 SQL 分析的配置如下:
源日志主题:配置为需要拆分查询的日志主题,示例中为 cls_service_log。
写入目标:选择日志主题,示例中为 sql_result。
调度范围:2023-12-13 12:05:00 - 2023-12-13 12:15:00(实际查询的是12:00:00 -12:15:00的数据,您可在调度详情中查看 SQL 时间窗口,SQL 时间窗口是查询的范围)
调度周期:5分种
SQL 时间窗口:@m-5m,@m
SQL 语句(CQL):
*
|
select
sum
(
etl_input_line
)
as
input_lines
,
sum
(
etl_failure_line
)
as
failed_lines
,
etl_task_id
group
by
etl_task_id
说明:
示例中的定时 SQL 分析使用的语句和检索分析的一样,但在某些业务场景下,例如有 Distinct、Avg 、TOP N 计算时,需要您根据业务诉求调整 SQL 语句。
可以在定时 SQL 分析的调度详情中看到,将原来的1个15分钟范围的查询,拆分成了3个5分钟范围的查询,如下图所示。三个查询的 SQL 时间窗口加起来刚好是原来的时间范围12:00-12:15。
3. 打开目标主题 sql_result 查看数据:
可以看到定时 SQL 分析处理的数据如下。由于 input_lines 和 failed_lines 在定时 SQL 中,分三次(每次计算5分钟的 sum 值)后写入。因此我们需要将结果数据再做一次 sum,就可以得到原始业务场景中15分钟的 input_lines 和 failed_lines 的 sum 值。
4. 在目标日志主题中检索
在目标日志主题 sql_result 中执行 SQL 语句:
select
sum
(
input_lines
)
as
input_lines
,
sum
(
failed_lines
)
as
failed_lines
,
etl_task_id
group
by
etl_task_id
得到如下图的结果,和在源日志主题:cls_service_log 直接检索分析的结果一致(没有超时的情况下)。
结论
当您的查询超时,您可通过定时 SQL,对源日志数据预计算(拆分查询范围)之后,然后在目标日志主题中进行检索,或者配置仪表盘、告警,可有效提升对日志数据的计算分析能力。