Как подружить PINO с Telegram и не сойти с ума: очереди, ретраи и маскирование секретов
Когда проект вырастает из «песочницы», мониторинг становится вопросом выживания. Можно поднять тяжелый стек мониторинга, но для оперативных алертов Telegram остается самым удобным инструментом. Однако просто отправить строку текста в чат - верный способ «сойти с ума» от лимитов API, потерянных логов или случайно утекших в чат паролей.
Сегодня разберем обновление пакета pino-telegram-logger-transport, который превращает логгер Pino в профессиональный инструмент уведомлений, решающий эти проблемы «из коробки».
1. Очереди: чтобы Node.js не «захлебнулся»
Самая большая проблема сетевых логгеров - что делать, когда Telegram тормозит, а логов много? В новой версии появились инструменты контроля памяти:
- Ограничение очереди (maxQueueSize): Вы сами определяете, сколько событий может храниться в памяти (по умолчанию - 1000).
- Стратегии переполнения (overflowStrategy): Если очередь полна, вы можете выбрать: вытеснять старые записи (dropOldest), игнорировать новые (dropNewest) или принудительно ждать свободного места (block), замедляя поток данных, но сохраняя логи.
2. Ретраи: боремся с капризами Telegram
Telegram API часто отдает ошибки 429 (Too Many Requests) или 5xx. Чтобы не терять важные алерты:
- Умные повторы: Транспорт автоматически соблюдает рекомендации Telegram по задержке (retry_after).
- Гибкая настройка: Можно задать количество попыток и экспоненциальную задержку (backoff), чтобы не «долбить» API впустую.
3. Маскирование секретов: безопасность прежде всего
Случайная утечка пароля или токена в логи - кошмар любого разработчика. Опция redactKeys автоматически заменяет значения чувствительных полей (например, password, token, secret) на [REDACTED] в блоках контекста и ошибок. Это происходит только при отправке в Telegram, не затрагивая сам объект лога в коде.
4. Не только текст: медиа и форматирование
Логи стали информативнее:
- Поддержка медиа: К ошибке можно прикрепить скриншот или документ, просто передав mediaUrl или mediaBuffer в объект лога.
- Дедупликация (dedupWindowMs): Если сервис начал спамить одной и той же ошибкой, транспорт «схлопнет» их в одно сообщение на заданный период.
- Разбивка сообщений: Опция splitLongMessages корректно делит огромные стектрейсы на части, чтобы они не обрезались лимитами Telegram.
Примеры интеграции
Базовая настройка для продакшена:
Работа с NestJS:
CLI: проверка на вменяемость
Чтобы не гадать, почему бот молчит, используйте встроенную утилиту pino-telegram-cli. Команда check --probe-message не просто проверит токен, а отправит и тут же удалит тестовое сообщение, подтверждая реальные права на запись в чат.
Альтернативы
- pino-telegram: Популярный, но очень простой - нет очередей, ретраев и поддержки медиа.
- pino-telegram-webhook: Хорош для Serverless, но требует поднятого эндпоинта и сложнее в отладке.
Итог: Если вам нужен надежный «доставщик» алертов, который не упадет вместе с сервером и не раскроет ваши секреты, обновленный pino-telegram-logger-transport — это маст-хэв.