Сбор логов

Типы логов

Application Logs — логи работы приложения.

Это технические логи от каждого микросервиса (ui, data_api, us и так далее), которые пишутся в stdout/stderr каждого Kubernetes-пода. Они содержат информацию о запусках, внутренних операциях, ошибках и стектрейсы. Нужны для отладки и поиска причин сбоев в работе DataLens.

Usage Tracking — логи использования.

Это структурированные события о действиях пользователей: открытие дашборда, выполнение запроса, время ответа. Их собирает сервис fluent-bit и отправляет в базу данных ClickHouse®. Они нужны для анализа популярности дашбордов, поиска тяжелых запросов и аудита.

Инструменты для сбора логов

Скрипт ./init.sh предоставляет несколько инструментов для работы с логами.

Сбор логов со всех подов

Это основная команда. Используйте ее, когда нужна общая картина происходящего.

./init.sh --stern . -o extjson > datalens.enterprise.log

# --stern .: Агрегирует логи со всех подов в пространстве имен DataLens
# -o extjson: Вывод в структурированном JSON, который удобно парсить. Для чтения глазами можно использовать raw
# > datalens.enterprise.log: Перенаправление вывода в файл для дальнейшего анализа или отправки в поддержку

Сбор логов с одного пода

Если вы знаете, с каким сервисом возникла проблема (например, auth), можно смотреть только его логи.

 ./init.sh --stern --tail 100 --no-follow pod/<имя_пода>

Имя пода всегда уникальное, поэтому его нужно смотреть предварительно. Для этого используйте команду:

./init.sh --kubectl get pods

Сбор событий кластера

Иногда проблемы возникают на уровне Kubernetes: под не может запуститься, скачать образ или получить ресурсы. В этом случае нужно смотреть не логи приложения, а события кластера.

./init.sh --kubectl get events

Эта команда покажет проблемы ImagePullBackoff (не удалось скачать Docker-образ), CrashLoopBackoff (под падает и перезапускается) или нехватку ресурсов.

Продвинутые инструменты отладки

Терминальный интерфейс k9s

Для интерактивного мониторинга и управления кластером в дистрибутив встроена утилита k9s.

./init.sh --k9s

Эта команда запускает текстовый интерфейс прямо в терминале. В нем можно в реальном времени отслеживать состояние подов, просматривать логи, контролировать потребление ресурсов, переключаться между пространствами имен и работать с другими параметрами.

Сбор полного отчета для техподдержки

Доступна единая команда, которая автоматически собирает всю диагностическую информацию в один архив.

./init.sh --get-debug-info

Она соберет логи, конфигурацию Helm-релиза, события кластера и другую служебную информацию.

Совет

Именно результат выполнения этой команды в первую очередь попросит у вас техническая поддержка при обращении.

Настройка Usage Tracking

Как включить мониторинг пользовательских действий

  1. Включить функцию. В values.yaml установите features.usage_tracking.enabled: true и infra.fluebt-bit.enabled = true.

  2. Создать подключение. В интерфейсе DataLens выберите любой воркбук или создайте новый. Внутри него создайте подключение к ClickHouse®. Данные для подключения можно найти в Readme.md в разделе Конфигурация ClickHouse®.

    clickhouse:
    CLICKHOUSE_HOST: clickhouse-cip
    CLICKHOUSE_PORT: '8123'
    CLICKHOUSE_USER: ch-user
    CLICKHOUSE_DB_USAGE_TRACKING: ch-usage-tracking-db
    CLICKHOUSE_TABLE_USAGE_TRACKING: ch-usage-tracking-table
    

    Чтобы получить пароль, обратитесь к секрету через ./init.sh --kubectl get secret datalens-enterprise-secrets --template "{{.data.CLICKHOUSE_PASSWORD}}" | base64 -d.

  3. Создать датасет. На основе подключения можно создать датасет, чарты и дашборды для аналитики пользовательских действий.

Как использовать Usage Tracking с внешней базой данных ClickHouse®

Для использования Usage Tracking с внешней базой данных ClickHouse® создайте таблицу в целевом кластере при помощи запроса:

CREATE TABLE $CLICKHOUSE_DB_USAGE_TRACKING.$CLICKHOUSE_TABLE_USAGE_TRACKING
ON CLUSTER '{cluster}' (
    event_time DateTime64(9),
    event_date Date,
    source_entry_id String,
    dash_id Nullable(String),
    dash_tab_id Nullable(String),
    chart_id Nullable(String),
    chart_kind Nullable(String),
    response_status_code Nullable(UInt64),
    dataset_id Nullable(String),
    user_id Nullable(String),
    request_id Nullable(String),
    query Nullable(String),
    source Nullable(String),
    connection_id Nullable(String),
    dataset_mode Nullable(String),
    username Nullable(String),
    execution_time Int64,
    status Nullable(String),
    error Nullable(String),
    connection_type Nullable(String),
    host Nullable(String),
    cluster Nullable(String),
    clique_alias Nullable(String),
    cache_used UInt8,
    cache_full_hit UInt8,
    endpoint_code Nullable(String),
    query_type Nullable(String),
    err_code Nullable(String),
    workbook_id Nullable(String)
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/$CLICKHOUSE_DB_USAGE_TRACKING.$CLICKHOUSE_TABLE_USAGE_TRACKING', '{replica}')
PARTITION BY toYYYYMM(event_date)
ORDER BY (toStartOfHour(event_time), connection_id, dash_id, dataset_id, chart_id, user_id, event_time)
TTL event_date + toIntervalMonth(6)
SETTINGS index_granularity = 8192, allow_nullable_key = 1;

В этом запросе $CLICKHOUSE_DB_USAGE_TRACKING и $CLICKHOUSE_TABLE_USAGE_TRACKING — имя базы данных и имя таблицы ClickHouse® в вашем кластере.

Данные Usage Tracking содержат только ID объектов DataLens, а не их экранные имена. Для работы с экранными именами необходимо донастроить ClickHouse®.

Как получить экранные имена объектов для аналитики

Создать в кластере ClickHouse® таблицу и словарь:

CREATE TABLE $CLICKHOUSE_DB_USAGE_TRACKING.$CLICKHOUSE_TABLE_US_ENTRIES ON CLUSTER '{cluster}'
(
  encoded_entry_id String,
  display_key String,
  updated_at DateTime
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/$CLICKHOUSE_DB_USAGE_TRACKING.$CLICKHOUSE_TABLE_US_ENTRIES', '{replica}')
ORDER BY encoded_entry_id
SETTINGS index_granularity = 8192;

CREATE DICTIONARY $CLICKHOUSE_DB_USAGE_TRACKING.$CLICKHOUSE_DICT_US_ENTRIES ON CLUSTER '{cluster}'
ON CLUSTER '{cluster}' (
    entry_id String,
    title String
)
PRIMARY KEY entry_id
SOURCE(CLICKHOUSE(HOST 'localhost' PORT 9000 user $CH_RO_USER password '$CH_RO_PASSWORD' DB $CH_DATABASE TABLE $CH_TABLE))
LAYOUT(complex_key_hashed())
LIFETIME(10800);

В этом коде:

  • $CLICKHOUSE_DB_USAGE_TRACKING — имя базы данных в ClickHouse®, в которую DataLens будет поставлять данные Usage Tracking;
  • $CLICKHOUSE_TABLE_USAGE_TRACKING — имя таблицы в ClickHouse®, в которую будут поставляться данные об активности пользователей;
  • $CLICKHOUSE_TABLE_US_ENTRIES — имя таблицы в ClickHouse®, с которой будут синхронизироваться экранные имена объектов DataLens;
  • $CLICKHOUSE_DICT_US_ENTRIES — имя словаря на основе таблицы с именами объектов в ClickHouse®, который может использоваться для эффективного доступа к ним в запросах.

Рекомендуемые имена для новых объектов:

CLICKHOUSE_TABLE_US_ENTRIES: us_entries
CLICKHOUSE_DICT_US_ENTRIES: us_entries_dict

При построении запросов к статистике с использованием экранных имен используйте словарь, а не таблицу напрямую. Например, следующий запрос выведет список из 10 самых популярных датасетов по количеству уникальных пользователей:

SELECT
  uniqExact(user_id) AS user_count,
  dictGetStringOrDefault('$CLICKHOUSE_DB_USAGE_TRACKING.$CLICKHOUSE_DICT_US_ENTRIES', 'title', dataset_id, '__unknown__') AS dataset_title
FROM $CLICKHOUSE_DB_USAGE_TRACKING.$CLICKHOUSE_TABLE_USAGE_TRACKING
WHERE dataset_id IS NOT NULL
GROUP BY dataset_title
ORDER BY user_count DESC
LIMIT 10;

При работе с данными Usage Tracking через DataLens без использования SQL для получения экранного имени объекта по его ID воспользуйтесь функцией DB_CALL_STRING, например:

DB_CALL_STRING("dictGetStringOrDefault", "$CLICKHOUSE_DB_USAGE_TRACKING.$CLICKHOUSE_DICT_US_ENTRIES", "title", [dataset_id], "__unknown__")

Инструменты для мониторинга и отладки

Отладка c Freelens

Freelens — это графический клиент для Kubernetes. Он позволяет:

  • смотреть статус подов;
  • просматривать логи каждого пода в реальном времени;
  • проверять потребление CPU и RAM;
  • подключаться к командной строке пода для выполнения диагностических команд.

Интерфейс Freelens:

image

Отладка c k9s

Это встроенный аналог Freelens прямо в терминале. В отличие от Freelens, k9s доступен без дополнительных установок и настроек.

Запускается так:

./init.sh --k9s

Выглядит так:

image

Кейс

Пользователи жалуются, что интерфейс DataLens не загружается. Вы видите, что под datalens-enterprise-ui-... находится в состоянии ImagePullBackoff. В каком источнике вы будете искать проблему в первую очередь?

  • В логах пода datalens-enterprise-ui с помощью stern.
  • В событиях кластера с помощью ./init.sh --kubectl get events.
  • В логах Usage Tracking в ClickHouse®.
  • В интерфейсе k9s.
Узнать ответ
  • В логи пода datalens-enterprise-ui с помощью stern.

    Неверно. Логи приложения еще не генерируются, так как контейнер даже не может запуститься.

  • В событиях кластера с помощью ./init.sh --kubectl get events.

    Верно. Именно в событиях кластера будет детальная информация об ошибке ImagePullBackoff, например: «неверный адрес registry» или «ошибка аутентификации в registry».

  • В логах Usage Tracking в ClickHouse®.

    Неверно. Usage Tracking фиксирует действия в уже работающем приложении, а в кейсе приложение не может стартовать.

  • В интерфейс k9s.

    Неверно. В k9s вы увидите статус ImagePullBackoff, но детали ошибки все равно нужно смотреть в описании пода или в events. Так что просмотр событий — более прямой путь.

Итоги

Теперь в вашем арсенале есть полный набор инструментов для диагностики DataLens: от просмотра общих логов до анализа конкретных событий в кластере. Вы знаете, как быстро собрать информацию для техподдержки и как использовать интерактивные утилиты для мониторинга.