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')}