---
metadata:
  - name: generator
    content: Diplodoc Platform v5.63.0
alternate:
  - en/cookbook/logging
  - ru/cookbook/logging
  - href: ru/cookbook/logging.md
    type: text/markdown
    title: Markdown version
csp:
  - script-src:
      - https://mc.yandex.ru
    img-src:
      - https://mc.yandex.ru
    connect-src:
      - https://mc.yandex.ru
      - wss://mc.yandex.ru
    child-src:
      - 'blob:'
      - https://mc.yandex.ru
    frame-src:
      - 'blob:'
      - https://mc.yandex.ru
    frame-ancestors:
      - 'blob:'
      - https://mc.yandex.ru
canonical: ru/cookbook/logging.html
title: Логирование DataLens On-premises
description: "Из статьи вы узнаете, как быстро собрать информацию для техподдержки и\_как использовать интерактивные утилиты для мониторинга в DataLens On-premises."
vcsPath: ru/cookbook/logging.md
---

# Сбор логов

## Типы логов {#types}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

```shell
./init.sh --kubectl get pods
```

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

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

```shell
./init.sh --kubectl get events
```

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

## Продвинутые инструменты отладки {#advanced-tools}

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

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

```shell
./init.sh --k9s
```

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

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

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

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

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

{% note tip %}

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

{% endnote %}

## Настройка Usage Tracking {#usage-tracking}

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

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

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

    ```yaml
    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`.

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

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

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

```sql
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® таблицу и словарь:

```sql
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®, который может использоваться для эффективного доступа к ним в запросах.

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

```sql
CLICKHOUSE_TABLE_US_ENTRIES: us_entries
CLICKHOUSE_DICT_US_ENTRIES: us_entries_dict
```

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

```sql
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`, например:

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

## Инструменты для мониторинга и отладки {#monitoring-tools}

### Отладка c Freelens

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

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

Интерфейс Freelens:


![image](../_assets/datalens/cookbook/freelens.png)


### Отладка c `k9s`

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

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

```yaml
./init.sh --k9s
```

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


![image](../_assets/datalens/cookbook/k9s.png)


## Кейс {#case-example}

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

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

{% cut "Узнать ответ" %}

* В логи пода `datalens-enterprise-ui` с помощью `stern`.

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

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

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

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

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

* В интерфейс `k9s`.

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

{% endcut %}

## Итоги {#results}

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