Трассировка в программной инженерии относится к процессу сбора и записи информации о выполнении программного обеспечения. Эта информация обычно используется программистами для целей отладки , а также, в зависимости от типа и детализации информации, содержащейся в журнале трассировки, опытными системными администраторами или персоналом технической поддержки и инструментами мониторинга программного обеспечения для диагностики распространенных проблем с программным обеспечением. [1] Трассировка является сквозной задачей .
Не всегда существует четкое различие между трассировкой и другими формами ведения журнала , за исключением того, что термин трассировка почти никогда не применяется к ведению журнала, которое является функциональным требованием программы (поэтому исключается регистрация данных из внешнего источника, например, получение данных в эксперименте по физике высоких энергий , и ведение журнала с опережающей записью ). Журналы, которые регистрируют использование программы (например, журнал сервера ) или события операционной системы , представляющие интерес в первую очередь для системного администратора (см., например, Event Viewer ), попадают в терминологическую серую зону.
Трассировка в основном используется для обнаружения аномалий, анализа неисправностей, отладки или диагностики в распределенных программных системах, таких как микросервисы или бессерверные функции. [2]
Трассировка ПО — это инструмент для разработчиков, позволяющий собирать информацию для отладки. Эта информация используется как во время циклов разработки, так и после выпуска. В отличие от регистрации событий, трассировка ПО обычно не имеет понятия «класс» события или «код события». Другие причины, по которым решения по регистрации событий, основанные на кодах событий, не подходят для трассировки ПО, включают:
OpenTelemetry — это проект CNCF с открытым исходным кодом, который обеспечивает комплексную поддержку распределенной трассировки. [3] Некоторые поставщики, включая Datadog , New Relic , Splunk, также предлагают SaaS-услуги трассировки. [4]
Google и Meta разработали собственные фреймворки трассировки, а именно Dapper и Canopy. [2]
В операционных системах трассировка может использоваться в ситуациях (например, при загрузке ), когда некоторые технологии, используемые для ведения журнала событий, могут быть недоступны.
Linux предлагает возможности трассировки на системном и пользовательском уровне с помощью маркеров ядра и LTTng . ftrace также поддерживает трассировку ядра Linux. syslog — еще один инструмент в различных операционных системах для регистрации и трассировки системных сообщений.
FreeBSD и SmartOS используют DTrace для трассировки ядра и пользовательского пространства.
Во встроенном программном обеспечении трассировка также требует специальных методов для эффективного инструментирования и регистрации, а также низкой нагрузки на ЦП. [6]
Генерация трассировки вызовов методов может быть выполнена с помощью инструментирования исходного кода, сбора информации во время выполнения или под управлением отладчика. [7] Могут быть использованы макросы трассировки, аспектно-ориентированное программирование и связанные с ними методы инструментирования .
Библиотеки, используемые в исходном коде, отправляют данные агенту или напрямую в компонент сбора. [4]
Для моделирования деревьев выполнения ISVis преобразует корневое дерево в направленный ациклический граф, в то время как Jinsight использует принцип фрейма вызова для сбора и представления совокупной информации о трассировках. [7]
Основным методом визуализации является представление дорожки, которое представлено такими инструментами, как Jaeger , и часто включает аннотации и атрибуты «ключ-значение». Несмотря на широкое распространение, этому дизайну не хватает строгого обоснования, и пользователи часто сталкиваются с такими проблемами, как отсутствие функций и запутанная навигация. Существуют альтернативы представлениям дорожки, например, представление зависимости службы Jaeger или представления списка, дерева и таблицы SkyWalking. Агрегированные визуализации также используются для анализа больших объемов трасс, при этом такие системы, как Canopy, предлагают запрашиваемые метрики, а Jaeger предоставляет функции сравнения трасс. [8]
Регистрация событий предоставляет системным администраторам информацию, полезную для диагностики и аудита . Различные классы событий, которые будут регистрироваться, а также то, какие подробности будут отображаться в сообщениях о событиях, часто рассматриваются на ранних этапах цикла разработки. Многие технологии регистрации событий позволяют или даже требуют, чтобы каждому классу событий был назначен уникальный «код», который используется программным обеспечением регистрации событий или отдельным просмотрщиком (например, Event Viewer) для форматирования и вывода сообщения, понятного человеку. Это облегчает локализацию и позволяет системным администраторам легче получать информацию о возникающих проблемах.
Поскольку регистрация событий используется для регистрации высокоуровневой информации (часто информации об отказах), производительность реализации регистрации часто менее важна.
Особая проблема, связанная с предотвращением «слишком частой» записи дублирующих событий, решается путем регулирования событий.
Трудности в проведении четкого различия между регистрацией событий и трассировкой программного обеспечения возникают из-за того, что некоторые из тех же технологий используются для обоих, и, кроме того, потому, что многие критерии, которые различают эти два, являются непрерывными, а не дискретными. В следующей таблице перечислены некоторые важные, но ни в коем случае не точные или универсальные различия, которые используются разработчиками для выбора технологий для каждой цели и которые направляют отдельную разработку новых технологий в каждой области:
Включение или выключение трассировки во время выполнения часто требует включения дополнительных данных в двоичный файл. Это может привести к снижению производительности, даже если трассировка не активна.
Если трассировка включена или отключена во время компиляции , сбор данных трассировки из системы клиента зависит от его готовности и возможности установить версию программного обеспечения, специально включенную для трассировки, и впоследствии воспроизвести проблему.
Трассировка в программном обеспечении обычно требует высоких стандартов надежности , не только в отношении точности и надежности выходных данных трассировки, но и в отношении обеспечения непрерывности отслеживаемого процесса.
Учитывая низкоуровневую природу, трассировка может генерировать большой объем сообщений. Чтобы смягчить проблемы с производительностью, часто необходимо иметь возможность деактивировать программную трассировку, либо во время компиляции, либо во время выполнения.
В проприетарном программном обеспечении данные трассировки могут включать конфиденциальную информацию об исходном коде продукта .