[unified_analytics]Add library cycle info to analysis server data (#2117)

diff --git a/pkgs/unified_analytics/CHANGELOG.md b/pkgs/unified_analytics/CHANGELOG.md
index e5c26c9..bb1ba6a 100644
--- a/pkgs/unified_analytics/CHANGELOG.md
+++ b/pkgs/unified_analytics/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 8.0.3
+- Changed `Event.contextStructure` to make optional data that's no longer being
+  collected and to add data about the size of library cycles.
+
 ## 8.0.2
 - Added `Event.dartMCPEvent` for events from the `dart mcp-server` command.
 
diff --git a/pkgs/unified_analytics/lib/src/constants.dart b/pkgs/unified_analytics/lib/src/constants.dart
index 3d472ea..449c591 100644
--- a/pkgs/unified_analytics/lib/src/constants.dart
+++ b/pkgs/unified_analytics/lib/src/constants.dart
@@ -87,7 +87,7 @@
 const String kLogFileName = 'dart-flutter-telemetry.log';
 
 /// The current version of the package, should be in line with pubspec version.
-const String kPackageVersion = '8.0.2';
+const String kPackageVersion = '8.0.3';
 
 /// The minimum length for a session.
 const int kSessionDurationMinutes = 30;
diff --git a/pkgs/unified_analytics/lib/src/event.dart b/pkgs/unified_analytics/lib/src/event.dart
index 7fcaad6..45b0ac5 100644
--- a/pkgs/unified_analytics/lib/src/event.dart
+++ b/pkgs/unified_analytics/lib/src/event.dart
@@ -309,18 +309,6 @@
   /// Event that is emitted on shutdown to report the structure of the analysis
   /// contexts created immediately after startup.
   ///
-  /// [contextsFromBothFiles] - the number of contexts that were created because
-  ///     of both a package config and an analysis options file.
-  ///
-  /// [contextsFromOptionsFiles] - the number of contexts that were created
-  ///     because of an analysis options file.
-  ///
-  /// [contextsFromPackagesFiles] - the number of contexts that were created
-  ///     because of a package config file.
-  ///
-  /// [contextsWithoutFiles] - the number of contexts that were created because
-  ///     of the lack of either a package config or an analysis options file.
-  ///
   /// [immediateFileCount] - the number of files in one of the analysis
   ///     contexts.
   ///
@@ -341,11 +329,25 @@
   ///
   /// [transitiveFileUniqueLineCount] - the number of lines in the unique
   ///     transitive files.
+  ///
+  /// [libraryCycleLibraryCounts] - json encoded percentile values indicating
+  ///     the number of libraries in a single library cycle.
+  ///
+  /// [libraryCycleLineCounts] - json encoded percentile values indicating the
+  ///     number of lines of code in all of the files in a single library cycle.
+  ///
+  /// [contextsFromBothFiles] - the number of contexts that were created because
+  ///     of both a package config and an analysis options file.
+  ///
+  /// [contextsFromOptionsFiles] - the number of contexts that were created
+  ///     because of an analysis options file.
+  ///
+  /// [contextsFromPackagesFiles] - the number of contexts that were created
+  ///     because of a package config file.
+  ///
+  /// [contextsWithoutFiles] - the number of contexts that were created because
+  ///     of the lack of either a package config or an analysis options file.
   Event.contextStructure({
-    required int contextsFromBothFiles,
-    required int contextsFromOptionsFiles,
-    required int contextsFromPackagesFiles,
-    required int contextsWithoutFiles,
     required int immediateFileCount,
     required int immediateFileLineCount,
     required int numberOfContexts,
@@ -353,13 +355,15 @@
     required int transitiveFileLineCount,
     required int transitiveFileUniqueCount,
     required int transitiveFileUniqueLineCount,
+    String libraryCycleLibraryCounts = '',
+    String libraryCycleLineCounts = '',
+    int contextsFromBothFiles = 0,
+    int contextsFromOptionsFiles = 0,
+    int contextsFromPackagesFiles = 0,
+    int contextsWithoutFiles = 0,
   }) : this._(
           eventName: DashEvent.contextStructure,
           eventData: {
-            'contextsFromBothFiles': contextsFromBothFiles,
-            'contextsFromOptionsFiles': contextsFromOptionsFiles,
-            'contextsFromPackagesFiles': contextsFromPackagesFiles,
-            'contextsWithoutFiles': contextsWithoutFiles,
             'immediateFileCount': immediateFileCount,
             'immediateFileLineCount': immediateFileLineCount,
             'numberOfContexts': numberOfContexts,
@@ -367,6 +371,12 @@
             'transitiveFileLineCount': transitiveFileLineCount,
             'transitiveFileUniqueCount': transitiveFileUniqueCount,
             'transitiveFileUniqueLineCount': transitiveFileUniqueLineCount,
+            'libraryCycleLibraryCounts': libraryCycleLibraryCounts,
+            'libraryCycleLineCounts': libraryCycleLineCounts,
+            'contextsFromBothFiles': contextsFromBothFiles,
+            'contextsFromOptionsFiles': contextsFromOptionsFiles,
+            'contextsFromPackagesFiles': contextsFromPackagesFiles,
+            'contextsWithoutFiles': contextsWithoutFiles,
           },
         );
 
diff --git a/pkgs/unified_analytics/pubspec.yaml b/pkgs/unified_analytics/pubspec.yaml
index 94b3fe9..b3517d6 100644
--- a/pkgs/unified_analytics/pubspec.yaml
+++ b/pkgs/unified_analytics/pubspec.yaml
@@ -5,7 +5,7 @@
 # LINT.IfChange
 # When updating this, keep the version consistent with the changelog and the
 # value in lib/src/constants.dart.
-version: 8.0.2
+version: 8.0.3
 # LINT.ThenChange(lib/src/constants.dart)
 repository: https://github.com/dart-lang/tools/tree/main/pkgs/unified_analytics
 issue_tracker: https://github.com/dart-lang/tools/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Aunified_analytics
diff --git a/pkgs/unified_analytics/test/event_test.dart b/pkgs/unified_analytics/test/event_test.dart
index 9c4a99c..98924fb 100644
--- a/pkgs/unified_analytics/test/event_test.dart
+++ b/pkgs/unified_analytics/test/event_test.dart
@@ -85,35 +85,35 @@
 
   test('Event.contextStructure constructed', () {
     Event generateEvent() => Event.contextStructure(
-          contextsFromBothFiles: 1,
-          contextsFromOptionsFiles: 2,
-          contextsFromPackagesFiles: 3,
-          contextsWithoutFiles: 4,
-          immediateFileCount: 5,
-          immediateFileLineCount: 6,
-          numberOfContexts: 7,
-          transitiveFileCount: 8,
-          transitiveFileLineCount: 9,
-          transitiveFileUniqueCount: 10,
-          transitiveFileUniqueLineCount: 11,
+          immediateFileCount: 1,
+          immediateFileLineCount: 2,
+          numberOfContexts: 3,
+          transitiveFileCount: 4,
+          transitiveFileLineCount: 5,
+          transitiveFileUniqueCount: 6,
+          transitiveFileUniqueLineCount: 7,
+          libraryCycleLibraryCounts: 'a',
+          libraryCycleLineCounts: 'b',
         );
 
     final constructedEvent = generateEvent();
 
     expect(generateEvent, returnsNormally);
     expect(constructedEvent.eventName, DashEvent.contextStructure);
-    expect(constructedEvent.eventData['contextsFromBothFiles'], 1);
-    expect(constructedEvent.eventData['contextsFromOptionsFiles'], 2);
-    expect(constructedEvent.eventData['contextsFromPackagesFiles'], 3);
-    expect(constructedEvent.eventData['contextsWithoutFiles'], 4);
-    expect(constructedEvent.eventData['immediateFileCount'], 5);
-    expect(constructedEvent.eventData['immediateFileLineCount'], 6);
-    expect(constructedEvent.eventData['numberOfContexts'], 7);
-    expect(constructedEvent.eventData['transitiveFileCount'], 8);
-    expect(constructedEvent.eventData['transitiveFileLineCount'], 9);
-    expect(constructedEvent.eventData['transitiveFileUniqueCount'], 10);
-    expect(constructedEvent.eventData['transitiveFileUniqueLineCount'], 11);
-    expect(constructedEvent.eventData.length, 11);
+    expect(constructedEvent.eventData['immediateFileCount'], 1);
+    expect(constructedEvent.eventData['immediateFileLineCount'], 2);
+    expect(constructedEvent.eventData['numberOfContexts'], 3);
+    expect(constructedEvent.eventData['transitiveFileCount'], 4);
+    expect(constructedEvent.eventData['transitiveFileLineCount'], 5);
+    expect(constructedEvent.eventData['transitiveFileUniqueCount'], 6);
+    expect(constructedEvent.eventData['transitiveFileUniqueLineCount'], 7);
+    expect(constructedEvent.eventData['libraryCycleLibraryCounts'], 'a');
+    expect(constructedEvent.eventData['libraryCycleLineCounts'], 'b');
+    expect(constructedEvent.eventData['contextsFromBothFiles'], 0);
+    expect(constructedEvent.eventData['contextsFromOptionsFiles'], 0);
+    expect(constructedEvent.eventData['contextsFromPackagesFiles'], 0);
+    expect(constructedEvent.eventData['contextsWithoutFiles'], 0);
+    expect(constructedEvent.eventData.length, 13);
   });
 
   test('Event.dartCliCommandExecuted constructed', () {