如果有一种方法可以从Kiba ETL运行中获取某种返回对象,这样我可以使用其中的数据返回有关管道运行状况的报告,那就太好了。
我们有一个作业,每10分钟运行一次,平均处理20到5万条记录,并将其压缩为摘要记录,其中一些已创建,而一些已更新。问题是,不浏览大量日志文件就很难知道发生了什么,显然,日志对最终用户也很有用。
在管道运行时,是否有一种方法可以用任意数据填充某种结果对象?例如
然后最后,使用该数据发送电子邮件摘要,填充网页,呈现一些控制台输出等。
当前,我现在唯一能看到此工作的方法是在设置过程中发送一个对象,并在该对象流经源,转换器和目的地时对其进行突变。运行完成后,请稍后检查变量,并对其中的数据进行处理。
这是应该怎么做,还是有更好的方法?
编辑
我只是想补充一点,我不想在post_process
块中处理此问题,因为管道是通过许多不同的媒介使用的,我希望每个用例都可以处理自己的反馈机制。对于ETL管道来说,它也更干净(imo),不必担心它的使用位置以及该使用场景的反馈期望是什么...
答案 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
如果这样做,请确保使用名称空间很好的变量,以避免发生任何冲突。
请注意,如前所述,这并不涉及失败的情况,但是您知道了!