- Добавлен сервис superset-init в docker-compose для автоматической инициализации - Созданы Python-скрипты для инициализации подключения ClickHouse и создания датасетов - Создан скрипт для автоматического создания дашборда с 10 чартами - Создан скрипт экспорта дашборда в JSON - Добавлен экспортируемый JSON дашборда (ecommerce_analytics.zip.json) - Обновлен Makefile с командами superset-init, superset-dashboard, superset-export - Добавлена документация docs/SUPERSET_DASHBOARD.md Дашборд включает: - KPI блок (Total Events, Unique Users, Sessions, Avg/Session) - Динамика трафика (Events by Hour, Traffic by Device) - География (World Map) - Маркетинг (UTM Effectiveness Table, Top Pages) - Качество данных (DQ Summary) - Native Filters (Date Range, Country, Device, Browser)
108 lines
4.1 KiB
Python
108 lines
4.1 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
================================================================================
|
|
Экспорт дашборда Superset в JSON-формат
|
|
================================================================================
|
|
Назначение:
|
|
- Экспорт созданного дашборда в JSON для версионирования
|
|
- Формат совместимый с superset import-dashboards
|
|
|
|
Запуск:
|
|
docker compose exec superset python /app/superset_init/export_dashboard.py
|
|
================================================================================
|
|
"""
|
|
|
|
import json
|
|
import sys
|
|
import os
|
|
sys.path.insert(0, '/app')
|
|
|
|
try:
|
|
from superset.app import create_app
|
|
from superset.dashboards.data_access_layer import DashboardDAO
|
|
from superset.charts.data_access_layer import ChartDAO
|
|
except ImportError as e:
|
|
print(f"Error importing: {e}")
|
|
sys.exit(1)
|
|
|
|
|
|
def export_dashboard(slug: str, output_path: str):
|
|
"""Экспорт дашборда в JSON"""
|
|
app = create_app()
|
|
|
|
with app.app_context():
|
|
dashboard = DashboardDAO.get_by_slug(slug)
|
|
|
|
if not dashboard:
|
|
print(f"Dashboard with slug '{slug}' not found")
|
|
return False
|
|
|
|
# Собираем данные дашборда
|
|
dashboard_data = {
|
|
"dashboards": [
|
|
{
|
|
"__Dashboard__": {
|
|
"dashboard_title": dashboard.dashboard_title,
|
|
"description": dashboard.description,
|
|
"slug": dashboard.slug,
|
|
"json_metadata": dashboard.json_metadata,
|
|
"position_json": dashboard.position_json,
|
|
"published": dashboard.published,
|
|
"slices": []
|
|
}
|
|
}
|
|
],
|
|
"charts": [],
|
|
"datasets": []
|
|
}
|
|
|
|
# Добавляем чарты
|
|
for slice_obj in dashboard.slices:
|
|
chart_data = {
|
|
"__Slice__": {
|
|
"slice_name": slice_obj.slice_name,
|
|
"viz_type": slice_obj.viz_type,
|
|
"params": slice_obj.params,
|
|
"description": slice_obj.description,
|
|
"datasource_type": slice_obj.datasource_type,
|
|
"datasource_name": slice_obj.datasource.name if slice_obj.datasource else None
|
|
}
|
|
}
|
|
dashboard_data["dashboards"][0]["__Dashboard__"]["slices"].append(slice_obj.id)
|
|
dashboard_data["charts"].append(chart_data)
|
|
|
|
# Добавляем датасет
|
|
if slice_obj.datasource:
|
|
ds = slice_obj.datasource
|
|
dataset_data = {
|
|
"__SqlaTable__": {
|
|
"table_name": ds.table_name,
|
|
"schema": ds.schema,
|
|
"database": ds.database.database_name if ds.database else None,
|
|
"description": ds.description,
|
|
"columns": [
|
|
{
|
|
"column_name": col.column_name,
|
|
"type": col.type,
|
|
"description": col.description
|
|
}
|
|
for col in ds.columns
|
|
]
|
|
}
|
|
}
|
|
# Добавляем уникальные датасеты
|
|
if dataset_data not in dashboard_data["datasets"]:
|
|
dashboard_data["datasets"].append(dataset_data)
|
|
|
|
# Сохраняем в файл
|
|
with open(output_path, 'w', encoding='utf-8') as f:
|
|
json.dump(dashboard_data, f, indent=2, ensure_ascii=False)
|
|
|
|
print(f"Dashboard exported to: {output_path}")
|
|
return True
|
|
|
|
|
|
if __name__ == "__main__":
|
|
output_file = "/app/superset_init/dashboards/ecommerce_analytics.json"
|
|
export_dashboard("ecommerce-analytics", output_file)
|