Update Contec monitor service, parser, dashboard and tunneling
This commit is contained in:
+53
-39
@@ -17,50 +17,64 @@ async def retry_failed_transmissions():
|
||||
|
||||
while True:
|
||||
try:
|
||||
# 1. Fetch untransmitted readings in a quick DB session and close it immediately
|
||||
db = SessionLocal()
|
||||
readings_to_retry = []
|
||||
try:
|
||||
# Get readings that haven't been transmitted
|
||||
failed_readings = db.query(VitalReading).filter(VitalReading.transmitted == False).limit(50).all()
|
||||
|
||||
for reading in failed_readings:
|
||||
vitals = NormalizedVitals(
|
||||
device_id=reading.device_id,
|
||||
patient_id=reading.patient_id,
|
||||
timestamp=reading.timestamp,
|
||||
heart_rate=reading.heart_rate,
|
||||
spo2=reading.spo2,
|
||||
systolic_bp=reading.systolic_bp,
|
||||
diastolic_bp=reading.diastolic_bp,
|
||||
map_bp=reading.map_bp,
|
||||
respiratory_rate=reading.respiratory_rate,
|
||||
temperature=reading.temperature
|
||||
)
|
||||
|
||||
success = await forward_vitals_to_api(vitals)
|
||||
|
||||
if success:
|
||||
reading.transmitted = True
|
||||
log_entry = TransmissionLog(
|
||||
reading_id=reading.id,
|
||||
status="success",
|
||||
response_code=200
|
||||
failed_readings = db.query(VitalReading).filter(VitalReading.transmitted == False).order_by(VitalReading.id.desc()).limit(20).all()
|
||||
for r in failed_readings:
|
||||
readings_to_retry.append({
|
||||
"id": r.id,
|
||||
"vitals": NormalizedVitals(
|
||||
device_id=r.device_id,
|
||||
patient_id=r.patient_id,
|
||||
timestamp=r.timestamp,
|
||||
heart_rate=r.heart_rate,
|
||||
spo2=r.spo2,
|
||||
systolic_bp=r.systolic_bp,
|
||||
diastolic_bp=r.diastolic_bp,
|
||||
map_bp=r.map_bp,
|
||||
respiratory_rate=r.respiratory_rate,
|
||||
temperature=r.temperature
|
||||
)
|
||||
db.add(log_entry)
|
||||
logger.info(f"Successfully re-transmitted reading {reading.id}")
|
||||
else:
|
||||
# Log the failure but don't mark as transmitted
|
||||
log_entry = TransmissionLog(
|
||||
reading_id=reading.id,
|
||||
status="failed",
|
||||
error_message="Retry failed"
|
||||
)
|
||||
db.add(log_entry)
|
||||
|
||||
if failed_readings:
|
||||
db.commit()
|
||||
})
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
|
||||
# 2. Forward outside of any DB transaction
|
||||
successful_ids = []
|
||||
failed_ids = []
|
||||
consecutive_failures = 0
|
||||
|
||||
for item in readings_to_retry:
|
||||
success = await forward_vitals_to_api(item["vitals"])
|
||||
if success:
|
||||
successful_ids.append(item["id"])
|
||||
consecutive_failures = 0
|
||||
else:
|
||||
failed_ids.append(item["id"])
|
||||
consecutive_failures += 1
|
||||
# If external API is unresponsive, stop this batch immediately so we don't spam
|
||||
if consecutive_failures >= 3:
|
||||
logger.warning("External API appears unreachable during retry; pausing retry queue.")
|
||||
break
|
||||
|
||||
# 3. Update status in a quick DB session
|
||||
if successful_ids or failed_ids:
|
||||
db = SessionLocal()
|
||||
try:
|
||||
for rid in successful_ids:
|
||||
db.query(VitalReading).filter(VitalReading.id == rid).update({"transmitted": True})
|
||||
db.add(TransmissionLog(reading_id=rid, status="success", response_code=200))
|
||||
for rid in failed_ids:
|
||||
db.add(TransmissionLog(reading_id=rid, status="failed", error_message="Retry failed"))
|
||||
db.commit()
|
||||
except Exception as e:
|
||||
logger.error(f"Failed updating retry transmission status: {e}")
|
||||
db.rollback()
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error in retry background task: {e}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user