Роли коллектора
- Агент - Экземпляры агента собирают данные на периферии, например на серверах или узлах Kubernetes, либо получают события напрямую от приложений, инструментированных с помощью OpenTelemetry SDK. В последнем случае экземпляр агента запускается вместе с приложением или на том же хосте, что и приложение (например, как сайдкар или ДемонСет). Агенты могут отправлять данные либо напрямую в ClickHouse, либо в экземпляр шлюза. В первом случае это называется шаблоном развертывания агента.
- Шлюз - Экземпляры шлюза предоставляют автономный сервис (например, развертывание в Kubernetes), как правило, на каждый кластер, центр обработки данных или регион. Они получают события от приложений (или других коллекторов, работающих как агенты) через единую конечную точку OTLP. Обычно развертывается набор экземпляров шлюза, а для распределения нагрузки между ними используется стандартный балансировщик нагрузки. Если все агенты и приложения отправляют свои сигналы в эту единую конечную точку, это часто называется шаблоном развертывания шлюза.
Развертывание коллектора
- Управляемый ClickStack
- ClickStack с открытым исходным кодом
При отправке данных в Управляемый ClickStack мы рекомендуем использовать официальный дистрибутив коллектора ClickStack в роли шлюза, где это возможно. Если вы предпочитаете использовать собственный коллектор, убедитесь, что он включает ClickHouse exporter.Коллектор можно развернуть с помощью Helm (рекомендуется для Kubernetes) или Docker. Официальный Helm-чарт ClickStack включает upstream-Helm-чарт OpenTelemetry Collector в качестве субчарта с предварительно настроенным образом дистрибутива ClickStack — см. руководство по развертыванию ClickStack через Helm, если вы хотите установить полный стек, включая HyperDX. Для автономного развертывания коллектора upstream-чарт можно использовать напрямую с образом ClickStack, как показано ниже.Целевой экземпляр ClickHouse настраивается через переменные среды Дистрибутив ClickStack с OTel collector поддерживает расширение базовой конфигурации за счёт монтирования пользовательского файла конфигурации и задания переменной окружения.Чтобы добавить пользовательские приёмники, процессоры или конвейеры:Разверните автономный коллектор:Для более сложных конфигураций см. конфигурацию коллектора ClickStack по умолчанию и документацию экспортёра ClickHouse.Подробную информацию о настройке коллекторов OTel, включая
- Helm
- Docker
Добавьте официальный Helm-репозиторий OpenTelemetry:Создайте Установите чарт:Для развертываний в продакшн мы рекомендуем хранить
values.yaml, указав образ ClickStack и учетные данные Управляемого ClickStack:CLICKHOUSE_PASSWORD в секрете Kubernetes и ссылаться на него через extraEnvsFrom, а не указывать значение напрямую.CLICKHOUSE_ENDPOINT, CLICKHOUSE_USERNAME и CLICKHOUSE_PASSWORD. Переменная CLICKHOUSE_ENDPOINT должна содержать полный HTTP-адрес конечной точки ClickHouse Cloud, включая протокол и порт — например, https://99rr6dm6v3.us-central1.gcp.clickhouse.cloud:8443.Подробнее о получении учётных данных Управляемого ClickStack см. здесь.Пользователь для продакшнаВ продакшне следует использовать пользователя с подходящими учётными данными.
Изменение конфигурации
Настройка экземпляра Управляемого ClickStack
OpenTelemetry Collector можно настроить для использования экземпляра Управляемого ClickStack с помощью переменных окруженияCLICKHOUSE_ENDPOINT, CLICKHOUSE_USERNAME и CLICKHOUSE_PASSWORD. Способ их настройки зависит от метода развертывания:- Helm
- Docker
Переопределите соответствующие значения в разделе
extraEnvs файла values.yaml, затем обновите релиз:Расширение конфигурации OTel collector
- Создайте пользовательский файл конфигурации с дополнительными настройками
- Смонтируйте файл по пути
/etc/otelcol-contrib/custom.config.yaml - Задайте переменную окружения
CUSTOM_OTELCOL_CONFIG_FILE=/etc/otelcol-contrib/custom.config.yaml
В пользовательской конфигурации вы определяете только новые приёмники, процессоры и конвейеры. Базовые процессоры (
memory_limiter, batch) и экспортёры (clickhouse) уже определены — обращайтесь к ним по имени. Пользовательская конфигурация объединяется с базовой и не может переопределять существующие компоненты.Структура конфигурации
приёмники, operators и процессоры, рекомендуем смотреть в официальной документации OpenTelemetry Collector.Docker Compose
При использовании Docker Compose измените конфигурацию коллектора, используя те же переменные среды, что указаны выше:Защита коллектора
- Управляемый ClickStack
- ClickStack с открытым исходным кодом
По умолчанию коллектор ClickStack OpenTelemetry при развертывании вне дистрибутивов с открытым исходным кодом не защищён и не требует аутентификации на своих портах OTLP.Чтобы защитить ингестию, укажите токен аутентификации при развертывании коллектора с помощью переменной окружения Мы также рекомендуем:Здесь предполагается, что коллектор настроен на использование базы данных
OTLP_AUTH_TOKEN. Способ настройки зависит от метода развертывания:- Helm
- Docker
Добавьте Для развертываний в продакшн мы рекомендуем хранить
OTLP_AUTH_TOKEN в extraEnvs вашего values.yaml, затем обновите релиз:OTLP_AUTH_TOKEN и CLICKHOUSE_PASSWORD в Kubernetes secret и ссылаться на них через extraEnvsFrom.- Настроить обмен данными между коллектором и ClickHouse по HTTPS.
- Создать отдельного пользователя для ингестии с ограниченными разрешениями — см. ниже.
- Включить TLS для конечной точки OTLP, чтобы обеспечить шифрованную связь между SDKs/агентами и коллектором. Это можно настроить через пользовательскую конфигурацию коллектора.
Создание пользователя для ингестии
Мы рекомендуем создать отдельную базу данных и пользователя для OTel collector для ингестии в Управляемый ClickStack. Ему следует выдать разрешения на создание и вставку данных в таблицы, создаваемые и используемые ClickStack.otel. Это можно задать с помощью переменной окружения HYPERDX_OTEL_EXPORTER_CLICKHOUSE_DATABASE. Передайте её в коллектор аналогично другим переменным окружения.Обработка — фильтрация, преобразование и обогащение
- Развернуть собственную версию OTel collector, которая выполняет фильтрацию и обработку, и отправлять события в коллектор ClickStack через OTLP для ингестии в ClickHouse.
- Развернуть собственную версию OTel collector и отправлять события напрямую в ClickHouse с помощью ClickHouse exporter.
-
Процессоры - Процессоры берут данные, собранные приёмниками, и изменяют или преобразуют их перед отправкой в экспортеры. Процессоры применяются в порядке, заданном в разделе
processorsконфигурации коллектора. Они необязательны, но обычно рекомендуется минимальный набор. При использовании OTel collector с ClickHouse мы рекомендуем ограничиться следующими процессорами: - memory_limiter используется для предотвращения ситуаций нехватки памяти в коллекторе. Рекомендации см. в разделе Оценка ресурсов.
- Любой процессор, выполняющий обогащение на основе контекста. Например, Kubernetes Attributes Processor позволяет автоматически задавать атрибуты ресурса для spans, metrics и журналов на основе метаданных k8s, например обогащать события идентификатором исходного пода.
- Tail или head sampling, если это требуется для трасс.
- Базовая фильтрация - отбрасывание ненужных событий, если это нельзя сделать через оператор (см. ниже).
- Батчинг - необходим при работе с ClickHouse, чтобы данные отправлялись батчами. См. “Оптимизация вставок”.
- Операторы - Операторы представляют собой самую базовую единицу обработки, доступную на уровне приёмника. Поддерживается базовый парсинг, что позволяет задавать такие поля, как Severity и Timestamp. Здесь поддерживаются парсинг JSON и regex, а также фильтрация событий и базовые преобразования. Мы рекомендуем выполнять фильтрацию событий именно здесь.
Пример
regex_parser) и фильтрации событий, а также процессора для объединения событий в батчи и ограничения использования памяти.
file=code_snippets/ClickStack/config-unstructured-logs-with-processor.yaml
Оптимизация вставок
Пакетирование
- (1) Если на узле, принимающем данные, возникают проблемы, запрос на вставку завершится по тайм-ауту (или вернёт более конкретную ошибку), и подтверждение получено не будет.
- (2) Если узел записал данные, но из-за сетевых сбоев не может вернуть подтверждение отправителю запроса, отправитель получит либо тайм-аут, либо сетевую ошибку.
timeout пакетного процессора, что обеспечивает низкую сквозную задержку конвейера и стабильный размер батчей.
Используйте асинхронные вставки
timeout пакетного процессора. Это может создавать проблемы — именно для таких случаев и нужны asynchronous inserts. Эта проблема редко возникает, если вы отправляете данные в коллектор ClickStack, работающий как шлюз: выступая в роли агрегаторов, такие коллекторы смягчают её — см. Роли коллектора.
Если нельзя гарантировать большие батчи, можно делегировать пакетирование ClickHouse с помощью Asynchronous Inserts. При asynchronous inserts данные сначала попадают в буфер, а затем позже, то есть асинхронно, записываются в хранилище базы данных.
Когда asynchronous inserts включены, ClickHouse ① при получении запроса на вставку ② сразу записывает данные запроса в буфер в памяти. Когда ③ происходит следующий flush буфера, данные из буфера сортируются и записываются как part в хранилище базы данных. Обратите внимание: до записи в хранилище базы данных эти данные недоступны для поиска запросами; flush буфера настраивается.
Чтобы включить asynchronous inserts для коллектора, добавьте async_insert=1 в connection string. Мы рекомендуем использовать wait_for_async_insert=1 (значение по умолчанию), чтобы обеспечить гарантии доставки — подробнее см. здесь.
Данные из async insert вставляются после flush буфера ClickHouse. Это происходит либо после превышения async_insert_max_data_size, либо через async_insert_busy_timeout_ms миллисекунд с момента первого INSERT-запроса. Если для async_insert_stale_timeout_ms задано ненулевое значение, данные вставляются через async_insert_stale_timeout_ms milliseconds с момента последнего запроса. Эти параметры можно настроить, чтобы управлять сквозной задержкой конвейера. Дополнительные параметры для настройки flush буфера описаны здесь. Как правило, значений по умолчанию достаточно.
Рассмотрите adaptive asynchronous insertsЕсли используется небольшое число агентов, пропускная способность невысока, а требования к сквозной задержке строгие, могут быть полезны adaptive asynchronous inserts. Как правило, они неприменимы к сценариям обсервабилити с высокой пропускной способностью, характерным для ClickHouse.
async_insert_deduplicate.
Полные сведения о настройке этой возможности можно найти на этой странице документации или в подробной статье в блоге.
Масштабирование
Добавление Kafka
Конфигурация OTel collectorДистрибутив коллектора ClickStack OpenTelemetry можно настроить для работы с Kafka с помощью пользовательской конфигурации коллектора.
Оценка ресурсов
| Скорость логирования | Ресурсы для агента collector |
|---|---|
| 1k/second | 0.2CPU, 0.2GiB |
| 5k/second | 0.5 CPU, 0.5GiB |
| 10k/second | 1 CPU, 1GiB |
Выбор схемы: Map vs JSON
Map(LowCardinality(String), String). Это рекомендуемая схема для задач обсервабилити. Схема с типом JSON доступна в статусе бета для оценки на рабочих нагрузках с небольшим и стабильным набором ключей атрибутов.
Полное сравнение, рекомендации по выбору подходящего варианта, переменные окружения, необходимые для включения схемы с типом JSON, и пошаговое руководство по миграции см. в разделе Map vs JSON type.