Grafana — предпочтительный инструмент визуализации данных обсервабилити в ClickHouse. Это обеспечивается официальным плагином ClickHouse для Grafana. Инструкции по установке можно найти здесь.
V4 плагина делает журналы и трассировки полноценной частью нового конструктора запросов. Это сводит к минимуму необходимость для SRE писать SQL-запросы и упрощает SQL-ориентированную обсервабилити, развивая этот новый подход.
Одной из важных частей этой работы стало то, что OpenTelemetry (OTel) был положен в основу плагина, поскольку мы считаем, что именно он станет фундаментом SQL-ориентированной обсервабилити в ближайшие годы и определит, как будут собираться данные.
При настройке источника данных ClickHouse в Grafana плагин позволяет указать базу данных и таблицу по умолчанию для журналов и трассировок, а также соответствует ли схема этих таблиц схеме OTel. Благодаря этому плагин может возвращать столбцы, необходимые для корректного отображения журналов и трассировок в Grafana. Если вы изменили стандартную схему OTel и хотите использовать собственные имена столбцов, их можно указать. Если же используются стандартные имена столбцов OTel для таких столбцов, как время (Timestamp), уровень журнала (SeverityText) или тело сообщения (Body), ничего менять не потребуется.
HTTP или NativeВы можете подключить Grafana к ClickHouse через HTTP-протокол или собственный протокол Native. Последний дает небольшое преимущество в производительности, которое в запросах агрегации, выполняемых пользователями Grafana, скорее всего будет незаметно. В то же время HTTP-протокол обычно проще проксировать и анализировать.
Для корректного отображения журналов в конфигурации Logs требуются столбцы времени, уровня журнала и сообщения.
Конфигурация Traces немного сложнее (полный список здесь). Эти обязательные столбцы нужны, чтобы абстрагировать последующие запросы, формирующие полный профиль трассировки. Эти запросы предполагают, что данные структурированы аналогично OTel, поэтому пользователям, которые существенно отклоняются от стандартной схемы, потребуется использовать представления, чтобы воспользоваться этой возможностью.
После настройки вы можете перейти в Grafana Explore и начать поиск журналов и трассировок.
Если вы следуете требованиям Grafana к журналам, вы можете выбрать Query Type: Log в конструкторе запросов и нажать Run Query. Конструктор запросов сформирует запрос для вывода журналов и их корректного отображения, например.
SELECT Timestamp as timestamp, Body as body, SeverityText as level, TraceId as traceID FROM "default"."otel_logs" WHERE ( timestamp >= $__fromTime AND timestamp <= $__toTime ) ORDER BY timestamp DESC LIMIT 1000
Конструктор запросов позволяет легко изменять запрос без необходимости писать SQL. В конструкторе запросов также можно настраивать фильтрацию, в том числе искать журналы по ключевым словам. Если нужно составлять более сложные запросы, можно переключиться в редактор SQL. Если запрос возвращает нужные столбцы и в качестве Query Type выбрано logs, результаты будут отображаться как журналы. Столбцы, необходимые для отображения журналов, перечислены здесь.
От журналов к трассировкам
Если в журналах есть trace ID, вы можете перейти к трассировке, связанной с конкретной строкой журнала.
Как и в случае с описанным выше журналированием, если столбцы, необходимые Grafana для отображения трассировок, настроены должным образом (например, при использовании схемы OTel), конструктор запросов может автоматически сформировать нужные запросы. Если выбрать Query Type: Traces и нажать Run Query, будет сгенерирован и выполнен запрос, похожий на следующий (в зависимости от настроенных столбцов; в примере ниже предполагается использование OTel):
SELECT "TraceId" as traceID,
"ServiceName" as serviceName,
"SpanName" as operationName,
"Timestamp" as startTime,
multiply("Duration", 0.000001) as duration
FROM "default"."otel_traces"
WHERE ( Timestamp >= $__fromTime AND Timestamp <= $__toTime )
AND ( ParentSpanId = '' )
AND ( Duration > 0 )
ORDER BY Timestamp DESC, Duration DESC LIMIT 1000
Этот запрос возвращает имена столбцов, которые ожидает Grafana, и отображает таблицу трассировок, как показано ниже. Фильтровать по длительности или другим столбцам можно без написания SQL.
Если вам нужны более сложные запросы, вы можете переключиться в редактор SQL.
Как показано выше, идентификаторы трасс отображаются как ссылки, по которым можно перейти. При нажатии на идентификатор трассы пользователь может выбрать просмотр связанных спанов по ссылке View Trace. При этом выполняется следующий запрос (если используются столбцы OTel), чтобы получить спаны в нужной структуре и отобразить результаты в виде waterfall-диаграммы.
WITH '<trace_id>' AS trace_id,
(SELECT min(Start) FROM "default"."otel_traces_trace_id_ts"
WHERE TraceId = trace_id) AS trace_start,
(SELECT max(End) + 1 FROM "default"."otel_traces_trace_id_ts"
WHERE TraceId = trace_id) AS trace_end
SELECT "TraceId" AS traceID,
"SpanId" AS spanID,
"ParentSpanId" AS parentSpanID,
"ServiceName" AS serviceName,
"SpanName" AS operationName,
"Timestamp" AS startTime,
multiply("Duration", 0.000001) AS duration,
arrayMap(key -> map('key', key, 'value',"SpanAttributes"[key]),
mapKeys("SpanAttributes")) AS tags,
arrayMap(key -> map('key', key, 'value',"ResourceAttributes"[key]),
mapKeys("ResourceAttributes")) AS serviceTags
FROM "default"."otel_traces"
WHERE traceID = trace_id
AND startTime >= trace_start
AND startTime <= trace_end
LIMIT 1000
Если журналы содержат идентификаторы трассировки, вы можете перейти от трассы к связанным с ней журналам. Чтобы просмотреть журналы, нажмите на идентификатор трассировки и выберите View Logs. При этом будет выполнен следующий запрос при использовании столбцов OTel по умолчанию.
SELECT Timestamp AS "timestamp",
Body AS "body", SeverityText AS "level",
TraceId AS "traceID" FROM "default"."otel_logs"
WHERE ( traceID = '<trace_id>' )
ORDER BY timestamp ASC LIMIT 1000
Вы можете создавать панели мониторинга в Grafana с помощью источника данных ClickHouse. Подробности см. в документации по источнику данных ClickHouse для Grafana, особенно в разделах о макросах и переменных.
Плагин включает несколько готовых панелей мониторинга, в том числе пример «Simple ClickHouse OTel dashboarding» для данных логирования и трассировки, соответствующих спецификации OTel. Для этого необходимо использовать стандартные имена столбцов OTel; установить эту панель можно из конфигурации источника данных.
Ниже приведены несколько простых советов по созданию визуализаций.
Наряду со статистикой линейные графики — один из самых распространённых видов визуализации в сценариях обсервабилити. Плагин ClickHouse автоматически построит линейный график, если запрос возвращает столбец datetime с именем time и числовой столбец. Например:
SELECT
$__timeInterval(Timestamp) as time,
quantile(0.99)(Duration)/1000000 AS p99
FROM otel_traces
WHERE
$__timeFilter(Timestamp)
AND ( Timestamp >= $__fromTime AND Timestamp <= $__toTime )
GROUP BY time
ORDER BY time ASC
LIMIT 100000
Многолинейные графики будут автоматически отображаться для запроса, если выполняются следующие условия:
- поле 1: поле datetime с псевдонимом time
- поле 2: значение, по которому выполняется группировка. Оно должно иметь тип String.
- поле 3+: значения метрик
Например:
SELECT
$__timeInterval(Timestamp) as time,
ServiceName,
quantile(0.99)(Duration)/1000000 AS p99
FROM otel_traces
WHERE $__timeFilter(Timestamp)
AND ( Timestamp >= $__fromTime AND Timestamp <= $__toTime )
GROUP BY ServiceName, time
ORDER BY time ASC
LIMIT 100000
В предыдущих разделах мы рассмотрели обогащение данных обсервабилити географическими координатами с помощью IP-словарей. Если у вас есть столбцы latitude и longitude, данные обсервабилити можно визуализировать с помощью функции geohashEncode. В результате получаются геохеши, совместимые с панелью Grafana Geo Map. Ниже показаны пример запроса и визуализация:
WITH coords AS
(
SELECT
Latitude,
Longitude,
geohashEncode(Longitude, Latitude, 4) AS hash
FROM otel_logs_v2
WHERE (Longitude != 0) AND (Latitude != 0)
)
SELECT
hash,
count() AS heat,
round(log10(heat), 2) AS adj_heat
FROM coords
GROUP BY hash
Последнее изменение 10 июня 2026 г.