Предисловие
Одним из камней преткновения при разработке на node.js является более сложная, по сравнению с другими современными языками, отладка. Из-за асинхронной структуры кода в большом приложении найти утечку памяти или место интенсивного использования процессора становится затруднительно без специализированных утилит. В разное время для node.js уже создавались инструменты профилирования, но большинство из них либо просто не достаточно удобные, либо перестали поддерживаться разработчиками.
Поиски
Долгое время я обходился консервативными методами отладки в виде периодического вывода объёма используемой памяти и времени выполнения критических участков кода в консоль, но настал момент, когда необходимость наличия качественного инструмента встала очень остро.
Первым делом я решил посмотреть не оправился ли node-inspector, который после перехода на node.js 0.6.x перестал поддерживать профилирование CPU и Heap. Оказалось, что в новой версии node-inspector неработающий профайлинг окончательно исключён и теперь это просто debugger. Немного покопавшись в коде старой версии, мне всё же удалось завести профилирование CPU и Heap на node 0.8.x, однако это решение не было идеальным. Чтобы вывести его из состояния «поделки» необходимо было бы заменить устаревший интерфейс WebKit-консоли на современный, переписав приличное количество кода и исправить некоторые проблемы производительности. В целом, решение на основе консоли WebKit мне кажется очень не гибким, поэтому я бросил эту затею и продолжил поиски.
Вот оно
Попробовав ещё несколько различных вариантов, я наткнулся на сервис https://nodetime.com. Это инструмент совершенно другого уровня, который гораздо больше других подходил на роль «того самого» идеального инструмента. Сервис состоит из двух частей:
- backend — собирает подробную статистику о работе приложения;
- frontend — собственно сам сервис, отображающий эту статистику в понятном для человека, красивом виде.
Кроме самых необходимых инструментов профилирования CPU и Heap, nodetime содержит набор метрик, существенно упрощающих разработку. Очень порадовала простота и доступность использования сервиса. Для начала работы достаточно просто подключить модуль nodetime к проекту.
Кроме сбора и отображения статистики в реальном времени nodetime предоставляет возможность сохранять и просматривать статистику за определённые промежутки времени, а также, настраивать уведомления на определённые события (например: утечка памяти).
Хочется большего
Безусловно, nodetime сервис очень удобный, но далеко не всегда существует возможность удалённой отладки приложения. Для многих очень остро стоит вопрос конфиденциальности собираемых профайлером данных, да и возможность отладки без подключения к сети совершенно не лишняя.
Т.к. backend nodetime распространяется по лицензии MIT, за что огромное спасибо его автору, я решил создать на его основе интерфейс, который можно было бы использовать локально. Потратив полторы недели свободных вечеров на разбор протокола и реализацию интерфейса я получил стабильную версию, которую не стыдно показать людям. Встречайте…
Look
Для начала демо:
Тут запущен пример реализации чата.
А тут можно посмотреть на работу профайлера.
Внимание: демо запущено на слабом VPS, большая просьба не устраивать хардкор, чтобы все смогли посмотреть.
Исходный код проекта расположен на GitHub. Добавить модуль в своё приложение можно при помощи npm.
npm install look
Для работы модуля достаточно подключить его к приложению и, при желании, указать порт и интерфейс, на которых будет работать профайлер. По умолчанию профайлер запускается на порту 5959 и слушает интерфейс '0.0.0.0'.
Простой пример:
require('look').start(3131); var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(8080, '0.0.0.0'); console.log('Server running at http://0.0.0.0:8080/');
После запуска приложения, профайлер будет доступен на порту 3131 вашего сервера.
За работу интерфейса отвечает небольшое приложение на основе connect, которое запускается в отдельном потоке, чтобы не влиять на работу основного приложения.
Заключение
Это первая стабильная версия look, реализующая самый необходимый функционал. По мере ��еобходимости look будет улучшаться, есть куда расти. Надеюсь, этот инструмент поможет вам писать свои node.js приложения лучше.