数据加工错误排查概述

数据加工任务启动后,加工结果根据路由规则发送到对应的Logstore。如果加工任务失败,目标Logstore没有日志产生或者加工延迟过大等异常,可以根据本文档步骤进行排查处理。

错误分析

当发生错误时,分析错误在数据加工任务的哪个环节产生,能帮助用户更高效地定位错误位置。

根据加工原理,数据加工任务的主要四个环节如下图所示。加工环节

以上每个环节都可能产生错误,其原因、影响和排查方式各不相同。

  • 启动加工引擎。

    • 该环节产生错误主要是由于在启动加工引擎过程中,检测到用户编写的LOG DSL规则存在错误,导致加工引擎内部的安全检查不通过。

    • 在该阶段产生错误时,加工任务会停止。用户需要修改LOG DSL规则并重新启动加工任务。如果重试成功,加工任务会继续正常工作,不会产生日志的丢失或冗余。

    该环节的错误排查方法请参见加工引擎启动错误

  • 读取源Logstore数据。

    • 该环节产生错误可能是由于源Logstore信息配置错误、网络错误、源Logstore信息发生变化等,导致对源Logstore的访问异常。

    • 该阶段产生错误时,加工任务会一直重试,直到重试成功或被手动停止。如果重试成功,加工任务会继续正常工作,不会产生日志的丢失。

    • 如果是已经读取部分数据后才报错,则加工服务会保存断点并一直重试,重试成功后从断点处继续读取,不会有数据的丢失与重复。如果重试过程中停止,不会有数据丢失与重复。

    该环节的错误排查方法请参见源Logstore读取错误

  • 加工日志事件。

    • 该环节产生错误主要是由于在数据加工过程中,部分或全部日志事件不适配加工规则引发的错误。

    • 该阶段产生错误时,不适配加工规则的日志事件会引发报错,错误分成WARNING和ERROR级别(通过加工日志的logging.levelname体现)。

      • 对于ERROR级别的错误,该日志事件会丢弃,加工后的输出结果中将不包含这些日志事件。

      • 对于WARNING级别的错误(例如某些事件与正则规则不匹配),会跳过当前DSL的这一步,进行下一步。

    该环节的错误排查方法请参见加工规则错误

  • 输出到目标Logstore。

    • 该环节产生错误可能是由于目标Logstore信息配置错误、网络错误、目标Logstore信息发生变化等,导致对目标Logstore的访问异常。

    • 该阶段产生错误时,加工任务会一直重试,直到重试成功或被手动停止。如果重试成功,加工任务会继续正常工作,不会产生日志的丢失。

    • 如果是已经输出部分数据后才报错,例如配置了两个目标,一个目标成功,另外一个目标失败。会保存断点并一直重试,重试成功后不会有数据的丢失与冗余。但如果这时停止加工任务再重新启动时,会从断点继续加工,不会有数据的丢失,但可能会有数据的冗余。

通用错误排查

  1. 确认目标Logstore是否有数据写入。

    检查目标Logstore最近是否有数据写入,正确的方法是通过查看目标Logstore的消费预览数据。消费预览

    说明

    通过Logstore的查询的方式可能不准确,因为:

    • 数据加工是基于日志接收时间进行加工,可能正在加工历史日志,当前查询的时间范围与日志的写入时间并不一定一致。

    • 日志服务在写入历史日志时的索引可以查询,但通常会有几分钟的延迟。 数据加工如果正在写入历史日志,那么查询界面立刻查询可能查询不到。

  2. 查看加工任务状态。

    • 查看当前任务的进度,是否已经启动,请参见查看任务状态。对于时间区间固定的任务,加工到结束位置之后会自动结束。

    • 查看对应任务的消费组,检查其状态是否开启并有所更新。消费状态

    • 参见错误日志查看方式查看是否有异常发生,然后根据错误分析进一步找到原因并解决。

  3. 查看源Logstore是否有数据产生。

    通过查看加工任务,确认在当前加工任务的时间范围内,源Logstore是否存在日志。

    • 如果时间配置没有设置结束时间,检查源Logstore是否有新日志产生,如果没有新日志产生,且特定时间范围内没有日志而且没有历史日志存在,加工任务无法进行。

    • 如果选择的是历史时间,确认历史特定时间范围内源Logstore是否有日志。

    单击加工任务的修改加工规则,选择对应的时间范围来查看是否有原始日志。

  4. 查看加工规则是否异常。

    检查加工规则代码中是否存在异常。例如:

    • 修改了日志的时间,导致在当前时间范围内查询不到。

    • 加工规则在特定条件下丢弃了日志。

      例如如下代码,会丢弃所有字段name不存在或者为空的日志,而前置逻辑是构建字段name,如果前置逻辑存在问题,导致字段name没有正确构建的话,所有日志都不会产出。

      # ....前置逻辑.
      #  .... 构建字段name...
      
      e_keep(e_search('name: "?"'))
    • 如果存在从第三方拉取数据做富化的逻辑,需要确认是否因为第三方的数据过大,导致数据加工任务正在处于初始化状态,迟迟未能开始消费数据。例如:

      e_dict_map(res_rds_mysql(..database="userinfo", table="user"), "username", ["city", "school", "age"])

    单击加工任务的修改加工规则,选择对应的时间范围,并单击预览数据来查看结果。

    如果能够重现,可以通过注释掉特定语句重试预览进行调试。

  5. 确认Shard数量是否符合预期。

    如果发现加工速度过慢,可以考虑是否源Logstore与目标Logstore的规划不符合性能预期,建议调整源Logstore或目标Logstore的Shard数量。

错误日志查看方式

错误日志可以通过如下方式查看。

  • 通过日志库internal-etl-log查看。

    加工任务产生的日志会存储在日志库internal-etl-log中,该Logstore在执行数据加工任务后由系统自动生成。

    • internal-etl-log属于专属Logstore,不收取任何费用,不支持修改其配置,也不支持写入其他数据。

    • internal-etl-log中每个日志事件的__topic__字段显示了加工任务的状态,可通过该字段判断对应的加工任务是否产生了错误。

    • 具体的错误信息通过每个日志事件的messagereason字段查看,如下图所示。日志库错误信息

  • 通过仪表盘查看。

    单击目标加工任务,在数据加工概览页面的执行状态区域查看仪表盘。

    具体的错误信息在异常详情的reason列,如下图所示。仪表盘错误信息

  • 控制台查看。

    预览阶段的错误日志会直接显示在控制台。预览阶段只是模拟加工规则的操作,以及预览预期的加工结果,并不会真的对源Logstore和目标Logstore进行修改,因此预览阶段遇到的各类错误都不会对源日志事件产生影响。

预览限制

预览阶段的数据加工相较于真实的加工任务,会存在限制。

  • 不能发现源Logstore密钥权限问题。

    预览阶段不会创建消费组进行消费,因此不会对消费组权限进行检查。

  • 不能发现加工规则中输出目标的名称错误。

    预览阶段不会对写入目标做真正的写入操作,因此不会检查配置项中是否配置了相关的输出目标。

  • 不能发现输出目标的配置错误。

    • 此处配置错误包含输出目标的Project、Logstore、密钥权限等信息配置错误。

    • 预览阶段不会对写入目标做真正的写入操作,因此不会检查输出目标的配置信息是否正确。

  • 不能完整覆盖所有数据。

    • 预览阶段默认只从源Logstore中拉取1000条数据进行加工,不会覆盖所有数据。

    • 如果拉取的1000条数据经过加工后没有加工结果产生,则会持续拉取数据五分钟,直到有加工结果产生为止。