Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions pkgs/unified_analytics/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion pkgs/unified_analytics/lib/src/constants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
80 changes: 80 additions & 0 deletions pkgs/unified_analytics/lib/src/event.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Comment on lines +125 to +126
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The indentation for the wrapped line in this comment is incorrect. It should be aligned with the start of the text on the previous line to improve readability, following standard Dart documentation style.

Suggested change
/// * [immediateFileCountPercentiles] - json encoded percentile values for the
/// number of files in the immediate workspace.
/// * [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,
Comment on lines 112 to +173
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The named parameters in this constructor are not in alphabetical order. Sorting them alphabetically improves readability and makes it easier to find specific parameters. This aligns with the style guide's emphasis on readability.1

Suggested change
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,
required int changedFileEventCount,
required int changedFileUniqueCount,
required String immediateFileCountPercentiles,
required String immediateFileLineCountPercentiles,
required int produceErrorsActualFileCount,
required int produceErrorsActualFileLineCount,
required int produceErrorsDurationMs,
required int produceErrorsElementsDurationMs,
required int produceErrorsPotentialFileCount,
required int produceErrorsPotentialFileLineCount,
required int removedFileEventCount,
required int removedFileUniqueCount,
required String transitiveFileCountPercentiles,
required String transitiveFileLineCountPercentiles,
required bool withFineDependencies,
required String workingDuration,

Style Guide References

Footnotes

  1. Code should be optimized for readability, as it is read more often than it is written. Sorting parameters alphabetically improves readability.

}) : 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,
Comment on lines 116 to +196
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The keys in the eventData map are not in alphabetical order. Sorting them makes the code more readable and consistent with the suggested sorted constructor parameters. This aligns with the style guide's goal of optimizing for readability.1

Suggested change
'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,
'changedFileEventCount': changedFileEventCount,
'changedFileUniqueCount': changedFileUniqueCount,
'immediateFileCountPercentiles': immediateFileCountPercentiles,
'immediateFileLineCountPercentiles':
immediateFileLineCountPercentiles,
'produceErrorsActualFileCount': produceErrorsActualFileCount,
'produceErrorsActualFileLineCount':
produceErrorsActualFileLineCount,
'produceErrorsDurationMs': produceErrorsDurationMs,
'produceErrorsElementsDurationMs': produceErrorsElementsDurationMs,
'produceErrorsPotentialFileCount': produceErrorsPotentialFileCount,
'produceErrorsPotentialFileLineCount':
produceErrorsPotentialFileLineCount,
'removedFileEventCount': removedFileEventCount,
'removedFileUniqueCount': removedFileUniqueCount,
'transitiveFileCountPercentiles': transitiveFileCountPercentiles,
'transitiveFileLineCountPercentiles':
transitiveFileLineCountPercentiles,
'withFineDependencies': withFineDependencies,
'workingDuration': workingDuration,

Style Guide References

Footnotes

  1. Code should be optimized for readability. Sorting map keys alphabetically improves readability, especially for large maps.

},
);

Expand Down
2 changes: 1 addition & 1 deletion pkgs/unified_analytics/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
44 changes: 41 additions & 3 deletions pkgs/unified_analytics/test/event_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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,
);
Comment on lines +14 to +33
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

For consistency with the suggested changes in event.dart and to improve readability, the parameters in this Event.analysisStatistics call should be sorted alphabetically. This aligns with the style guide's emphasis on readability.1

Suggested change
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,
);
Event generateEvent() => Event.analysisStatistics(
changedFileEventCount: 1,
changedFileUniqueCount: 3,
immediateFileCountPercentiles: 'immediateFileCountPercentiles',
immediateFileLineCountPercentiles:
'immediateFileLineCountPercentiles',
produceErrorsActualFileCount: 12,
produceErrorsActualFileLineCount: 13,
produceErrorsDurationMs: 14,
produceErrorsElementsDurationMs: 15,
produceErrorsPotentialFileCount: 10,
produceErrorsPotentialFileLineCount: 11,
removedFileEventCount: 2,
removedFileUniqueCount: 4,
transitiveFileCountPercentiles: 'transitiveFileCountPercentiles',
transitiveFileLineCountPercentiles:
'transitiveFileLineCountPercentiles',
withFineDependencies: false,
workingDuration: 'workingDuration',
);

Style Guide References

Footnotes

  1. Code should be optimized for readability. Sorting parameters alphabetically in test data also improves readability and maintainability.


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);
Comment on lines 21 to +59
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

To improve readability and consistency, the expect calls checking the eventData properties should be sorted alphabetically by key. This makes the test easier to read and verify.1

    expect(constructedEvent.eventData['changedFileEventCount'], 1);
    expect(constructedEvent.eventData['changedFileUniqueCount'], 3);
    expect(constructedEvent.eventData['immediateFileCountPercentiles'],
        'immediateFileCountPercentiles');
    expect(constructedEvent.eventData['immediateFileLineCountPercentiles'],
        'immediateFileLineCountPercentiles');
    expect(constructedEvent.eventData['produceErrorsActualFileCount'], 12);
    expect(constructedEvent.eventData['produceErrorsActualFileLineCount'], 13);
    expect(constructedEvent.eventData['produceErrorsDurationMs'], 14);
    expect(constructedEvent.eventData['produceErrorsElementsDurationMs'], 15);
    expect(constructedEvent.eventData['produceErrorsPotentialFileCount'], 10);
    expect(
        constructedEvent.eventData['produceErrorsPotentialFileLineCount'], 11);
    expect(constructedEvent.eventData['removedFileEventCount'], 2);
    expect(constructedEvent.eventData['removedFileUniqueCount'], 4);
    expect(constructedEvent.eventData['transitiveFileCountPercentiles'],
        'transitiveFileCountPercentiles');
    expect(constructedEvent.eventData['transitiveFileLineCountPercentiles'],
        'transitiveFileLineCountPercentiles');
    expect(constructedEvent.eventData['withFineDependencies'], false);
    expect(constructedEvent.eventData['workingDuration'], 'workingDuration');

Style Guide References

Footnotes

  1. Code should be optimized for readability. Sorting assertions in tests makes them easier to read and verify.

expect(constructedEvent.eventData.length, 16);
});

test('Event.analyticsCollectionEnabled constructed', () {
Expand Down