Получение всех результатов в одном массиве - PullRequest
0 голосов
/ 04 июня 2018

Я боролся с этим часами, и я почти уверен, что что-то упускаю.

Учитывая этот JSON:

[
{
  "LAST_JOB_POD":"gitlab-web-65-gwwwh",
  "STARTED_AT":"31-05-2018-18:18:48",
  "FINISHED":"false",
  "FIRST_INDEXED":"0",
  "LAST_INDEXED":"3143",
  "failed_projects":{
    "1082": "4:Deadline Exceeded, trace",
    "1273": "/opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/elasticsearch-transport-5.0.3/lib/elasticsearch/transport/transport/base.rb:201:in `__raise_transport_error'",
    "2492": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "3060": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)"
  }
},
{
  "LAST_JOB_POD":"gitlab-web-65-gwwwh",
  "STARTED_AT":"31-05-2018-18:18:48",
  "FINISHED":"false",
  "FIRST_INDEXED":"0",
  "LAST_INDEXED":"3143",
  "failed_projects":{
    "5570": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6103": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6188": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6695": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6721": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6728": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6747": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)"
  }
},
{ 
  "LAST_JOB_POD":"gitlab-web-65-gwwwh",
  "STARTED_AT":"31-05-2018-18:18:48",
  "FINISHED":"false",
  "FIRST_INDEXED":"0",
  "LAST_INDEXED":"3143",
  "failed_projects":{
    "6760": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6939": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6941": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6942": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "6947": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)",
    "7201": "/opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/elasticsearch-transport-5.0.3/lib/elasticsearch/transport/transport/base.rb:201:in `__raise_transport_error'",
    "7707": ", trace - [\"/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/elastic/indexer.rb:64:in `run_indexer!'\"",
    "7787": "/opt/gitlab/embedded/lib/ruby/2.3.0/net/protocol.rb:176:in `rbuf_fill': Net::ReadTimeout (Faraday::TimeoutError)"
  }
}
]

В настоящее время я использую jq дляизвлечь failed_projects записей, но с помощью

[] | select(.failed_projects != null) | . as $object | {"failed_projects"}[]

Я получаю результаты в разных группах:

{
"1082": "...",
...
}
{
"5570": "...",
...
}
{
"6760": "...",
...
}

Что я пытаюсьВыполнить это сгруппировать идентификаторы с тем же исключением.Нечто подобное:

[{
"Exception": "ReadTimeout",
 [{
   "ID": 2492,
   "ID": 3060
 }]
},
{
"Exception": "Deadline Exceeded",
 [{
   "ID": 1082
 }]
}]

1 Ответ

0 голосов
/ 04 июня 2018

Иллюстративный вывод недопустим как JSON и содержит объекты с повторяющимися ключами, что, вероятно, не то, что вы на самом деле хотите, но следующая программа jq выдаст вывод, который соответствует общему описанию проблемы.Поскольку вы, похоже, не указали точный критерий группировки, я взял текст сообщения об ошибке после последнего ":" в качестве критерия группировки.(Если, например, вы хотите рассмотреть текст после первого «:», используйте «^ [^:] *: *» в качестве регулярного выражения.)

Первый шаг собирает .failed_projects вместеи применяется to_entries, чтобы мы могли легко получить доступ к идентификатору и тексту сообщения об ошибке:

[.[] | .failed_projects | to_entries[]]

Далее мы извлекаем критерий группировки и используем его для формирования групп:

| map(.value |= sub("^.*: *";""))
| group_by(.value)

Наконец, мы преобразуем группы в объекты JSON в форме: {GROUP: ARRAY_OF_IDs}:

| map( .[0].value as $key
       | [.[] | .key] as $value
       | {($key): $value} )

Объединение вышеуказанных фрагментов в файл program.jq и использование вызова:

jq -f program.jq input.json

дает вывод, показанный ниже.Очевидно, вы захотите изменить критерий группировки.Вы также можете преобразовать строки идентификаторов в числа JSON, что можно сделать с помощью tonumber или более осторожно с помощью (tonumber? // .).

Чтобы понять файл program.jq, вы можете начать с первого фрагмента., а затем добавьте каждый из остальных по очереди.

Выход

[
  {
    "Deadline Exceeded, trace": [
      "1082"
    ]
  },
  {
    "TimeoutError)": [
      "6728",
      "6747",
      "6939",
      "5570",
      "6103",
      "6188",
      "6695",
      "6721",
      "2492",
      "6760",
      "3060",
      "6941",
      "6942",
      "6947",
      "7787"
    ]
  },
  {
    "in `__raise_transport_error'": [
      "1273",
      "7201"
    ]
  },
  {
    "in `run_indexer!'\"": [
      "7707"
    ]
  }
]
...