Секрет 1: Инструментарий — ваш лучший друг. Не пытайтесь изобретать велосипед. Начните с встроенных или стандартных библиотек.
* `debug.sethook()` — это ваш швейцарский нож. Эта функция позволяет установить hook-функцию, которая будет вызываться при наступлении определенных событий: вызов функции, возврат из функции, выполнение каждой строки кода или через заданное количество инструкций. С его помощью можно реализовать простейший профилировщик, замеряющий время выполнения функций. Пример за 5 минут: установите hook на вызов и возврат, записывайте время в стек при входе и вычисляйте разницу при выходе — вы получите таблицу самых «тяжелых» функций.
* Стандартная библиотека `os` для элементарных замеров: `os.clock()` дает процессорное время, затраченное на выполнение программы. Отличный способ замерить общее время выполнения скрипта или его отдельных блоков.
Секрет 2: Логирование — это не просто print(). Превратите хаотичный вывод в структурированные данные для мониторинга.
* Используйте уровни логирования (DEBUG, INFO, WARN, ERROR). Библиотеки вроде `lualogging` или `log.lua` (из Lapis) предоставляют готовые решения.
* Ключевой момент: логируйте контекст. Вместо «Ошибка при обработке запроса» пишите «Ошибка при обработке пользователя ID=12345 в функции process_user(), невалидный email: 'user@'». Это сразу даст информацию для анализа.
* Направляйте логи в системный журнал (syslog) или в файл с ротацией, чтобы их могла собрать система централизованного логирования, такая как ELK Stack (Elasticsearch, Logstash, Kibana) или Grafana Loki.
Секрет 3: Интеграция с экосистемой хоста. Lua редко работает в вакууме.
* Для Nginx/OpenResty: используйте модуль `lua-resty-logger-socket` для асинхронной отправки логов и метрик на удаленный сервер (например, в Logstash). Модуль `nginx-lua-prometheus` позволяет легко экспортировать метрики в формате Prometheus прямо из вашего Lua-кода. Вы можете инкрементировать счетчики ошибок, наблюдать за временем выполнения запросов и гистограммами распределения.
* Для Redis: если вы используете Lua-скрипты (`EVAL`), мониторить их выполнение можно через команды Redis `SLOWLOG` (показывает медленные команды, включая скрипты) и `INFO commandstats`. Также можно добавить логирование внутрь скрипта, используя `redis.log()`.
* Для игровых движков: часто есть встроенные консоли или системы профилирования. Изучите их API.
Секрет 4: Метрики и их визуализация. Логи говорят, «что» произошло, а метрики показывают, «как часто» и «как долго».
* Определите ключевые метрики для вашего скрипта: количество выполненных операций в секунду (RPS), время выполнения (p50, p95, p99 процентили), количество ошибок, потребление памяти.
* Используйте простые счетчики и таймеры внутри кода. Например, перед критичной функцией: `local start_time = os.clock()`.
* Экспортируйте эти метрики. Самый эффективный способ — использовать формат Prometheus. Напишите небольшой HTTP-эндпоинт (если среда позволяет, например, в OpenResty это просто), который будет возвращать текущие значения метрик в текстовом формате, понятном Prometheus. Затем Prometheus будет скрапить этот эндпоинт, а Grafana — визуализировать данные на дашбордах.
Секрет 5: Профилирование памяти. Утечки памяти в долгоживущих процессах (как воркер Nginx) — кошмар.
* Используйте `collectgarbage("count")` для получения примерного объема памяти в КБ, используемого Lua. Логируйте это значение периодически, чтобы видеть тренд.
* Для глубокого анализа используйте сторонние профилировщики, такие как `LuaProfiler` (для CPU) или `LuaMemProfiler`. Они могут генерировать отчеты о том, какие функции и строки кода аллоцируют больше всего памяти.
* Помните о циклических ссылках. Lua использует сборку мусора, но циклические ссылки между таблицами и функциями (через метатаблицы) могут приводить к утечкам. Будьте осторожны с глобальными переменными и замыканиями в долгоживущих контекстах.
Практический план на 30 минут:
- Минуты 1-5: Встройте структурированное логирование с уровнями в ключевые точки вашего скрипта.
- Минуты 6-15: Добавьте замер времени для 2-3 самых важных функций, используя `os.clock()`. Создайте счетчики для успешных и неудачных операций.
- Минуты 16-25: Если вы в OpenResty, установите `lua-resty-prometheus`. Если в другом окружении, настройте простой вывод метрик в формате, который вы можете парсить (например, JSON в лог).
- Минуты 26-30: Настройте сбор логов и метрик в вашу систему мониторинга (например, настройте Prometheus на скрапинг вашего эндпоинта или Filebeat на сбор логов).
Комментарии (14)