使用Ruby-plugin将Ticks转换为logstash中的@timestamp

时间:2016-08-19 12:43:23

标签: ruby timestamp logstash

我使用jdbc-plugin对每个分钟的MSSQL数据库进行查询。 在此数据库中,我的时间戳存储在刻度线中。字段名称是lastupdate。 现在我想将lastupdate字段转换为时间戳格式,然后用转换后的lastvalue字段覆盖@timestamp字段。 我尝试使用另一篇文章提供的ruby过滤器插件,从ticks到datetime(Parse ticks to datetime)转换,但无法实现转换并得到_rubyexception和_dateparsefailure。

我的过滤器如下所示:

filter {
  if [type] == "mydb" {
    ruby {
      init => "require 'time'"
      code => "lastupdate = Time.at(event['lastupdate'].to_s)"
    }
    date {
      match => [ "lastupdate", "MM/dd/YY HH:mm:ss,SSS" ]
    }
  }
}

lastupdate的示例:636062509024728064

转换后的日期 http://tickstodatetime.com/:2016-08-08 T11:01:42.472Z

Ticks中的其他信息:https://msdn.microsoft.com/en-us/library/system.datetime.ticks%28v=vs.110%29.aspx

2 个答案:

答案 0 :(得分:2)

此处使用的刻度值为specified,如下所示:

  

此属性的值表示自公元1月1日午夜12:00:00(公历1月1日0:00:00到公历)以来经过的100纳秒间隔的数量,代表DateTime.MinValue。它不包括可归因于闰秒的刻度数。

在Ruby中,内部时间表示遵循从1970年1月1日,00:00:00 UTC开始计算秒数的Unix约定。因此,要转换该值,您必须执行一些额外的步骤。在扩展的Ruby中,它看起来像这样:

epoch = 621_355_968_000_000_000 # 1970-01-01T00:00:00Z in ticks
ticks_per_second = 10_000_000.0

lastupdate = 636062509024728064 # the value in ticks we would like to convert
seconds_since_epoch = (lastupdate - epoch) / ticks_per_second
Time.at(seconds_since_epoch).utc
# => 2016-08-08 11:01:42 UTC

为了将其应用于logstash,您可以稍微压缩一下:

filter {
  if [type] == "mydb" {
    ruby {
      code => "event['@timestamp'] = LogStash::Timestamp.at((event['lastupdate'].to_i - 621355968000000000) / 10_000_000.0)"
    }
  }
}

此代码剪切执行上面显示的计算,并将结果作为参数传递给Time.at。最后,它将生成的时间对象formats采用logstash使用的格式,并将其存储在@timestamp字段中。

答案 1 :(得分:1)

根据霍尔格的回答,我修好了我的。 (谢谢!)

他完全正确的转换。蜱虫是一个奇怪的时间单位:P我不会在这里重复他完美的解释。

这将解析String(!!!)tick值并创建一个Logstash时间对象以写入@timestamp字段:

ruby {
      init => "require 'time'"
      code => "
        ts = (event['message'].to_i - 621355968000000000) / 10000000
        event['@timestamp'] = LogStash::Timestamp.new(Time.at(ts))
       "
    }

有趣的问题:)仍然认为Holger值得一试;)

注意:您不需要"需要时间"部分。当lambda在logstash中执行时,它已被导入。

注意2:logstash 5.0会破坏事件(我相信它变成了一个java bean),所以不需要将它作为数组访问,而是需要通过set方法访问它。

此致

Artur

P.S。例如:

artur@pandaadb:~/dev/logstash$ ./logstash-2.3.2/bin/logstash -f conf2/
Settings: Default pipeline workers: 8
Pipeline main started
636062509024728064
{
       "message" => "636062509024728064",
      "@version" => "1",
    "@timestamp" => "2016-08-08T11:01:42.000Z",
          "host" => "pandaadb"
}

P.s.2:我认为"不能复制Fixnum"是我试图调用解析整数值(不确定)