Logsta sh конвертировать длительность даты из строки в часы - PullRequest
0 голосов
/ 21 января 2020

У меня есть такой столбец:

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

и т. Д.

Что я хочу сделать в Logsta sh, это полностью преобразовать это в часы. Таким образом, значение 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"}]}

Заранее спасибо!

1 Ответ

1 голос
/ 23 января 2020

В: Возможно ли это?

A: Да.

Предполагается, что ваши json - и сплит-фильтры работают правильно и поле business_time_left содержит одно значение, как вы показали (например, 4 дня 23 часа 58 минут ). Я лично сделал бы следующее:

Сначала убедитесь, что ваши данные находятся в виде значения шаблона, вы стандартизуете «количественные описания». Это означает, что минуты всегда обозначаются как «Минуты», а не «Минуты», «Мин.» Или что-то в этом роде.

В дальнейшем вы можете проанализировать поле с помощью фильтра grok следующим образом: извлечет все доступные значения в нужные поля, например, cal c .days. Символ ? предотвращает сбой грока, если, например, нет секунд. Вы можете проверить шаблон на этом сайте .

С извлеченными данными вы можете реализовать фильтр ruby для агрегирования числовых значений c следующим образом (не проверено):

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)
 '
}

Таким образом, в основном вы проверяете наличие значений и добавляете их к сумме с вашими пользовательскими логами c.

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

Эти фрагменты кода не предназначены для работы из коробки, они просто намеки. Поэтому, пожалуйста, проверьте документацию о ruby фильтре, ruby кодировании в целом и т. Д.

Я надеюсь, что смогу вам помочь.

...