|
4 | 4 | from src.models import SystemInformation, UserDashboardSettings |
5 | 5 | from src.utils import _get_system_info, get_os_release_info, get_os_info, get_cached_value |
6 | 6 | from datetime import datetime, timedelta |
| 7 | +from flask import request, jsonify |
7 | 8 | import gc |
8 | 9 |
|
| 10 | +from src.config import query_api, bucket |
9 | 11 | api_bp = blueprints.Blueprint("api", __name__) |
10 | 12 |
|
11 | 13 | @app.route("/api/system-info", methods=["GET"]) |
@@ -109,6 +111,105 @@ def graph_data_api(): |
109 | 111 | # Handle and log the error for debugging purposes |
110 | 112 | return jsonify({'error': 'An error occurred while fetching the graph data', 'details': str(e)}), 500 |
111 | 113 |
|
| 114 | +@app.route('/api/v2/graphs_data', methods=['GET']) |
| 115 | +@login_required |
| 116 | +def graph_data_api_v2(): |
| 117 | + try: |
| 118 | + current_time = datetime.now() |
| 119 | + # Get the time filter from query parameters |
| 120 | + time_filter = request.args.get('filter', default='1 day') |
| 121 | + |
| 122 | + # Determine the start time based on the filter |
| 123 | + time_deltas = { |
| 124 | + '5 minutes': '-5m', |
| 125 | + '15 minutes': '-15m', |
| 126 | + '30 minutes': '-30m', |
| 127 | + '1 hour': '-1h', |
| 128 | + '3 hours': '-3h', |
| 129 | + '6 hours': '-6h', |
| 130 | + '12 hours': '-12h', |
| 131 | + '1 day': '-1d', |
| 132 | + '2 days': '-2d', |
| 133 | + '3 days': '-3d', |
| 134 | + '1 week': '-1w', |
| 135 | + '1 month': '-30d', |
| 136 | + '3 months': '-90d', |
| 137 | + } |
| 138 | + |
| 139 | + # Get the start time for the query |
| 140 | + time_range = time_deltas.get(time_filter, '-1d') |
| 141 | + |
| 142 | + # Build the InfluxDB query |
| 143 | + flux_query = f""" |
| 144 | + from(bucket: "{bucket}") |
| 145 | + |> range(start: {time_range}) |
| 146 | + |> filter(fn: (r) => r._measurement == "system_info") |
| 147 | + |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") |
| 148 | + """ |
| 149 | + |
| 150 | + # Execute the query |
| 151 | + tables = query_api.query(flux_query) |
| 152 | + |
| 153 | + # Initialize lists for the data |
| 154 | + time_data = [] |
| 155 | + cpu_data = [] |
| 156 | + memory_data = [] |
| 157 | + battery_data = [] |
| 158 | + network_sent_data = [] |
| 159 | + network_received_data = [] |
| 160 | + dashboard_memory_usage = [] |
| 161 | + cpu_frequency = [] |
| 162 | + current_temp = [] |
| 163 | + |
| 164 | + # Parse the results |
| 165 | + for table in tables: |
| 166 | + for record in table.records: |
| 167 | + time_data.append(record.values.get("_time", None)) |
| 168 | + # Extract each field by key (handle missing fields gracefully) |
| 169 | + cpu_data.append(record.values.get("cpu_percent", None)) |
| 170 | + memory_data.append(record.values.get("memory_percent", None)) |
| 171 | + battery_data.append(record.values.get("battery_percent", None)) |
| 172 | + network_sent_data.append(record.values.get("network_sent", None)) |
| 173 | + network_received_data.append(record.values.get("network_received", None)) |
| 174 | + dashboard_memory_usage.append(record.values.get("dashboard_memory_usage", None)) |
| 175 | + cpu_frequency.append(record.values.get("cpu_frequency", None)) |
| 176 | + current_temp.append(record.values.get("current_temp", None)) |
| 177 | + |
| 178 | + # Return the data as JSON |
| 179 | + response = jsonify({ |
| 180 | + "time": time_data, |
| 181 | + "cpu": cpu_data, |
| 182 | + "memory": memory_data, |
| 183 | + "battery": battery_data, |
| 184 | + "network_sent": network_sent_data, |
| 185 | + "network_received": network_received_data, |
| 186 | + "dashboard_memory_usage": dashboard_memory_usage, |
| 187 | + "cpu_frequency": cpu_frequency, |
| 188 | + "current_temp": current_temp, |
| 189 | + "current_time": current_time |
| 190 | + }) |
| 191 | + |
| 192 | + print(time_data) |
| 193 | + # Clean up large data structures |
| 194 | + del tables |
| 195 | + del time_data |
| 196 | + del cpu_data |
| 197 | + del memory_data |
| 198 | + del battery_data |
| 199 | + del network_sent_data |
| 200 | + del network_received_data |
| 201 | + del dashboard_memory_usage |
| 202 | + del cpu_frequency |
| 203 | + del current_temp |
| 204 | + |
| 205 | + gc.collect() |
| 206 | + |
| 207 | + return response, 200 |
| 208 | + |
| 209 | + except Exception as e: |
| 210 | + # Handle and log the error for debugging purposes |
| 211 | + return jsonify({'error': 'An error occurred while fetching the graph data', 'details': str(e)}), 500 |
| 212 | + |
112 | 213 | @app.route('/api/v1/refresh-interval', methods=['GET', 'POST']) |
113 | 214 | @login_required |
114 | 215 | def manage_refresh_interval(): |
|
0 commit comments