2026-11-03•5 мин
Когда запрос приложения замедляется, трассировка может показать вызов базы данных. Поиск стоящего за ним запроса к БД может быть утомительным и требовать переключения между трассировками и телеметрией базы данных, а также ручного сопоставления временных меток или текста запроса.
В Grafana Cloud приложение Database Observability уже предоставляет единую точку обзора всей телеметрии вашей базы данных, включая выборки запросов, историю производительности и планы выполнения. Но что, если вы могли бы переходить от этого вызова базы данных в трассировке прямо к деталям ее запроса?
В прошлом году семантические соглашения OpenTelemetry для баз данных были стабилизированы, предоставив всем нам надежный общий язык для описания операций с базами данных. Эта основа открыла путь к тому, что мы называем связыванием трассировок (trace linkage), которое теперь стало общедоступным (Generally Available) в Database Observability!
Что такое связывание трассировок?
С помощью связывания трассировок мы стремимся обеспечить связь между приложениями с инструментированием OpenTelemetry и телеметрией базы данных, собираемой с помощью Alloy. Другими словами, когда вы предоставляете нам эти ранее разрозненные элементы головоломки, мы сделаем все возможное, чтобы предоставить вам как можно больше вспомогательной информации между этими двумя элементами. И мы сделаем это без необходимости утомительно сопоставлять вручную временные метки и логи.
На спане базы данных в трассировке вы увидите ссылку на текст запроса. При клике по ней приложение ищет связь между вашим запросом к базе данных и нашим специализированным представлением ваших наиболее релевантных данных в приложении Database Observability. Вы можете изучить данные выборки выполнения запросов или ознакомиться с исторической производительностью запроса вместе с его сопутствующей схемой и планом выполнения.
Эта связь опирается на атрибуты базы данных, которые ваше инструментирование OpenTelemetry передает уже сейчас. Grafana Cloud Traces на базе Tempo сохраняют эти атрибуты, а связывание трассировок использует текст запроса, систему базы данных и имя базы данных, чтобы связать спан базы данных с соответствующим контекстом запроса в Database Observability.
Мы поддерживаем стабильные соглашения, такие как db.query.text, и их устаревший эквивалент db.statement, поэтому существующее инструментирование может продолжать приносить пользу по мере того, как команды переходят на стабильные соглашения.
Как это работает?
Первоначальная идея связывания трассировок возникла из следующего вопроса: какой общий контекст может связать инструментирование приложения с телеметрией, собираемой из базы данных?
Ответом стало использование контекста трассировки: ID трассировки (trace ID) и ID спана (span ID). С одной стороны у нас есть трассировка приложения со спанами, представляющими выполнение запроса. Со стороны Database Observability мы собираем телеметрию из базы данных, касающуюся выполнения запросов. Пока собираемая нами телеметрия содержит те же trace ID и span ID, мы можем установить связь между трассировкой приложения и Database Observability.
Это привело нас к sqlcommenter, проекту с открытым исходным кодом, переданному сообществу OpenTelemetry. Его идея (восхитительно) проста: позволить оператору SQL переносить с собой часть контекста трассировки в комментарии. При включенном распространении контекста трассировки sqlcommenter внедряет ID трассировки и ID спана приложения в комментарий в конце оператора SQL. Это делается на уровне отдельного выполнения запроса, так что это похоже на общую нить, которая позволяет нам проследить путь от спана трассировки до конкретного выполнения запроса.
Затем мы ищем trace ID и span ID в логах, сгенерированных нами в компоненте Alloy для Database Observability: наш компонент извлекает traceparent из комментария SQL и включает его в логи выборок запросов.
Выход за рамки простого совпадения traceparent
Тем не менее, включение sqlcommenter не гарантирует, что Alloy захватил именно это выполнение SQL. Это может зависеть от того, насколько кратковременным является запрос или как часто Alloy опрашивает базу данных. Даже если вы готовы использовать sqlcommenter, поддерживаются далеко не все движки баз данных, и это может иметь недостатки для кэшей баз данных. Это означает, что у вас могут быть трассировки, для которых мы не можем найти выборку запроса в Database Observability, по крайней мере, не исключительно с помощью sqlcommenter.
Мы можем выйти за рамки сопоставления на основе sqlcommenter, используя сам оператор запроса. Когда мы не можем найти точное совпадение, мы ищем совпадающий текст запроса в телеметрии, собранной Alloy.
Звучит просто, но один и тот же запрос может выглядеть по-разному с каждой стороны. Инструментирование OpenTelemetry не всегда записывает операторы одинаково: в зависимости от используемого языка и инструментирования, литеральные значения могут сохраняться или маскироваться, а заполнители параметров могут принимать различные формы. Между тем, движки баз данных применяют собственную нормализацию к тексту запроса, который собирает Alloy. Мы учитываем эти различия, а также форматирование и комментарии, чтобы найти совпадение.
Даже когда мы не можем указать вам на точное выполнение, вы все равно можете изучить выборки и историческую производительность, которые мы собрали для этого запроса! Это позволяет нам установить значимую связь между вашими трассировками и Database Observability даже без sqlcommenter.
Связывание трассировок может стать отличным инструментом для быстрого соединения телеметрии базы данных и приложения, поэтому мы рады предложить вам попробовать его уже сегодня. Если ваше приложение уже заинструментировано с помощью OpenTelemetry SDK, отправляющего трассировки в Grafana Cloud, и вы уже настроили Database Observability, ознакомьтесь с нашей документацией по настройке связывания трассировок, чтобы начать работу.
Если Database Observability уже собрала запрос, а спан базы данных уже включает его текст в db.query.text или устаревшем db.statement, велика вероятность, что связывание трассировок сможет сопоставить спан с этим запросом без дополнительного инструментирования приложения.
После того как вы попробовали сопоставление по тексту запроса, вы можете дополнительно пойти дальше и сопоставить трассировку с конкретным выполнением запроса с помощью sqlcommenter, как подробно описано в этом блоге. Это повышает точность сопоставления; точные совпадения остаются наилучшими из возможных (best-effort), так как Alloy может не делать выборку для данного выполнения.
А если вы не знаете, с чего начать, обратитесь за помощью к Grafana Assistant, используя естественный язык.












