diff --git a/lib/fluent/plugin_helper/inject.rb b/lib/fluent/plugin_helper/inject.rb index e9194adecc..6960ee45a6 100644 --- a/lib/fluent/plugin_helper/inject.rb +++ b/lib/fluent/plugin_helper/inject.rb @@ -76,7 +76,7 @@ module InjectParams config_param :time_key, :string, default: nil # To avoid defining :time_type twice - config_param :time_type, :enum, list: [:float, :unixtime, :unixtime_millis, :string], default: :float + config_param :time_type, :enum, list: [:float, :unixtime, :unixtime_millis, :unixtime_micros, :unixtime_nanos, :string], default: :float Fluent::TimeMixin::TIME_PARAMETERS.each do |name, type, opts| config_param(name, type, **opts) @@ -132,7 +132,9 @@ def configure(conf) if @_inject_time_key @_inject_time_formatter = case @inject_config.time_type when :float then ->(time){ time.to_r.truncate(+6).to_f } # microsecond floating point value - when :unixtime_millis then ->(time) { time.to_f.floor(3) * 1000 } + when :unixtime_millis then ->(time) { time.respond_to?(:nsec) ? time.to_i * 1_000 + time.nsec / 1_000_000 : (time * 1_000).floor } + when :unixtime_micros then ->(time) { time.respond_to?(:nsec) ? time.to_i * 1_000_000 + time.nsec / 1_000 : (time * 1_000_000).floor } + when :unixtime_nanos then ->(time) { time.respond_to?(:nsec) ? time.to_i * 1_000_000_000 + time.nsec : (time * 1_000_000_000).floor } when :unixtime then ->(time){ time.to_i } else localtime = @inject_config.localtime && !@inject_config.utc diff --git a/lib/fluent/time.rb b/lib/fluent/time.rb index 5c56c953e1..9f52cbba27 100644 --- a/lib/fluent/time.rb +++ b/lib/fluent/time.rb @@ -50,6 +50,7 @@ def nsec def to_int @sec end + alias :to_i :to_int def to_f @sec + @nsec / 1_000_000_000.0 diff --git a/test/plugin_helper/test_inject.rb b/test/plugin_helper/test_inject.rb index 1f087cdf4b..b17f63f5eb 100644 --- a/test/plugin_helper/test_inject.rb +++ b/test/plugin_helper/test_inject.rb @@ -187,6 +187,35 @@ def config_inject_section(hash = {}) record = {"key1" => "value1", "key2" => 2} assert_equal record.merge({"timedata" => unixtime_millis}), @d.inject_values_to_record('tag', time, record) + assert_equal record.merge({"timedata" => time_in_unix * 1_000}), @d.inject_values_to_record('tag', time_in_unix, record) + end + + test 'injects time as unix time micros into specified key' do + time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i + time_subsecond = 320_101_224 + time = Fluent::EventTime.new(time_in_unix, time_subsecond) + unixtime_micros = 1466464211320101 + + @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "unixtime_micros")) + @d.start + + record = {"key1" => "value1", "key2" => 2} + assert_equal record.merge({"timedata" => unixtime_micros}), @d.inject_values_to_record('tag', time, record) + assert_equal record.merge({"timedata" => time_in_unix * 1_000_000}), @d.inject_values_to_record('tag', time_in_unix, record) + end + + test 'injects time as unix time nanos into specified key' do + time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i + time_subsecond = 320_101_224 + time = Fluent::EventTime.new(time_in_unix, time_subsecond) + unixtime_nanos = 1466464211320101224 + + @d.configure(config_inject_section("time_key" => "timedata", "time_type" => "unixtime_nanos")) + @d.start + + record = {"key1" => "value1", "key2" => 2} + assert_equal record.merge({"timedata" => unixtime_nanos}), @d.inject_values_to_record('tag', time, record) + assert_equal record.merge({"timedata" => time_in_unix * 1_000_000_000}), @d.inject_values_to_record('tag', time_in_unix, record) end test 'injects time as unix time into specified key' do