- Dataset viewer: sed-замена (find→replace) по всем/выбранным/текущим датасетам с обязательным визуальным предпросмотром и целями (sql/metrics/yaml); сохранение и выбор именованных правил (sedRules store + SedRuleEditor). - Migration: literal-замена в dataset YAML при переносе; рескан ID чартов/датасетов перед миграцией + метрика средней длительности синка (GET /migration/sync-stats); логическая группировка опций (маппинги БД, сервер изменений, rescan) под галочками. - Fix: дашборды хаба скрывались дефолтным профиль-фильтром show_only_slug_dashboards=true (теперь false); мастер миграции не грузил дашборды предзаполненного источника; потеря терминального task_status из-за утечки pending-корутин в /ws/logs (панель результата не появлялась); горизонтальный скролл в MappingTable; чистая per-env ошибка в mapping coverage. - Backend: record_sync_duration + alembic-миграция sync-duration; literal_replace модуль.
45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
"""add ID-sync duration metrics to environments
|
|
|
|
Revision ID: u1v2w3x4y5z6
|
|
Revises: t1u2v3w4x5y6
|
|
Create Date: 2026-08-18
|
|
|
|
"""
|
|
from collections.abc import Sequence
|
|
|
|
import sqlalchemy as sa
|
|
from sqlalchemy import inspect
|
|
|
|
from alembic import op
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision: str = "u1v2w3x4y5z6"
|
|
down_revision: str | Sequence[str] | None = "t1u2v3w4x5y6"
|
|
branch_labels: str | Sequence[str] | None = None
|
|
depends_on: str | Sequence[str] | None = None
|
|
|
|
|
|
def _table_exists(table_name: str) -> bool:
|
|
conn = op.get_bind()
|
|
inspector = inspect(conn)
|
|
return table_name in inspector.get_table_names()
|
|
|
|
|
|
def upgrade() -> None:
|
|
"""Add last/avg sync duration + run count to environments for the pre-migration ID rescan reference."""
|
|
if not _table_exists("environments"):
|
|
return
|
|
op.add_column("environments", sa.Column("last_sync_duration_seconds", sa.Float(), nullable=True))
|
|
op.add_column("environments", sa.Column("sync_duration_avg_seconds", sa.Float(), nullable=True))
|
|
op.add_column(
|
|
"environments",
|
|
sa.Column("sync_run_count", sa.Integer(), nullable=False, server_default=sa.text("0")),
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
"""Remove the ID-sync duration metrics columns."""
|
|
op.drop_column("environments", "sync_run_count")
|
|
op.drop_column("environments", "sync_duration_avg_seconds")
|
|
op.drop_column("environments", "last_sync_duration_seconds")
|