Как стать автором
Обновить

Комментарии 13

Все эти сложности сделаны только для того, чтобы не пробрасывать явно конктекст обработки?
Не всегда возможно явно пробрасывать контекст обработки (например используется сторонняя функция/библиотека).
Если многоуровневые сервисы, то больно его руками передавать.
Все это для того, чтобы заменить Thread-local storage.
Лично меня чрезвычайно напрягает отсутствие каких-либо вменяемых зрелых стандартов по созданию trace ID

А OpenTracing чем не подошел?
Вот есть OpenTracing для Node.js
А вот Jaeger под ноду.

Я обеими руками за opentracing, но не очень вижу как оно решает проблему создания trace ID автоматом.

Возможно тупой вопрос. Для веба ведь есть Zone.js позволяющая «работать» с контекстом вызова, это нельзя прикрутить к ноде малой кровью?
Zone.js подменяет базовые асинхронные функции, такие как setTimeout. На ноде же их попросту слишком много.

А ещё Zone.js не умеет работать с функциями, объявленными как async, без транспиляции.

Все хорошо, конечно, но:


  1. как у этого решения с производительностью?
  2. Как-то не хочется в прод тащить экспериментальные модули (async_hooks), нет информации когда обещают перевести в статус стабильного?!
1. На бенчмарки можно тут посмотреть github.com/nodejs/benchmarking/issues/181 и решить для себя насколько оно критично. Как по мне иметь возможность адекватной трассировки важнее.
2. Зависит от того, что у вас за прод. Меня, как любителя смузи и всего модного-стильного-молодежного, это не смутило и поюзать уже успел, но и компания была вполне себе хипстерская, а не кровавый энтерпрайз.
спасибо за ссылку, гляну.
но там только async_hooks, я помню касательно Proxy то же не все гладко (было по крайней мере, может сейчас это пофиксили)
Просто я бы это добавил в статью — как минимум то, что это эксперементальный модуль…
Все, кто сюда дочитал, обратите внимание ещё на такую вещь.

И cls-hooked и вообще всё, что основано на async_hooks имеет одну существенную проблему.
Проблема НЕ в асинхронной части. Она большей степени покрыта. Проблема в том, что синхронный контекст можно разделить. Например:

issues/59
issues/249
Пример для Front-End

Исходя из этого наивное применение подобных пакетов чревато потерей контекста.

Посему все нормальные пакеты рекомендуют делать обёртки в тех местах, которые не могут быть покрыты асинхронным контекстом автоматически. Поэтому «биндить» только req и res — мало. Надо биндить ещё и кучу всего остального, например общение с БД. Посмотреть можно, например, тут, самый конец файла: Cloud Tracing Mongoose Sync Split Wrapper:

image

Недавно появился AsyncLocalStorage API, надеюсь он решит все проблемы

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории