- Зачем: - гео-блок дашборда должен показывать понятную метрику, единицы и сравнение стран. - Что: - legacy world_map заменён на столбцы Top Countries by Events с tooltip и легендой. - синхронизирован экспорт дашборда и добавлены контрактные тесты. - обновлены документы и урок Superset по новому гео-блоку. - Проверка: - uv run --with pytest pytest tests/test_superset_dashboard_config.py. - uv run python -m py_compile superset/create_dashboard.py tests/test_superset_dashboard_config.py. - jq empty superset/dashboards/ecommerce_analytics.zip.json.
298 lines
13 KiB
Markdown
298 lines
13 KiB
Markdown
# Дашборд Superset для E-commerce Analytics
|
||
|
||
Документация по настройке и использованию Superset дашборда для анализа кликстрима.
|
||
|
||
---
|
||
|
||
## Быстрый старт
|
||
|
||
### 1. Запуск инфраструктуры
|
||
|
||
```bash
|
||
# Чистый прогон: стартовая история генератора -> DM -> Superset
|
||
make generated-history-analytics
|
||
```
|
||
|
||
Команда очищает volumes, генерирует стартовую историю, прогоняет batch
|
||
STG -> ODS -> DDS -> DM и создаёт metadata Superset. Если данные уже
|
||
подготовлены и нужно только пересобрать Superset:
|
||
|
||
```bash
|
||
# Автоматическая инициализация (создание подключения и датасетов)
|
||
make superset-init
|
||
|
||
# Создание дашборда с чартами; при необходимости обновляет metadata колонок датасетов
|
||
make superset-dashboard
|
||
```
|
||
|
||
### 2. Доступ к UI
|
||
|
||
Откройте в браузере: http://localhost:8088
|
||
|
||
**Логин:** `admin`
|
||
**Пароль:** `admin`
|
||
|
||
---
|
||
|
||
## Структура дашборда
|
||
|
||
### Витрины данных (Datasets)
|
||
|
||
| Витрина | Таблица ClickHouse | Описание |
|
||
|---------|-------------------|------------|
|
||
| **Events Enriched** | `dm.v_events_enriched` | Полная обогащённая витрина событий |
|
||
| **Daily Traffic** | `dm.v_daily_traffic` | Агрегаты по дням |
|
||
| **UTM Effectiveness** | `dm.v_utm_effectiveness` | Эффективность маркетинговых каналов |
|
||
| **Top Pages** | `dm.v_top_pages_daily` | Популярность страниц |
|
||
| **Session Overview** | `dm.v_session_overview` | Анализ сессий |
|
||
| **DQ Summary** | `dm.dq_summary` | Метрики по слоям (строки, ошибки, сироты) |
|
||
|
||
### Чарты (Charts)
|
||
|
||
#### KPI-блок (верх дашборда)
|
||
- **📊 Total Events** — общее количество событий
|
||
- **👤 Unique Users** — уникальные пользователи
|
||
- **📈 Avg Events/Visit** — среднее количество событий на визит (`click_id`)
|
||
- **🎯 Conversion to /confirmation** — доля просмотров `/confirmation` от просмотров `/home`
|
||
|
||
KPI разложены в одну строку по 12-колоночной сетке Superset: четыре блока по 3 колонки.
|
||
`Unique Sessions` не вынесен отдельной KPI-плиткой: в текущем дашборде важнее
|
||
развести события, пользователей и среднюю глубину визита. Генератор создаёт
|
||
повторные визиты, поэтому `user_domain_id` и `click_id` уже не идут 1:1.
|
||
|
||
#### Динамика трафика
|
||
- **📅 Events over Time** — линейный график событий с 5-минутными бакетами
|
||
(быстрый проверочный профиль покрывает 6 часов модельного времени, поэтому
|
||
5-минутные бакеты дают видимую динамику без лишнего шума)
|
||
- **📱 Traffic by Device** — pie chart распределения по устройствам
|
||
|
||
#### География
|
||
- **🌍 Top Countries by Events** — top-15 стран по количеству событий
|
||
(`COUNT(*)`, единицы — события, штуки). Столбцы заменили legacy world map:
|
||
на текущем разреженном распределении так видны страна, значение, порядок и
|
||
tooltip. Перекос стран приходит из гео-фактуры статического сида
|
||
`geo_by_click_id`; своя генерация гео описана как отдельный будущий шаг в
|
||
ADR-0006 и не лечится настройкой чарта.
|
||
|
||
> **Что проверили по Superset.** Через MCP Context7 проверили `/apache/superset`:
|
||
> legacy world map описан как отдельный legacy-плагин, а ECharts bar chart имеет
|
||
> штатные параметры `show_legend`, `rich_tooltip`, подписи осей и формат чисел.
|
||
> Поэтому для разреженной географии выбран top-N bar chart
|
||
> (`viz_type: echarts_timeseries_bar`), а не донастройка `world_map`.
|
||
|
||
#### Маркетинг
|
||
- **🔗 UTM Effectiveness Table** — таблица эффективности UTM-меток
|
||
- **🪜 Page Funnel** — funnel chart по просмотрам страниц, от `/home` к `/confirmation`
|
||
|
||
> **Что проверили по Superset 4.1.2.** Через MCP Context7 проверили официальную
|
||
> библиотеку `/apache/superset`; документация не дала точной строки `viz_type`.
|
||
> В установленном Superset 4.1.2 дополнительно проверили bundled example
|
||
> `Featured Charts/Funnel.yaml` и frontend assets: для воронки используется
|
||
> `viz_type: funnel`, поэтому dashboard создаёт именно funnel chart.
|
||
|
||
#### Прохождение строк по слоям
|
||
- **🧱 Rows by Layer (event)** — `dist_bar` по `dm.dq_summary`: сколько строк
|
||
одного **event-зерна** в каждом слое конвейера `STG → ODS → DDS → DM`.
|
||
|
||
> **Почему именно одно зерно, а не сумма по слою.** Чарт берёт по одной
|
||
> канонической таблице на слой (`browser_raw → browser_event → event →
|
||
> v_events_enriched`). Если суммировать `total_rows` по всем таблицам слоя,
|
||
> в один столбец складываются таблицы разного зерна: события, визиты и
|
||
> error-таблицы. Получается **ложная «воронка потерь»**, которой нет. На одном
|
||
> зерне видно прохождение event-строк по слоям, а не сумму несравнимых таблиц.
|
||
>
|
||
> Настоящие сигналы качества (`rows_with_errors` в ODS, `orphan_events` в DDS)
|
||
> на чистых демо-данных равны нулю и живут в `dm.dq_summary` отдельными
|
||
> `check_name` — их разбирают уроки 3–4, а не этот чарт.
|
||
|
||
> **Порядок столбцов.** В groupby подпись слоя получает числовой префикс
|
||
> (`1 · stg`, `2 · ods`, …), а `order_bars` сортирует бары по подписи — иначе
|
||
> `dist_bar` ставит их по убыванию значения, а не по порядку конвейера.
|
||
|
||
### Фильтры (Native Filters)
|
||
|
||
| Фильтр | Поле | Тип | Применение |
|
||
|--------|------|-----|------------|
|
||
| 📅 Date Range | `event_date` | Time Range | Charts с `event_date`; по умолчанию `No filter`, чтобы стартовая история не скрывалась фильтром даты |
|
||
| 🌍 Country | `geo_country` | Multi-select | Charts на `dm.v_events_enriched` |
|
||
| 📱 Device Type | `device_type` | Multi-select | Charts на `dm.v_events_enriched` |
|
||
| 🌐 Browser | `browser_name` | Multi-select | Charts на `dm.v_events_enriched` |
|
||
|
||
Фильтры работают через левую панель Superset. Click-to-filter между виджетами не включен:
|
||
клик по сектору pie chart, карте, строке таблицы или funnel не меняет остальные charts.
|
||
|
||
Фильтр применяется только к charts, где есть нужное поле. Агрегированные витрины
|
||
`dm.v_utm_effectiveness` и `dm.v_top_pages_daily` содержат `event_date`, но не содержат
|
||
`geo_country`, `device_type` и `browser_name`. `dm.dq_summary` использует `check_date`;
|
||
бизнес-фильтры на него не рассчитаны.
|
||
|
||
---
|
||
|
||
## Команды Makefile
|
||
|
||
```bash
|
||
# Основные
|
||
make up # Запуск всех сервисов
|
||
make down # Остановка сервисов
|
||
make clean # Остановка с удалением volumes
|
||
make logs service=superset # Логи сервиса
|
||
|
||
# ETL
|
||
make generated-history-analytics # Чистый прогон генерации до Superset
|
||
make generated-history-check # Проверка DM и Superset metadata
|
||
make ddl # Применение DDL в ClickHouse
|
||
make data # Архивная загрузка data/*.jsonl в Kafka
|
||
make transform # Запуск batch-процесса
|
||
|
||
# Superset
|
||
make superset-init # Инициализация (подключение + датасеты)
|
||
make superset-dashboard # Создание дашборда
|
||
make superset-ui # Показать URL и логин
|
||
make superset-restart # Перезапуск сервиса
|
||
```
|
||
|
||
---
|
||
|
||
## Ручная настройка (если автоматика не сработала)
|
||
|
||
### Создание подключения к ClickHouse
|
||
|
||
1. Откройте **Settings → Database Connections**
|
||
2. Нажмите **+ Database**
|
||
3. Выберите **ClickHouse**
|
||
4. Введите SQLAlchemy URI:
|
||
```
|
||
clickhousedb://default:123456@clickhouse:8123/default
|
||
```
|
||
5. Установите:
|
||
- **Expose in SQL Lab:** ✅
|
||
- **Allow DDL:** ❌
|
||
6. Нажмите **Connect**
|
||
|
||
### Импорт датасетов
|
||
|
||
```bash
|
||
# Внутри контейнера
|
||
docker compose exec superset bash
|
||
python /app/superset_init/init_superset.py
|
||
```
|
||
|
||
### Создание чартов вручную
|
||
|
||
1. Перейдите в **Charts → + Chart**
|
||
2. Выберите датасет (например, `dm.v_events_enriched`)
|
||
3. Настройте визуализацию:
|
||
- **Viz Type:** Big Number / Line Chart / Pie Chart / World Map / Table
|
||
- **Metrics:** COUNT(*), COUNT(DISTINCT ...)
|
||
- **Dimensions:** группировки
|
||
- **Filters:** фильтры
|
||
4. Нажмите **Create Chart**
|
||
|
||
### Создание дашборда
|
||
|
||
1. **Dashboards → + Dashboard**
|
||
2. Назовите: "E-commerce Analytics Dashboard"
|
||
3. Добавьте чарты из списка
|
||
4. Настройте layout (drag-and-drop)
|
||
5. Добавьте Native Filters (фильтры вверху)
|
||
6. Сохраните
|
||
|
||
---
|
||
|
||
## Импорт дашборда
|
||
|
||
Основной способ собрать дашборд — `make superset-dashboard` (скрипт `create_dashboard.py`).
|
||
Готовый экспорт дашборда лежит в репозитории на случай ручного импорта:
|
||
`superset/dashboards/ecommerce_analytics.zip.json` (внутри контейнера —
|
||
`/app/superset_init/dashboards/ecommerce_analytics.zip.json`).
|
||
|
||
```bash
|
||
# Импорт через CLI
|
||
docker compose exec superset superset import-dashboards -p /app/superset_init/dashboards/ecommerce_analytics.zip.json
|
||
|
||
# Или через UI: Settings → Import Dashboards
|
||
```
|
||
|
||
---
|
||
|
||
## Расширение дашборда
|
||
|
||
### Добавление нового чарта
|
||
|
||
1. Отредактируйте `superset/create_dashboard.py`
|
||
2. Добавьте конфигурацию в `CHARTS_CONFIG`
|
||
3. Запустите: `make superset-dashboard`
|
||
|
||
Пример нового чарта:
|
||
```python
|
||
{
|
||
"slice_name": "📊 My New Chart",
|
||
"viz_type": "echarts_bar",
|
||
"dataset_name": "v_events_enriched",
|
||
"params": {
|
||
"x_axis": "event_type",
|
||
"metrics": [{"sqlExpression": "COUNT(*)", "label": "Count"}],
|
||
"time_range": "No filter"
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Troubleshooting
|
||
|
||
### Superset не стартует
|
||
|
||
```bash
|
||
# Проверить логи
|
||
make logs service=superset
|
||
|
||
# Перезапуск
|
||
make superset-restart
|
||
|
||
# Полная переинициализация
|
||
docker compose down -v
|
||
make generated-history-analytics
|
||
```
|
||
|
||
### Нет данных в чартах
|
||
|
||
```bash
|
||
# Проверить данные в ClickHouse
|
||
docker compose exec clickhouse clickhouse-client -q "SELECT count() FROM dm.v_events_enriched"
|
||
|
||
# Перезапустить ETL
|
||
make transform
|
||
```
|
||
|
||
### Ошибка подключения к ClickHouse
|
||
|
||
```bash
|
||
# Проверить доступность ClickHouse
|
||
docker compose exec superset bash -c "ping clickhouse"
|
||
|
||
# Проверить порт
|
||
docker compose exec superset bash -c "curl clickhouse:8123"
|
||
```
|
||
|
||
---
|
||
|
||
## Порты сервисов
|
||
|
||
| Сервис | URL | Логин/Пароль |
|
||
|--------|-----|--------------|
|
||
| Superset | http://localhost:8088 | admin / admin |
|
||
| ClickHouse HTTP | http://localhost:9123 | default / 123456 |
|
||
| Airflow | http://localhost:8080 | admin / admin |
|
||
| Grafana | http://localhost:3000 | admin / admin |
|
||
| Prometheus | http://localhost:9090 | - |
|
||
| Kafka UI | http://localhost:8082 | - |
|
||
|
||
---
|
||
|
||
## Дополнительные ресурсы
|
||
|
||
- [Superset Documentation](https://superset.apache.org/docs/intro)
|
||
- [ClickHouse SQL Reference](https://clickhouse.com/docs/en/sql-reference)
|
||
- [ARCHITECTURE.md](./ARCHITECTURE.md) — архитектура хранилища
|