-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcloud_run_server.py
More file actions
109 lines (89 loc) · 4.26 KB
/
cloud_run_server.py
File metadata and controls
109 lines (89 loc) · 4.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
"""
Cloud Run server - Handles HTTP requests for trading predictions
Routes:
- /weekday - Runs LSTM make_predictions_on_next_data() every 15 minutes on weekdays (Mon-Fri)
- /mlp_minute - Runs MLP make_predictions_on_next_data() every 1 minute
Schedules:
- Weekday: Every 15 minutes from 8:01 AM to 4:46 PM CST (Monday-Friday) - triggered by Cloud Scheduler
- MLP Minute: Every 1 minute - triggered by Cloud Scheduler
"""
import functions_framework
from datetime import datetime
import logging
import json
import os
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@functions_framework.http
def run_server(request):
"""
Main Cloud Run server endpoint
Handles prediction requests for both LSTM and MLP strategies
Routes:
- /weekday: LSTM strategy - Every 15 minutes from 8:01 AM to 4:46 PM CST, Monday-Friday
- /mlp_minute: MLP strategy - Every 1 minute
"""
try:
# Get the route from the request path
path = request.path.strip('/')
logger.info("=" * 80)
logger.info(f"🚀 Request received: {path}")
logger.info(f" Method: {request.method}")
logger.info(f" Execution time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
logger.info("=" * 80)
if path == 'weekday' or path == 'weekday_predict_stocks':
# Weekday prediction: LSTM make_predictions_on_next_data()
# Schedule: Every 15 minutes from 8:01 AM to 4:46 PM CST (Monday-Friday)
# Triggered by: Cloud Scheduler with schedule "1,16,31,46 8-16 * * 1-5"
logger.info("📅 Running weekday LSTM prediction (make_predictions_on_next_data)...")
import importlib
main_module = importlib.import_module('lstm_strategy_main')
main_module.make_predictions_on_next_data()
logger.info("=" * 80)
logger.info("✅ Weekday LSTM prediction completed successfully")
logger.info("=" * 80)
response_data = {
'status': 'success',
'message': 'Weekday LSTM predictions completed and saved to Firebase',
'timestamp': datetime.now().isoformat()
}
return json.dumps(response_data), 200, {'Content-Type': 'application/json'}
elif path == 'mlp_minute' or path == 'mlp_predict':
# MLP prediction: make_predictions_on_next_data()
# Schedule: Every 1 minute
# Triggered by: Cloud Scheduler with schedule "* * * * *" (every minute)
logger.info("⏱️ Running MLP prediction (make_predictions_on_next_data)...")
import importlib
mlp_module = importlib.import_module('mlp_strategy_main')
mlp_module.make_predictions_on_next_data()
logger.info("=" * 80)
logger.info("✅ MLP prediction completed successfully")
logger.info("=" * 80)
response_data = {
'status': 'success',
'message': 'MLP predictions completed and saved to Firebase',
'timestamp': datetime.now().isoformat()
}
return json.dumps(response_data), 200, {'Content-Type': 'application/json'}
elif path == '' or path == 'health':
# Health check endpoint
return json.dumps({'status': 'healthy', 'timestamp': datetime.now().isoformat()}), 200, {'Content-Type': 'application/json'}
else:
# Unknown route
response_data = {
'status': 'error',
'message': f'Unknown route: {path}. Use /weekday or /mlp_minute',
'timestamp': datetime.now().isoformat()
}
return json.dumps(response_data), 404, {'Content-Type': 'application/json'}
except Exception as e:
logger.error("=" * 80)
logger.error(f"❌ Error in Cloud Run server: {str(e)}", exc_info=True)
logger.error("=" * 80)
response_data = {
'status': 'error',
'message': str(e),
'timestamp': datetime.now().isoformat()
}
return json.dumps(response_data), 500, {'Content-Type': 'application/json'}