【问题标题】:Logstash convert date duration from string to hoursLogstash 将日期持续时间从字符串转换为小时
【发布时间】:2023-03-07 10:59:01
【问题描述】:

我有一个这样的专栏:

business_time_left
3 Hours 24 Minutes
59 Minutes
4 Days 23 Hours 58 Minutes
0 Seconds
1 Hour

等等..

我想在 Logstash 中将其完全转换为小时。 所以 mu 值应该完全转换为类似的东西

business_time_left
    3.24
    0.59
    119.58
    0 
    1

这可能吗?

我的配置文件:

http_poller {
    urls => {
    snowinc => {
    url => "https://service-now.com"
    user => "your_user"
    password => "yourpassword"
    headers => {Accept => "application/json"}
    }
}
request_timeout => 60
metadata_target => "http_poller_metadata"
schedule => { cron => "* * * * * UTC"}
codec => "json"
}
}
filter
   {
   json {source => "result" }
   split{ field => ["result"] }
}
output {
  elasticsearch {
    hosts => ["yourelastuicIP"]
    index => "inc"
    action=>update
    document_id => "%{[result][number]}"
    doc_as_upsert =>true
}
        stdout { codec => rubydebug }
}

Json 输入数据示例,当 url 被点击时。

{"result":[
{
"made_sla":"true",
"Type":"incident resolution p3",
"sys_updated_on":"2019-12-23 05:00:00"
"business_time_left":" 59 Minutes"} ,
{
"made_sla":"true",
"Type":"incident resolution l1.5 p4",
"sys_updated_on":"2019-12-24 07:00:00"
"business_time_left":"3 Hours 24 Minutes"}]}

提前致谢!

【问题讨论】:

  • 你用我建议的方法成功了吗?背后的意图够清楚吗?

标签: logstash elastic-stack logstash-configuration


【解决方案1】:

问:这可能吗?

答:是的。

假设您的 json 过滤器和拆分过滤器工作正常,并且字段 business_time_left 像您显示的那样包含一个值(例如 4 天 23 小时 58 分钟)我个人将执行以下操作:

首先,确保您的数据具有某种模式含义,标准化“数量描述”。这意味着分钟总是被标记为“分钟”而不是分钟、分钟或其他。

接下来,您可以像这样使用 grok-filter 解析字段:

filter{
  grok{
    match => { "business_time_left" => "(%{INT:calc.days}\s+Days)?%{SPACE}?(%{INT:calc.hours}\s+Hours)?%{SPACE}?(%{INT:calc.minutes}\s+Minutes)?%{SPACE}?(%{INT:calc.seconds}\s+Seconds)?%{SPACE}?" }
  }
}

这会将所有可用值提取到所需字段中,例如计算天数。 ? 字符可以防止 grok 失败,例如没有秒。您可以在this site 上测试该模式。

提取数据后,您可以实现一个 ruby​​ 过滤器来聚合数值,如下所示(虽然未经测试):

ruby{
  code => '
    days = event.get("calc.days")
    hours = event.get("calc.hours")
    minutes = event.get("calc.minutes")

    sum = 0

    if days
      days_numeric = days.to_i
      days_as_hours = days_numeric * 24
      sum += days_as_hours
    end

    if hours
      sum += hours.to_i
    end

    if minutes
      sum += (minutes.to_i / 100)
    end

    # seconds and so on ...

    event.set("business_time_left_as_hours", sum)
 '
}

所以基本上你检查这些值是否存在并用你的自定义逻辑将它们加到一个总和中。

event.set("business_time_left_as_hours", sum) will set the result as a new field to the document.

这些代码 sn-ps 并非旨在开箱即用,它们只是提示。因此,请查看有关 ruby​​ 过滤器、一般 ruby​​ 编码等的文档。

希望能帮到你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2016-07-17
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多