有什么办法可以在Kiba作业结束时返回一些数据?

时间:2020-07-03 11:11:40

标签: ruby etl kiba-etl

如果有一种方法可以从Kiba ETL运行中获取某种返回对象,这样我可以使用其中的数据返回有关管道运行状况的报告,那就太好了。

我们有一个作业,每10分钟运行一次,平均处理20到5万条记录,并将其压缩为摘要记录,其中一些已创建,而一些已更新。问题是,不浏览大量日志文件就很难知道发生了什么,显然,日志对最终用户也很有用。

在管道运行时,是否有一种方法可以用任意数据填充某种结果对象?例如

    在源代码中找到
  • 25.7k行
  • 此转换器删除了782条记录
  • 已插入100条记录
  • 已更新150条记录
  • 20条记录有错误(在这里)
  • 该记录的统计数据最高
  • 该VIP客户有1200条记录

然后最后,使用该数据发送电子邮件摘要,填充网页,呈现一些控制台输出等。

当前,我现在唯一能看到此工作的方法是在设置过程中发送一个对象,并在该对象流经源,转换器和目的地时对其进行突变。运行完成后,请稍后检查变量,并对其中的数据进行处理。

这是应该怎么做,还是有更好的方法?

编辑

我只是想补充一点,我不想在post_process块中处理此问题,因为管道是通过许多不同的媒介使用的,我希望每个用例都可以处理自己的反馈机制。对于ETL管道来说,它也更干净(imo),不必担心它的使用位置以及该使用场景的反馈期望是什么...

1 个答案:

答案 0 :(得分:1)

答案高度依赖于上下文,但这是一些准则。

如果结果对象不是太大,实际上我建议您传递一个空的结果对象(通常为Hash),然后在运行期间填充它(您也可以使用某种形式的中间件来跟踪异常本身)。

如何填充它取决于上下文和您的实际需求,但这可以通过与作业无关的方式来完成(也许使用DSL扩展https://github.com/thbar/kiba/wiki/How-to-extend-the-Kiba-DSL,您可以实现一些相当高级的扩展,将注册所需的转换或块以实现您所需的内容。

该对象可以按原样使用,或者也可以序列化为JSON或类似对象,甚至在以后需要提供一些丰富的输出(或者可以用它准备其他东西)时甚至存储到DB中。

如果需要,您甚至可以为此目的在特定的数据库中构建某种结构(例如,如果您需要一种简单的方法将其公开给客户)。

请注意,您可以以编程方式定义post_process,而无需工作来实现它(无需耦合)。这是一个非常简单的示例:

module ETL
  module DSLExtensions
    module EmailReport
      def setup_email_report
        pre_process do
          @email_report_stats = Hash.new(0)
        end

        post_process do
          # Do the actual email sending
        end
      end

      def track_event!(event:)
        @email_report_stats[event] += 1
      end
    end
  end
end

Kiba.parse do
  extend ETL::DSLExtensions::EmailReport

  # this will register the pre/post process
  setup_email_report

  source ...

  track_event!(event: 'row_read')

  transform
  transform
  transform

  track_event!(event: 'row_written')

  destination ...
end

如果这样做,请确保使用名称空间很好的变量,以避免发生任何冲突。

请注意,如前所述,这并不涉及失败的情况,但是您知道了!