@@ -14,6 +14,7 @@ import 'package:analysis_server/src/legacy_analysis_server.dart';
1414import 'package:analysis_server/src/lsp/lsp_analysis_server.dart'
1515 show LspAnalysisServer;
1616import 'package:analysis_server/src/scheduler/message_scheduler.dart' ;
17+ import 'package:analysis_server/src/scheduler/scheduler_tracking_listener.dart' ;
1718import 'package:analysis_server/src/status/diagnostics.dart' ;
1819import 'package:analysis_server/src/status/pages.dart' ;
1920import 'package:analysis_server/src/status/utilities/library_cycle_extensions.dart' ;
@@ -252,6 +253,53 @@ class CollectReportPage extends DiagnosticPage {
252253 void _collectMessageSchedulerData (Map <String , Object ?> collectedData) {
253254 collectedData['allowOverlappingHandlers' ] =
254255 MessageScheduler .allowOverlappingHandlers;
256+
257+ var now = DateTime .now ().millisecondsSinceEpoch;
258+ var listener = server.messageScheduler.listener;
259+ if (listener is ! SchedulerTrackingListener ) {
260+ return ;
261+ }
262+
263+ Map <String , Object ?> buildMessageData (
264+ MessageData data, {
265+ required bool isActive,
266+ }) {
267+ Map <String , Object ?> messageData = {};
268+ messageData['id' ] = data.message.id;
269+ messageData['pendingMessageCount' ] = data.pendingMessageCount;
270+ messageData['pendingDuration' ] =
271+ (data.activeTime ?? now) - data.pendingTime;
272+ if (isActive) {
273+ messageData['activeMessageCount' ] = data.activeMessageCount;
274+ messageData['runningDuration' ] = now - data.activeTime! ;
275+ }
276+ return messageData;
277+ }
278+
279+ var (: pending, : active) = listener.pendingAndActiveMessages;
280+ if (pending.isNotEmpty) {
281+ pending.sort (
282+ (first, second) => first.pendingTime.compareTo (second.pendingTime),
283+ );
284+ var pendingMessages = < Map <String , Object ?>> [];
285+ for (var data in pending) {
286+ pendingMessages.add (buildMessageData (data, isActive: false ));
287+ }
288+ collectedData['pendingMessages' ] = pendingMessages;
289+ }
290+
291+ if (active.isNotEmpty) {
292+ active.sort (
293+ (first, second) => first.activeTime! .compareTo (second.activeTime! ),
294+ );
295+ var activeMessages = < Map <String , Object ?>> [];
296+ for (var data in active) {
297+ activeMessages.add (buildMessageData (data, isActive: true ));
298+ }
299+ collectedData['activeMessages' ] = activeMessages;
300+ }
301+
302+ collectedData['completedMessageLog' ] = listener.completedMessageLog;
255303 }
256304
257305 Future <void > _collectObservatoryData (
0 commit comments