У «Гонца» стоит весь стек, а жалоба «оплата не работает» всё ещё разбирается час. В логе только failed, время от контейнера, DEBUG съел диск, секрет остался в исходной строке. Дорогой фотоаппарат не спасает снимок с закрытым объективом. Качество наблюдаемости зависит от того, что и как ты записываешь.
Ошибки до отправки
«Что-то пошло не так» без service.name, времени и контекста не связывает запись с запросом. Пиши структурированное событие: @timestamp, log.level, message, сервис, идентификатор операции и тип ошибки. Не логируй всё тело HTTP «для надёжности»: оно может содержать секреты и объёмные данные.
Уровни служат договором с дежурным: INFO про обычный ход, WARN про отклонение, ERROR про ошибку операции. Не делай любой отказ карты ERROR инфраструктуры. Не выбрасывай все успешные события, если по ним считаешь число запросов: исчезнет знаменатель доли ошибок.
Проверь не только красивую строку
Ниже исправленный пайплайн для вложенных ECS-полей. Он оставляет INFO, убирает DEBUG и не отправляет сырой обрезанный JSON с возможным секретом.
Убери удаление event.original: секрет вновь появится в исходной копии первой строки. Верни защиту. Замени [log][level] на [level]: DEBUG перестанет удаляться, потому что такого поля нет. Схема и условия должны говорить на одном языке. Для JSON с буквальным ключом log.level путь Logstash будет [log.level], а не [log][level].
Маскировка в этом примере ограничена известными полями. Она не доказывает, что произвольная message безопасна. Главная защита остаётся в приложении.
Ошибки по дороге
| Ошибка | Последствие | Что проверить |
|---|---|---|
| время приёма вместо времени события | сдвиг таймлайна | @timestamp, timezone и date-failure |
| потерян registry агента | повторная отправка | постоянный путь состояния |
| очередь без контроля диска | логи отстают или теряются | размер очереди и lag |
| сломанный grok молча выбрасывает строки | исчезают доказательства | доля parse-failure, карантин |
| bulk 200 считают успехом всех записей | документы отклонены незаметно | errors, результаты items |
Схема доставки «хотя бы один раз» допускает дубликаты. Перезапуск контейнера и ротация файла не гарантируют сохранность бесконечного хвоста. Проверяй сбои на стенде и сравни число отправленных и принятых событий по определённому договору.
Ошибки в хранилище и поиске
Индекс без ILM растёт до заполнения диска. Тысяча маленьких индексов на каждую pod-replica создаёт накладные расходы. Динамический маппинг с пользовательскими ключами превращает каждое имя в новое поле. message годится для text-поиска, service.name и trace.id для keyword-фильтров.
Перед диагнозом «логи потерялись» проверь data view и окно времени. Перед добавлением серверов измерь, где очередь и нагрузка. Перед публикацией дашборда подпиши единицы, источники и смысл числа.
Короткая приёмка всего блока
- По одному запросу клиента найди связанные события и объясни время.
- Покажи, как сломанное событие становится видимой ошибкой обработки без утечки.
- Докажи, что новая backing-генерация получает схему и policy.
- Опиши восстановление доставки после недоступности приёмника и риск дубликатов.
- У правила тревоги назови владельца, действие и критерий восстановления.
С этого начинается рабочий конвейер, а не с наличия трёх контейнеров ELK. Ты уже можешь собрать маршрут от строки до расследования и объяснить его границы. Следующий шаг для собственного проекта: взять один сервис, один измеримый вопрос дежурного и проверить весь путь на его реальных обезличенных событиях.
урок из курса
Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.