Ruby 有没有办法在Kiba作业结束时返回一些数据?

Ruby 有没有办法在Kiba作业结束时返回一些数据?,ruby,etl,kiba-etl,Ruby,Etl,Kiba Etl,如果有一种方法可以从Kiba ETL运行中获取某种返回对象,这样我就可以使用其中的数据返回一个关于管道运行情况的报告,那就太好了 我们有一个每10分钟运行一次的作业,它平均处理20-50k条记录,并将它们压缩成摘要记录,其中一些记录是创建的,一些记录是更新的。问题是,如果不浏览大量的日志文件,就很难知道发生了什么,显然,日志对最终用户也很有用 在管道运行时,是否有方法用任意数据填充某种结果对象?e、 g 在源中找到25.7k行 782条记录被这个变压器丢弃了 插入100条记录 更新150项纪录

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

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

在管道运行时,是否有方法用任意数据填充某种结果对象?e、 g

  • 在源中找到25.7k行
  • 782条记录被这个变压器丢弃了
  • 插入100条记录
  • 更新150项纪录
  • 20条记录有错误(如下所示)
  • 这项记录有最高的统计数字
  • 1200条记录属于该VIP客户
  • 等等
最后,使用这些数据发送电子邮件摘要、填充网页、呈现一些控制台输出等

目前,我唯一能看到这一点的方法是在设置过程中发送一个对象,并在它流经源、转换器和目标时对其进行变异。运行完成后,检查变量并对其中的数据进行处理

是应该这样做,还是有更好的方法

编辑


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

答案在很大程度上取决于上下文,但这里有一些指导原则

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

您将如何填充它取决于上下文和您的实际需求,但这可以以与工作无关的方式完成(可能使用DSL扩展,您可以实现一些相当高级的扩展,这些扩展将注册所需的转换或块以实现您所需的功能)

该对象可以按原样使用,也可以序列化为JSON或类似格式,甚至可以存储到DB中,如果您以后需要提供一些丰富的输出(或者您可以使用它来准备其他内容)

如果需要的话,您甚至可以在特定的数据库中构建一些结构合理的东西,用于此目的(例如,如果您需要一种向客户公开的简单方法)

请注意,您可以通过编程方式定义
post\u流程
,而无需作业太多地实现它(无需耦合)。下面是一个非常简单的例子:

模块ETL
模块扩展
模块电子邮件报告
def设置\电子邮件\报告
预处理
@email\u report\u stats=Hash.new(0)
结束
后处理
#实际发送电子邮件吗
结束
结束
def track_事件!(活动:)
@电子邮件报告统计信息[事件]+=1
结束
结束
结束
结束
Kiba.do
扩展ETL::DSL扩展::EmailReport
#这将注册预/后处理
设置\u电子邮件\u报告
来源。。。
田径比赛!(事件:“行读取”)
使改变
使改变
使改变
田径比赛!(事件:“已写入行”)
目的地。。。
结束
如果这样做,请确保使用非常好的名称空间变量,以避免任何冲突


请注意,正如前面所讨论的,这并不包括失败的情况,但您知道了

谢谢,这很有帮助。我最终决定在管道之外创建一个上下文散列,将其发送进来,并在它通过每个管道时添加到其中,因为我需要跟踪转换过程中丢弃的某些记录及其原因。如果不在运行时访问变压器内部的某些状态,就不可能弄清楚这一点。