fix(superset): 5-минутные бакеты вместо часовых в графике динамики

- Зачем:
  - все события стенда укладываются в ~50 минут (20:51–21:41 28.11.2022),
    поэтому часовая гранулярность давала всего 2 точки и прямую диагональ,
    которая читалась как ошибка расчёта и ничему не учила менти.
- Что:
  - time_grain_sqla переведён с PT1H на PT5M (~10 точек, реальная форма трафика).
  - чарт переименован «Events by Hour» → «Events over Time» (идемпотентно через
    previous_slice_names), т.к. «by Hour» противоречит 5-минутным бакетам.
  - синхронизированы README, SUPERSET_DASHBOARD.md и урок 6.
- Проверка:
  - python3 -m py_compile superset/create_dashboard.py.
  - make superset-dashboard (идемпотентно, чарт ID 5 переименован, 10 чартов).
  - визуально через playwright-cli: кривая ~11 точек 20:50–21:40, консоль чистая.
This commit is contained in:
2026-06-06 17:58:50 +03:00
parent 2563c79082
commit c9300e7d5d
4 changed files with 13 additions and 6 deletions
+1 -1
View File
@@ -271,7 +271,7 @@ make superset-dashboard
| Блок | Чарты | Датасет | | Блок | Чарты | Датасет |
|------|-------|---------| |------|-------|---------|
| **KPI** | Total Events, Unique Users, Avg Events/Visit, Conversion to /confirmation | `v_events_enriched` | | **KPI** | Total Events, Unique Users, Avg Events/Visit, Conversion to /confirmation | `v_events_enriched` |
| **Динамика** | Events by Hour (timeline), Traffic by Device (pie) | `v_events_enriched` | | **Динамика** | Events over Time (timeline), Traffic by Device (pie) | `v_events_enriched` |
| **География** | Geography Map по странам | `v_events_enriched` | | **География** | Geography Map по странам | `v_events_enriched` |
| **Маркетинг** | UTM Effectiveness Table, Page Funnel | `v_utm_effectiveness`, `v_top_pages_daily` | | **Маркетинг** | UTM Effectiveness Table, Page Funnel | `v_utm_effectiveness`, `v_top_pages_daily` |
| **Слои** | Rows by Layer (event) — прохождение строк STG→ODS→DDS→DM | `dq_summary` | | **Слои** | Rows by Layer (event) — прохождение строк STG→ODS→DDS→DM | `dq_summary` |
+3 -1
View File
@@ -67,7 +67,9 @@ KPI разложены в одну строку по 12-колоночной с
`user_domain_id` и `click_id` идут 1:1 и дают то же число, что `Unique Users`. `user_domain_id` и `click_id` идут 1:1 и дают то же число, что `Unique Users`.
#### Динамика трафика #### Динамика трафика
- **📅 Events by Hour** — линейный график событий по часам - **📅 Events over Time** — линейный график событий с 5-минутными бакетами
(все события стенда укладываются в ~50 минут, поэтому часовая гранулярность
давала бы всего 2 точки и прямую линию)
- **📱 Traffic by Device** — pie chart распределения по устройствам - **📱 Traffic by Device** — pie chart распределения по устройствам
#### География #### География
+1 -1
View File
@@ -118,7 +118,7 @@ http://localhost:8088/superset/dashboard/1/
- KPI сверху: `Total Events`, `Unique Users`, `Avg Events/Visit`, - KPI сверху: `Total Events`, `Unique Users`, `Avg Events/Visit`,
`Conversion to /confirmation`; `Conversion to /confirmation`;
- динамика: `Events by Hour`, `Traffic by Device`; - динамика: `Events over Time`, `Traffic by Device`;
- география: `Geography Map`; - география: `Geography Map`;
- маркетинг: `UTM Effectiveness Table`, `Page Funnel`; - маркетинг: `UTM Effectiveness Table`, `Page Funnel`;
- прохождение строк по слоям: `Rows by Layer (event)`. - прохождение строк по слоям: `Rows by Layer (event)`.
+8 -3
View File
@@ -103,12 +103,17 @@ CHARTS_CONFIG = [
}, },
# Динамика # Динамика
{ {
"slice_name": "📅 Events by Hour", "slice_name": "📅 Events over Time",
"previous_slice_names": ["📅 Events by Hour"],
# Все события стенда укладываются в ~50 минут (20:5121:41 28.11.2022),
# поэтому часовая гранулярность давала всего 2 точки и прямую линию,
# читавшуюся как ошибка. 5-минутные бакеты дают ~10 точек — реальную
# форму трафика. Поэтому и название не «by Hour», а «over Time».
"viz_type": "echarts_timeseries_line", "viz_type": "echarts_timeseries_line",
"dataset_name": "v_events_enriched", "dataset_name": "v_events_enriched",
"params": { "params": {
"granularity_sqla": "event_ts", "granularity_sqla": "event_ts",
"time_grain_sqla": "PT1H", "time_grain_sqla": "PT5M",
"metrics": [ "metrics": [
{ {
"expressionType": "SQL", "expressionType": "SQL",
@@ -283,7 +288,7 @@ DASHBOARD_ROWS = [
[("📊 Total Events", 3), ("👤 Unique Users", 3), [("📊 Total Events", 3), ("👤 Unique Users", 3),
("📈 Avg Events/Visit", 3), ("🎯 Conversion to /confirmation", 3)], ("📈 Avg Events/Visit", 3), ("🎯 Conversion to /confirmation", 3)],
# Динамика во времени + разрез по устройствам # Динамика во времени + разрез по устройствам
[("📅 Events by Hour", 8), ("📱 Traffic by Device", 4)], [("📅 Events over Time", 8), ("📱 Traffic by Device", 4)],
# География + эффективность маркетинговых каналов # География + эффективность маркетинговых каналов
[("🌍 Geography Map", 6), ("🔗 UTM Effectiveness Table", 6)], [("🌍 Geography Map", 6), ("🔗 UTM Effectiveness Table", 6)],
# Популярные страницы + прохождение строк по слоям # Популярные страницы + прохождение строк по слоям