"Wrapture bindings, изначально использовавшиеся для модульного тестирования, также могут служить мощным механизмом трассировки. Привязка наблюдает за вызовами методов и генерирует события, которые затем обрабатываются "приемником" вместо тестовой ленты. Это позволяет в реальном времени описывать работу запущенной программы.В статье это иллюстрируется на примере OrderService, включающего Gateway, Ledger и Notifier, где платежи по картам могут быть отклонены. Три привязки применяются к ключевым методам: OrderService.place, Gateway.charge и Ledger.record. Простой приемник Printer используется для отображения этих событий.Вывод показывает подробную информацию о вызовах, включая аргументы, возвращаемые значения и исключения, с отступами, указывающими на вложенность вызовов. Важно отметить, что конфиденциальные данные, такие как номера карт, могут быть скрыты с помощью политик захвата wrapture.redact() на уровне привязки.Когда приемник не зарегистрирован, привязки несут минимальные накладные расходы, работая примерно за полмикросекунды на вызов. Для управления большими трассировками можно применять фильтрацию на уровне приемника или привязки.Фильтрация на уровне приемника, например wrapture.Depth(1, wrapture.Printer()), ограничивает вывод вызовами верхнего уровня, предоставляя краткий обзор. Фильтрация на уровне привязки с использованием when= принимает предикат для предотвращения создания событий для определенных вызовов, что делает ее очень эффективной.Однако when= пропускает только указанное событие; вложенные вызовы по-прежнему записываются. Чтобы подавить все дерево вызовов, к привязке можно добавить tree=True, гарантируя, что "ничего отсюда вниз" не будет отслежено.Привязки также отслеживают filtered_calls, позволяя пользователям понять, какие операции были подавлены. Эта настройка позволяет программам самоописывать свои действия с помощью данных в реальном времени, с минимальными изменениями кода и настраиваемыми приемниками для различных потребностей мониторинга."
wrapture.redact()на уровне привязки.Когда приемник не зарегистрирован, привязки несут минимальные накладные расходы, работая примерно за полмикросекунды на вызов. Для управления большими трассировками можно применять фильтрацию на уровне приемника или привязки.Фильтрация на уровне приемника, напримерwrapture.Depth(1, wrapture.Printer()), ограничивает вывод вызовами верхнего уровня, предоставляя краткий обзор. Фильтрация на уровне привязки с использованиемwhen=принимает предикат для предотвращения создания событий для определенных вызовов, что делает ее очень эффективной.Однакоwhen=пропускает только указанное событие; вложенные вызовы по-прежнему записываются. Чтобы подавить все дерево вызовов, к привязке можно добавитьtree=True, гарантируя, что "ничего отсюда вниз" не будет отслежено.Привязки также отслеживаютfiltered_calls, позволяя пользователям понять, какие операции были подавлены. Эта настройка позволяет программам самоописывать свои действия с помощью данных в реальном времени, с минимальными изменениями кода и настраиваемыми приемниками для различных потребностей мониторинга."