我们使用ActiveSupport
通知来记录特定的网络呼叫(使用法拉第制作)。只有一种类型的调用,当代码到达时......
ActiveSupport::Notifications.subscribe(notification[:name]) do |_name, starts, ends, _, env|
handle_notification(starts, ends, env, notification[:service], env[:request_headers][notification[:header]])
end
... starts
和ends
相同,因此我无法计算通话的持续时间。
这只发生在一个特定的调用上,代码基本相同。但是,我注意到正常工作的调用被提取到了宝石,但是不工作的调用不在宝石中。不确定是否重要。
我该如何调试/解决这个问题?
答案 0 :(得分:0)
在尝试使用factory_girl
(现在称为factory_bot
,因为我们在政治上都是正确的)来限制缓慢的工厂时,我遇到了同样的问题。
在我看来,应该归咎于使用travel_to
。 travel_to
的工作方式(不幸的是)实际上是通过冻结时间来实现的……也就是说,一旦调用travel_to x
,Time.now
将返回{{1 }},无论通话之间经过了多长时间。
一种解决方法可能涉及使用x
,或避免进行travel_back
呼叫。
答案 1 :(得分:-1)
start
和end
值是Time
个对象。如果您只记录这些值的输出,它们就像时间/日期值2017-01-12 10:51:00 +0100
一样。
您必须将这些转换为毫秒或微秒才能看到精细值。
您可以使用以下内容将Time对象转换为毫秒:
start.to_f * 1000
end.to_f * 1000
然后,您可以使用1484216765256
之类的值(以毫秒为单位),并通过从end
中减去start
来计算持续时间。