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

错误分析

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

根据加工原理,数据加工任务的主要四个环节如下图所示。
加工环节
以上每个环节都可能产生错误,其原因、影响和排查方式各不相同。
  • 启动加工引擎。
    • 该环节产生错误主要是由于在启动加工引擎过程中,检测到用户编写的LOG DSL规则存在错误,导致加工引擎内部的安全检查不通过。
    • 在该阶段产生错误时,加工任务会停止。用户需要修改LOG DSL规则并重新启动加工任务。如果重试成功,加工任务会继续正常工作,不会产生日志的丢失或冗余。
    该环节的错误排查方法请参见加工引擎启动错误
  • 读取源Logstore数据。
    • 该环节产生错误可能是由于源Logstore信息配置错误、网络错误、源Logstore信息发生变化等,导致对源Logstore的访问异常。
    • 该阶段产生错误时,加工任务会一直重试,直到重试成功或被手动停止。如果重试成功,加工任务会继续正常工作,不会产生日志的丢失。
    • 如果是已经读取部分数据后才报错,则加工服务会保存断点并一直重试,重试成功后从断点处继续读取,不会有数据的丢失与重复。如果重试过程中停止,不会有数据丢失与重复。
    该环节的错误排查方法请参见源Logstore读取错误
  • 加工日志事件。
    • 该环节产生错误主要是由于在数据加工过程中,部分或全部日志事件不适配加工规则引发的错误。
    • 该阶段产生错误时,不适配加工规则的日志事件会丢弃,加工后的输出结果中将不包含这些日志事件。
    该环节的错误排查方法请参见:加工规则错误
  • 输出到目标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条数据经过加工后没有加工结果产生,则会持续拉取数据五分钟,直到有加工结果产生为止。