diff --git a/application_events.json b/application_events.json
index bf489d5..bc1c67c 100644
--- a/application_events.json
+++ b/application_events.json
@@ -1,2466 +1,5 @@
{
"events": [
- {
- "timestamp": "2025-08-16T23:10:43.623996",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.5% CPU",
- "details": {
- "duration": 10.079814672470093,
- "points_saved": 29,
- "points_rate": 2.8770370232306517,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.5,
- "cpu_max": 0.5,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1495598842357767,
- "csv_write_time_avg": 1.1641403724407328e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:10:53.686190",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.06323528289795,
- "points_saved": 30,
- "points_rate": 2.9811486223504837,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.17666353384653727,
- "csv_write_time_avg": 1.1277198791503906e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:11:03.746473",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.060283184051514,
- "points_saved": 30,
- "points_rate": 2.982023413372574,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1407540241877238,
- "csv_write_time_avg": 7.319450378417969e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:11:13.794825",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.8% CPU",
- "details": {
- "duration": 10.048351764678955,
- "points_saved": 30,
- "points_rate": 2.985564269898796,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.8,
- "cpu_max": 0.8,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.06855700016021729,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:11:23.825097",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.030272245407104,
- "points_saved": 30,
- "points_rate": 2.990945735669049,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.053484288851420085,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:11:33.855459",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.030361652374268,
- "points_saved": 30,
- "points_rate": 2.990919075475086,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.05102927684783935,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:11:43.886684",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.031224966049194,
- "points_saved": 30,
- "points_rate": 2.990661669091798,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.057368199030558266,
- "csv_write_time_avg": 6.882349650065104e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:11:53.956022",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.06933856010437,
- "points_saved": 29,
- "points_rate": 2.880030284700191,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.14132211948263235,
- "csv_write_time_avg": 6.856589481748383e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:12:04.014556",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.058533191680908,
- "points_saved": 30,
- "points_rate": 2.9825422284048377,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1752167224884033,
- "csv_write_time_avg": 4.1095415751139325e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:12:14.088376",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.07282567024231,
- "points_saved": 30,
- "points_rate": 2.978310255942147,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13535377979278565,
- "csv_write_time_avg": 5.0067901611328125e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:12:24.147956",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.060068845748901,
- "points_saved": 29,
- "points_rate": 2.8826840496478883,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13287821309319858,
- "csv_write_time_avg": 1.2422430104222791e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:12:34.220754",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.073304176330566,
- "points_saved": 30,
- "points_rate": 2.9781687790677034,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1420870860417684,
- "csv_write_time_avg": 9.11553700764974e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:12:44.271089",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.050334692001343,
- "points_saved": 30,
- "points_rate": 2.984975219171138,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1588114102681478,
- "csv_write_time_avg": 1.3057390848795573e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:12:54.334008",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.5% CPU",
- "details": {
- "duration": 10.062919616699219,
- "points_saved": 29,
- "points_rate": 2.8818674007765166,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.5,
- "cpu_max": 0.5,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1311787407973717,
- "csv_write_time_avg": 1.2595078040813578e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:13:04.392049",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.058041095733643,
- "points_saved": 30,
- "points_rate": 2.9826881511475642,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13646260102589924,
- "csv_write_time_avg": 3.449916839599609e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:13:14.433092",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.041042804718018,
- "points_saved": 30,
- "points_rate": 2.9877374873756937,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1584561030069987,
- "csv_write_time_avg": 1.4623006184895834e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:13:24.498886",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.5% CPU",
- "details": {
- "duration": 10.065793514251709,
- "points_saved": 29,
- "points_rate": 2.8810445951370043,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.5,
- "cpu_max": 0.5,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.16681985197396115,
- "csv_write_time_avg": 8.936586051151671e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:13:34.572643",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.5% CPU",
- "details": {
- "duration": 10.072757482528687,
- "points_saved": 30,
- "points_rate": 2.9783304176671925,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.5,
- "cpu_max": 0.5,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13336125214894612,
- "csv_write_time_avg": 1.6760826110839843e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:13:44.646950",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.075306177139282,
- "points_saved": 30,
- "points_rate": 2.977577005855122,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13515442212422688,
- "csv_write_time_avg": 5.451838175455729e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:13:54.709161",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.062211751937866,
- "points_saved": 30,
- "points_rate": 2.9814518656121844,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1613554875055949,
- "csv_write_time_avg": 1.1444091796875e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:14:04.751130",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.6% CPU",
- "details": {
- "duration": 10.041969060897827,
- "points_saved": 30,
- "points_rate": 2.9874619029465297,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.6,
- "cpu_max": 0.6,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.0970383882522583,
- "csv_write_time_avg": 5.849202473958334e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:14:14.795339",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 3.3% CPU",
- "details": {
- "duration": 10.044208765029907,
- "points_saved": 30,
- "points_rate": 2.9867957448722615,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 3.3,
- "cpu_max": 3.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.052556904157002766,
- "csv_write_time_avg": 3.6557515462239585e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:14:24.824750",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.02941083908081,
- "points_saved": 29,
- "points_rate": 2.8914958680322473,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.10140497108985638,
- "csv_write_time_avg": 1.5373887686893857e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:14:34.872300",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.046550989151001,
- "points_saved": 30,
- "points_rate": 2.9860994118674347,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.131866979598999,
- "csv_write_time_avg": 1.006921132405599e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:14:44.917272",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.6% CPU",
- "details": {
- "duration": 10.045971393585205,
- "points_saved": 30,
- "points_rate": 2.9862716928654924,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.6,
- "cpu_max": 0.6,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.05455433527628581,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:14:54.947153",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.029881000518799,
- "points_saved": 30,
- "points_rate": 2.991062406268653,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.05049606164296468,
- "csv_write_time_avg": 2.6543935139973957e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:15:04.977178",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.8% CPU",
- "details": {
- "duration": 10.030024528503418,
- "points_saved": 30,
- "points_rate": 2.9910196046625526,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.8,
- "cpu_max": 0.8,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.04865203698476155,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:15:15.007220",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.03004240989685,
- "points_saved": 30,
- "points_rate": 2.991014272322356,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.14151499271392823,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:15:25.080409",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.073188781738281,
- "points_saved": 29,
- "points_rate": 2.8789294659675395,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.16915046757665173,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:15:35.129968",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.5% CPU",
- "details": {
- "duration": 10.049559116363525,
- "points_saved": 30,
- "points_rate": 2.9852055849048655,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.5,
- "cpu_max": 0.5,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.12903095086415609,
- "csv_write_time_avg": 4.378954569498698e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:15:45.197608",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.067639589309692,
- "points_saved": 30,
- "points_rate": 2.9798444544891587,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.12897333304087322,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:15:55.245351",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.047743558883667,
- "points_saved": 29,
- "points_rate": 2.886220157794511,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1339695618070405,
- "csv_write_time_avg": 1.011223628603179e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:16:05.307691",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.8% CPU",
- "details": {
- "duration": 10.062339305877686,
- "points_saved": 30,
- "points_rate": 2.981414071624099,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.8,
- "cpu_max": 0.8,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.152794615427653,
- "csv_write_time_avg": 3.606478373209636e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:16:15.347687",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.03999638557434,
- "points_saved": 30,
- "points_rate": 2.9880488844701754,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.15475840568542482,
- "csv_write_time_avg": 4.204114278157552e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:16:25.383758",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.036071300506592,
- "points_saved": 30,
- "points_rate": 2.9892175037143955,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13733135064442953,
- "csv_write_time_avg": 1.8485387166341145e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:16:35.423433",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.039674520492554,
- "points_saved": 29,
- "points_rate": 2.8885398566264713,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13295227083666572,
- "csv_write_time_avg": 2.618493704960264e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:16:45.472491",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.049057960510254,
- "points_saved": 30,
- "points_rate": 2.9853544598798107,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13075623512268067,
- "csv_write_time_avg": 4.378954569498698e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:16:55.521022",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.048531532287598,
- "points_saved": 30,
- "points_rate": 2.985510858338358,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.15967687765757244,
- "csv_write_time_avg": 6.246566772460937e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:17:05.582028",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.060006380081177,
- "points_saved": 29,
- "points_rate": 2.8827019491180472,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.14668524676355824,
- "csv_write_time_avg": 7.292319988382273e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:17:15.653499",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.07246994972229,
- "points_saved": 30,
- "points_rate": 2.978415438293478,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.12842321395874023,
- "csv_write_time_avg": 3.7225087483723957e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:17:25.699632",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.045625925064087,
- "points_saved": 30,
- "points_rate": 2.98637439058419,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13115129470825196,
- "csv_write_time_avg": 8.829434712727864e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:17:35.769511",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.070386171340942,
- "points_saved": 29,
- "points_rate": 2.879730678306098,
- "variables_saved": 78,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.14351819301473684,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:17:45.835111",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.065600156784058,
- "points_saved": 29,
- "points_rate": 2.881099939227613,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.15835017171399346,
- "csv_write_time_avg": 4.1846571297481145e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:17:55.889674",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.05456256866455,
- "points_saved": 30,
- "points_rate": 2.9837200569516775,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1353708823521932,
- "csv_write_time_avg": 1.3526280721028646e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:18:05.934009",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.04433560371399,
- "points_saved": 30,
- "points_rate": 2.9867580279682424,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1348640203475952,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:18:15.992414",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.05840516090393,
- "points_saved": 29,
- "points_rate": 2.8831608526489125,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13495705867635793,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:18:26.034450",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.041033029556274,
- "points_saved": 30,
- "points_rate": 2.987740396002436,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.16204473972320557,
- "csv_write_time_avg": 3.5047531127929686e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:18:36.096809",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.062353610992432,
- "points_saved": 30,
- "points_rate": 2.9814098331057513,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.14261778195699057,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:18:46.135806",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.03900408744812,
- "points_saved": 29,
- "points_rate": 2.888732761475715,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13065999129722858,
- "csv_write_time_avg": 1.201958491884429e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:18:56.183386",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.048580646514893,
- "points_saved": 30,
- "points_rate": 2.985496266122398,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13435545762379963,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:19:06.248606",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.065220594406128,
- "points_saved": 30,
- "points_rate": 2.980560606557682,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.14284565448760986,
- "csv_write_time_avg": 4.1405359903971355e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:19:16.313708",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.065101623535156,
- "points_saved": 30,
- "points_rate": 2.980595837189682,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.161697522799174,
- "csv_write_time_avg": 4.879633585611979e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:19:26.384238",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.070529699325562,
- "points_saved": 29,
- "points_rate": 2.8796896355851245,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.14373201337353936,
- "csv_write_time_avg": 2.7746989809233567e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:19:36.444737",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.5% CPU",
- "details": {
- "duration": 10.060499429702759,
- "points_saved": 30,
- "points_rate": 2.9819593161973232,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.5,
- "cpu_max": 0.5,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1324414094289144,
- "csv_write_time_avg": 9.42548116048177e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:19:46.482863",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.03812575340271,
- "points_saved": 30,
- "points_rate": 2.988605715547112,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1363412062327067,
- "csv_write_time_avg": 4.490216573079427e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:19:56.544156",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.061293125152588,
- "points_saved": 29,
- "points_rate": 2.8823332785625597,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.15811870015900711,
- "csv_write_time_avg": 8.82970875707166e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:20:06.607830",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.063673734664917,
- "points_saved": 30,
- "points_rate": 2.981018740369457,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.15765948295593263,
- "csv_write_time_avg": 3.838539123535157e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:20:16.655080",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.047250509262085,
- "points_saved": 30,
- "points_rate": 2.9858915105525057,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13280262152353922,
- "csv_write_time_avg": 1.0053316752115885e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:20:26.706058",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.5% CPU",
- "details": {
- "duration": 10.05097770690918,
- "points_saved": 29,
- "points_rate": 2.885291445832678,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.5,
- "cpu_max": 0.5,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.12726879942006078,
- "csv_write_time_avg": 1.0186228258856412e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:20:36.766494",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.060436010360718,
- "points_saved": 30,
- "points_rate": 2.9819781139808024,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13224898179372152,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:20:46.839981",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.073486804962158,
- "points_saved": 30,
- "points_rate": 2.9781147859569463,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.161234982808431,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:20:56.896816",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.056835889816284,
- "points_saved": 30,
- "points_rate": 2.983045594924989,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.15503631432851156,
- "csv_write_time_avg": 3.973642985026042e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:21:06.964022",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.06720519065857,
- "points_saved": 29,
- "points_rate": 2.8806405999263136,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1320108380810968,
- "csv_write_time_avg": 4.464182360418912e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:21:17.037150",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.072125434875488,
- "points_saved": 30,
- "points_rate": 2.978517314341892,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13422666390736898,
- "csv_write_time_avg": 1.3009707132975261e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:21:27.098443",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.061476469039917,
- "points_saved": 30,
- "points_rate": 2.98166974720984,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13725918134053547,
- "csv_write_time_avg": 8.813540140787761e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:21:37.146005",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.047874927520752,
- "points_saved": 29,
- "points_rate": 2.8861824225707755,
- "variables_saved": 78,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13900006228479847,
- "csv_write_time_avg": 5.335643373686692e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:21:47.201834",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.055346250534058,
- "points_saved": 30,
- "points_rate": 2.983487515251565,
- "variables_saved": 79,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.16858336130777996,
- "csv_write_time_avg": 3.028710683186849e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:21:57.255970",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.055124998092651,
- "points_saved": 30,
- "points_rate": 2.9835531637538746,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1529279867808024,
- "csv_write_time_avg": 9.886423746744792e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:22:07.324758",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.5% CPU",
- "details": {
- "duration": 10.068788290023804,
- "points_saved": 29,
- "points_rate": 2.88018768144458,
- "variables_saved": 78,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.5,
- "cpu_max": 0.5,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1336704944742137,
- "csv_write_time_avg": 8.492634214203933e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:22:17.376005",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.051247119903564,
- "points_saved": 30,
- "points_rate": 2.9847042503406116,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13125402132670086,
- "csv_write_time_avg": 1.9653638203938803e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:22:27.433557",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.057551622390747,
- "points_saved": 30,
- "points_rate": 2.9828333103667233,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13685109615325927,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:22:37.485203",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.051645755767822,
- "points_saved": 29,
- "points_rate": 2.885099684632167,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.158185967083635,
- "csv_write_time_avg": 2.2674429005589977e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:22:47.544523",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.05932068824768,
- "points_saved": 30,
- "points_rate": 2.9823087393017547,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.145928692817688,
- "csv_write_time_avg": 9.210904439290364e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:22:57.586259",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.041735649108887,
- "points_saved": 30,
- "points_rate": 2.9875313440124494,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13609295686086018,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:23:07.648063",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.6% CPU",
- "details": {
- "duration": 10.061804056167603,
- "points_saved": 29,
- "points_rate": 2.882186915797055,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.6,
- "cpu_max": 0.6,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13225756842514563,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:23:17.711457",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.06339430809021,
- "points_saved": 30,
- "points_rate": 2.9811015132222596,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13507616519927979,
- "csv_write_time_avg": 2.3396809895833335e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:23:27.783843",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.072385311126709,
- "points_saved": 30,
- "points_rate": 2.97844046601948,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1592735767364502,
- "csv_write_time_avg": 2.1696090698242188e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:23:37.842202",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.058359861373901,
- "points_saved": 29,
- "points_rate": 2.8831738374529388,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13965451306310192,
- "csv_write_time_avg": 1.3565195017847521e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:23:47.901642",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.059439897537231,
- "points_saved": 30,
- "points_rate": 2.9822733974825626,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.12954200108846028,
- "csv_write_time_avg": 4.680951436360677e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:23:57.972580",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.5% CPU",
- "details": {
- "duration": 10.070937633514404,
- "points_saved": 30,
- "points_rate": 2.9788686110184015,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.5,
- "cpu_max": 0.5,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13494617144266766,
- "csv_write_time_avg": 5.53131103515625e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:24:08.029252",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.05667233467102,
- "points_saved": 29,
- "points_rate": 2.883657638921042,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.15297264888368803,
- "csv_write_time_avg": 1.0219113580111799e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:24:18.101172",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.071919679641724,
- "points_saved": 30,
- "points_rate": 2.978578161285253,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.14788151582082112,
- "csv_write_time_avg": 7.851918538411458e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:24:28.154278",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.052912950515747,
- "points_saved": 30,
- "points_rate": 2.984209666160583,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13252392609914143,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:24:38.202667",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.048582315444946,
- "points_saved": 29,
- "points_rate": 2.8859792445971415,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13080199011440935,
- "csv_write_time_avg": 4.801256903286638e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:24:48.272145",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.069477319717407,
- "points_saved": 30,
- "points_rate": 2.9793006178439785,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1584811290105184,
- "csv_write_time_avg": 7.278919219970703e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:24:58.306954",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.5% CPU",
- "details": {
- "duration": 10.034809827804565,
- "points_saved": 30,
- "points_rate": 2.9895932772812155,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.5,
- "cpu_max": 0.5,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.14619729518890381,
- "csv_write_time_avg": 4.1643778483072914e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:25:08.341731",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.03477692604065,
- "points_saved": 29,
- "points_rate": 2.8899496434986847,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13125635837686472,
- "csv_write_time_avg": 3.056690610688308e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:25:18.408931",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.06719970703125,
- "points_saved": 30,
- "points_rate": 2.9799746576048407,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13230324586232503,
- "csv_write_time_avg": 7.081826527913412e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:25:28.479744",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.070812463760376,
- "points_saved": 30,
- "points_rate": 2.9789056352657166,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1399958292643229,
- "csv_write_time_avg": 2.944469451904297e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:25:38.519396",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.5% CPU",
- "details": {
- "duration": 10.039652109146118,
- "points_saved": 29,
- "points_rate": 2.8885463046653794,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.5,
- "cpu_max": 0.5,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1625690295778472,
- "csv_write_time_avg": 1.8021156047952587e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:25:48.584197",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.064801216125488,
- "points_saved": 30,
- "points_rate": 2.980684800007277,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13829598426818848,
- "csv_write_time_avg": 5.173683166503906e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:25:58.644484",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.06028699874878,
- "points_saved": 29,
- "points_rate": 2.8826215398831856,
- "variables_saved": 78,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1308187040789374,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:26:08.696010",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.050812721252441,
- "points_saved": 30,
- "points_rate": 2.9848332500082315,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13072904745737712,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:26:18.743946",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.04814076423645,
- "points_saved": 29,
- "points_rate": 2.886106064837129,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.14816656605950718,
- "csv_write_time_avg": 9.758719082536368e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:26:28.806260",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.0% CPU",
- "details": {
- "duration": 10.062823057174683,
- "points_saved": 30,
- "points_rate": 2.9812707457486622,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.0,
- "cpu_max": 0.0,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.14972790082295737,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:26:38.849378",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.04311752319336,
- "points_saved": 29,
- "points_rate": 2.887549601309357,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.12524189620182433,
- "csv_write_time_avg": 1.285816061085668e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:26:48.924394",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.5% CPU",
- "details": {
- "duration": 10.075015783309937,
- "points_saved": 30,
- "points_rate": 2.9776628290446334,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.5,
- "cpu_max": 0.5,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.12937448819478353,
- "csv_write_time_avg": 4.15643056233724e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:26:58.982552",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.05815863609314,
- "points_saved": 30,
- "points_rate": 2.9826532952410076,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.145879062016805,
- "csv_write_time_avg": 6.699562072753907e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:27:09.037744",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.2% CPU",
- "details": {
- "duration": 10.055191278457642,
- "points_saved": 30,
- "points_rate": 2.983533497196851,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.2,
- "cpu_max": 0.2,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1595397392908732,
- "csv_write_time_avg": 5.9604644775390625e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:27:19.103965",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.066221237182617,
- "points_saved": 29,
- "points_rate": 2.8809221769217404,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13217245299240638,
- "csv_write_time_avg": 1.5275231723127694e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:27:29.168335",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.063864469528198,
- "points_saved": 30,
- "points_rate": 2.980962242768202,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13237438996632894,
- "csv_write_time_avg": 4.124641418457031e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:27:39.225265",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.057435512542725,
- "points_saved": 30,
- "points_rate": 2.9828677462148985,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13342551390329996,
- "csv_write_time_avg": 3.6160151163736978e-06
- }
- },
- {
- "timestamp": "2025-08-16T23:27:49.270344",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.045079469680786,
- "points_saved": 29,
- "points_rate": 2.8869856219187846,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.1633307933807373,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:27:59.342474",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.5% CPU",
- "details": {
- "duration": 10.072129964828491,
- "points_saved": 30,
- "points_rate": 2.9785159747500183,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.5,
- "cpu_max": 0.5,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13907296657562257,
- "csv_write_time_avg": 1.2175242106119792e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:28:09.412567",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.070093154907227,
- "points_saved": 30,
- "points_rate": 2.9791184191161917,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13324183622996014,
- "csv_write_time_avg": 2.1163622538248698e-05
- }
- },
- {
- "timestamp": "2025-08-16T23:28:19.485111",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 30 points saved, 0 lost, 0.3% CPU",
- "details": {
- "duration": 10.072543621063232,
- "points_saved": 30,
- "points_rate": 2.97839365393915,
- "variables_saved": 80,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.3,
- "cpu_max": 0.3,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13361387252807616,
- "csv_write_time_avg": 0.0
- }
- },
- {
- "timestamp": "2025-08-16T23:28:29.547893",
- "level": "info",
- "event_type": "performance_report",
- "message": "Performance report: 29 points saved, 0 lost, 0.6% CPU",
- "details": {
- "duration": 10.062782049179077,
- "points_saved": 29,
- "points_rate": 2.881906798564302,
- "variables_saved": 77,
- "udp_points_sent": 0,
- "points_lost": 0,
- "cpu_average": 0.6,
- "cpu_max": 0.6,
- "delay_average": 0.0,
- "delay_max": 0.0,
- "read_errors": 0,
- "csv_errors": 0,
- "udp_errors": 0,
- "read_time_avg": 0.13867291088761954,
- "csv_write_time_avg": 7.571845219053071e-06
- }
- },
{
"timestamp": "2025-08-16T23:28:39.608741",
"level": "info",
@@ -20956,8 +18495,2298 @@
"event_type": "plc_disconnection",
"message": "Disconnected from PLC 10.1.33.11 (manually disconnected)",
"details": {}
+ },
+ {
+ "timestamp": "2025-08-17T11:44:38.444506",
+ "level": "info",
+ "event_type": "dataset_activated",
+ "message": "Dataset activated: DAR",
+ "details": {
+ "dataset_id": "DAR",
+ "variables_count": 3,
+ "streaming_count": 3,
+ "prefix": "gateway_phoenix"
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:44:38.477432",
+ "level": "info",
+ "event_type": "dataset_activated",
+ "message": "Dataset activated: Fast",
+ "details": {
+ "dataset_id": "Fast",
+ "variables_count": 3,
+ "streaming_count": 1,
+ "prefix": "fast"
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:44:38.507737",
+ "level": "info",
+ "event_type": "csv_recording_started",
+ "message": "馃敟 CRITICAL PRIORITY: CSV recording started with MAXIMUM PRIORITY, async buffering, and performance monitoring: 2 datasets activated",
+ "details": {
+ "activated_datasets": 2,
+ "total_datasets": 3,
+ "priority": "CRITICAL",
+ "recording_protection": true,
+ "performance_monitoring": true,
+ "async_csv_buffering": true,
+ "csv_flush_interval": 5.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:44:38.538900",
+ "level": "info",
+ "event_type": "plc_connection",
+ "message": "Successfully connected to PLC 10.1.33.11 and auto-started CSV recording for 2 datasets",
+ "details": {
+ "ip": "10.1.33.11",
+ "rack": 0,
+ "slot": 2,
+ "symbols_path": "C:/Users/migue/Downloads/symSAE452.asc",
+ "auto_started_recording": true,
+ "recording_datasets": 2,
+ "dataset_names": [
+ "Fast",
+ "DAR"
+ ]
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:44:48.443166",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 159 points saved, 786 lost, 0.1% CPU",
+ "details": {
+ "duration": 217.18231582641602,
+ "points_saved": 159,
+ "points_rate": 0.7321038059428443,
+ "variables_saved": 477,
+ "udp_points_sent": 0,
+ "points_lost": 786,
+ "cpu_average": 0.05,
+ "cpu_max": 0.1,
+ "delay_average": 0.010103533344884072,
+ "delay_max": 0.02752995491027832,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.07352502241074664,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:44:58.474986",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.6% CPU",
+ "details": {
+ "duration": 10.030561923980713,
+ "points_saved": 40,
+ "points_rate": 3.9878124778203516,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.6,
+ "cpu_max": 0.6,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05362551808357239,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:45:08.509722",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.5% CPU",
+ "details": {
+ "duration": 10.035993337631226,
+ "points_saved": 40,
+ "points_rate": 3.9856542999101987,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.5,
+ "cpu_max": 0.5,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.058691871166229245,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:45:09.662016",
+ "level": "info",
+ "event_type": "plot_session_created",
+ "message": "Plot session 'Clock' created and started",
+ "details": {
+ "session_id": "Clock_1755423909662_3",
+ "variables": [
+ "AUX Blink_2.0S",
+ "M50.1",
+ "M50.2"
+ ],
+ "time_window": 10,
+ "trigger_variable": null,
+ "auto_started": true
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:45:18.540781",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.031059503555298,
+ "points_saved": 40,
+ "points_rate": 3.987614666807912,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06141417622566223,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:45:28.572052",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.03127145767212,
+ "points_saved": 40,
+ "points_rate": 3.987530411153134,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05746864676475525,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:45:38.598693",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 1.4% CPU",
+ "details": {
+ "duration": 10.025715827941895,
+ "points_saved": 40,
+ "points_rate": 3.9897400531260923,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 1.4,
+ "cpu_max": 1.4,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.057582080364227295,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:45:48.644790",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.9% CPU",
+ "details": {
+ "duration": 10.04702115058899,
+ "points_saved": 40,
+ "points_rate": 3.9812795654018376,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.9,
+ "cpu_max": 0.9,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.055578047037124635,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:45:58.670833",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.026043891906738,
+ "points_saved": 40,
+ "points_rate": 3.989609504132428,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05239493250846863,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:46:08.702623",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 41 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.031790018081665,
+ "points_saved": 41,
+ "points_rate": 4.087007396097815,
+ "variables_saved": 123,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05360426553865758,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:46:18.734278",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 39 points saved, 0 lost, 0.9% CPU",
+ "details": {
+ "duration": 10.029641389846802,
+ "points_saved": 39,
+ "points_rate": 3.8884740225588175,
+ "variables_saved": 117,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.9,
+ "cpu_max": 0.9,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.050327612803532526,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:46:28.770477",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 41 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.038211822509766,
+ "points_saved": 41,
+ "points_rate": 4.084392790761924,
+ "variables_saved": 123,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05422858494084056,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:46:38.803077",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.031599521636963,
+ "points_saved": 40,
+ "points_rate": 3.9874000067212387,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05854540467262268,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:46:48.834681",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.032604932785034,
+ "points_saved": 40,
+ "points_rate": 3.987000411955429,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.051559311151504514,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:46:58.867059",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.031375408172607,
+ "points_saved": 40,
+ "points_rate": 3.9874890902210494,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05397914052009582,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:47:08.898926",
+ "level": "info",
+ "event_type": "csv_recording_stopped",
+ "message": "馃敟 CRITICAL: CSV recording stopped (dataset threads continue for UDP streaming)",
+ "details": {
+ "recording_protection": false,
+ "performance_monitoring": false
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:47:08.927026",
+ "level": "info",
+ "event_type": "udp_streaming_stopped",
+ "message": "UDP streaming to PlotJuggler stopped (CSV recording continues)",
+ "details": {}
+ },
+ {
+ "timestamp": "2025-08-17T11:47:09.369942",
+ "level": "info",
+ "event_type": "dataset_deactivated",
+ "message": "Dataset deactivated: Fast",
+ "details": {
+ "dataset_id": "Fast"
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:47:09.830035",
+ "level": "info",
+ "event_type": "dataset_deactivated",
+ "message": "Dataset deactivated: DAR",
+ "details": {
+ "dataset_id": "DAR"
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:47:09.856751",
+ "level": "info",
+ "event_type": "plc_disconnection",
+ "message": "Disconnected from PLC 10.1.33.11 (manually disconnected)",
+ "details": {}
+ },
+ {
+ "timestamp": "2025-08-17T11:48:16.461284",
+ "level": "info",
+ "event_type": "dataset_activated",
+ "message": "Dataset activated: DAR",
+ "details": {
+ "dataset_id": "DAR",
+ "variables_count": 3,
+ "streaming_count": 3,
+ "prefix": "gateway_phoenix"
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:48:16.495469",
+ "level": "info",
+ "event_type": "dataset_activated",
+ "message": "Dataset activated: Fast",
+ "details": {
+ "dataset_id": "Fast",
+ "variables_count": 3,
+ "streaming_count": 1,
+ "prefix": "fast"
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:48:16.523144",
+ "level": "info",
+ "event_type": "csv_recording_started",
+ "message": "馃敟 CRITICAL PRIORITY: CSV recording started with MAXIMUM PRIORITY, async buffering, and performance monitoring: 2 datasets activated",
+ "details": {
+ "activated_datasets": 2,
+ "total_datasets": 3,
+ "priority": "CRITICAL",
+ "recording_protection": true,
+ "performance_monitoring": true,
+ "async_csv_buffering": true,
+ "csv_flush_interval": 5.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:48:16.550734",
+ "level": "info",
+ "event_type": "plc_connection",
+ "message": "Successfully connected to PLC 10.1.33.11 and auto-started CSV recording for 2 datasets",
+ "details": {
+ "ip": "10.1.33.11",
+ "rack": 0,
+ "slot": 2,
+ "symbols_path": "C:/Users/migue/Downloads/symSAE452.asc",
+ "auto_started_recording": true,
+ "recording_datasets": 2,
+ "dataset_names": [
+ "Fast",
+ "DAR"
+ ]
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:48:24.788784",
+ "level": "info",
+ "event_type": "plot_session_created",
+ "message": "Plot session 'Clock' created and started",
+ "details": {
+ "session_id": "Clock_1755424104787_4",
+ "variables": [
+ "AUX Blink_2.0S",
+ "M50.1",
+ "M50.2"
+ ],
+ "time_window": 10,
+ "trigger_variable": null,
+ "auto_started": true
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:48:26.462730",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 82 points saved, 267 lost, 0.2% CPU",
+ "details": {
+ "duration": 87.59567999839783,
+ "points_saved": 82,
+ "points_rate": 0.9361192241615092,
+ "variables_saved": 246,
+ "udp_points_sent": 0,
+ "points_lost": 267,
+ "cpu_average": 0.2,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.0589886147801469,
+ "csv_write_time_avg": 1.0588589836569394e-06
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:48:36.494577",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 1.1% CPU",
+ "details": {
+ "duration": 10.032840251922607,
+ "points_saved": 40,
+ "points_rate": 3.986906897310036,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 1.1,
+ "cpu_max": 1.1,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.054489463567733765,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:48:46.526492",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.031915426254272,
+ "points_saved": 40,
+ "points_rate": 3.9872744436538023,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.054218947887420654,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:48:56.573318",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.045141696929932,
+ "points_saved": 40,
+ "points_rate": 3.9820244658395496,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.044889640808105466,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:49:06.602242",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.03060793876648,
+ "points_saved": 40,
+ "points_rate": 3.987794183980341,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05647929310798645,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:49:16.632663",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 41 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.029419660568237,
+ "points_saved": 41,
+ "points_rate": 4.087973321247689,
+ "variables_saved": 123,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06024240284431272,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:49:26.669230",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.035572052001953,
+ "points_saved": 40,
+ "points_rate": 3.9858216146254035,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05603350400924682,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:49:36.725951",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.058717489242554,
+ "points_saved": 40,
+ "points_rate": 3.9766501090003374,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.04997180700302124,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:49:46.758419",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.032468318939209,
+ "points_saved": 40,
+ "points_rate": 3.9870547036254615,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.04948654770851135,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:49:56.787103",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.028683185577393,
+ "points_saved": 40,
+ "points_rate": 3.988559540650903,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.043788307905197145,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:50:06.814021",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.025397062301636,
+ "points_saved": 40,
+ "points_rate": 3.9898669101507664,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.056126219034194944,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:50:16.846563",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.03406310081482,
+ "points_saved": 40,
+ "points_rate": 3.986421013911283,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.057128846645355225,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:50:26.874188",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.02662706375122,
+ "points_saved": 40,
+ "points_rate": 3.9893774592066022,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.057685816287994386,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:50:36.906037",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 41 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.032846927642822,
+ "points_saved": 41,
+ "points_rate": 4.08657685058819,
+ "variables_saved": 123,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05049483950545148,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:50:46.944927",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.038890361785889,
+ "points_saved": 40,
+ "points_rate": 3.984504119326204,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.04996376633644104,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:50:56.975549",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.5% CPU",
+ "details": {
+ "duration": 10.02962875366211,
+ "points_saved": 40,
+ "points_rate": 3.9881835093242946,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.5,
+ "cpu_max": 0.5,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.046877598762512206,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:51:07.007289",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.032732963562012,
+ "points_saved": 40,
+ "points_rate": 3.986949532622509,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05184122323989868,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:51:17.040487",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 39 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.032196998596191,
+ "points_saved": 39,
+ "points_rate": 3.8874834700173135,
+ "variables_saved": 117,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05754338166652582,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:51:27.074685",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 41 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.035199642181396,
+ "points_saved": 41,
+ "points_rate": 4.085618768127232,
+ "variables_saved": 123,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.0582186477940257,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:51:37.114080",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.039394617080688,
+ "points_saved": 40,
+ "points_rate": 3.9843039870098687,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05256502032279968,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:51:47.145345",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.031264543533325,
+ "points_saved": 40,
+ "points_rate": 3.987533159594129,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05184995532035828,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:51:57.176101",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.029216289520264,
+ "points_saved": 40,
+ "points_rate": 3.988347528390312,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05822017192840576,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:52:07.213742",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.038188219070435,
+ "points_saved": 40,
+ "points_rate": 3.984782824056682,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05464252233505249,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:52:17.246804",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.033055782318115,
+ "points_saved": 40,
+ "points_rate": 3.9868212504603546,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06277742981910706,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:52:27.282874",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.03606915473938,
+ "points_saved": 40,
+ "points_rate": 3.9856241904342213,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06410343050956727,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:52:37.317902",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.035037517547607,
+ "points_saved": 40,
+ "points_rate": 3.9860339266350167,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05867310166358948,
+ "csv_write_time_avg": 1.6689300537109375e-06
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:52:47.350980",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.034068584442139,
+ "points_saved": 40,
+ "points_rate": 3.986418835328687,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.054804164171218875,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:52:57.396594",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.5% CPU",
+ "details": {
+ "duration": 10.045613765716553,
+ "points_saved": 40,
+ "points_rate": 3.9818373404431604,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.5,
+ "cpu_max": 0.5,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05058804154396057,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:53:07.436012",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.038421869277954,
+ "points_saved": 40,
+ "points_rate": 3.9846900758791413,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06493547558784485,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:53:17.470256",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.034239292144775,
+ "points_saved": 40,
+ "points_rate": 3.9863510162961413,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05540837645530701,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:53:27.504951",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.035695552825928,
+ "points_saved": 40,
+ "points_rate": 3.9857725644872213,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06719018816947937,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:53:37.534904",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.029953479766846,
+ "points_saved": 40,
+ "points_rate": 3.9880543893539406,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06676023006439209,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:53:47.566919",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.031022787094116,
+ "points_saved": 40,
+ "points_rate": 3.9876292626374927,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05666109323501587,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:53:57.595060",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.028135776519775,
+ "points_saved": 40,
+ "points_rate": 3.9887772654272777,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05307635068893433,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:54:07.635115",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.04006314277649,
+ "points_saved": 40,
+ "points_rate": 3.9840386889178827,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06067319512367249,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:54:17.669720",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.035594463348389,
+ "points_saved": 40,
+ "points_rate": 3.9858127135454167,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06120737195014954,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:54:27.699494",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.029774188995361,
+ "points_saved": 40,
+ "points_rate": 3.9881256792289386,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.061375600099563596,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:54:37.731169",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.030691385269165,
+ "points_saved": 40,
+ "points_rate": 3.987761009050986,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05804708003997803,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:54:47.763244",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.033058404922485,
+ "points_saved": 40,
+ "points_rate": 3.986820208320021,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05338407754898071,
+ "csv_write_time_avg": 1.5556812286376954e-06
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:54:57.790133",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.026888608932495,
+ "points_saved": 40,
+ "points_rate": 3.9892733987655786,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.048776018619537356,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:55:07.827327",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.035198211669922,
+ "points_saved": 40,
+ "points_rate": 3.9859700980777877,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05443235039710999,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:55:17.859693",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.033368349075317,
+ "points_saved": 40,
+ "points_rate": 3.9866970501174146,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05625796318054199,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:55:27.887916",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.028214454650879,
+ "points_saved": 40,
+ "points_rate": 3.988745970769385,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.061816084384918216,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:55:37.930191",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.041287899017334,
+ "points_saved": 40,
+ "points_rate": 3.9835527476425114,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06068907976150513,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:55:47.963494",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.035291910171509,
+ "points_saved": 40,
+ "points_rate": 3.9859328814797155,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.058468747138977054,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:55:58.000161",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.035674095153809,
+ "points_saved": 40,
+ "points_rate": 3.9857810866253476,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.04989212155342102,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:56:08.035461",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.035292148590088,
+ "points_saved": 40,
+ "points_rate": 3.9859327867818792,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.052482783794403076,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:56:18.070310",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.034848690032959,
+ "points_saved": 40,
+ "points_rate": 3.98610893253724,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.0669166624546051,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:56:28.102941",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.033632040023804,
+ "points_saved": 40,
+ "points_rate": 3.9865922768984765,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06309733986854553,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:56:38.131118",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.028177499771118,
+ "points_saved": 40,
+ "points_rate": 3.988760669714208,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06416801810264587,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:56:48.161015",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.029897212982178,
+ "points_saved": 40,
+ "points_rate": 3.9880767619658233,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.057724982500076294,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:56:58.194842",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.032370567321777,
+ "points_saved": 40,
+ "points_rate": 3.9870935519757547,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05876151919364929,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:57:08.228367",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.5% CPU",
+ "details": {
+ "duration": 10.034466981887817,
+ "points_saved": 40,
+ "points_rate": 3.9862605629377104,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.5,
+ "cpu_max": 0.5,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06143256425857544,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:57:18.263792",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.035939693450928,
+ "points_saved": 40,
+ "points_rate": 3.985675604059526,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06214610934257507,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:57:28.292443",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.027656555175781,
+ "points_saved": 40,
+ "points_rate": 3.988967888948488,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06685451269149781,
+ "csv_write_time_avg": 4.1961669921875e-06
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:57:38.328093",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.034634351730347,
+ "points_saved": 40,
+ "points_rate": 3.9861940752332945,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06682798862457276,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:57:48.356833",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.030749082565308,
+ "points_saved": 40,
+ "points_rate": 3.9877380712797397,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05809829235076904,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:57:58.383690",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.02586841583252,
+ "points_saved": 40,
+ "points_rate": 3.9896793316011734,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05802654027938843,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:58:08.415797",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.032095670700073,
+ "points_saved": 40,
+ "points_rate": 3.987202805175069,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05983633995056152,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:58:18.470995",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.056198358535767,
+ "points_saved": 40,
+ "points_rate": 3.977646280818212,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05343431830406189,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:58:28.503210",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.030220985412598,
+ "points_saved": 40,
+ "points_rate": 3.9879480280817146,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06310295462608337,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:58:38.535761",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 41 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.034545421600342,
+ "points_saved": 41,
+ "points_rate": 4.085885137531341,
+ "variables_saved": 123,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06631027779928068,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:58:48.565895",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.030133962631226,
+ "points_saved": 40,
+ "points_rate": 3.987982628051233,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05272157192230224,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:58:58.590847",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 39 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.024951934814453,
+ "points_saved": 39,
+ "points_rate": 3.890292966349452,
+ "variables_saved": 117,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05874959016457582,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:59:08.621419",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 41 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.02958369255066,
+ "points_saved": 41,
+ "points_rate": 4.087906463201679,
+ "variables_saved": 123,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06672422478838665,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:59:18.658610",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.037182331085205,
+ "points_saved": 40,
+ "points_rate": 3.9851821637353138,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05756016373634339,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:59:28.691634",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.03402042388916,
+ "points_saved": 40,
+ "points_rate": 3.9864379690485126,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.057320022583007814,
+ "csv_write_time_avg": 5.316734313964844e-06
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:59:38.721239",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.028605222702026,
+ "points_saved": 40,
+ "points_rate": 3.988590547910981,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.06629549264907837,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:59:48.762228",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 40 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.041988849639893,
+ "points_saved": 40,
+ "points_rate": 3.983274687805933,
+ "variables_saved": 120,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.05378082990646362,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T11:59:58.798744",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 12 points saved, 11 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.034538507461548,
+ "points_saved": 12,
+ "points_rate": 1.1958696447352273,
+ "variables_saved": 36,
+ "udp_points_sent": 0,
+ "points_lost": 11,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 2,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.04289235671361288,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T12:00:08.830422",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.033655166625977,
+ "points_saved": 0,
+ "points_rate": 0.0,
+ "variables_saved": 0,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.0,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T12:00:18.860453",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.02803921699524,
+ "points_saved": 0,
+ "points_rate": 0.0,
+ "variables_saved": 0,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.0,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T12:00:28.887984",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 0 points saved, 0 lost, 0.0% CPU",
+ "details": {
+ "duration": 10.029523849487305,
+ "points_saved": 0,
+ "points_rate": 0.0,
+ "variables_saved": 0,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.0,
+ "cpu_max": 0.0,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.0,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T12:00:38.918362",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 0 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.030377626419067,
+ "points_saved": 0,
+ "points_rate": 0.0,
+ "variables_saved": 0,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.0,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T12:00:48.949343",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 0 points saved, 0 lost, 0.3% CPU",
+ "details": {
+ "duration": 10.030980825424194,
+ "points_saved": 0,
+ "points_rate": 0.0,
+ "variables_saved": 0,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.3,
+ "cpu_max": 0.3,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.0,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T12:00:58.981665",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 0 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.03232216835022,
+ "points_saved": 0,
+ "points_rate": 0.0,
+ "variables_saved": 0,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.0,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T12:01:09.010233",
+ "level": "info",
+ "event_type": "performance_report",
+ "message": "Performance report: 0 points saved, 0 lost, 0.2% CPU",
+ "details": {
+ "duration": 10.027637481689453,
+ "points_saved": 0,
+ "points_rate": 0.0,
+ "variables_saved": 0,
+ "udp_points_sent": 0,
+ "points_lost": 0,
+ "cpu_average": 0.2,
+ "cpu_max": 0.2,
+ "delay_average": 0.0,
+ "delay_max": 0.0,
+ "read_errors": 0,
+ "csv_errors": 0,
+ "udp_errors": 0,
+ "read_time_avg": 0.0,
+ "csv_write_time_avg": 0.0
+ }
+ },
+ {
+ "timestamp": "2025-08-17T12:12:52.623369",
+ "level": "info",
+ "event_type": "application_started",
+ "message": "Application initialization completed successfully",
+ "details": {}
}
],
- "last_updated": "2025-08-17T11:41:21.786104",
+ "last_updated": "2025-08-17T12:12:52.623369",
"total_entries": 1000
}
\ No newline at end of file
diff --git a/core/streamer.py b/core/streamer.py
index 276df36..a987181 100644
--- a/core/streamer.py
+++ b/core/streamer.py
@@ -58,7 +58,9 @@ class DataStreamer:
self.recording_protector = RecordingProtector(logger)
# 馃搳 PERFORMANCE MONITORING - Real-time performance tracking
- self.performance_monitor = PerformanceMonitor(logger, event_logger, report_interval=10.0)
+ self.performance_monitor = PerformanceMonitor(
+ logger, event_logger, report_interval=10.0
+ )
# UDP streaming setup
self.udp_socket = None
@@ -380,16 +382,15 @@ class DataStreamer:
return
timestamp = datetime.now()
-
+
with self.csv_buffer_lock:
if dataset_id not in self.csv_buffer:
self.csv_buffer[dataset_id] = []
-
+
# Add data to buffer with timestamp
- self.csv_buffer[dataset_id].append({
- 'timestamp': timestamp,
- 'data': data.copy()
- })
+ self.csv_buffer[dataset_id].append(
+ {"timestamp": timestamp, "data": data.copy()}
+ )
def _csv_flush_loop(self):
"""馃毃 Background thread to flush CSV buffers every flush_interval seconds"""
@@ -406,22 +407,46 @@ class DataStreamer:
flush_start_time = time.time()
total_points_written = 0
datasets_flushed = 0
-
+
with self.csv_buffer_lock:
for dataset_id, buffer_data in self.csv_buffer.items():
if not buffer_data:
continue
-
+
try:
self.setup_dataset_csv_file(dataset_id)
-
+
if dataset_id in self.dataset_csv_writers:
- dataset_variables = self.config_manager.get_dataset_variables(dataset_id)
-
+ dataset_variables = self.config_manager.get_dataset_variables(
+ dataset_id
+ )
+
for entry in buffer_data:
- timestamp_str = entry['timestamp'].strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
- data = entry['data']
-
+ timestamp_str = entry["timestamp"].strftime(
+ "%Y-%m-%d %H:%M:%S.%f"
+ )[:-3]
+ data = entry["data"]
+
+ # 馃毃 CRITICAL VALIDATION: Check if buffered data matches current dataset variables
+ current_vars = set(dataset_variables.keys())
+ buffered_vars = set(data.keys())
+
+ if current_vars != buffered_vars:
+ # Data inconsistency detected - skip this entry to prevent CSV corruption
+ missing_vars = current_vars - buffered_vars
+ extra_vars = buffered_vars - current_vars
+
+ if self.logger:
+ dataset_name = self.config_manager.datasets.get(
+ dataset_id, {}
+ ).get("name", dataset_id)
+ self.logger.warning(
+ f"馃毃 SKIPPING inconsistent buffered data for dataset '{dataset_name}': "
+ f"Missing vars: {missing_vars}, Extra vars: {extra_vars}. "
+ f"This prevents CSV corruption during variable modifications."
+ )
+ continue # Skip this entry
+
# Create row with all variables for this dataset
row = [timestamp_str]
for var_name in dataset_variables.keys():
@@ -430,26 +455,30 @@ class DataStreamer:
if isinstance(value, bool):
value = 1 if value else 0
row.append(value)
-
+
self.dataset_csv_writers[dataset_id].writerow(row)
total_points_written += 1
-
+
# Flush file to disk
self.dataset_csv_files[dataset_id].flush()
datasets_flushed += 1
-
+
except Exception as e:
if self.logger:
- self.logger.error(f"Error flushing CSV buffer for dataset {dataset_id}: {e}")
-
+ self.logger.error(
+ f"Error flushing CSV buffer for dataset {dataset_id}: {e}"
+ )
+
# Clear all buffers after successful flush
self.csv_buffer.clear()
-
+
flush_time = time.time() - flush_start_time
-
+
if total_points_written > 0 and self.logger:
# 馃毃 FIX: Avoid division by zero when flush_time is 0
- throughput = total_points_written / max(flush_time, 0.001) # Minimum 1ms to avoid division by zero
+ throughput = total_points_written / max(
+ flush_time, 0.001
+ ) # Minimum 1ms to avoid division by zero
self.logger.debug(
f"馃摑 CSV Batch Flush: {total_points_written} points written across {datasets_flushed} datasets "
f"in {flush_time:.3f}s ({throughput:.1f} points/sec)"
@@ -459,31 +488,31 @@ class DataStreamer:
"""馃毃 Start the asynchronous CSV flush thread"""
if self.csv_flush_active:
return
-
+
self.csv_flush_active = True
self.csv_flush_thread = threading.Thread(
- target=self._csv_flush_loop,
- name="csv_flush_thread",
- daemon=True
+ target=self._csv_flush_loop, name="csv_flush_thread", daemon=True
)
self.csv_flush_thread.start()
-
+
if self.logger:
- self.logger.info(f"馃摑 CSV async flush thread started (interval: {self.csv_flush_interval}s)")
+ self.logger.info(
+ f"馃摑 CSV async flush thread started (interval: {self.csv_flush_interval}s)"
+ )
def stop_csv_flush_thread(self):
"""馃毃 Stop the asynchronous CSV flush thread and flush remaining data"""
if not self.csv_flush_active:
return
-
+
self.csv_flush_active = False
-
+
# Final flush of any remaining data
self._flush_csv_buffers()
-
+
if self.csv_flush_thread and self.csv_flush_thread.is_alive():
self.csv_flush_thread.join(timeout=5.0)
-
+
if self.logger:
self.logger.info("馃摑 CSV async flush thread stopped, final flush completed")
@@ -493,6 +522,17 @@ class DataStreamer:
return
try:
+ # 馃毃 CRITICAL FIX: Clear CSV buffer for this dataset to prevent writing old data with new headers
+ with self.csv_buffer_lock:
+ if dataset_id in self.csv_buffer:
+ old_buffer_size = len(self.csv_buffer[dataset_id])
+ self.csv_buffer[dataset_id].clear()
+ if self.logger and old_buffer_size > 0:
+ self.logger.info(
+ f"馃毃 CRITICAL: Cleared {old_buffer_size} buffered entries for dataset '{self.config_manager.datasets[dataset_id]['name']}' "
+ f"to prevent data corruption during variable modification"
+ )
+
# Close current file if open
if dataset_id in self.dataset_csv_files:
self.dataset_csv_files[dataset_id].close()
@@ -543,6 +583,7 @@ class DataStreamer:
"file_path": csv_path,
"variables_count": len(dataset_variables),
"reason": "variable_modification",
+ "buffer_cleared": True,
},
)
@@ -576,7 +617,7 @@ class DataStreamer:
Called by: dataset_streaming_loop() at configured intervals
Updates: self.last_read_values cache for use by all other functions
-
+
馃毃 CRITICAL FIX: Returns None if ANY variable fails - prevents corrupt CSV data
馃殌 PERFORMANCE FIX: Uses batch reading to reduce snap7 calls and improve timing
"""
@@ -588,11 +629,11 @@ class DataStreamer:
try:
# 馃殌 NEW: Use batch reading for improved performance
batch_results = self.plc_client.read_variables_batch(variables)
-
+
for var_name, value in batch_results.items():
if value is not None:
data[var_name] = value
-
+
# Clear any previous error for this variable
if (
dataset_id in self.last_read_errors
@@ -603,7 +644,7 @@ class DataStreamer:
# Variable read failed
var_config = variables.get(var_name, {})
error_msg = f"Batch read failed for variable {var_name}"
-
+
if self.logger:
self.logger.warning(
f"Error reading variable {var_name} in dataset {dataset_id}: {error_msg}"
@@ -611,12 +652,14 @@ class DataStreamer:
data[var_name] = None
errors[var_name] = error_msg
failed_variables.append(var_name)
-
+
except Exception as e:
# Fall back to individual reads if batch reading fails completely
if self.logger:
- self.logger.warning(f"Batch reading failed for dataset {dataset_id}, falling back to individual reads: {e}")
-
+ self.logger.warning(
+ f"Batch reading failed for dataset {dataset_id}, falling back to individual reads: {e}"
+ )
+
for var_name, var_config in variables.items():
try:
value = self.plc_client.read_variable(var_config)
@@ -642,7 +685,9 @@ class DataStreamer:
# This ensures that incomplete data is never written to CSV
if failed_variables:
if self.logger:
- dataset_name = self.config_manager.datasets.get(dataset_id, {}).get('name', dataset_id)
+ dataset_name = self.config_manager.datasets.get(dataset_id, {}).get(
+ "name", dataset_id
+ )
self.logger.warning(
f"馃毃 CRITICAL: Dataset '{dataset_name}' read failed - {len(failed_variables)} variables failed: {failed_variables}. "
f"Skipping CSV write to prevent data corruption."
@@ -769,7 +814,7 @@ class DataStreamer:
"""馃攽 HIGH PRIORITY: Streaming loop for CSV recording - CRITICAL PRIORITY THREAD with performance monitoring"""
dataset_info = self.config_manager.datasets[dataset_id]
interval = self.config_manager.get_dataset_sampling_interval(dataset_id)
-
+
# 馃搳 Register dataset with performance monitor
self.performance_monitor.set_dataset_interval(dataset_id, interval)
@@ -790,19 +835,23 @@ class DataStreamer:
read_time = 0.0
csv_write_time = 0.0
variables_count = 0
-
+
try:
# 馃搵 CRITICAL SECTION: PLC READ with timing and error tracking
- dataset_variables = self.config_manager.get_dataset_variables(dataset_id)
+ dataset_variables = self.config_manager.get_dataset_variables(
+ dataset_id
+ )
variables_count = len(dataset_variables)
-
+
# Measure read operation time
read_start = time.time()
-
+
# Ensure entire dataset read is atomic w.r.t. other datasets
with self.plc_client.io_lock:
- all_data = self.read_dataset_variables(dataset_id, dataset_variables)
-
+ all_data = self.read_dataset_variables(
+ dataset_id, dataset_variables
+ )
+
read_time = time.time() - read_start
# 馃毃 CRITICAL FIX: Proper validation - all_data is None if ANY variable failed
read_success = all_data is not None
@@ -817,24 +866,33 @@ class DataStreamer:
# 馃毃 NEW: Use async buffering instead of immediate write
self.buffer_dataset_csv_data(dataset_id, all_data)
csv_write_time = time.time() - csv_start
-
+
# 馃搳 Record successful CSV buffer operation (much faster)
- self.performance_monitor.record_csv_write(dataset_id, csv_write_time, success=True)
-
+ self.performance_monitor.record_csv_write(
+ dataset_id, csv_write_time, success=True
+ )
+
except Exception as csv_error:
csv_write_time = time.time() - csv_start
-
+
# 馃搳 Record CSV buffer error
- self.performance_monitor.record_csv_write(dataset_id, csv_write_time, success=False)
-
+ self.performance_monitor.record_csv_write(
+ dataset_id, csv_write_time, success=False
+ )
+
if self.logger:
- self.logger.error(f"馃毃 CSV BUFFER ERROR for dataset '{dataset_info['name']}': {csv_error}")
+ self.logger.error(
+ f"馃毃 CSV BUFFER ERROR for dataset '{dataset_info['name']}': {csv_error}"
+ )
# 馃摗 UDP Streaming: Lower priority - only if enabled
if self.udp_streaming_enabled:
# Use background thread for UDP to not block recording
self.priority_manager.submit_background_task(
- self._handle_udp_streaming, dataset_id, dataset_info, all_data
+ self._handle_udp_streaming,
+ dataset_id,
+ dataset_info,
+ all_data,
)
# 馃搱 PLOT MANAGER: Background priority - update plots without blocking
@@ -851,7 +909,7 @@ class DataStreamer:
f"馃毃 CRITICAL: Dataset '{dataset_info['name']}' read completely failed. "
f"No CSV data written to prevent corruption (consecutive errors: {consecutive_errors})"
)
-
+
if consecutive_errors >= max_consecutive_errors:
self.event_logger.log_event(
"error",
@@ -860,7 +918,7 @@ class DataStreamer:
{
"dataset_id": dataset_id,
"consecutive_errors": consecutive_errors,
- "priority": "CRITICAL"
+ "priority": "CRITICAL",
},
)
break
@@ -869,17 +927,17 @@ class DataStreamer:
loop_end_time = time.time()
total_loop_time = loop_end_time - loop_start_time
expected_end_time = loop_start_time + interval
-
+
# Calculate delay (how much we're behind schedule)
delay = max(0.0, loop_end_time - expected_end_time)
-
+
# 馃搳 Record performance metrics
self.performance_monitor.record_dataset_read(
dataset_id=dataset_id,
read_time=read_time,
variables_count=variables_count,
success=read_success,
- delay=delay
+ delay=delay,
)
# Maintain sampling interval
@@ -895,16 +953,16 @@ class DataStreamer:
except Exception as e:
consecutive_errors += 1
-
+
# 馃搳 Record read error
self.performance_monitor.record_dataset_read(
dataset_id=dataset_id,
read_time=read_time,
variables_count=variables_count,
success=False,
- delay=0.0
+ delay=0.0,
)
-
+
self.event_logger.log_event(
"error",
"dataset_loop_error",
@@ -915,7 +973,7 @@ class DataStreamer:
"consecutive_errors": consecutive_errors,
"priority": "CRITICAL",
"read_time": read_time,
- "variables_count": variables_count
+ "variables_count": variables_count,
},
)
@@ -927,7 +985,7 @@ class DataStreamer:
{
"dataset_id": dataset_id,
"consecutive_errors": consecutive_errors,
- "priority": "CRITICAL"
+ "priority": "CRITICAL",
},
)
break
@@ -937,9 +995,13 @@ class DataStreamer:
# 馃攽 FIXED: Do NOT call stop_dataset_streaming from within the loop
# The thread will be cleaned up externally when needed
if self.logger:
- self.logger.info(f"馃敟 CRITICAL: Dataset '{dataset_info['name']}' recording loop ended")
+ self.logger.info(
+ f"馃敟 CRITICAL: Dataset '{dataset_info['name']}' recording loop ended"
+ )
- def _handle_udp_streaming(self, dataset_id: str, dataset_info: dict, all_data: dict):
+ def _handle_udp_streaming(
+ self, dataset_id: str, dataset_info: dict, all_data: dict
+ ):
"""Handle UDP streaming in background thread (lower priority) with performance tracking"""
try:
# Get filtered data for streaming - only variables that are in streaming_variables list AND have streaming=true
@@ -956,17 +1018,23 @@ class DataStreamer:
if streaming_data:
try:
self.send_to_plotjuggler(streaming_data)
-
+
# 馃搳 Record successful UDP send
- self.performance_monitor.record_udp_send(len(streaming_data), success=True)
-
+ self.performance_monitor.record_udp_send(
+ len(streaming_data), success=True
+ )
+
except Exception as udp_error:
# 馃搳 Record UDP send error
- self.performance_monitor.record_udp_send(len(streaming_data), success=False)
-
+ self.performance_monitor.record_udp_send(
+ len(streaming_data), success=False
+ )
+
if self.logger:
- self.logger.warning(f"UDP streaming error for dataset '{dataset_info['name']}': {udp_error}")
-
+ self.logger.warning(
+ f"UDP streaming error for dataset '{dataset_info['name']}': {udp_error}"
+ )
+
if self.logger:
udp_count = len(streaming_data)
self.logger.debug(
@@ -1005,9 +1073,9 @@ class DataStreamer:
target=self.dataset_streaming_loop,
args=(dataset_id,),
dataset_id=dataset_id,
- name=f"recording_{dataset_id}"
+ name=f"recording_{dataset_id}",
)
-
+
self.dataset_threads[dataset_id] = thread
thread.start()
@@ -1025,7 +1093,7 @@ class DataStreamer:
if dataset_id in self.dataset_threads:
# Use priority manager to safely stop the recording thread
self.priority_manager.stop_recording_thread(dataset_id, timeout=5.0)
-
+
# Clean up the reference
if dataset_id in self.dataset_threads:
del self.dataset_threads[dataset_id]
@@ -1115,10 +1183,10 @@ class DataStreamer:
# 馃敟 ENABLE RECORDING PROTECTION MODE
self.recording_protector.start_recording_protection()
-
+
# 馃搳 START PERFORMANCE MONITORING
self.performance_monitor.start_monitoring()
-
+
# 馃毃 START ASYNC CSV FLUSH THREAD
self.start_csv_flush_thread()
@@ -1163,7 +1231,7 @@ class DataStreamer:
"recording_protection": True,
"performance_monitoring": True,
"async_csv_buffering": True,
- "csv_flush_interval": self.csv_flush_interval
+ "csv_flush_interval": self.csv_flush_interval,
},
)
return True
@@ -1171,13 +1239,13 @@ class DataStreamer:
def stop_csv_recording(self):
"""馃敟 CRITICAL: Stop CSV recording safely with performance monitoring and async flush"""
self.csv_recording_enabled = False
-
+
# 馃毃 STOP ASYNC CSV FLUSH THREAD AND FLUSH REMAINING DATA
self.stop_csv_flush_thread()
-
+
# 馃敟 DISABLE RECORDING PROTECTION MODE
self.recording_protector.stop_recording_protection()
-
+
# 馃搳 STOP PERFORMANCE MONITORING
self.performance_monitor.stop_monitoring()
@@ -1201,10 +1269,7 @@ class DataStreamer:
"info",
"csv_recording_stopped",
"馃敟 CRITICAL: CSV recording stopped (dataset threads continue for UDP streaming)",
- {
- "recording_protection": False,
- "performance_monitoring": False
- }
+ {"recording_protection": False, "performance_monitoring": False},
)
# 馃攽 NEW: UDP Streaming Methods (Manual)
@@ -1444,7 +1509,9 @@ class DataStreamer:
"csv_recording_enabled": self.csv_recording_enabled,
# 馃搳 PERFORMANCE STATS
"performance_current": self.performance_monitor.get_current_stats(),
- "performance_historical": self.performance_monitor.get_historical_stats(windows=6), # Last minute
+ "performance_historical": self.performance_monitor.get_historical_stats(
+ windows=6
+ ), # Last minute
}
return stats
@@ -1457,14 +1524,14 @@ class DataStreamer:
"error": "API rate limit exceeded - protecting recording operations",
"error_type": "rate_limited",
"message": "Too many API requests - recording operations have priority",
- "retry_after": 1.0
+ "retry_after": 1.0,
}
-
+
# Use background thread for cache access to not block recording
future = self.priority_manager.submit_api_task(
self.get_cached_dataset_values, dataset_id
)
-
+
try:
return future.result(timeout=2.0) # 2 second timeout
except Exception as e:
@@ -1472,7 +1539,7 @@ class DataStreamer:
"success": False,
"error": f"API timeout or error: {str(e)}",
"error_type": "api_timeout",
- "message": "API request timed out - recording operations have priority"
+ "message": "API request timed out - recording operations have priority",
}
def perform_csv_cleanup_safe(self):
@@ -1480,9 +1547,11 @@ class DataStreamer:
if self.csv_recording_enabled:
# Don't run cleanup while recording is active - protect recording
if self.logger:
- self.logger.info("Skipping CSV cleanup - recording is active (protecting recording operations)")
+ self.logger.info(
+ "Skipping CSV cleanup - recording is active (protecting recording operations)"
+ )
return
-
+
# Run cleanup in background thread
self.priority_manager.submit_background_task(self.perform_csv_cleanup)
@@ -1669,48 +1738,52 @@ class DataStreamer:
"""馃攽 CRITICAL: Safely shutdown all streaming operations with priority protection and performance monitoring"""
if self.logger:
self.logger.info("馃敟 CRITICAL: Starting safe shutdown of data streamer...")
-
+
try:
# 1. Stop performance monitoring first
self.performance_monitor.stop_monitoring()
-
+
# 2. Stop CSV recording first (graceful stop with buffer flush)
if self.csv_recording_enabled:
self.stop_csv_recording()
else:
# Ensure CSV flush thread is stopped even if recording wasn't active
self.stop_csv_flush_thread()
-
+
# 3. Stop UDP streaming
if self.udp_streaming_enabled:
self.stop_udp_streaming()
-
+
# 4. Stop all dataset streaming threads using priority manager
active_datasets = list(self.dataset_threads.keys())
for dataset_id in active_datasets:
self.stop_dataset_streaming(dataset_id)
-
+
# 5. Shutdown priority manager (will wait for all recording threads)
self.priority_manager.shutdown()
-
+
# 6. Clear all cached data
self.clear_cached_values()
-
+
# 7. Close any remaining files
for dataset_id in list(self.dataset_csv_files.keys()):
try:
self.dataset_csv_files[dataset_id].close()
except:
pass
-
+
self.dataset_csv_files.clear()
self.dataset_csv_writers.clear()
self.dataset_csv_hours.clear()
-
+
if self.logger:
- self.logger.info("馃敟 CRITICAL: Data streamer shutdown completed successfully")
-
+ self.logger.info(
+ "馃敟 CRITICAL: Data streamer shutdown completed successfully"
+ )
+
except Exception as e:
if self.logger:
- self.logger.error(f"馃毃 CRITICAL ERROR: Error during data streamer shutdown: {e}")
+ self.logger.error(
+ f"馃毃 CRITICAL ERROR: Error during data streamer shutdown: {e}"
+ )
raise
diff --git a/frontend/src/components/PlotHistoricalManager.jsx b/frontend/src/components/PlotHistoricalManager.jsx
index 930ec10..94532f9 100644
--- a/frontend/src/components/PlotHistoricalManager.jsx
+++ b/frontend/src/components/PlotHistoricalManager.jsx
@@ -1,4 +1,5 @@
import React, { useState, useEffect, useCallback } from 'react'
+import { useTranslation } from 'react-i18next'
import {
Box,
Card,
@@ -280,6 +281,7 @@ function CollapsiblePlotItemsForm({ data, schema, uiSchema, onSave, title, icon,
* Adapted from PlotManager for historical data analysis
*/
export default function PlotHistoricalManager() {
+ const { t } = useTranslation()
const [plotDefinitions, setPlotDefinitions] = useState({ plots: [] })
const [plotVariables, setPlotVariables] = useState({ variables: [] })
const [plotDefinitionsSchema, setPlotDefinitionsSchema] = useState(null)
@@ -523,8 +525,8 @@ export default function PlotHistoricalManager() {
setHistoricalSessions(prev => [...prev, newSession])
toast({
- title: "Historical Plot Created",
- description: `Created historical plot: ${plotDef.name}`,
+ title: t('historical.plotCreated'),
+ description: `${t('historical.createdDescription')}: ${plotDef.name}`,
status: "success",
duration: 3000,
isClosable: true
@@ -534,7 +536,7 @@ export default function PlotHistoricalManager() {
console.error('Error creating historical plot:', error)
toast({
title: "Creation Error",
- description: error.message || "Failed to create historical plot",
+ description: error.message || t('historical.createFailed'),
status: "error",
duration: 5000,
isClosable: true
@@ -547,8 +549,8 @@ export default function PlotHistoricalManager() {
const removeHistoricalSession = (sessionId) => {
setHistoricalSessions(prev => prev.filter(s => s.id !== sessionId))
toast({
- title: "Session Removed",
- description: "Historical plot session removed",
+ title: t('historical.sessionRemoved'),
+ description: t('historical.sessionRemovedDescription'),
status: "info",
duration: 2000,
isClosable: true
@@ -574,9 +576,9 @@ export default function PlotHistoricalManager() {
馃搳
- Historical Plot Manager
+ {t('historical.manager')}
- CSV Data Analysis
+ {t('historical.csvAnalysis')}
@@ -587,14 +589,14 @@ export default function PlotHistoricalManager() {
isLoading={isLoading}
variant="ghost"
>
- 馃攧 Refresh Config
+ 馃攧 {t('historical.refreshConfig')}
@@ -615,14 +617,14 @@ export default function PlotHistoricalManager() {
{/* Plot Creation */}
- 馃幆 Create Historical Plot
+ 馃幆 {t('historical.createPlot')}
- Select Plot Definition
+ {t('historical.selectPlotDefinition')}
@@ -653,9 +655,9 @@ export default function PlotHistoricalManager() {
馃搱
- Historical Plot Sessions
+ {t('historical.sessions')}
- {historicalSessions.length} active
+ {historicalSessions.length} {t('historical.active')}
@@ -665,7 +667,7 @@ export default function PlotHistoricalManager() {
onClick={() => setIsSessionsExpanded(!isSessionsExpanded)}
leftIcon={isSessionsExpanded ? : }
>
- {isSessionsExpanded ? 'Collapse' : 'Expand'}
+ {isSessionsExpanded ? t('ui.collapse') : t('ui.expand')}
@@ -687,10 +689,10 @@ export default function PlotHistoricalManager() {
) : (
- No historical plot sessions active.
+ {t('historical.noSessions')}
- Select a plot definition and create your first historical plot to analyze CSV data.
+ {t('historical.noSessionsHelp')}
)}
diff --git a/frontend/src/components/PlotHistoricalSession.jsx b/frontend/src/components/PlotHistoricalSession.jsx
index 1a7d4fe..2b6d947 100644
--- a/frontend/src/components/PlotHistoricalSession.jsx
+++ b/frontend/src/components/PlotHistoricalSession.jsx
@@ -1,4 +1,5 @@
import React, { useEffect, useRef, useState, useCallback, useMemo } from 'react'
+import { useTranslation } from 'react-i18next'
import {
Box,
VStack,
@@ -58,10 +59,11 @@ import * as api from '../services/api'
*/
export default function PlotHistoricalSession({
session,
- onRemove,
- availableVariables = [],
- booleanVariables = []
+ onRemove,
+ availableVariables = [],
+ booleanVariables = []
}) {
+ const { t } = useTranslation();
const [isLoading, setIsLoading] = useState(false)
const [error, setError] = useState(null)
const [historicalData, setHistoricalData] = useState([])
@@ -632,8 +634,8 @@ export default function PlotHistoricalSession({
Range: {timeRangeSeconds}s
- From: {formatCentralTimeInfo().start}
- To: {formatCentralTimeInfo().end}
+ {t('timeSelector.from')}: {formatCentralTimeInfo().start}
+ {t('timeSelector.to')}: {formatCentralTimeInfo().end}
@@ -666,7 +668,7 @@ export default function PlotHistoricalSession({
{dataStats.loadTime}ms
- Time Range:
+ {t('timeSelector.timeRange')}:
{formatTimeRange(dataStats.timeRange)}
@@ -727,7 +729,7 @@ export default function PlotHistoricalSession({
{/* Time Range Configuration */}
- 馃搮 Time Range
+ 馃搮 {t('timeSelector.timeRange')}
Central Time
@@ -946,8 +948,8 @@ export default function PlotHistoricalSession({
Range: {timeRangeSeconds}s
- From: {formatCentralTimeInfo().start}
- To: {formatCentralTimeInfo().end}
+ {t('timeSelector.from')}: {formatCentralTimeInfo().start}
+ {t('timeSelector.to')}: {formatCentralTimeInfo().end}
diff --git a/frontend/src/components/TimePointSelector.jsx b/frontend/src/components/TimePointSelector.jsx
index d0bc679..f70572b 100644
--- a/frontend/src/components/TimePointSelector.jsx
+++ b/frontend/src/components/TimePointSelector.jsx
@@ -1,4 +1,5 @@
import { useMemo, useState, useCallback, useRef, useEffect } from "react";
+import { useTranslation } from 'react-i18next';
import { Box, Flex, Text, Slider, SliderTrack, SliderFilledTrack, SliderThumb, Button, IconButton, useColorModeValue, NumberInput, NumberInputField, NumberInputStepper, NumberIncrementStepper, NumberDecrementStepper } from "@chakra-ui/react";
import { CheckIcon } from "@chakra-ui/icons";
import DatePicker from "react-datepicker";
@@ -14,6 +15,7 @@ export default function TimePointSelector({
dataSegments = [],
onTimeChange,
}) {
+ const { t } = useTranslation();
// Color mode values
const bgColor = useColorModeValue('gray.50', 'gray.700');
const borderColor = useColorModeValue('gray.200', 'gray.600');
@@ -163,7 +165,7 @@ export default function TimePointSelector({
- Select Date and Time
+ {t('timeSelector.selectDateTime')}
- Navigate with slider
+ {t('timeSelector.navigateSlider')}
{/* Slider with integrated data availability */}
@@ -302,7 +304,7 @@ export default function TimePointSelector({
{hasPendingChanges && (
- Pending changes
+ {t('timeSelector.pendingChanges')}
)}
@@ -311,7 +313,7 @@ export default function TimePointSelector({
- Time Range (seconds)
+ {t('timeSelector.timeRangeSeconds')}
- Pending changes
+ {t('timeSelector.pendingChanges')}
}
onClick={applyPendingChanges}
>
- Apply Changes
+ {t('timeSelector.applyChanges')}
)}
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json
index 6a7fd04..3986ac5 100644
--- a/frontend/src/locales/en.json
+++ b/frontend/src/locales/en.json
@@ -100,5 +100,63 @@
"refresh": "Refresh",
"noLogs": "No logs available",
"loading": "Loading logs..."
+ },
+ "historical": {
+ "title": "Historical Plots",
+ "manager": "Historical Plot Manager",
+ "csvAnalysis": "CSV Data Analysis",
+ "createPlot": "Create Historical Plot",
+ "selectPlotDefinition": "Select Plot Definition",
+ "choosePlot": "Choose a plot...",
+ "createButton": "Create Plot",
+ "sessions": "Historical Plot Sessions",
+ "active": "active",
+ "noSessions": "No historical plot sessions active.",
+ "noSessionsHelp": "Select a plot definition and create your first historical plot to analyze CSV data.",
+ "plotCreated": "Historical Plot Created",
+ "createdDescription": "Created historical plot",
+ "sessionRemoved": "Session Removed",
+ "sessionRemovedDescription": "Historical plot session removed",
+ "createFailed": "Failed to create historical plot",
+ "refreshConfig": "Refresh Config",
+ "refreshVariables": "Refresh Variables",
+ "debugData": "Debug Data"
+ },
+ "csvFiles": {
+ "title": "CSV Files",
+ "browser": "CSV File Browser",
+ "loading": "Loading files...",
+ "noFiles": "No files available",
+ "download": "Download",
+ "openWith": "Open with",
+ "plotJuggler": "PlotJuggler",
+ "fileSize": "File size",
+ "lastModified": "Last modified",
+ "records": "records"
+ },
+ "ui": {
+ "collapse": "Collapse",
+ "expand": "Expand",
+ "addNew": "Add New",
+ "addFirst": "Add First",
+ "items": "items",
+ "defined": "defined",
+ "yet": "yet",
+ "choose": "Choose",
+ "select": "Select"
+ },
+ "timeSelector": {
+ "selectDateTime": "Select Date and Time",
+ "navigateSlider": "Navigate with slider",
+ "timeRange": "Time Range",
+ "timeRangeSeconds": "Time Range (seconds)",
+ "pendingChanges": "Pending changes",
+ "applyChanges": "Apply Changes",
+ "from": "From",
+ "to": "To",
+ "range": "Range",
+ "duration": "Duration",
+ "time": "Time",
+ "date": "Date"
}
}
diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json
index 80c7258..d83ad3c 100644
--- a/frontend/src/locales/es.json
+++ b/frontend/src/locales/es.json
@@ -100,5 +100,63 @@
"refresh": "Actualizar",
"noLogs": "No hay registros disponibles",
"loading": "Cargando registros..."
+ },
+ "historical": {
+ "title": "Gr谩ficos Hist贸ricos",
+ "manager": "Gestor de Gr谩ficos Hist贸ricos",
+ "csvAnalysis": "An谩lisis de Datos CSV",
+ "createPlot": "Crear Gr谩fico Hist贸rico",
+ "selectPlotDefinition": "Seleccionar Definici贸n de Gr谩fico",
+ "choosePlot": "Elegir un gr谩fico...",
+ "createButton": "Crear Gr谩fico",
+ "sessions": "Sesiones de Gr谩ficos Hist贸ricos",
+ "active": "activo",
+ "noSessions": "No hay sesiones de gr谩ficos hist贸ricos activas.",
+ "noSessionsHelp": "Selecciona una definici贸n de gr谩fico y crea tu primer gr谩fico hist贸rico para analizar datos CSV.",
+ "plotCreated": "Gr谩fico Hist贸rico Creado",
+ "createdDescription": "Gr谩fico hist贸rico creado",
+ "sessionRemoved": "Sesi贸n Eliminada",
+ "sessionRemovedDescription": "Sesi贸n de gr谩fico hist贸rico eliminada",
+ "createFailed": "Error al crear gr谩fico hist贸rico",
+ "refreshConfig": "Actualizar Configuraci贸n",
+ "refreshVariables": "Actualizar Variables",
+ "debugData": "Datos de Depuraci贸n"
+ },
+ "csvFiles": {
+ "title": "Archivos CSV",
+ "browser": "Explorador de Archivos CSV",
+ "loading": "Cargando archivos...",
+ "noFiles": "No hay archivos disponibles",
+ "download": "Descargar",
+ "openWith": "Abrir con",
+ "plotJuggler": "PlotJuggler",
+ "fileSize": "Tama帽o del archivo",
+ "lastModified": "脷ltima modificaci贸n",
+ "records": "registros"
+ },
+ "ui": {
+ "collapse": "Colapsar",
+ "expand": "Expandir",
+ "addNew": "Agregar Nuevo",
+ "addFirst": "Agregar Primero",
+ "items": "elementos",
+ "defined": "definido",
+ "yet": "a煤n",
+ "choose": "Elegir",
+ "select": "Seleccionar"
+ },
+ "timeSelector": {
+ "selectDateTime": "Seleccionar Fecha y Hora",
+ "navigateSlider": "Navegar con control deslizante",
+ "timeRange": "Rango de Tiempo",
+ "timeRangeSeconds": "Rango de Tiempo (segundos)",
+ "pendingChanges": "Cambios pendientes",
+ "applyChanges": "Aplicar Cambios",
+ "from": "Desde",
+ "to": "Hasta",
+ "range": "Rango",
+ "duration": "Duraci贸n",
+ "time": "Hora",
+ "date": "Fecha"
}
}
diff --git a/frontend/src/locales/it.json b/frontend/src/locales/it.json
index b710209..8f8973f 100644
--- a/frontend/src/locales/it.json
+++ b/frontend/src/locales/it.json
@@ -100,5 +100,63 @@
"refresh": "Aggiorna",
"noLogs": "Nessun log disponibile",
"loading": "Caricamento log..."
+ },
+ "historical": {
+ "title": "Grafici Storici",
+ "manager": "Gestore Grafici Storici",
+ "csvAnalysis": "Analisi Dati CSV",
+ "createPlot": "Crea Grafico Storico",
+ "selectPlotDefinition": "Seleziona Definizione Grafico",
+ "choosePlot": "Scegli un grafico...",
+ "createButton": "Crea Grafico",
+ "sessions": "Sessioni Grafici Storici",
+ "active": "attivo",
+ "noSessions": "Nessuna sessione di grafici storici attiva.",
+ "noSessionsHelp": "Seleziona una definizione di grafico e crea il tuo primo grafico storico per analizzare i dati CSV.",
+ "plotCreated": "Grafico Storico Creato",
+ "createdDescription": "Grafico storico creato",
+ "sessionRemoved": "Sessione Rimossa",
+ "sessionRemovedDescription": "Sessione grafico storico rimossa",
+ "createFailed": "Errore nella creazione del grafico storico",
+ "refreshConfig": "Aggiorna Configurazione",
+ "refreshVariables": "Aggiorna Variabili",
+ "debugData": "Dati di Debug"
+ },
+ "csvFiles": {
+ "title": "File CSV",
+ "browser": "Browser File CSV",
+ "loading": "Caricamento file...",
+ "noFiles": "Nessun file disponibile",
+ "download": "Scarica",
+ "openWith": "Apri con",
+ "plotJuggler": "PlotJuggler",
+ "fileSize": "Dimensione file",
+ "lastModified": "Ultima modifica",
+ "records": "record"
+ },
+ "ui": {
+ "collapse": "Comprimi",
+ "expand": "Espandi",
+ "addNew": "Aggiungi Nuovo",
+ "addFirst": "Aggiungi Primo",
+ "items": "elementi",
+ "defined": "definito",
+ "yet": "ancora",
+ "choose": "Scegli",
+ "select": "Seleziona"
+ },
+ "timeSelector": {
+ "selectDateTime": "Seleziona Data e Ora",
+ "navigateSlider": "Naviga con cursore",
+ "timeRange": "Intervallo di Tempo",
+ "timeRangeSeconds": "Intervallo di Tempo (secondi)",
+ "pendingChanges": "Modifiche in sospeso",
+ "applyChanges": "Applica Modifiche",
+ "from": "Da",
+ "to": "A",
+ "range": "Intervallo",
+ "duration": "Durata",
+ "time": "Ora",
+ "date": "Data"
}
}
diff --git a/frontend/src/pages/Dashboard.jsx b/frontend/src/pages/Dashboard.jsx
index 610b710..4585e41 100644
--- a/frontend/src/pages/Dashboard.jsx
+++ b/frontend/src/pages/Dashboard.jsx
@@ -1723,6 +1723,7 @@ function DatasetManager() {
// Console Logs Display Component
function ConsoleLogsDisplay({ logs, loading, onRefresh }) {
+ const { t } = useTranslation()
// All hooks must be called at the top level
const cardBg = useColorModeValue('white', 'gray.700')
const logBg = useColorModeValue('gray.50', 'gray.800')
@@ -1753,7 +1754,7 @@ function ConsoleLogsDisplay({ logs, loading, onRefresh }) {
- Loading console logs...
+ Loading {t('logs.loading')}...
@@ -1764,7 +1765,7 @@ function ConsoleLogsDisplay({ logs, loading, onRefresh }) {
- 馃搵 Console Logs
+ 馃搵 {t('logs.title')}
@@ -1784,7 +1785,7 @@ function ConsoleLogsDisplay({ logs, loading, onRefresh }) {
{(!logs || logs.length === 0) ? (
- No console logs found
+ {t('logs.noLogs')}
) : (
- 馃敡 Configuration
- 馃搳 Datasets
- 馃搱 Plotting
- 馃搲 Historical Plots
- 馃搧 CSV Files
- 馃搵 Console Logs
+ 馃敡 {t('config.title')}
+ 馃搳 {t('datasets.title')}
+ 馃搱 {t('plots.title')}
+ 馃搲 {t('historical.title')}
+ 馃搧 {t('csvFiles.title')}
+ 馃搵 {t('logs.title')}
diff --git a/system_state.json b/system_state.json
index ca8afb0..9a22388 100644
--- a/system_state.json
+++ b/system_state.json
@@ -1,9 +1,13 @@
{
"last_state": {
- "should_connect": false,
+ "should_connect": true,
"should_stream": false,
- "active_datasets": []
+ "active_datasets": [
+ "Fast",
+ "DAR"
+ ]
},
"auto_recovery_enabled": true,
- "last_update": "2025-08-17T11:41:21.785119"
+ "last_update": "2025-08-17T12:13:12.849060",
+ "plotjuggler_path": "C:\\Program Files\\PlotJuggler\\plotjuggler.exe"
}
\ No newline at end of file