假设我们有两个时间戳字段,我们可以计算它们之间的时间差吗?为了 例子
[2014-04-01T18:50:41.817+0000] ~[2014-04-01T18:50:45.680Z]
我努力实现这一目标,但找到了方法。
ruby {
code => 'event["buffer_time"] = Time.now.to_f - event["arrival_ts"].to_f'
}
从今天起,最新版本不再支持上述代码 - Logstash-7.x。
我们可以使用 ruby 中的 event.set 和 event.get 实现相同的效果 并使用时间库转换时间戳(日期时间)
ruby {
init => "require 'time'"
code => '
to_date_v = Time.iso8601(event.get("[B-date]").to_s).to_i
from_date_v = Time.iso8601(event.get("[A-date]").to_s).to_i
event.set("[to_date]", to_date_v)
event.set("[from_date]", from_date_v)
difference_v = to_date_v - from_date_v
event.set("[difference]", difference_v)
'
}
您可以检查示例输入、输出和完整脚本这里
他们决定禁用 Elasticsearch 中的服务器脚本作为安全预防措施。您可以使用 lucene 表达式,但它们仅适用于整数(不适用于日期)。
我会在logstash中的ruby{}过滤器中计算两个日期之间的差异,这样你就不会受到elasticsearch/kibana的突发奇想。
ruby {
code => "
begin
event['elapsed_time'] = ((DateTime.parse(event['date2']) - DateTime.parse(event['date1'])) * 86400).to_i
rescue Exception => e
event['logstash_ruby_exception'] = 'elapsed: ' + e.message
end
"
}
我从 Elastic 的 R.Clarke 那里学到了这一点(版本logstash 2.1.0):
ruby {
code => 'event["buffer_time"] = Time.now.to_f - event["arrival_ts"].to_f'
}