kibana 4.1 экспорт результатов поиска

Недавно мы переместили централизованное ведение журнала из Splunk в решение ELK, и у нас есть необходимость экспортировать результаты поиска - есть ли способ сделать это в Kibana 4.1? Если есть, это не совсем очевидно...

Спасибо!

8 ответов

Решение

Конечно, вы можете экспортировать из Kibana's Discover (Kibana 4.x+). 1. На странице обнаружения нажмите "стрелку вверх" здесь: введите описание изображения здесь

  1. Теперь, внизу страницы, у вас будет два варианта экспорта результатов поиска.

введите описание изображения здесь

На logz.io (компания, в которой я работаю) мы будем публиковать запланированные отчеты на основе конкретных поисков.

Это очень старый пост. Но я думаю, что все еще кто-то ищет хороший ответ.

Вы можете легко экспортировать результаты поиска из Kibana Discover.

Сначала нажмите Save, затем нажмите Share

Нажмите CSV Отчеты

Затем нажмите Создать CSV

Через несколько секунд вы получите опцию загрузки внизу справа.

Это работает с Kibana v 7.2.0 - экспорт результатов запроса в локальный файл JSON. Здесь я предполагаю, что у вас есть Chrome, аналогичный подход может работать с Firefox.

  1. Chrome - откройте Инструменты разработчика / Сеть
  2. Кибана - выполним ваш запрос
  3. Chrome - щелкните правой кнопкой мыши сетевой вызов и выберите Копировать / Копировать как cURL.
  4. командная строка - выполнить [cURL from step 4] > query_result.json

Если вы хотите экспортировать журналы (не только метку времени и счет), у вас есть несколько вариантов (tylerjl очень хорошо ответил на этот вопрос на форумах Kibana):

Если вы действительно хотите экспортировать журналы из Elasticsearch, вы, вероятно, захотите сохранить их где-нибудь, поэтому просмотр их в браузере, вероятно, не лучший способ просмотра сотен или тысяч журналов. Здесь есть несколько вариантов:

  • На вкладке "Обнаружение" можно щелкнуть вкладку со стрелкой внизу, чтобы увидеть необработанный запрос и ответ. Вы можете нажать "Запрос" и использовать его как запрос к ES с помощью curl (или чего-то подобного), чтобы запросить у ES требуемые журналы.

  • Вы можете использовать logstash или stream2es206 для выгрузки содержимого индекса (с возможными параметрами запроса, чтобы получить нужные документы).

@ Ответ Шона правильный, но в нем нет подробностей.

Вот быстрый и грязный скрипт, который может захватывать все журналы из ElasticSearch через httpie, анализировать и записывать их через jq, а также использовать курсор прокрутки для итерации запроса, чтобы можно было захватить более первых 500 записей (в отличие от другие решения на этой странице).

Этот скрипт реализован с помощью httpie (http command) и fish shell, но может быть легко адаптирована к более стандартным инструментам, таким как bash и curl.

Запрос задается в соответствии с ответом @Sean:

На вкладке "Обнаружение" вы можете щелкнуть вкладку со стрелкой внизу, чтобы увидеть необработанный запрос и ответ. Вы можете нажать "Запрос" и использовать это как запрос к ES с помощью curl (или чего-то подобного), чтобы запросить ES для журналов, которые вы хотите.

set output logs.txt
set query '<paste value from Discover tab here>'
set es_url http://your-es-server:port
set index 'filebeat-*'

function process_page
  # You can do anything with each page of results here
  # but writing to a TSV file isn't a bad example -- note
  # the jq expression here extracts a kubernetes pod name and
  # the message field, but can be modified to suit
  echo $argv | \
    jq -r '.hits.hits[]._source | [.kubernetes.pod.name, .message] | @tsv' \
    >> $output
end

function summarize_string
  echo (echo $argv | string sub -l 10)"..."(echo $argv | string sub -s -10 -l 10)
end

set response (echo $query | http POST $es_url/$index/_search\?scroll=1m)
set scroll_id (echo $response | jq -r ._scroll_id)
set hits_count (echo $response | jq -r '.hits.hits | length')
set hits_so_far $hits_count
echo "Got initial response with $hits_count hits and scroll ID "(summarize_string $scroll_id)

process_page $response

while test "$hits_count" != "0"
  set response (echo "{ \"scroll\": \"1m\", \"scroll_id\": \"$scroll_id\" }" | http POST $es_url/_search/scroll)
  set scroll_id (echo $response | jq -r ._scroll_id)
  set hits_count (echo $response | jq -r '.hits.hits | length')
  set hits_so_far (math $hits_so_far + $hits_count)
  echo "Got response with $hits_count hits (hits so far: $hits_so_far) and scroll ID "(summarize_string $scroll_id)

  process_page $response
end

echo Done!

Конечным результатом являются все журналы, соответствующие запросу в Kibana, в выходном файле, указанном в верхней части скрипта, преобразованные в соответствии с кодом в process_page функция.

Если у вас возникли проблемы с выполнением собственного запроса с помощью curl или вам не нужна автоматическая программа для извлечения логов из Kibana, просто нажмите "Ответить" и получите то, что вам нужно.

После того, как у меня возникли проблемы, такие как "отсутствие токена xsrf" при использовании curl, я обнаружил, что этот способ проще и проще!

Как говорили другие, кнопка "Запрос" появляется после нажатия вкладки со стрелкой внизу.

Нажмите кнопку "Ответить"

Экспортируются только метка времени и количество сообщений в это время, а не информация журнала:

сырье:

1441240200000,1214 1441251000000,1217 1441261800000,1342 1441272600000,1452 1441283400000,1396 1441294200000,1332 1441305000000,1332 1441315800000,1334 1441326600000,1337 1441337400000,1215 144134818000002523

отформатирован:

"3 сентября 2015 г., 06: 00: 00.000", "1 214" "3 сентября 2015 г., 09: 00: 00 000", "1 217" "3 сентября 2015 г., 12: 00: 00 000", "1 342" "3 сентября 2015 г., 15: 00: 00.000 "," 1452 "" 3 сентября 2015 года, 18: 00: 00.000 "," 1396 "" 3 сентября 2015 года, 21: 00: 00.000 "," 1332 "" 4 сентября 2015 года, 00: 00: 00.000 "," 1332 "" 4 сентября 2015 г., 03: 00: 00.000 "," 1334 "" 4 сентября 2015 г., 06: 00: 00.000 "," 1337 "" 4 сентября 2015 г., 09: 00: 00.000 "," 1 215 " "4 сентября 2015 года, 12: 00: 00.000", "12 523" "4 сентября 2015 года, 15: 00: 00 000", "61897"

Я попробовал сценарий, но продолжал сталкиваться с какой-то проблемой с пробелами или скрытыми символами.

Я проверил сеть (когда я немного использовал пользовательский интерфейс kibana, который просто показывает необработанные журналы событий), скопировал запрос как curl. Преобразовал его в python на случайном веб-сайте, затем добавил логику для извлечения и обновления search_after, чтобы я получил результаты, превышающие одну страницу.

Обратите внимание, что это немного специфично для CVAT (программное обеспечение для маркировки изображений компьютерного зрения, которое использует Kibana для хранения своих данных о событиях), но только в той степени, в которой некоторые конечные точки API будут отличаться для других экземпляров Kibana.

Мне было так больно начинать работать, что я действительно думал, что должен оставить что-то позади.

      import requests

cookies = {
    'PGADMIN_LANGUAGE': 'en',
    'sessionid': 'gqnwizma4m088siz93q7uafjygkbd1b3',
    'csrftoken': 'khLc0XNgkESvVxoPHyOyCIJ2dXzv2tHWTIoOcxqN6X6CR75E6VTzis6jRxNmVI43',
}

headers = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'en-GB,en',
    'Connection': 'keep-alive',
    'Origin': '<kibana-address>',
    'Referer': '<kibana-address>/analytics/app/kibana',
    'Sec-GPC': '1',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
    'content-type': 'application/x-ndjson',
    'kbn-version': '6.8.23',
}

params = {
    'rest_total_hits_as_int': 'true',
    'ignore_throttled': 'true',
}

# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/search-multi-search.html
# https://stackoverflow.com/questions/68127892/how-does-search-after-work-in-elastic-search

results = []
for i in range(0, 500):
    
    if i == 0: 
        data = '{"index":"cvat*", "ignore_unavailable":true,"preference":1676572620990}\n{"version":true,"size":500, "from": ' + str(i*500) + ', "sort":[{"@timestamp":{"order":"desc","unmapped_type":"boolean"}}],"_source":{"excludes":[]},"aggs":{"2":{"date_histogram":{"field":"@timestamp","interval":"1M","time_zone":"Europe/London","min_doc_count":1}}},"stored_fields":["*"],"script_fields":{},"docvalue_fields":[{"field":"@timestamp","format":"date_time"}],"query":{"bool":{"must":[{"range":{"@timestamp":{"gte":1673308800000,"lte":1676591999999,"format":"epoch_millis"}}}],"filter":[{"match_all":{}}],"should":[],"must_not":[]}},"highlight":{"pre_tags":["@kibana-highlighted-field@"],"post_tags":["@/kibana-highlighted-field@"],"fields":{"*":{}},"fragment_size":2147483647},"timeout":"30000ms"}\n'
    else: 
        search_after = f'"search_after": {str(search_after)}'
        print(search_after)
        data = '{"index":"cvat*", "ignore_unavailable":true,"preference":1676572620990}\n{"version":true,"size":500, ' + search_after + ', "sort":[{"@timestamp":{"order":"desc","unmapped_type":"boolean"}}],"_source":{"excludes":[]},"aggs":{"2":{"date_histogram":{"field":"@timestamp","interval":"1M","time_zone":"Europe/London","min_doc_count":1}}},"stored_fields":["*"],"script_fields":{},"docvalue_fields":[{"field":"@timestamp","format":"date_time"}],"query":{"bool":{"must":[{"range":{"@timestamp":{"gte":1673308800000,"lte":1676591999999,"format":"epoch_millis"}}}],"filter":[{"match_all":{}}],"should":[],"must_not":[]}},"highlight":{"pre_tags":["@kibana-highlighted-field@"],"post_tags":["@/kibana-highlighted-field@"],"fields":{"*":{}},"fragment_size":2147483647},"timeout":"30000ms"}\n'
        
    #print(data)
    
    response = requests.post(
        f'<kibana-address>/analytics/elasticsearch/_msearch', #?from={str(i*500)}',
        params=params,
        cookies=cookies,
        headers=headers,
        data=data,
        verify=False,
    )
    
    print(i, response.status_code)
    
    if response.status_code == 500:
        break
        
    results.extend(response.json()['responses'][0]['hits']['hits'])
    search_after = results[-1]['sort']
Другие вопросы по тегам