|
6 | 6 | from src.logger import logger |
7 | 7 | from src.models import GeneralSettings, SystemInformation |
8 | 8 | from sqlalchemy.exc import SQLAlchemyError |
9 | | -from src.logger import logger |
| 9 | +from prometheus_client import Counter, Gauge |
10 | 10 |
|
11 | | -# Flag to check if logging is already scheduled |
| 11 | +# Flag to track if logging is already scheduled |
12 | 12 | is_logging_scheduled = False |
13 | 13 |
|
| 14 | +# Initialize Prometheus metrics |
| 15 | +metrics = { |
| 16 | + 'cpu_usage_metric': Gauge('cpu_usage_percentage', 'Current CPU usage percentage'), |
| 17 | + 'memory_usage_metric': Gauge('memory_usage_percentage', 'Current memory usage percentage'), |
| 18 | + 'disk_usage_metric': Gauge('disk_usage_percentage', 'Disk usage percentage'), |
| 19 | + 'network_sent_metric': Gauge('network_bytes_sent', 'Total network bytes sent'), |
| 20 | + 'network_recv_metric': Gauge('network_bytes_received', 'Total network bytes received'), |
| 21 | + 'cpu_temp_metric': Gauge('cpu_temperature', 'Current CPU temperature'), |
| 22 | + 'cpu_frequency_metric': Gauge('cpu_frequency', 'Current CPU frequency'), |
| 23 | + 'battery_percentage_metric': Gauge('battery_percentage', 'Current battery percentage'), |
| 24 | + 'dashboard_memory_usage_metric': Gauge('dashboard_memory_usage_percentage', 'Current memory usage percentage'), |
| 25 | + 'request_count': Counter('http_requests_total', 'Total HTTP requests made') |
| 26 | +} |
14 | 27 |
|
15 | 28 | def log_system_info(): |
16 | 29 | """ |
17 | 30 | Logs system information at regular intervals based on the general settings. |
18 | | - This function checks if logging is still active before each logging event. |
| 31 | + This function checks if logging is enabled and schedules the next log if active. |
19 | 32 | """ |
20 | 33 | global is_logging_scheduled |
21 | 34 | with app.app_context(): |
22 | 35 | try: |
23 | | - # Fetch the general settings to check if logging is enabled |
24 | | - general_settings = GeneralSettings.query.first() |
25 | | - is_logging_system_info = ( |
26 | | - general_settings.is_logging_system_info if general_settings else False |
27 | | - ) |
28 | | - |
29 | | - if not is_logging_system_info: |
| 36 | + if not is_logging_enabled(): |
30 | 37 | logger.info("System info logging has been stopped.") |
31 | | - is_logging_scheduled = False # Reset the flag if logging stops |
| 38 | + is_logging_scheduled = False |
32 | 39 | return |
33 | 40 |
|
34 | 41 | log_system_info_to_db() |
35 | 42 | logger.debug("System information logged successfully.") |
36 | | - |
37 | | - # Schedule the next log after 60 seconds |
38 | | - Timer(60, log_system_info).start() |
| 43 | + schedule_next_log() |
39 | 44 |
|
40 | 45 | except Exception as e: |
41 | 46 | logger.error(f"Error during system info logging: {e}", exc_info=True) |
42 | | - is_logging_scheduled = False # Reset the flag in case of an error |
| 47 | + is_logging_scheduled = False |
| 48 | + |
| 49 | + |
| 50 | +def is_logging_enabled(): |
| 51 | + """ |
| 52 | + Checks if system info logging is enabled in the general settings. |
| 53 | + """ |
| 54 | + try: |
| 55 | + general_settings = GeneralSettings.query.first() |
| 56 | + return general_settings.is_logging_system_info if general_settings else False |
| 57 | + except SQLAlchemyError as e: |
| 58 | + logger.error(f"Error fetching general settings: {e}", exc_info=True) |
| 59 | + return False |
| 60 | + |
| 61 | + |
| 62 | +def schedule_next_log(interval=60): |
| 63 | + """ |
| 64 | + Schedules the next logging event after the specified interval (in seconds). |
| 65 | + """ |
| 66 | + Timer(interval, log_system_info).start() |
43 | 67 |
|
44 | 68 |
|
45 | 69 | def log_system_info_to_db(): |
46 | 70 | """ |
47 | | - Fetches system information and logs it to the database. |
| 71 | + Fetches system information and logs it to the database and updates Prometheus metrics. |
48 | 72 | """ |
49 | 73 | with app.app_context(): |
50 | 74 | try: |
51 | 75 | system_info = _get_system_info() |
52 | | - system_log = SystemInformation( |
53 | | - cpu_percent=system_info["cpu_percent"], |
54 | | - memory_percent=system_info["memory_percent"], |
55 | | - battery_percent=system_info["battery_percent"], |
56 | | - network_sent=system_info["network_sent"], |
57 | | - network_received=system_info["network_received"], |
58 | | - dashboard_memory_usage=system_info["dashboard_memory_usage"], |
59 | | - cpu_frequency=system_info["cpu_frequency"], |
60 | | - current_temp=system_info["current_temp"], |
61 | | - timestamp=datetime.datetime.now(), |
62 | | - ) |
63 | | - db.session.add(system_log) |
64 | | - db.session.commit() |
| 76 | + |
| 77 | + # Update Prometheus metrics |
| 78 | + update_prometheus_metrics(system_info) |
| 79 | + |
| 80 | + # Store system information in the database |
| 81 | + store_system_info_in_db(system_info) |
65 | 82 | logger.info("System information logged to database.") |
66 | 83 |
|
67 | 84 | except SQLAlchemyError as db_err: |
68 | | - logger.error( |
69 | | - f"Database error while logging system info: {db_err}", exc_info=True |
70 | | - ) |
| 85 | + logger.error(f"Database error while logging system info: {db_err}", exc_info=True) |
71 | 86 | db.session.rollback() |
72 | 87 | except Exception as e: |
73 | 88 | logger.error(f"Failed to log system information: {e}", exc_info=True) |
74 | 89 |
|
| 90 | + |
| 91 | +def update_prometheus_metrics(system_info): |
| 92 | + """ |
| 93 | + Updates Prometheus metrics with the latest system information. |
| 94 | + """ |
| 95 | + metrics['cpu_usage_metric'].set(system_info['cpu_percent']) |
| 96 | + metrics['memory_usage_metric'].set(system_info['memory_percent']) |
| 97 | + metrics['disk_usage_metric'].set(system_info['disk_percent']) |
| 98 | + metrics['network_sent_metric'].set(system_info['network_sent']) |
| 99 | + metrics['network_recv_metric'].set(system_info['network_received']) |
| 100 | + metrics['cpu_temp_metric'].set(system_info['current_temp']) |
| 101 | + metrics['cpu_frequency_metric'].set(system_info['cpu_frequency']) |
| 102 | + metrics['battery_percentage_metric'].set(system_info['battery_percent']) |
| 103 | + metrics['dashboard_memory_usage_metric'].set(system_info['dashboard_memory_usage']) |
| 104 | + metrics['request_count'].inc() |
| 105 | + |
| 106 | + |
| 107 | +def store_system_info_in_db(system_info): |
| 108 | + """ |
| 109 | + Stores the collected system information into the database. |
| 110 | + """ |
| 111 | + system_log = SystemInformation( |
| 112 | + cpu_percent=system_info["cpu_percent"], |
| 113 | + memory_percent=system_info["memory_percent"], |
| 114 | + battery_percent=system_info["battery_percent"], |
| 115 | + network_sent=system_info["network_sent"], |
| 116 | + network_received=system_info["network_received"], |
| 117 | + dashboard_memory_usage=system_info["dashboard_memory_usage"], |
| 118 | + cpu_frequency=system_info["cpu_frequency"], |
| 119 | + current_temp=system_info["current_temp"], |
| 120 | + timestamp=datetime.datetime.now(), |
| 121 | + ) |
| 122 | + db.session.add(system_log) |
| 123 | + db.session.commit() |
| 124 | + |
| 125 | + |
75 | 126 | def monitor_settings(): |
76 | 127 | """ |
77 | 128 | Monitors application general settings for changes and controls system logging dynamically. |
78 | | - This function runs periodically to check for updates to logging settings. |
79 | 129 | """ |
80 | 130 | global is_logging_scheduled |
81 | 131 | with app.app_context(): |
82 | 132 | try: |
83 | | - # Fetch the general settings |
84 | | - general_settings = GeneralSettings.query.first() |
85 | | - |
86 | | - # Check if logging should be active or not |
87 | | - is_logging_system_info = ( |
88 | | - general_settings.is_logging_system_info if general_settings else False |
89 | | - ) |
90 | | - if is_logging_system_info: |
| 133 | + if is_logging_enabled(): |
91 | 134 | logger.info("System logging enabled. Starting system info logging.") |
92 | | - |
93 | | - # Schedule logging only if not already scheduled |
94 | 135 | if not is_logging_scheduled: |
95 | 136 | logger.debug("Scheduling system info logging.") |
96 | 137 | Timer(0, log_system_info).start() |
97 | 138 | is_logging_scheduled = True |
98 | 139 | else: |
99 | 140 | logger.info("System logging disabled. Stopping system info logging.") |
100 | | - is_logging_scheduled = False # Reset the flag if logging is disabled |
| 141 | + is_logging_scheduled = False |
101 | 142 |
|
102 | | - # Check settings periodically (every 10 seconds) |
| 143 | + # Recheck settings every 10 seconds |
103 | 144 | Timer(10, monitor_settings).start() |
104 | 145 |
|
105 | 146 | except SQLAlchemyError as db_err: |
106 | 147 | logger.error(f"Error fetching settings: {db_err}", exc_info=True) |
107 | | - |
|
0 commit comments