Трассировка ClickHouse с помощью OpenTelemetry
OpenTelemetry — это открытый стандарт для сбора трасс и метрик из распределённых приложений. ClickHouse частично поддерживает OpenTelemetry.
Передача контекста трассировки в ClickHouse
ClickHouse принимает HTTP-заголовки контекста трассировки, как описано в рекомендации W3C. Он также принимает контекст трассировки по нативному протоколу, который используется для обмена данными между серверами ClickHouse или между клиентом и сервером. Для ручного тестирования заголовки контекста трассировки, соответствующие спецификации Trace Context, можно передать в clickhouse-client с помощью флагов --opentelemetry-traceparent и --opentelemetry-tracestate.
Если родительский контекст трассировки не передан или переданный контекст трассировки не соответствует указанному выше стандарту W3C, ClickHouse может начать новую трассировку с вероятностью, задаваемой настройкой opentelemetry_start_trace_probability.
Распространение контекста трассировки
Контекст трассировки распространяется в последующие сервисы в следующих случаях:
-
Запросы к удалённым серверам ClickHouse, например, при использовании движка таблиц Distributed.
-
Табличная функция url. Информация о контексте трассировки передаётся в HTTP-заголовках.
Трассировка запросов ClickHouse Keeper
ClickHouse поддерживает трассировку с использованием OpenTelemetry для запросов ClickHouse Keeper (службы координации, совместимой с ZooKeeper). Эта функция обеспечивает детальную наблюдаемость жизненного цикла операций Keeper — от отправки клиентского запроса до обработки на стороне сервера.
Включение трассировки Keeper
Чтобы включить трассировку запросов к Keeper, задайте следующие настройки в конфигурации клиента ZooKeeper/Keeper:
Типы спанов Keeper
Когда включена трассировка, ClickHouse создаёт спаны как для клиентских, так и для серверных операций Keeper:
Клиентские спаны:
zookeeper.create— Создание нового узлаzookeeper.get— Получение данных узлаzookeeper.set— Установка данных узлаzookeeper.remove— Удаление узлаzookeeper.list— Перечисление дочерних узловzookeeper.exists— Проверка существования узлаzookeeper.multi— Атомарное выполнение нескольких операцийzookeeper.client.requests_queue— Время ожидания запросов в очереди перед отправкой
Серверные спаны (Keeper):
keeper.receive_request— Получение и разбор запроса от клиентаkeeper.dispatcher.requests_queue— Постановка запроса в очередь в диспетчереkeeper.write.pre_commit— Предварительная обработка запросов на запись до коммита Raftkeeper.write.commit— Обработка запросов на запись после коммита Raftkeeper.read.wait_for_write— Ожидание запросами на чтение завершения зависимых операций записиkeeper.read.process— Обработка запросов на чтениеkeeper.dispatcher.responses_queue— Постановка ответа в очередь в диспетчереkeeper.send_response— Отправка ответа клиенту
Семплирование и производительность
Чтобы контролировать накладные расходы трассировки, Keeper использует динамическое семплирование. Частота семплирования автоматически подстраивается в диапазоне от 1/10 000 до 1/10 в зависимости от размера запроса. Для всех запросов (как попавших в выборку, так и нет) длительность записывается в гистограммные метрики для мониторинга производительности.
Трассировка самого ClickHouse
ClickHouse создаёт trace spans для каждого запроса и некоторых этапов его выполнения, таких как планирование запроса или распределённые запросы.
Чтобы эта информация была полезной, данные трассировки должны быть экспортированы в систему мониторинга, поддерживающую OpenTelemetry, такую как Jaeger или Prometheus. ClickHouse избегает зависимости от конкретной системы мониторинга и вместо этого предоставляет данные трассировки через системную таблицу. Информация о span'ах трассировки OpenTelemetry, требуемая стандартом, хранится в таблице system.opentelemetry_span_log.
Таблица должна быть включена в конфигурации сервера, см. элемент opentelemetry_span_log в файле конфигурации по умолчанию config.xml. По умолчанию она включена.
Теги или атрибуты сохраняются в виде двух параллельных массивов, содержащих ключи и значения. Для работы с ними используйте ARRAY JOIN.
Log-query-settings
Настройка log_query_settings позволяет логировать изменения параметров запроса во время его выполнения. При включении любые изменения настроек запроса будут записываться в журнал спанов OpenTelemetry. Эта функция особенно полезна в продуктивной среде для отслеживания изменений конфигурации, которые могут повлиять на производительность запросов.
Интеграция с системами мониторинга
На данный момент нет готового инструмента, позволяющего экспортировать данные трассировки из ClickHouse в систему мониторинга.
Для тестирования можно настроить экспорт с помощью materialized view с движком URL поверх таблицы system.opentelemetry_span_log, которое будет отправлять поступающие лог-записи на HTTP-эндпоинт коллектора трассировок. Например, чтобы отправлять минимальные данные о спане в экземпляр Zipkin, запущенный по адресу http://localhost:9411, в формате Zipkin v2 JSON:
В случае возникновения ошибок та часть данных журнала, для которой произошла ошибка, будет незаметно потеряна. Если данные не поступают, проверьте журнал сервера на наличие сообщений об ошибках.