truthound-dashboard 1.4.4__py3-none-any.whl → 1.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- truthound_dashboard/api/alerts.py +75 -86
- truthound_dashboard/api/anomaly.py +7 -13
- truthound_dashboard/api/cross_alerts.py +38 -52
- truthound_dashboard/api/drift.py +49 -59
- truthound_dashboard/api/drift_monitor.py +234 -79
- truthound_dashboard/api/enterprise_sampling.py +498 -0
- truthound_dashboard/api/history.py +57 -5
- truthound_dashboard/api/lineage.py +3 -48
- truthound_dashboard/api/maintenance.py +104 -49
- truthound_dashboard/api/mask.py +1 -2
- truthound_dashboard/api/middleware.py +2 -1
- truthound_dashboard/api/model_monitoring.py +435 -311
- truthound_dashboard/api/notifications.py +227 -191
- truthound_dashboard/api/notifications_advanced.py +21 -20
- truthound_dashboard/api/observability.py +586 -0
- truthound_dashboard/api/plugins.py +2 -433
- truthound_dashboard/api/profile.py +199 -37
- truthound_dashboard/api/quality_reporter.py +701 -0
- truthound_dashboard/api/reports.py +7 -16
- truthound_dashboard/api/router.py +66 -0
- truthound_dashboard/api/rule_suggestions.py +5 -5
- truthound_dashboard/api/scan.py +17 -19
- truthound_dashboard/api/schedules.py +85 -50
- truthound_dashboard/api/schema_evolution.py +6 -6
- truthound_dashboard/api/schema_watcher.py +667 -0
- truthound_dashboard/api/sources.py +98 -27
- truthound_dashboard/api/tiering.py +1323 -0
- truthound_dashboard/api/triggers.py +14 -11
- truthound_dashboard/api/validations.py +12 -11
- truthound_dashboard/api/versioning.py +1 -6
- truthound_dashboard/core/__init__.py +129 -3
- truthound_dashboard/core/actions/__init__.py +62 -0
- truthound_dashboard/core/actions/custom.py +426 -0
- truthound_dashboard/core/actions/notifications.py +910 -0
- truthound_dashboard/core/actions/storage.py +472 -0
- truthound_dashboard/core/actions/webhook.py +281 -0
- truthound_dashboard/core/anomaly.py +262 -67
- truthound_dashboard/core/anomaly_explainer.py +4 -3
- truthound_dashboard/core/backends/__init__.py +67 -0
- truthound_dashboard/core/backends/base.py +299 -0
- truthound_dashboard/core/backends/errors.py +191 -0
- truthound_dashboard/core/backends/factory.py +423 -0
- truthound_dashboard/core/backends/mock_backend.py +451 -0
- truthound_dashboard/core/backends/truthound_backend.py +718 -0
- truthound_dashboard/core/checkpoint/__init__.py +87 -0
- truthound_dashboard/core/checkpoint/adapters.py +814 -0
- truthound_dashboard/core/checkpoint/checkpoint.py +491 -0
- truthound_dashboard/core/checkpoint/runner.py +270 -0
- truthound_dashboard/core/connections.py +645 -23
- truthound_dashboard/core/converters/__init__.py +14 -0
- truthound_dashboard/core/converters/truthound.py +620 -0
- truthound_dashboard/core/cross_alerts.py +540 -320
- truthound_dashboard/core/datasource_factory.py +1672 -0
- truthound_dashboard/core/drift_monitor.py +216 -20
- truthound_dashboard/core/enterprise_sampling.py +1291 -0
- truthound_dashboard/core/interfaces/__init__.py +225 -0
- truthound_dashboard/core/interfaces/actions.py +652 -0
- truthound_dashboard/core/interfaces/base.py +247 -0
- truthound_dashboard/core/interfaces/checkpoint.py +676 -0
- truthound_dashboard/core/interfaces/protocols.py +664 -0
- truthound_dashboard/core/interfaces/reporters.py +650 -0
- truthound_dashboard/core/interfaces/routing.py +646 -0
- truthound_dashboard/core/interfaces/triggers.py +619 -0
- truthound_dashboard/core/lineage.py +407 -71
- truthound_dashboard/core/model_monitoring.py +431 -3
- truthound_dashboard/core/notifications/base.py +4 -0
- truthound_dashboard/core/notifications/channels.py +501 -1203
- truthound_dashboard/core/notifications/deduplication/__init__.py +81 -115
- truthound_dashboard/core/notifications/deduplication/service.py +131 -348
- truthound_dashboard/core/notifications/dispatcher.py +202 -11
- truthound_dashboard/core/notifications/escalation/__init__.py +119 -106
- truthound_dashboard/core/notifications/escalation/engine.py +168 -358
- truthound_dashboard/core/notifications/routing/__init__.py +88 -128
- truthound_dashboard/core/notifications/routing/engine.py +90 -317
- truthound_dashboard/core/notifications/stats_aggregator.py +246 -1
- truthound_dashboard/core/notifications/throttling/__init__.py +67 -50
- truthound_dashboard/core/notifications/throttling/builder.py +117 -255
- truthound_dashboard/core/notifications/truthound_adapter.py +842 -0
- truthound_dashboard/core/phase5/collaboration.py +1 -1
- truthound_dashboard/core/plugins/lifecycle/__init__.py +0 -13
- truthound_dashboard/core/quality_reporter.py +1359 -0
- truthound_dashboard/core/report_history.py +0 -6
- truthound_dashboard/core/reporters/__init__.py +175 -14
- truthound_dashboard/core/reporters/adapters.py +943 -0
- truthound_dashboard/core/reporters/base.py +0 -3
- truthound_dashboard/core/reporters/builtin/__init__.py +18 -0
- truthound_dashboard/core/reporters/builtin/csv_reporter.py +111 -0
- truthound_dashboard/core/reporters/builtin/html_reporter.py +270 -0
- truthound_dashboard/core/reporters/builtin/json_reporter.py +127 -0
- truthound_dashboard/core/reporters/compat.py +266 -0
- truthound_dashboard/core/reporters/csv_reporter.py +2 -35
- truthound_dashboard/core/reporters/factory.py +526 -0
- truthound_dashboard/core/reporters/interfaces.py +745 -0
- truthound_dashboard/core/reporters/registry.py +1 -10
- truthound_dashboard/core/scheduler.py +165 -0
- truthound_dashboard/core/schema_evolution.py +3 -3
- truthound_dashboard/core/schema_watcher.py +1528 -0
- truthound_dashboard/core/services.py +595 -76
- truthound_dashboard/core/store_manager.py +810 -0
- truthound_dashboard/core/streaming_anomaly.py +169 -4
- truthound_dashboard/core/tiering.py +1309 -0
- truthound_dashboard/core/triggers/evaluators.py +178 -8
- truthound_dashboard/core/truthound_adapter.py +2620 -197
- truthound_dashboard/core/unified_alerts.py +23 -20
- truthound_dashboard/db/__init__.py +8 -0
- truthound_dashboard/db/database.py +8 -2
- truthound_dashboard/db/models.py +944 -25
- truthound_dashboard/db/repository.py +2 -0
- truthound_dashboard/main.py +15 -0
- truthound_dashboard/schemas/__init__.py +177 -16
- truthound_dashboard/schemas/base.py +44 -23
- truthound_dashboard/schemas/collaboration.py +19 -6
- truthound_dashboard/schemas/cross_alerts.py +19 -3
- truthound_dashboard/schemas/drift.py +61 -55
- truthound_dashboard/schemas/drift_monitor.py +67 -23
- truthound_dashboard/schemas/enterprise_sampling.py +653 -0
- truthound_dashboard/schemas/lineage.py +0 -33
- truthound_dashboard/schemas/mask.py +10 -8
- truthound_dashboard/schemas/model_monitoring.py +89 -10
- truthound_dashboard/schemas/notifications_advanced.py +13 -0
- truthound_dashboard/schemas/observability.py +453 -0
- truthound_dashboard/schemas/plugins.py +0 -280
- truthound_dashboard/schemas/profile.py +154 -247
- truthound_dashboard/schemas/quality_reporter.py +403 -0
- truthound_dashboard/schemas/reports.py +2 -2
- truthound_dashboard/schemas/rule_suggestion.py +8 -1
- truthound_dashboard/schemas/scan.py +4 -24
- truthound_dashboard/schemas/schedule.py +11 -3
- truthound_dashboard/schemas/schema_watcher.py +727 -0
- truthound_dashboard/schemas/source.py +17 -2
- truthound_dashboard/schemas/tiering.py +822 -0
- truthound_dashboard/schemas/triggers.py +16 -0
- truthound_dashboard/schemas/unified_alerts.py +7 -0
- truthound_dashboard/schemas/validation.py +0 -13
- truthound_dashboard/schemas/validators/base.py +41 -21
- truthound_dashboard/schemas/validators/business_rule_validators.py +244 -0
- truthound_dashboard/schemas/validators/localization_validators.py +273 -0
- truthound_dashboard/schemas/validators/ml_feature_validators.py +308 -0
- truthound_dashboard/schemas/validators/profiling_validators.py +275 -0
- truthound_dashboard/schemas/validators/referential_validators.py +312 -0
- truthound_dashboard/schemas/validators/registry.py +93 -8
- truthound_dashboard/schemas/validators/timeseries_validators.py +389 -0
- truthound_dashboard/schemas/versioning.py +1 -6
- truthound_dashboard/static/index.html +2 -2
- truthound_dashboard-1.5.1.dist-info/METADATA +312 -0
- {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.1.dist-info}/RECORD +149 -148
- truthound_dashboard/core/plugins/hooks/__init__.py +0 -63
- truthound_dashboard/core/plugins/hooks/decorators.py +0 -367
- truthound_dashboard/core/plugins/hooks/manager.py +0 -403
- truthound_dashboard/core/plugins/hooks/protocols.py +0 -265
- truthound_dashboard/core/plugins/lifecycle/hot_reload.py +0 -584
- truthound_dashboard/core/reporters/junit_reporter.py +0 -233
- truthound_dashboard/core/reporters/markdown_reporter.py +0 -207
- truthound_dashboard/core/reporters/pdf_reporter.py +0 -209
- truthound_dashboard/static/assets/_baseUniq-BcrSP13d.js +0 -1
- truthound_dashboard/static/assets/arc-DlYjKwIL.js +0 -1
- truthound_dashboard/static/assets/architectureDiagram-VXUJARFQ-Bb2drbQM.js +0 -36
- truthound_dashboard/static/assets/blockDiagram-VD42YOAC-BlsPG1CH.js +0 -122
- truthound_dashboard/static/assets/c4Diagram-YG6GDRKO-B9JdUoaC.js +0 -10
- truthound_dashboard/static/assets/channel-Q6mHF1Hd.js +0 -1
- truthound_dashboard/static/assets/chunk-4BX2VUAB-DmyoPVuJ.js +0 -1
- truthound_dashboard/static/assets/chunk-55IACEB6-Bcz6Siv8.js +0 -1
- truthound_dashboard/static/assets/chunk-B4BG7PRW-Br3G5Rum.js +0 -165
- truthound_dashboard/static/assets/chunk-DI55MBZ5-DuM9c23u.js +0 -220
- truthound_dashboard/static/assets/chunk-FMBD7UC4-DNU-5mvT.js +0 -15
- truthound_dashboard/static/assets/chunk-QN33PNHL-Im2yNcmS.js +0 -1
- truthound_dashboard/static/assets/chunk-QZHKN3VN-kZr8XFm1.js +0 -1
- truthound_dashboard/static/assets/chunk-TZMSLE5B-Q__360q_.js +0 -1
- truthound_dashboard/static/assets/classDiagram-2ON5EDUG-vtixxUyK.js +0 -1
- truthound_dashboard/static/assets/classDiagram-v2-WZHVMYZB-vtixxUyK.js +0 -1
- truthound_dashboard/static/assets/clone-BOt2LwD0.js +0 -1
- truthound_dashboard/static/assets/cose-bilkent-S5V4N54A-CBDw6iac.js +0 -1
- truthound_dashboard/static/assets/dagre-6UL2VRFP-XdKqmmY9.js +0 -4
- truthound_dashboard/static/assets/diagram-PSM6KHXK-DAZ8nx9V.js +0 -24
- truthound_dashboard/static/assets/diagram-QEK2KX5R-BRvDTbGD.js +0 -43
- truthound_dashboard/static/assets/diagram-S2PKOQOG-bQcczUkl.js +0 -24
- truthound_dashboard/static/assets/erDiagram-Q2GNP2WA-DPje7VMN.js +0 -60
- truthound_dashboard/static/assets/flowDiagram-NV44I4VS-B7BVtFVS.js +0 -162
- truthound_dashboard/static/assets/ganttDiagram-JELNMOA3-D6WKSS7U.js +0 -267
- truthound_dashboard/static/assets/gitGraphDiagram-NY62KEGX-D3vtVd3y.js +0 -65
- truthound_dashboard/static/assets/graph-BKgNKZVp.js +0 -1
- truthound_dashboard/static/assets/index-C6JSrkHo.css +0 -1
- truthound_dashboard/static/assets/index-DkU82VsU.js +0 -1800
- truthound_dashboard/static/assets/infoDiagram-WHAUD3N6-DnNCT429.js +0 -2
- truthound_dashboard/static/assets/journeyDiagram-XKPGCS4Q-DGiMozqS.js +0 -139
- truthound_dashboard/static/assets/kanban-definition-3W4ZIXB7-BV2gUgli.js +0 -89
- truthound_dashboard/static/assets/katex-Cu_Erd72.js +0 -261
- truthound_dashboard/static/assets/layout-DI2MfQ5G.js +0 -1
- truthound_dashboard/static/assets/min-DYdgXVcT.js +0 -1
- truthound_dashboard/static/assets/mindmap-definition-VGOIOE7T-C7x4ruxz.js +0 -68
- truthound_dashboard/static/assets/pieDiagram-ADFJNKIX-CAJaAB9f.js +0 -30
- truthound_dashboard/static/assets/quadrantDiagram-AYHSOK5B-DeqwDI46.js +0 -7
- truthound_dashboard/static/assets/requirementDiagram-UZGBJVZJ-e3XDpZIM.js +0 -64
- truthound_dashboard/static/assets/sankeyDiagram-TZEHDZUN-CNnAv5Ux.js +0 -10
- truthound_dashboard/static/assets/sequenceDiagram-WL72ISMW-Dsne-Of3.js +0 -145
- truthound_dashboard/static/assets/stateDiagram-FKZM4ZOC-Ee0sQXyb.js +0 -1
- truthound_dashboard/static/assets/stateDiagram-v2-4FDKWEC3-B26KqW_W.js +0 -1
- truthound_dashboard/static/assets/timeline-definition-IT6M3QCI-DZYi2yl3.js +0 -61
- truthound_dashboard/static/assets/treemap-KMMF4GRG-CY3f8In2.js +0 -128
- truthound_dashboard/static/assets/unmerged_dictionaries-Dd7xcPWG.js +0 -1
- truthound_dashboard/static/assets/xychartDiagram-PRI3JC2R-CS7fydZZ.js +0 -7
- truthound_dashboard-1.4.4.dist-info/METADATA +0 -507
- {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.1.dist-info}/WHEEL +0 -0
- {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.1.dist-info}/entry_points.txt +0 -0
- {truthound_dashboard-1.4.4.dist-info → truthound_dashboard-1.5.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -351,8 +351,6 @@ class UnifiedAlertsService:
|
|
|
351
351
|
alert.status = "acknowledged"
|
|
352
352
|
alert.acknowledged_by = actor
|
|
353
353
|
alert.acknowledged_at = now
|
|
354
|
-
if message:
|
|
355
|
-
alert.notes = message
|
|
356
354
|
await self.session.commit()
|
|
357
355
|
return await self._get_single_drift_alert(source_id)
|
|
358
356
|
|
|
@@ -408,8 +406,6 @@ class UnifiedAlertsService:
|
|
|
408
406
|
if alert:
|
|
409
407
|
alert.status = "resolved"
|
|
410
408
|
alert.resolved_at = now
|
|
411
|
-
if message:
|
|
412
|
-
alert.notes = message
|
|
413
409
|
await self.session.commit()
|
|
414
410
|
return await self._get_single_drift_alert(source_id)
|
|
415
411
|
|
|
@@ -663,6 +659,7 @@ class UnifiedAlertsService:
|
|
|
663
659
|
if severity and alert_severity != severity:
|
|
664
660
|
continue
|
|
665
661
|
|
|
662
|
+
drift_pct = (alert.drift_score or 0) * 100
|
|
666
663
|
unified.append(
|
|
667
664
|
UnifiedAlertResponse(
|
|
668
665
|
id=_generate_alert_id(AlertSource.DRIFT, alert.id),
|
|
@@ -671,18 +668,18 @@ class UnifiedAlertsService:
|
|
|
671
668
|
source_name=monitor_names.get(alert.monitor_id, "Unknown Monitor"),
|
|
672
669
|
severity=alert_severity,
|
|
673
670
|
status=_map_drift_status(alert.status),
|
|
674
|
-
title=f"Drift Alert: {
|
|
671
|
+
title=f"Drift Alert: {drift_pct:.1f}% drift detected",
|
|
675
672
|
message=alert.message,
|
|
676
673
|
details={
|
|
677
|
-
"
|
|
678
|
-
"
|
|
679
|
-
"
|
|
674
|
+
"run_id": alert.run_id,
|
|
675
|
+
"drift_score": alert.drift_score,
|
|
676
|
+
"affected_columns": alert.affected_columns,
|
|
680
677
|
},
|
|
681
678
|
acknowledged_at=alert.acknowledged_at,
|
|
682
679
|
acknowledged_by=alert.acknowledged_by,
|
|
683
680
|
resolved_at=alert.resolved_at,
|
|
684
681
|
created_at=alert.created_at,
|
|
685
|
-
updated_at=alert.updated_at
|
|
682
|
+
updated_at=alert.created_at, # DriftAlert has no updated_at
|
|
686
683
|
)
|
|
687
684
|
)
|
|
688
685
|
|
|
@@ -760,7 +757,7 @@ class UnifiedAlertsService:
|
|
|
760
757
|
"columns_analyzed": detection.columns_analyzed,
|
|
761
758
|
},
|
|
762
759
|
created_at=detection.created_at,
|
|
763
|
-
updated_at=detection.updated_at
|
|
760
|
+
updated_at=detection.created_at, # AnomalyDetection has no updated_at
|
|
764
761
|
)
|
|
765
762
|
)
|
|
766
763
|
|
|
@@ -793,10 +790,10 @@ class UnifiedAlertsService:
|
|
|
793
790
|
|
|
794
791
|
unified = []
|
|
795
792
|
for validation in validations:
|
|
796
|
-
#
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
793
|
+
# Use summary fields from model
|
|
794
|
+
critical_count = validation.critical_issues or 0
|
|
795
|
+
high_count = validation.high_issues or 0
|
|
796
|
+
total_issues = validation.total_issues or 0
|
|
800
797
|
|
|
801
798
|
if critical_count > 0:
|
|
802
799
|
alert_severity = AlertSeverity.CRITICAL
|
|
@@ -812,6 +809,12 @@ class UnifiedAlertsService:
|
|
|
812
809
|
if status and status != AlertStatus.OPEN:
|
|
813
810
|
continue
|
|
814
811
|
|
|
812
|
+
# Calculate pass rate from row_count if available
|
|
813
|
+
pass_rate = 0.0
|
|
814
|
+
if validation.row_count and validation.row_count > 0:
|
|
815
|
+
failed_rows = total_issues
|
|
816
|
+
pass_rate = ((validation.row_count - failed_rows) / validation.row_count) * 100
|
|
817
|
+
|
|
815
818
|
unified.append(
|
|
816
819
|
UnifiedAlertResponse(
|
|
817
820
|
id=_generate_alert_id(AlertSource.VALIDATION, validation.id),
|
|
@@ -820,18 +823,18 @@ class UnifiedAlertsService:
|
|
|
820
823
|
source_name=source_names.get(validation.source_id, "Unknown Source"),
|
|
821
824
|
severity=alert_severity,
|
|
822
825
|
status=AlertStatus.OPEN,
|
|
823
|
-
title=f"Validation Failed: {
|
|
826
|
+
title=f"Validation Failed: {total_issues} issues",
|
|
824
827
|
message=f"Validation failed with {critical_count} critical, "
|
|
825
|
-
f"{high_count} high severity issues.
|
|
826
|
-
f"Pass rate: {validation.pass_rate:.1f}%",
|
|
828
|
+
f"{high_count} high severity issues.",
|
|
827
829
|
details={
|
|
828
|
-
"
|
|
829
|
-
"total_issues": len(issues),
|
|
830
|
+
"total_issues": total_issues,
|
|
830
831
|
"critical_issues": critical_count,
|
|
831
832
|
"high_issues": high_count,
|
|
833
|
+
"medium_issues": validation.medium_issues or 0,
|
|
834
|
+
"low_issues": validation.low_issues or 0,
|
|
832
835
|
},
|
|
833
836
|
created_at=validation.created_at,
|
|
834
|
-
updated_at=validation.updated_at
|
|
837
|
+
updated_at=validation.created_at, # Validation has no updated_at
|
|
835
838
|
)
|
|
836
839
|
)
|
|
837
840
|
|
|
@@ -68,6 +68,10 @@ from .models import (
|
|
|
68
68
|
# Scheduler Job Models
|
|
69
69
|
SchedulerJob,
|
|
70
70
|
SchedulerJobState,
|
|
71
|
+
# Cross-Alert Models
|
|
72
|
+
CrossAlertConfig,
|
|
73
|
+
CrossAlertCorrelation,
|
|
74
|
+
CrossAlertTriggerEvent,
|
|
71
75
|
)
|
|
72
76
|
from .repository import BaseRepository
|
|
73
77
|
|
|
@@ -135,6 +139,10 @@ __all__ = [
|
|
|
135
139
|
# Scheduler Job Models
|
|
136
140
|
"SchedulerJob",
|
|
137
141
|
"SchedulerJobState",
|
|
142
|
+
# Cross-Alert Models
|
|
143
|
+
"CrossAlertConfig",
|
|
144
|
+
"CrossAlertCorrelation",
|
|
145
|
+
"CrossAlertTriggerEvent",
|
|
138
146
|
# Repository
|
|
139
147
|
"BaseRepository",
|
|
140
148
|
]
|
|
@@ -148,8 +148,14 @@ async def get_db_session() -> AsyncGenerator[AsyncSession, None]:
|
|
|
148
148
|
async def get_sources(session: AsyncSession = Depends(get_db_session)):
|
|
149
149
|
...
|
|
150
150
|
"""
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
factory = get_session_factory()
|
|
152
|
+
async with factory() as session:
|
|
153
|
+
try:
|
|
154
|
+
yield session
|
|
155
|
+
await session.commit()
|
|
156
|
+
except Exception:
|
|
157
|
+
await session.rollback()
|
|
158
|
+
raise
|
|
153
159
|
|
|
154
160
|
|
|
155
161
|
async def _run_migrations(engine: AsyncEngine) -> None:
|