我们使用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
是相同的,所以我无法计算通话的持续时间。
这只发生在一个特定的调用上,代码基本相同。但是,我注意到正常工作的调用被提取到了宝石,但是不工作的调用不在宝石中。不确定是否重要。
我该如何调试/解决这个问题?
我试图用factory_girl
(现在称为factory_bot
,因为我们在政治上都是正确的)来确定缓慢的工厂时遇到了同样的问题。
在我的情况下,事实证明使用travel_to
是罪魁祸首。 travel_to
似乎工作的方式(不幸的是),基本上是“冻结”时间......也就是说,一旦travel_to x
被调用,Time.now
将返回x
的值,无论调用之间有多少时间。
解决方法可能涉及使用travel_back
或避免travel_to
调用。
start
和end
值是Time
对象。如果您只记录这些值的输出,它们就像时间/日期值2017-01-12 10:51:00 +0100
。
您必须将它们转换为毫秒或微秒才能看到精细值。
您可以使用以下内容将Time对象转换为毫秒:
start.to_f * 1000
end.to_f * 1000
然后你可以使用像1484216765256
这样的值,以毫秒为单位,并通过从end
中减去start
来计算持续时间。