Файлы HAR — HTTP-лог для отладки, которого вы не знали, что вам нужно

Обновлено

Файлы HAR захватывают каждый HTTP-запрос, который делает ваш браузер — заголовки, временные метки, тела ответов, токены аутентификации. Вот что содержится в одном из таких файлов, как его захватывать и как использовать при возникновении ошибок.

Файлы HAR — HTTP-лог для отладки, которого вы не знали, что вам нужно 1
Реклама · УДАЛИТЬ?

Ваш вызов API не работает в производственной среде. Работает корректно в curl и локально. Поддержка открывает тикет и просит вас «поделиться файлом HAR». Вы уверенно киваете и ищете в новой вкладке «что такое файл HAR».

Это та вкладка. Вот что такое файл HAR, что в нём содержится и как его использовать для нахождения проблемы.

Что такое файл HAR

HAR означает HTTP Archive. Это JSON-файл, который фиксирует каждый HTTP-запрос, сделанный браузером во время сессии — URL, методы, коды состояния, заголовки запроса и ответа, тела запроса и ответа, куки и расчёты по времени. Все это, для каждого запроса на странице.

Формат был стандартизирован Веб-группой по производительности (версия спецификации 1.2) и поддерживается Chrome, Firefox, Safari и Edge. Представьте себе структурированный экспорт вкладки Network браузера — то, что вы передадите кему-то, кто отладит вашу проблему, не давая ему доступ к SSH на вашем компьютере.

Файлы HAR особенно полезны, когда сбой интермитентен, когда он воспроизводится только в определённом браузере или когда нужно показать поставщику, что его API возвращает код 500 и это не ошибка PEBKAC.

Как захватить файл HAR

Chrome и Edge

  1. Откройте DevTools (F12 или Cmd+Option+I на Mac)
  2. Перейдите на Сеть вкладка
  3. Включите Сохранение журнала если сбой происходит после перенаправления или перезагрузки страницы
  4. Воспроизведите проблему
  5. Правый клик в любом месте в списке запросов → Сохранить все как HAR с содержимым

Firefox

  1. Откройте DevTools → Сеть вкладка
  2. Воспроизведите запрос
  3. Нажмите на иконку шестерёнки → Сохранить все как HAR

Safari

  1. Включите меню Develop: Safari → Настройки → Расширенные настройки → Показать меню Develop
  2. Develop → Показать веб-инспектор → Сеть
  3. Воспроизведите проблему
  4. Нажмите на Экспорт кнопка (иконка стрелки в панели сети)

Одно из важных замечаний относительно Сохранение журнала: без этого HAR фиксирует только запросы, сделанные после загрузки текущей страницы. Если сбой происходит во время аутентификации или в цепочке перенаправлений, вы получите пустой или искажённый файл и потратите 20 минут на размышления. Включайте его до воспроизведения проблемы.

Что содержится в файле HAR

Каждый файл HAR имеет одинаковую структуру на верхнем уровне:

{
  "log": {
    "version": "1.2",
    "creator": { "name": "Chrome", "version": "124.0.6367.82" },
    "entries": [ ... ]
  }
}

The entries массив — это место, где хранится вся полезная информация. Каждый элемент — это полный пары запрос/ответ. Обычный загрузка страницы генерирует от 50 до 200 элементов; сложный SPA, загружающий дашборд, может превысить это число.

Аннотированный элемент: ключевые поля

Вот разбор ключевых полей в одном элементе HAR:

ПолеРасположениеЧто он сообщает вам
startedDateTimeЭлементВремя отправки запроса, в формате ISO 8601 UTC. Сопоставьте это с логами на сервере, чтобы найти точную строку в логах.
timeЭлементОбщее время в миллисекундах с момента начала запроса до завершения ответа. Это значение используется при сортировке при поиске медленных запросов.
serverIPAddressЭлементIP-адрес, который фактически обработал этот запрос. Критично при использовании балансировщиков нагрузки — показывает, какой экземпляр вы достигли.
request.methodЗапросGET, POST, PUT, DELETE и т.д.
request.urlЗапросПолный URL, включая строку запроса. Обратите внимание на возможное двойное кодирование параметров здесь.
request.headersЗапросВсе заголовки запроса. Включает Authorization — токены аутентификации здесь. Это проблема конфиденциальности.
request.postData.textЗапросНезашифрованное тело запроса. Для API на JSON это ваше тело запроса. Если API отклоняет ввод, проверьте это сначала.
response.statusОтветКод состояния HTTP. 0 обычно означает, что запрос был заблокирован до завершения.
response.headersОтветЗаголовки ответа, включая Content-Type, Cache-Control, Set-Cookie. Полезно при отладке CORS.
response.content.textОтветТело ответа. Для API на JSON это исходный JSON. Может быть закодирован в base64 для бинарных ответов.
timings.blockedРасчёты по времениВремя ожидания свободного места в соединении TCP. Высокие значения указывают на истощение пула соединений.
timings.dnsРасчёты по времениВремя DNS-поиска. Более 50 мс требует внимания; более 200 мс — проблема.
timings.connectРасчёты по времениВремя установления TCP-соединения. Высокие значения = задержка сети или издержки TLS, а не медленность сервера.
timings.waitРасчёты по времениВремя от отправки запроса до получения первого байта (TTFB). Здесь медленные API проявляются. Высокое TTFB означает, что сервер медленно отвечает.
timings.receiveРасчёты по времениВремя загрузки тела ответа. Высокое значение наблюдается только при больших объёмах ответа.

Что следует искать на самом деле

Когда вы открываете HAR, вы обычно ищете одну из трёх вещей:

Запрос, который не срабатывает

Сортируйте или фильтруйте по response.status. В Chrome DevTools вы можете фильтровать в режиме ввода status-code:4xx или status-code:5xx. Как только вы найдёте неудачный запрос, прочитайте полный response.content.text — сообщение об ошибке от сервера обычно более полезно, чем код состояния.

Запрос, который работает медленно

Сортируйте элементы по timings.wait (TTFB) в порядке убывания. Высокое wait = ваш сервер работает медленно. Высокое timings.connect при нормальном wait = бутлентон находится в сети или в процессе TLS-рукопожатия, а не в вашем приложении. Эти данные указывают на совершенно разные решения, поэтому правильное определение экономит много времени, не виня неправильный слой.

Запрос, который отсутствует

Иногда ошибка — это отсутствующий запрос — вебхук, который не сработал, предварительный запрос OPTIONS, заблокированный CORS, вызов аналитики, съеденный блокировщиком рекламы. Сравните то, что должно быть в HAR, с тем, что есть. Отсутствие запроса — это данные.

Проблема конфиденциальности, которую нужно знать

Файлы HAR содержат всё. Включая:

  • Authorization заголовки — токены Bearer, учётные данные Basic auth
  • Cookie заголовки — сессионные токены, JWT, любые данные в куках
  • тела запроса и ответов — которые могут содержать пароли, PII или API-ключи

Chrome не удаляет ни одного из этих данных при экспорте. Перед тем как поделиться файлом HAR с поддержкой, поставщиком или коллегой за пределами вашей компании, удалите или скройте чувствительные поля.

Самый быстрый способ проверить и очистить HAR перед его передачей — это Форматер HAR-файла — вставьте свой файл, пройдите по элементам и скройте перед отправкой. Альтернативно, если вы привыкли к jq:

# Strip Authorization headers from all entries
jq '.log.entries[].request.headers |= map(select(.name | ascii_downcase != "authorization"))' file.har

Не самый красивый одноразовый код, но он работает.

Чтение сырого HAR-файла

HAR-файлы — это JSON, поэтому теоретически могут быть прочитаны в любом текстовом редакторе. На практике они огромны — типичная загрузка страницы создаёт файл с сотнями килобайт заголовков и тел, расположенных на глубоко вложенных ключах. Несколько способов их просмотра:

  • Импортировать в DevTools — Chrome и Firefox поддерживают импорт HAR-файлов в вкладку Network через иконку шестерёнки. Это даёт вам ту же систему фильтрации и сортировки, что и при записи в реальном времени.
  • Форматер HAR-файла — Браузерный, без установки. Хорошо, когда вы отправляете файл кему-то, у кого нет DevTools.
  • jq — Для фильтрации на командной строке. jq '.log.entries[] | select(.response.status >= 400) | {url: .request.url, status: .response.status}' извлекает все неудачные запросы с их URL в секундах.

Для быстрого анализа и фильтрации, jq быстрее всего. Для передачи и визуального просмотра, импорт в браузер или онлайн-форматер означает, что другой человек не должен знать, что jq это.

Хотите убрать рекламу? Откажитесь от рекламы сегодня

Установите наши расширения

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

в Расширение Chrome в Расширение края в Расширение Firefox в Расширение Opera

Табло результатов прибыло!

Табло результатов — это интересный способ следить за вашими играми, все данные хранятся в вашем браузере. Скоро появятся новые функции!

Реклама · УДАЛИТЬ?
Реклама · УДАЛИТЬ?
Реклама · УДАЛИТЬ?

новости с техническими моментами

Примите участие

Помогите нам продолжать предоставлять ценные бесплатные инструменты

Купи мне кофе
Реклама · УДАЛИТЬ?