📚 Методичка: Kibana & Логи

0 / 8 модулей

0. Введение

Эта методичка поможет техподдержке самостоятельно искать логи, диагностировать проблемы и оформлять баг-репорты для разработчиков. Работаем в kibana93.logan.wellsoft.pro (Kibana 9.3, Elasticsearch 9.3).

Что вы научитесь делать

  • Искать записи через AI-агента и руками в Discover
  • Фильтровать по проекту (fields.ProjectName), уровню (level), времени и Request ID (fields.RequestId)
  • Отличать Information от Warning и Error
  • Понимать, почему старых логов нет (ILM-политика удаляет)
  • Оформлять issue со ссылками на конкретные записи (Single Document)
Совет: проходите модули по порядку. В каждом есть интерактивная задача — попробуйте решить её сами, прежде чем смотреть ответ.
🎯 Задание «Разведка»

Зайдите в Kibana → AI-агент и задайте вопрос: «Какие последние ошибки были у проекта legion за последние 15 минут?». Затем откройте вкладку Discover, выберите DataView ascore и найдите хотя бы одну запись за последние 15 минут.

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

1. AI-агент

AI-агент — чат-бот, встроенный в Kibana 9.3. Подключён к документации Kibana/Elastic и знает структуру наших индексов ascore-*. Модель — MiniMax с большим контекстным окном, поэтому длинные логи переваривает нормально.

Когда использовать

  • Нужен быстрый первичный анализ ошибки
  • Не уверены, какой DataView/поле искать
  • Хотите сформулировать запрос на естественном языке
  • Надо собрать цепочку по RequestId через несколько компонентов
Ограничения: агент путает названия проектов — у нас внутренний ключ в fields.ProjectName часто отличается от «человеческого» имени (comfortCity, а не «Комфорт-Сити»; pskDom, а не «ПСК Дом»). Пишите ключ в кавычках и в правильном регистре. Ответ приходит за 15–20 секунд — не тыкайте «ещё раз».
🎯 Задание «AI vs Руки»

Клиент жалуется: «Не проходит оплата в Легионе». Какой порядок действий оптимален?

2. Поиск в Kibana (Discover)

Вкладка Discover — основной инструмент. По умолчанию показывает последние 15 минут. Интервал меняется абсолютно (от-до) или относительно (последние N часов/дней).

DataView, которые реально есть

  • ascore — все индексы ascore-*, основной для общих поисков. Поле времени @timestamp.
  • ascore-errors — только ошибки (ascore-errors-*). Сюда пишутся исключения/ошибки отдельно.
  • ascore-oauth — логи авторизации (ascore-oauth-*). Поле времени timestamp (без @).

Ключевые элементы интерфейса

  • Строка поиска — KQL (Kibana Query Language) или Lucene
  • Фильтры (+) — точные фильтры по полям (fields.ProjectName, level, fields.RequestId, fields.Environment)
  • Временной селектор — календарь или пресеты
  • Раскрытие строки — стрелка слева → Single Document, видны все поля
🎯 Задание «Найди интервал»

Клиент сообщил об ошибке 16 апреля около 14:00. Какой временной диапазон выставить, чтобы не промахнуться и не ждать долгой выборки?

Памятка: если дата известна точно, сужайте интервал до 1–2 часов — поиск быстрее и меньше шума. Если не уверены, начинайте с суток и сужайте.

3. Фильтры и синтаксис поиска

Основные поля для фильтрации

fields.ProjectNameВнутренний ключ проекта: legion, comfortCity, enco, ukDrevo, pskDom, usi и др.
levelУровень: Information, Warning, Error (Fatal — редко, у нас в основном в ascore-errors-*)
fields.RequestIdGUID запроса: 800124e2-0018-db00-b63f-84710c7967bb
fields.EnvironmentProduction / Staging / Development
fields.TypeHttpRequest, HttpResponse, syncjob и т.д.
message / messageTemplateТекст лога и его шаблон

Синтаксис KQL

fields.ProjectName : "legion" and level : "Error" — ошибки только в Легионе fields.RequestId : "800124e2-0018-db00-b63f-84710c7967bb" — все логи одного запроса message : *timeout* — подстрока (wildcard) level : "Error" and not fields.Type : "HttpResponse" — ошибки без HTTP-шума fields.ProjectName : ("legion" or "comfortCity") — несколько проектов сразу
Важно: значения в кавычках — точное совпадение токена. Без кавычек KQL тоже сработает, но хуже при спецсимволах. Для поиска подстроки — звёздочки: *timeout*.
🎯 Задание «Собери запрос»

Найти все записи с уровнем Error по проекту comfortCity с конкретным RequestId rq-998. Составьте KQL-запрос:

🎮 Симулятор поиска

Попробуйте фильтры. Введите, например, level:Error или legion и нажмите Search.

DataView: Время:
Введите запрос и нажмите Search...

4. Типы логов и хранение

Уровни логирования

Information — штатное событие. Обычно HTTP-запрос/ответ. В проде их 99.86% от всех логов.

Warning — стоит обратить внимание, но не критично. Предвестник. ~0.14% объёма.

Error — что-то отвалилось, нужен разбор. ~0.003% объёма, но именно это важно.

Fatal — полный крах. Крайне редко, обычно попадает в индекс ascore-errors-*.

Политика хранения (целевая)

Поскольку 78% объёма — это HttpRequest/HttpResponse на уровне Information (нужны только для real-time диагностики), а Error-ов 0.003% (нужны долго) — храним их по-разному:

ЧтоИндексСрок
HTTP-шум (Info + Type:HttpRequest/HttpResponse)ascore-http-*3 дня
Остальной Informationascore-logs-*7 дней
Warningascore-logs-*14 дней
Error / Fatalascore-errors-*30 дней
Вывод: если клиент жалуется на событие недельной давности — HttpRequest-логов уже нет, но Error-запись скорее всего осталась в ascore-errors-*. Если и там пусто — ошибки просто не было, и дело в клиенте/интеграции.
Переходный период: пока политика по уровням не раскатана, действует общая — 7 дней на всё (ILM ascore-logs-ilm-policy). Следите за объявлениями в канале DevOps.
🎯 Задание «Что осталось?»

Сегодня 21 апреля. Клиент сообщил о странном поведении 3 апреля. Какие логи гарантированно ещё есть (после внедрения целевой политики)?

5. Dashboard: быстрая диагностика

Дашборд показывает только ошибки (Error/Fatal из ascore-errors-*) по проектам. Не замена детальному поиску, но за секунды отвечает: есть ли массовый сбой.

Как читать дашборд

  • График ошибок по времени — всплеск = инцидент
  • Таблица снизу — группировка по паттерну ошибки. Например: «TimeoutException — 30 раз за 10 минут»
  • Если на проекте 0 новых ошибок за сутки, а клиент жалуется — проблема на стороне клиента или интеграции, а не в платформе
Лайфхак: если клиент звонит и кричит «всё отвалилось», откройте дашборд за последние 15 минут. Нет всплеска? Спокойно: «По системным логам сбоев не зафиксировано, проверим ваше подключение».
🎯 Задание «Интерпретация»

На дашборде видно: у проекта enco ошибки растут плавно в течение 3 часов, а у legion — 1 резкий скачок и тишина. Что сказать коллегам?

6. Практические кейсы

Кейс А: «Житель не может оплатить»

Клиент прислал скриншот. В тикете есть лицевой счёт и сумма. Что делать?

  1. Discover → DataView ascore, интервал ±1–2 часа вокруг обращения
  2. Фильтр fields.ProjectName : "legion" (или нужный ЖК)
  3. Поиск по лицевому счёту в message: message : *лс123456*
  4. Если пусто — по сумме: message : *1500* (без запятой)
  5. Если нашли запись — копируете fields.RequestId, ищете по нему всю цепочку
  6. Если ничего нет — смотрите в ascore-errors-* по тому же проекту и времени
# Пример рабочей цепочки поиска: fields.ProjectName : "legion" and message : (*лс123456* or *150000*) → нашли запись, скопировали fields.RequestId: 800124e2-... → fields.RequestId : "800124e2-..." → видим входящий HttpRequest и HttpResponse "200 OK" → но следом Error в ascore-errors-* по тому же RequestId? Ставим задачу разработчику

Кейс Б: Ответ "OK", но действие не выполнилось

Иногда запрос принят успешно (HTTP 200), но дальнейшая обработка (очередь, интеграция) отвалилась молча. В Kibana видно факт приёма, но не факт доведения до конца.

  • Ищите по тому же fields.RequestId записи уровня Error/Warning — часто бывают следом.
  • Ищите в ascore-errors-* по этому RequestId — туда пишется отдельно.
  • Если связанных ошибок нет — проблема вне Ascore (очередь, внешний сервис, клиент).
🎯 Задание «Следопыт»

Вы нашли запись в ascore-logs-* с fields.RequestId : "pay-777", ответ HttpResponse 200 OK, но клиент говорит, что деньги не прошли. Где ещё искать?

🎯 Задание «Оформление задачи»

Вы нашли подозрительный лог. Как правильно передать его разработчику?

7. Итоговый тест

Ответьте на 5 вопросов. Чтобы пройти, нужно минимум 4 правильных.

1. AI-агент гарантирует 100% точность названий проектов?

2. Как правильно найти подстроку в поле message?

3. Information-логи уровня HttpRequest от 10-дневной давности скорее всего...

4. Поле fields.RequestId позволяет...

5. На дашборде нет всплеска ошибок, но клиент жалуется. Что делать?