fix: Remove outer try-catch block from signals endpoint

- Removed the outer try-catch block that was catching HTTPException
- HTTPException now properly propagates to FastAPI error handler
- This ensures clear error messages are returned when protocol servers are disabled
This commit is contained in:
openhands 2025-11-01 16:35:56 +00:00
parent 28bf3ab246
commit ce08cf846d
1 changed files with 108 additions and 113 deletions

View File

@ -601,128 +601,123 @@ async def _generate_mock_signals(stations: Dict, pumps_by_station: Dict) -> List
@dashboard_router.get("/signals") @dashboard_router.get("/signals")
async def get_signals(): async def get_signals():
"""Get overview of all active signals across protocols""" """Get overview of all active signals across protocols"""
try: # Use default stations and pumps since we don't have db access in this context
# Use default stations and pumps since we don't have db access in this context stations = {
stations = { "STATION_001": {"name": "Main Pump Station", "location": "Downtown"},
"STATION_001": {"name": "Main Pump Station", "location": "Downtown"}, "STATION_002": {"name": "Secondary Pump Station", "location": "Industrial Area"}
"STATION_002": {"name": "Secondary Pump Station", "location": "Industrial Area"} }
}
pumps_by_station = {
pumps_by_station = { "STATION_001": [
"STATION_001": [ {"pump_id": "PUMP_001", "name": "Primary Pump"},
{"pump_id": "PUMP_001", "name": "Primary Pump"}, {"pump_id": "PUMP_002", "name": "Backup Pump"}
{"pump_id": "PUMP_002", "name": "Backup Pump"} ],
], "STATION_002": [
"STATION_002": [ {"pump_id": "PUMP_003", "name": "Industrial Pump"}
{"pump_id": "PUMP_003", "name": "Industrial Pump"} ]
] }
}
signals = []
signals = []
# Check if protocol servers are enabled before trying to connect
# Check if protocol servers are enabled before trying to connect if settings.opcua_enabled or settings.modbus_enabled:
if settings.opcua_enabled or settings.modbus_enabled: # Try to get data from protocol servers
# Try to get data from protocol servers try:
try: # Initialize protocol data collector
# Initialize protocol data collector from src.dashboard.protocol_clients import ProtocolDataCollector
from src.dashboard.protocol_clients import ProtocolDataCollector collector = ProtocolDataCollector()
collector = ProtocolDataCollector()
# Collect data from all pumps across all protocols
for station_id, station in stations.items():
pumps = pumps_by_station.get(station_id, [])
# Collect data from all pumps across all protocols for pump in pumps:
for station_id, station in stations.items(): pump_id = pump['pump_id']
pumps = pumps_by_station.get(station_id, [])
for pump in pumps: # Get signal data from protocol servers
pump_id = pump['pump_id'] pump_signals = await collector.get_signal_data(station_id, pump_id)
signals.extend(pump_signals)
# Get signal data from protocol servers
pump_signals = await collector.get_signal_data(station_id, pump_id) # Clean up connections
signals.extend(pump_signals) await collector.cleanup()
# Clean up connections # If no signals were retrieved from protocol servers, return error
await collector.cleanup() if not signals:
logger.error("no_signals_from_protocol_servers")
# If no signals were retrieved from protocol servers, return error
if not signals:
logger.error("no_signals_from_protocol_servers")
raise HTTPException(
status_code=503,
detail="No signals available from protocol servers. Please check server connectivity."
)
except HTTPException:
# Re-raise HTTP exceptions directly
raise
except Exception as e:
logger.error("failed_to_get_protocol_data", error=str(e))
raise HTTPException( raise HTTPException(
status_code=503, status_code=503,
detail=f"Unable to connect to protocol servers: {str(e)}" detail="No signals available from protocol servers. Please check server connectivity."
) )
else: except HTTPException:
# Protocol servers are disabled, return clear error # Re-raise HTTP exceptions directly
logger.error("protocol_servers_disabled_in_production") raise
except Exception as e:
logger.error("failed_to_get_protocol_data", error=str(e))
raise HTTPException( raise HTTPException(
status_code=503, status_code=503,
detail="Protocol servers are disabled in production environment. No real-time data available." detail=f"Unable to connect to protocol servers: {str(e)}"
) )
else:
# Add system status signals # Protocol servers are disabled, return clear error
signals.extend([ logger.error("protocol_servers_disabled_in_production")
{ raise HTTPException(
"name": "System_Status", status_code=503,
"protocol": "rest", detail="Protocol servers are disabled in production environment. No real-time data available."
"address": "/api/v1/dashboard/status", )
"data_type": "String",
"current_value": "Running", # Add system status signals
"quality": "Good", signals.extend([
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S") {
}, "name": "System_Status",
{ "protocol": "rest",
"name": "Database_Connection", "address": "/api/v1/dashboard/status",
"protocol": "rest", "data_type": "String",
"address": "/api/v1/dashboard/status", "current_value": "Running",
"data_type": "Boolean", "quality": "Good",
"current_value": "Connected", "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
"quality": "Good", },
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S") {
}, "name": "Database_Connection",
{ "protocol": "rest",
"name": "Health_Status", "address": "/api/v1/dashboard/status",
"protocol": "rest", "data_type": "Boolean",
"address": "/api/v1/dashboard/health", "current_value": "Connected",
"data_type": "String", "quality": "Good",
"current_value": "Healthy", "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
"quality": "Good", },
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S") {
} "name": "Health_Status",
]) "protocol": "rest",
"address": "/api/v1/dashboard/health",
# Calculate protocol statistics "data_type": "String",
protocol_counts = {} "current_value": "Healthy",
for signal in signals: "quality": "Good",
protocol = signal["protocol"] "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if protocol not in protocol_counts:
protocol_counts[protocol] = 0
protocol_counts[protocol] += 1
protocol_stats = {}
for protocol, count in protocol_counts.items():
protocol_stats[protocol] = {
"active_signals": count,
"total_signals": count,
"error_rate": "0%"
}
return {
"signals": signals,
"protocol_stats": protocol_stats,
"total_signals": len(signals),
"last_updated": datetime.now().isoformat()
} }
])
except Exception as e:
logger.error(f"Error getting signals: {str(e)}") # Calculate protocol statistics
raise HTTPException(status_code=500, detail=f"Failed to get signals: {str(e)}") protocol_counts = {}
for signal in signals:
protocol = signal["protocol"]
if protocol not in protocol_counts:
protocol_counts[protocol] = 0
protocol_counts[protocol] += 1
protocol_stats = {}
for protocol, count in protocol_counts.items():
protocol_stats[protocol] = {
"active_signals": count,
"total_signals": count,
"error_rate": "0%"
}
return {
"signals": signals,
"protocol_stats": protocol_stats,
"total_signals": len(signals),
"last_updated": datetime.now().isoformat()
}
@dashboard_router.get("/signals/export") @dashboard_router.get("/signals/export")
async def export_signals(): async def export_signals():