diff --git a/pkgs/unified_analytics/CHANGELOG.md b/pkgs/unified_analytics/CHANGELOG.md index 729cc11d5..79e09f6a2 100644 --- a/pkgs/unified_analytics/CHANGELOG.md +++ b/pkgs/unified_analytics/CHANGELOG.md @@ -1,3 +1,6 @@ +## 8.0.8 +- More data for `Event.analysisStatistics` for events from Dart Analysis Server. + ## 8.0.7 - Added optional fields `contextWorkspaceType` and `numberOfPackagesInWorkspace` to `Event.contextStructure` for workspace and packages distribution from the diff --git a/pkgs/unified_analytics/lib/src/constants.dart b/pkgs/unified_analytics/lib/src/constants.dart index 98b4471ba..afebc5433 100644 --- a/pkgs/unified_analytics/lib/src/constants.dart +++ b/pkgs/unified_analytics/lib/src/constants.dart @@ -87,7 +87,7 @@ const int kMaxLogFileSize = 25 * (1 << 20); 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.7'; +const String kPackageVersion = '8.0.8'; /// 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 58e77eb65..f3eaa0271 100644 --- a/pkgs/unified_analytics/lib/src/event.dart +++ b/pkgs/unified_analytics/lib/src/event.dart @@ -108,12 +108,92 @@ final class Event { /// /// [workingDuration] - json encoded percentile values indicating how long /// the analysis status was "working". + /// [withFineDependencies] - whether the fine-grained feature is enabled. + /// + /// Then there are three groups of measurements: + /// * file modifications + /// * workspace shape + /// * background analysis + /// + /// The file modifications group includes: + /// [changedFileEventCount] - the number of file change events received. + /// [removedFileEventCount] - the number of file removal events received. + /// [changedFileUniqueCount] - the number of unique files that were changed. + /// [removedFileUniqueCount] - the number of unique files that were removed. + /// + /// The workspace shape group includes: + /// * [immediateFileCountPercentiles] - json encoded percentile values for the + /// number of files in the immediate workspace. + /// * [immediateFileLineCountPercentiles] - json encoded percentile values for + /// the number of lines in the immediate workspace files. + /// * [transitiveFileCountPercentiles] - json encoded percentile values for + /// the number of files in the transitive workspace. + /// * [transitiveFileLineCountPercentiles] - json encoded percentile values + /// for the number of lines in the transitive workspace files. + /// + /// This allows us to understand how big is the workspace, and how it changed + /// over the reported period. + /// + /// The background analysis group includes: + /// * [produceErrorsPotentialFileCount] - the total number of files for which + /// the reported diagnostics could potentially change. + /// * [produceErrorsPotentialFileLineCount] - the total number of lines in + /// files for which the reported diagnostics could potentially change. + /// * [produceErrorsActualFileCount] - the total number of files that actually + /// were analyzed during background analysis. + /// * [produceErrorsActualFileLineCount] - the total number of lines in files + /// that actually were analyzed during background analysis. + /// * [produceErrorsDurationMs] - the total duration in milliseconds for + /// producing diagnostics. + /// * [produceErrorsElementsDurationMs] - the total duration in milliseconds + /// for preparing elements before analysis. + /// + /// This allows us to understand how many files were scheduled for analysis, + /// and how many of these files are served from the cache, because we + /// determined that the change that caused them to be scheduled for analysis + /// actually does not affect resolution and the set of diagnostics, e.g. + /// because the change was in a method body, or to an API that does not + /// affect this specific file (if fine-grained dependencies enabled). Event.analysisStatistics({ required String workingDuration, + required bool withFineDependencies, + required int changedFileEventCount, + required int removedFileEventCount, + required int changedFileUniqueCount, + required int removedFileUniqueCount, + required String immediateFileCountPercentiles, + required String immediateFileLineCountPercentiles, + required String transitiveFileCountPercentiles, + required String transitiveFileLineCountPercentiles, + required int produceErrorsPotentialFileCount, + required int produceErrorsPotentialFileLineCount, + required int produceErrorsActualFileCount, + required int produceErrorsActualFileLineCount, + required int produceErrorsDurationMs, + required int produceErrorsElementsDurationMs, }) : this._( eventName: DashEvent.analysisStatistics, eventData: { 'workingDuration': workingDuration, + 'withFineDependencies': withFineDependencies, + 'changedFileUniqueCount': changedFileUniqueCount, + 'removedFileUniqueCount': removedFileUniqueCount, + 'changedFileEventCount': changedFileEventCount, + 'removedFileEventCount': removedFileEventCount, + 'immediateFileCountPercentiles': immediateFileCountPercentiles, + 'immediateFileLineCountPercentiles': + immediateFileLineCountPercentiles, + 'transitiveFileCountPercentiles': transitiveFileCountPercentiles, + 'transitiveFileLineCountPercentiles': + transitiveFileLineCountPercentiles, + 'produceErrorsPotentialFileCount': produceErrorsPotentialFileCount, + 'produceErrorsPotentialFileLineCount': + produceErrorsPotentialFileLineCount, + 'produceErrorsActualFileCount': produceErrorsActualFileCount, + 'produceErrorsActualFileLineCount': + produceErrorsActualFileLineCount, + 'produceErrorsDurationMs': produceErrorsDurationMs, + 'produceErrorsElementsDurationMs': produceErrorsElementsDurationMs, }, ); diff --git a/pkgs/unified_analytics/pubspec.yaml b/pkgs/unified_analytics/pubspec.yaml index 78089f0b8..f88a71690 100644 --- a/pkgs/unified_analytics/pubspec.yaml +++ b/pkgs/unified_analytics/pubspec.yaml @@ -5,7 +5,7 @@ description: >- # LINT.IfChange # When updating this, keep the version consistent with the changelog and the # value in lib/src/constants.dart. -version: 8.0.7 +version: 8.0.8 # 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 eab0cd794..866a17f3c 100644 --- a/pkgs/unified_analytics/test/event_test.dart +++ b/pkgs/unified_analytics/test/event_test.dart @@ -11,15 +11,53 @@ import 'package:unified_analytics/unified_analytics.dart'; void main() { test('Event.analysisStatistics constructed', () { - Event generateEvent() => - Event.analysisStatistics(workingDuration: 'workingDuration'); + Event generateEvent() => Event.analysisStatistics( + workingDuration: 'workingDuration', + withFineDependencies: false, + changedFileEventCount: 1, + removedFileEventCount: 2, + changedFileUniqueCount: 3, + removedFileUniqueCount: 4, + immediateFileCountPercentiles: 'immediateFileCountPercentiles', + immediateFileLineCountPercentiles: + 'immediateFileLineCountPercentiles', + transitiveFileCountPercentiles: 'transitiveFileCountPercentiles', + transitiveFileLineCountPercentiles: + 'transitiveFileLineCountPercentiles', + produceErrorsPotentialFileCount: 10, + produceErrorsPotentialFileLineCount: 11, + produceErrorsActualFileCount: 12, + produceErrorsActualFileLineCount: 13, + produceErrorsDurationMs: 14, + produceErrorsElementsDurationMs: 15, + ); final constructedEvent = generateEvent(); expect(generateEvent, returnsNormally); expect(constructedEvent.eventName, DashEvent.analysisStatistics); expect(constructedEvent.eventData['workingDuration'], 'workingDuration'); - expect(constructedEvent.eventData.length, 1); + expect(constructedEvent.eventData['withFineDependencies'], false); + expect(constructedEvent.eventData['changedFileEventCount'], 1); + expect(constructedEvent.eventData['removedFileEventCount'], 2); + expect(constructedEvent.eventData['changedFileUniqueCount'], 3); + expect(constructedEvent.eventData['removedFileUniqueCount'], 4); + expect(constructedEvent.eventData['immediateFileCountPercentiles'], + 'immediateFileCountPercentiles'); + expect(constructedEvent.eventData['immediateFileLineCountPercentiles'], + 'immediateFileLineCountPercentiles'); + expect(constructedEvent.eventData['transitiveFileCountPercentiles'], + 'transitiveFileCountPercentiles'); + expect(constructedEvent.eventData['transitiveFileLineCountPercentiles'], + 'transitiveFileLineCountPercentiles'); + expect(constructedEvent.eventData['produceErrorsPotentialFileCount'], 10); + expect( + constructedEvent.eventData['produceErrorsPotentialFileLineCount'], 11); + expect(constructedEvent.eventData['produceErrorsActualFileCount'], 12); + expect(constructedEvent.eventData['produceErrorsActualFileLineCount'], 13); + expect(constructedEvent.eventData['produceErrorsDurationMs'], 14); + expect(constructedEvent.eventData['produceErrorsElementsDurationMs'], 15); + expect(constructedEvent.eventData.length, 16); }); test('Event.analyticsCollectionEnabled constructed', () {