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
|
@@ -1,22 +1,35 @@
|
|
|
1
1
|
"""Maintenance API endpoints.
|
|
2
2
|
|
|
3
3
|
This module provides endpoints for database maintenance, retention policies,
|
|
4
|
-
and cache management.
|
|
4
|
+
and cache management using truthound's store features.
|
|
5
|
+
|
|
6
|
+
Migrated features (using truthound):
|
|
7
|
+
- Retention policies (truthound.stores.retention)
|
|
8
|
+
- Caching (truthound.stores.caching)
|
|
9
|
+
|
|
10
|
+
Dashboard-specific features (not in truthound):
|
|
11
|
+
- SQLite VACUUM (SQLite-specific optimization)
|
|
5
12
|
"""
|
|
6
13
|
|
|
7
14
|
from __future__ import annotations
|
|
8
15
|
|
|
9
16
|
import logging
|
|
10
17
|
from datetime import datetime
|
|
11
|
-
from typing import
|
|
18
|
+
from typing import Any
|
|
12
19
|
|
|
13
|
-
from fastapi import APIRouter, HTTPException
|
|
20
|
+
from fastapi import APIRouter, HTTPException
|
|
14
21
|
|
|
15
|
-
from truthound_dashboard.core.cache import get_cache, get_cache_manager
|
|
16
22
|
from truthound_dashboard.core.maintenance import (
|
|
17
23
|
MaintenanceConfig,
|
|
18
24
|
get_maintenance_manager,
|
|
19
25
|
)
|
|
26
|
+
from truthound_dashboard.core.store_manager import (
|
|
27
|
+
CacheType,
|
|
28
|
+
DashboardStoreConfig,
|
|
29
|
+
DashboardStoreManager,
|
|
30
|
+
RetentionPolicySettings,
|
|
31
|
+
get_store_manager,
|
|
32
|
+
)
|
|
20
33
|
from truthound_dashboard.core.scheduler import get_scheduler
|
|
21
34
|
from truthound_dashboard.schemas import (
|
|
22
35
|
CacheClearRequest,
|
|
@@ -145,13 +158,16 @@ async def get_maintenance_status() -> MaintenanceStatusResponse:
|
|
|
145
158
|
"/cleanup",
|
|
146
159
|
response_model=MaintenanceReportResponse,
|
|
147
160
|
summary="Trigger cleanup",
|
|
148
|
-
description="Manually trigger database cleanup",
|
|
161
|
+
description="Manually trigger database cleanup using truthound retention policies",
|
|
149
162
|
)
|
|
150
163
|
async def trigger_cleanup(
|
|
151
164
|
request: CleanupTriggerRequest,
|
|
152
165
|
) -> MaintenanceReportResponse:
|
|
153
166
|
"""Manually trigger database cleanup.
|
|
154
167
|
|
|
168
|
+
This endpoint now uses truthound's retention system for cleanup
|
|
169
|
+
while maintaining backward compatibility with the existing API.
|
|
170
|
+
|
|
155
171
|
Args:
|
|
156
172
|
request: Cleanup options.
|
|
157
173
|
|
|
@@ -163,7 +179,7 @@ async def trigger_cleanup(
|
|
|
163
179
|
manager = get_maintenance_manager()
|
|
164
180
|
|
|
165
181
|
if request.tasks:
|
|
166
|
-
# Run specific tasks
|
|
182
|
+
# Run specific tasks (legacy behavior)
|
|
167
183
|
started_at = datetime.utcnow()
|
|
168
184
|
results = []
|
|
169
185
|
|
|
@@ -190,7 +206,7 @@ async def trigger_cleanup(
|
|
|
190
206
|
)
|
|
191
207
|
)
|
|
192
208
|
|
|
193
|
-
# Run vacuum if requested
|
|
209
|
+
# Run vacuum if requested (SQLite-specific, not in truthound)
|
|
194
210
|
vacuum_performed = False
|
|
195
211
|
vacuum_error = None
|
|
196
212
|
if request.run_vacuum:
|
|
@@ -254,11 +270,14 @@ async def trigger_cleanup(
|
|
|
254
270
|
"/vacuum",
|
|
255
271
|
response_model=MaintenanceReportResponse,
|
|
256
272
|
summary="Run database vacuum",
|
|
257
|
-
description="Run SQLite VACUUM to reclaim disk space",
|
|
273
|
+
description="Run SQLite VACUUM to reclaim disk space (SQLite-specific, not part of truthound)",
|
|
258
274
|
)
|
|
259
275
|
async def run_vacuum() -> MaintenanceReportResponse:
|
|
260
276
|
"""Run SQLite VACUUM to reclaim disk space.
|
|
261
277
|
|
|
278
|
+
Note: This is a dashboard-specific operation for SQLite.
|
|
279
|
+
truthound's store system is backend-agnostic and doesn't include VACUUM.
|
|
280
|
+
|
|
262
281
|
Returns:
|
|
263
282
|
Vacuum operation result.
|
|
264
283
|
"""
|
|
@@ -293,31 +312,50 @@ async def run_vacuum() -> MaintenanceReportResponse:
|
|
|
293
312
|
"/cache/stats",
|
|
294
313
|
response_model=CacheStatsResponse,
|
|
295
314
|
summary="Get cache statistics",
|
|
296
|
-
description="Get current cache usage statistics",
|
|
315
|
+
description="Get current cache usage statistics from truthound's caching system",
|
|
297
316
|
)
|
|
298
317
|
async def get_cache_stats() -> CacheStatsResponse:
|
|
299
|
-
"""Get cache statistics.
|
|
318
|
+
"""Get cache statistics using truthound's cache metrics.
|
|
300
319
|
|
|
301
320
|
Returns:
|
|
302
321
|
Cache usage statistics.
|
|
303
322
|
"""
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
323
|
+
try:
|
|
324
|
+
store_manager = get_store_manager()
|
|
325
|
+
if not store_manager._initialized:
|
|
326
|
+
store_manager.initialize()
|
|
327
|
+
|
|
328
|
+
stats = store_manager.get_cache_stats()
|
|
329
|
+
|
|
330
|
+
return CacheStatsResponse(
|
|
331
|
+
total_entries=stats.get("total_entries", 0),
|
|
332
|
+
expired_entries=stats.get("expired_entries", 0),
|
|
333
|
+
valid_entries=stats.get("valid_entries", 0),
|
|
334
|
+
max_size=stats.get("max_size", 0),
|
|
335
|
+
hit_rate=stats.get("hit_rate"),
|
|
336
|
+
)
|
|
337
|
+
except Exception as e:
|
|
338
|
+
logger.warning(f"Failed to get cache stats from store manager: {e}")
|
|
339
|
+
# Fallback to legacy cache
|
|
340
|
+
from truthound_dashboard.core.cache import get_cache
|
|
341
|
+
|
|
342
|
+
cache = get_cache()
|
|
343
|
+
stats = await cache.get_stats()
|
|
344
|
+
|
|
345
|
+
return CacheStatsResponse(
|
|
346
|
+
total_entries=stats.get("total_entries", 0),
|
|
347
|
+
expired_entries=stats.get("expired_entries", 0),
|
|
348
|
+
valid_entries=stats.get("valid_entries", 0),
|
|
349
|
+
max_size=stats.get("max_size", 0),
|
|
350
|
+
hit_rate=stats.get("hit_rate"),
|
|
351
|
+
)
|
|
314
352
|
|
|
315
353
|
|
|
316
354
|
@router.post(
|
|
317
355
|
"/cache/clear",
|
|
318
356
|
response_model=CacheStatsResponse,
|
|
319
357
|
summary="Clear cache",
|
|
320
|
-
description="Clear cached data",
|
|
358
|
+
description="Clear cached data using truthound's caching system",
|
|
321
359
|
)
|
|
322
360
|
async def clear_cache(request: CacheClearRequest) -> CacheStatsResponse:
|
|
323
361
|
"""Clear cache data.
|
|
@@ -328,36 +366,53 @@ async def clear_cache(request: CacheClearRequest) -> CacheStatsResponse:
|
|
|
328
366
|
Returns:
|
|
329
367
|
Updated cache statistics.
|
|
330
368
|
"""
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
369
|
+
try:
|
|
370
|
+
store_manager = get_store_manager()
|
|
371
|
+
if not store_manager._initialized:
|
|
372
|
+
store_manager.initialize()
|
|
373
|
+
|
|
374
|
+
store_manager.clear_cache(pattern=request.pattern)
|
|
375
|
+
stats = store_manager.get_cache_stats()
|
|
376
|
+
|
|
377
|
+
return CacheStatsResponse(
|
|
378
|
+
total_entries=stats.get("total_entries", 0),
|
|
379
|
+
expired_entries=stats.get("expired_entries", 0),
|
|
380
|
+
valid_entries=stats.get("valid_entries", 0),
|
|
381
|
+
max_size=stats.get("max_size", 0),
|
|
382
|
+
hit_rate=stats.get("hit_rate"),
|
|
383
|
+
)
|
|
384
|
+
except Exception as e:
|
|
385
|
+
logger.warning(f"Failed to clear cache from store manager: {e}")
|
|
386
|
+
# Fallback to legacy cache
|
|
387
|
+
from truthound_dashboard.core.cache import get_cache, get_cache_manager
|
|
388
|
+
|
|
389
|
+
if request.namespace:
|
|
390
|
+
manager = get_cache_manager()
|
|
391
|
+
cache = manager.get(request.namespace)
|
|
392
|
+
if cache:
|
|
393
|
+
if request.pattern:
|
|
394
|
+
await cache.invalidate_pattern(request.pattern)
|
|
395
|
+
else:
|
|
396
|
+
await cache.clear()
|
|
397
|
+
else:
|
|
398
|
+
raise HTTPException(
|
|
399
|
+
status_code=404,
|
|
400
|
+
detail=f"Cache namespace not found: {request.namespace}",
|
|
401
|
+
)
|
|
402
|
+
else:
|
|
403
|
+
cache = get_cache()
|
|
336
404
|
if request.pattern:
|
|
337
405
|
await cache.invalidate_pattern(request.pattern)
|
|
338
406
|
else:
|
|
339
407
|
await cache.clear()
|
|
340
|
-
|
|
341
|
-
raise HTTPException(
|
|
342
|
-
status_code=404,
|
|
343
|
-
detail=f"Cache namespace not found: {request.namespace}",
|
|
344
|
-
)
|
|
345
|
-
else:
|
|
346
|
-
# Clear default cache
|
|
408
|
+
|
|
347
409
|
cache = get_cache()
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
return CacheStatsResponse(
|
|
358
|
-
total_entries=stats.get("total_entries", 0),
|
|
359
|
-
expired_entries=stats.get("expired_entries", 0),
|
|
360
|
-
valid_entries=stats.get("valid_entries", 0),
|
|
361
|
-
max_size=stats.get("max_size", 0),
|
|
362
|
-
hit_rate=None,
|
|
363
|
-
)
|
|
410
|
+
stats = await cache.get_stats()
|
|
411
|
+
|
|
412
|
+
return CacheStatsResponse(
|
|
413
|
+
total_entries=stats.get("total_entries", 0),
|
|
414
|
+
expired_entries=stats.get("expired_entries", 0),
|
|
415
|
+
valid_entries=stats.get("valid_entries", 0),
|
|
416
|
+
max_size=stats.get("max_size", 0),
|
|
417
|
+
hit_rate=None,
|
|
418
|
+
)
|
truthound_dashboard/api/mask.py
CHANGED
|
@@ -61,7 +61,6 @@ async def run_mask(
|
|
|
61
61
|
source_id,
|
|
62
62
|
columns=request.columns,
|
|
63
63
|
strategy=request.strategy,
|
|
64
|
-
output_format=request.output_format,
|
|
65
64
|
)
|
|
66
65
|
return MaskResponse.from_db(mask)
|
|
67
66
|
except ValueError as e:
|
|
@@ -128,7 +127,7 @@ async def list_masks(
|
|
|
128
127
|
"""
|
|
129
128
|
masks = await service.list_for_source(source_id, limit=limit)
|
|
130
129
|
return MaskListResponse(
|
|
131
|
-
data=[MaskListItem.from_db(m) for m in masks],
|
|
130
|
+
data=[MaskListItem.from_db(m, source_name=None) for m in masks],
|
|
132
131
|
total=len(masks),
|
|
133
132
|
limit=limit,
|
|
134
133
|
)
|
|
@@ -955,8 +955,9 @@ def setup_middleware(app: Any) -> None:
|
|
|
955
955
|
app.add_middleware(RequestLoggingMiddleware)
|
|
956
956
|
|
|
957
957
|
# Rate limiting (general)
|
|
958
|
+
# 600 requests/minute = 10/second - reasonable for dashboard navigation
|
|
958
959
|
rate_limit_config = RateLimitConfig(
|
|
959
|
-
requests_per_minute=
|
|
960
|
+
requests_per_minute=600,
|
|
960
961
|
exclude_paths=["/health", "/docs", "/redoc", "/openapi.json", "/api/openapi.json"],
|
|
961
962
|
)
|
|
962
963
|
app.add_middleware(RateLimitMiddleware, config=rate_limit_config)
|