
Структурированное логирование и трейсинг в Node.js: @cleverbrush/log и @cleverbrush/otel
andrew_zol 6 минут назад Структурированное логирование и трейсинг в Node.js: @cleverbrush/log и @cleverbrush/otel Средний 12 мин 94 JavaScript * TypeScript * Статья о том, как получить наблюдаемость (observability) в...
В сфере искусственного интеллекта произошло заметное событие. andrew_zol 6 минут назад Структурированное логирование и трейсинг в Node. js: @cleverbrush/log и @cleverbrush/otel Средний 12 мин 94 JavaScript * TypeScript * Статья о том, как получить наблюдаемость (observability) в приложении с минимальным кодом, а бонусом получить структурированные логи с типизированными шаблонами, автоматическую корреляцию со спанами OpenTelemetry, всё это с помощью набора библиотек, которые я называю CleverBrush Framework. Все примеры ниже взяты из xpenser — open-source приложения для учёта личных доходов и расходов.
С одной стороны, это демонстратор возможностей Cleverbrush Framework, который я сделал для проверки на практике всей машинерии, которая есть в фреймворке, такой как: контракты, сервер, клиент, auth, логирование и OpenTelemetry. С другой стороны, это полезное приложение, которым я сам пользуюсь каждый день для контроля финансов. Исходный код открыт на GitHub: github.
Технические детали
com/cleverbrush/xpenser. Дисклеймер: все описываемые библиотеки носят экспериментальный характер. Несмотря на это, покрытие тестами у них достаточно хорошее.
ПредысторияВ предыдущих статьях (первая и вторая) я рассказывал о @cleverbrush/schema и о том, как на её основе построены @cleverbrush/server и @cleverbrush/client. Сегодня речь пойдёт об ещё двух элементах того же монорепозитория: @cleverbrush/log — библиотека структурированного логирования, и @cleverbrush/otel — тонкая обёртка над OpenTelemetry SDK. Оба пакета изначально проектировались как дополнение к серверу, но могут использоваться независимо — в любом Node.
В xpenser они используются сразу в нескольких процессах: API, Next. js web app и Telegram bot. @cleverbrush/log: структурированное логированиеИдея библиотеки пришла из экосистемы .
Отраслевые последствия
NET: там есть Serilog с его message templates. Идея заключается в том чтобы вместо форматирования строки в момент записи вы описываете шаблон с именованными плейсхолдерами, а все значения хранятся отдельно как структурированные свойства. Это позволяет запрашивать логи в базе данных по конкретным значениям — например, найти все события по TransactionId или UserId.
Например, событие создания транзакции в xpenser удобно описать типизированным строковым шаблоном: from '@cleverbrush/schema'; const TransactionCreated = parseString( object({ TransactionId: number(), UserId: number() }), $t => $t`Transaction ${t => t. TransactionId} created by ${t => t. info(TransactionCreated, { TransactionId: transaction.
id, UserId: principal. userId }); Свойства {TransactionId} и {UserId} сохраняются отдельно от текста сообщения, а сам шаблон остаётся стабильным: created . В SigNoz, Clickstack или любой другой системе, поддерживающей CLEF-формат, эти поля можно фильтровать и агрегировать как нормальные колонки.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





