🔥

Тред (Андрей Печкуров)


Конечно, логи это далеко не единственный пример использования CLS API. Для начала, давайте поговорим про внутрянку APM агентов (Application Performance Management).

Эти агенты в первую очередь нужны для отслеживания производительности веб-приложений. А это значит, что им нужно отслеживать контрольные точки обработки запросов. Как они это делают? Большинство из них устроены так.

Во-первых, они monkey patch'ат веб-фреймворки (включая, модуль http), драйверы БД и прочие популярные библиотеки, в которых нужно отследить контрольную точку. Но этого недостаточно. Нужно откуда-то взять контекст запроса (время его начала, контрольные точки и т.д.).

Поэтому, во-вторых, они используют CLS API в том или ином виде. Иногда он основан на диких monkey patch'ах core API, иногда на async_hooks и точечных патчах библиотек, которые не дружат с хуками.

Впрочем, есть надежда, что некоторые из них вскоре переедут на ALS, а популярные библиотеки начнут вести себя приличнее.

Если интересно посмотреть на исходный код одного из APM агентов, то вот пример: github.com/googleapis/clo…

Кроме того, на async_hooks можно построить полезные диагностические инструменты. Такие как, например, bubbleprof визуализация из Clinic.js: clinicjs.org/bubbleprof/

Наконец, async_hooks можно использовать для наблюдения за необработанными исключениями. Пример - модуль domain, который был портирован на async_hooks. С его помощью вы, например, можете сделать в таких случаях запись в лог и включить туда диагностическую информацию.