Как подружить PINO с Telegram и не сойти с ума: очереди, ретраи и маскирование секретов

Как подружить 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.

Примеры интеграции

Базовая настройка для продакшена:

import pino from 'pino'; const logger = pino({ transport: { target: 'pino-telegram-logger-transport', options: { botToken: process.env.BOT_TOKEN, chatId: [ { chatId: process.env.ALERTS_CHAT, minLevel: 'error' }, // Только фатальные ошибки { chatId: process.env.INFO_CHAT, minLevel: 'info' } // Общий поток ], redactKeys: ['apiKey', 'password', 'authorization'], // Скрываем секреты maxQueueSize: 500, overflowStrategy: 'dropOldest' // Бережем память }, }, });

Работа с NestJS:

import { createNestLoggerOptions } from 'pino-telegram-logger-transport'; // Бесшовная интеграция с nestjs-pino LoggerModule.forRoot( createNestLoggerOptions({ botToken: process.env.BOT_TOKEN, chatId: process.env.CHAT_ID, }) );

CLI: проверка на вменяемость

Чтобы не гадать, почему бот молчит, используйте встроенную утилиту pino-telegram-cli. Команда check --probe-message не просто проверит токен, а отправит и тут же удалит тестовое сообщение, подтверждая реальные права на запись в чат.

Альтернативы

  1. pino-telegram: Популярный, но очень простой - нет очередей, ретраев и поддержки медиа.
  1. pino-telegram-webhook: Хорош для Serverless, но требует поднятого эндпоинта и сложнее в отладке.

Итог: Если вам нужен надежный «доставщик» алертов, который не упадет вместе с сервером и не раскроет ваши секреты, обновленный pino-telegram-logger-transport — это маст-хэв.

Начать дискуссию