Как динамически анализировать объект json в логстше, используя код ruby - PullRequest
0 голосов
/ 25 августа 2018

У меня есть это в качестве ввода, мне нужно проанализировать все ключи и значения и поместить в отдельное событие, не могли бы вы помочь мне, как достичь, На самом деле я только один ключ и значение, когда я использую код рубина ниже.

"entities": {
"PROCESS_GROUP_INSTANCE-EA653E6874E21338": "WebSphere AS nzapwa145Cell (nzapwa146 / ePIMS_pwa146)",
"PROCESS_GROUP_INSTANCE-64A2967FB7FC0C5B": "WebSphere AS ndmProd (nzapwa127 / ePIMS_Report_pwa127)",
"PROCESS_GROUP_INSTANCE-4738C9392BDBC296": "EPS Store - 900008014",
"PROCESS_GROUP_INSTANCE-BA196B9B53FF6323": "EPS Store - 900008040",
"PROCESS_GROUP_INSTANCE-D5D2DAB06C8FDAAF": "ws-server.jar prod-sj-userprofile-adapter-service- - -*",
"PROCESS_GROUP_INSTANCE-3EABAD79933CE911": "/apps/conf/httpd-p2_cdis.conf - KPATHS",
}

Код:

ruby {
code => '
event.get("[result][entities]").each { |key, value|
event.set("hostId", key)
event.set("serverName", value)
}
'
}

Вывод для вышеуказанного кода:

{"serverName":"/apps/conf/httpd-p2_cdis.conf - KPATHS)","@timestamp":"2018-08-25T15:17:11.762Z","hostId":"PROCESS_GROUP_INSTANCE-3EABAD79933CE911"}

Но желаемый вывод будет таким:

{"serverName":"WebSphere AS nzapwa145Cell (nzapwa146 / ePIMS_pwa146)","@timestamp":"2018-08-25T15:17:11.762Z","hostId":"PROCESS_GROUP_INSTANCE-EA653E6874E21338"}
{"serverName":"WebSphere AS ndmProd (nzapwa127 / ePIMS_Report_pwa127)","@timestamp":"2018-08-25T15:17:11.762Z","hostId":"PROCESS_GROUP_INSTANCE-64A2967FB7FC0C5B"}
{"serverName":"EPS Store - 900008014","@timestamp":"2018-08-25T15:17:11.762Z","hostId":"PROCESS_GROUP_INSTANCE-4738C9392BDBC296"}
{"serverName":"ws-server.jar prod-sj-userprofile-adapter-service- - -*","@timestamp":"2018-08-25T15:17:11.762Z","hostId":"PROCESS_GROUP_INSTANCE-BA196B9B53FF6323"}
{"serverName":"/apps/conf/httpd-p2_cdis.conf - KPATHS","@timestamp":"2018-08-25T15:17:11.762Z","hostId":"PROCESS_GROUP_INSTANCE-D5D2DAB06C8FDAAF"}
{"serverName":"/apps/conf/httpd-p2_cdis.conf - KPATHS)","@timestamp":"2018-08-25T15:17:11.762Z","hostId":"PROCESS_GROUP_INSTANCE-3EABAD79933CE911"}

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

1 Ответ

0 голосов
/ 26 августа 2018

Я не эксперт по Logstash, но я думаю, что ваш фильтр Ruby перезаписывает (устанавливает) значения hostId и serverName несколько раз, перебирая все заданные пары ключ-значение.Это оставляет вас со значениями, которые были установлены в последней итерации.В конце концов, есть только одно событие, поэтому ваши ключи должны быть уникальными.Чтобы это исправить, вам нужно расширить ключевое поле вашего события, вложив его в древовидную структуру или создав уникальные строки ключей.

Здесь hostId - это уникальный ключ:

ruby {
code => '
event.get("[result][entities]").each do |key, value|
  event.set(key, value)
end
'
}

Здесь добавлен дополнительный индекс для обеспечения уникальных ключей:

ruby {
code => '
idx = 0
event.get("[result][entities]").each do |key, value|
  event.set("[#{idx}][hostId]", key)
  event.set("[#{idx}][serverName]", value)
  idx += 1
end
'
}

Надеюсь, вы найдете это полезным.

...