Skip to content

Commit 661d4a6

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Send analysis_statistics events to analytics.
Change-Id: Idd2350803bf20b2cc59cfe98a8053d235d1ae108 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/453104 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 477b4ca commit 661d4a6

File tree

4 files changed

+70
-1
lines changed

4 files changed

+70
-1
lines changed

DEPS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ vars = {
147147
"sync_http_rev": "6666fff944221891182e1f80bf56569338164d72",
148148
"tar_rev": "13479f7c2a18f499e840ad470cfcca8c579f6909",
149149
"test_rev": "a16f14975c5625ef99abc71f7e91bca5d8e55054",
150-
"tools_rev": "19f91a030f5cef908820efade7e7638aea0248ac",
150+
"tools_rev": "ce9d2ad5d246329af04cf03e1203ee665886741b",
151151
"vector_math_rev": "a7b7e9ccb931348dbfa669e0f8fea1bf97705b16",
152152
"web_rev": "816abcc1bf186f61c7e66e7f4c56d1554a61ab27",
153153
"webdev_rev": "0b2a408f6f64a29cd0d18ac7d2d407a4e1db8e0f",

pkg/analysis_server/lib/src/analysis_server.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,7 @@ abstract class AnalysisServer {
823823
_isFirstAnalysisSinceContextsBuilt = false;
824824
_dartFixPrompt.triggerCheck();
825825
}
826+
analyticsManager.analysisStatusChanged(status.isWorking);
826827
}
827828

828829
/// Immediately handles an LSP message by delegating to the

pkg/analysis_server/lib/src/analytics/analytics_manager.dart

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:analysis_server/protocol/protocol_constants.dart';
1010
import 'package:analysis_server/src/analytics/active_request_data.dart';
1111
import 'package:analysis_server/src/analytics/context_structure.dart';
1212
import 'package:analysis_server/src/analytics/notification_data.dart';
13+
import 'package:analysis_server/src/analytics/percentile_calculator.dart';
1314
import 'package:analysis_server/src/analytics/plugin_data.dart';
1415
import 'package:analysis_server/src/analytics/request_data.dart';
1516
import 'package:analysis_server/src/analytics/session_data.dart';
@@ -83,6 +84,13 @@ class AnalyticsManager {
8384
/// represented by the key.
8485
final Map<String, Map<String, int>> _severityAdjustments = {};
8586

87+
/// The start time of the current window during which analysis was working,
88+
/// or `null` if analysis is currently idle.
89+
DateTime? _analysisWorkingStart;
90+
91+
/// Accumulates durations (in ms) of periods where analysis was working.
92+
final PercentileCalculator _analysisWorkingDurations = PercentileCalculator();
93+
8694
/// A periodic timer used to send analytics data. This timer should be
8795
/// cancelled at shutdown.
8896
Timer? periodicTimer;
@@ -128,6 +136,15 @@ class AnalyticsManager {
128136
);
129137
}
130138

139+
/// Called when analysis status changes to record period durations.
140+
void analysisStatusChanged(bool isWorking) {
141+
if (isWorking) {
142+
_analysisWorkingStart ??= DateTime.now();
143+
} else {
144+
_finalizeOpenWorkingPeriod();
145+
}
146+
}
147+
131148
/// Record that the set of plugins known to the [pluginManager] has changed.
132149
void changedPlugins(PluginManager pluginManager) {
133150
_pluginData.recordPlugins(pluginManager);
@@ -431,6 +448,13 @@ class AnalyticsManager {
431448
buffer.writeln('</ul>');
432449
}
433450

451+
if (_analysisWorkingDurations.valueCount > 0) {
452+
h3('Analysis status periods');
453+
buffer.writeln('<ul>');
454+
li('workingDurations: ${_analysisWorkingDurations.toAnalyticsString()}');
455+
buffer.writeln('</ul>');
456+
}
457+
434458
if (_lintUsageCounts.isNotEmpty) {
435459
h3('Lint usage counts');
436460
buffer.writeln('<ul>');
@@ -478,6 +502,16 @@ class AnalyticsManager {
478502
return buffer.toString();
479503
}
480504

505+
void _finalizeOpenWorkingPeriod() {
506+
if (_analysisWorkingStart case var workingStart?) {
507+
var durationMilliseconds =
508+
DateTime.now().millisecondsSinceEpoch -
509+
workingStart.millisecondsSinceEpoch;
510+
_analysisWorkingDurations.addValue(durationMilliseconds);
511+
_analysisWorkingStart = null;
512+
}
513+
}
514+
481515
/// Record that the request with the given [id] was responded to at the given
482516
/// [sendTime].
483517
void _recordResponseData(String id, DateTime sendTime) {
@@ -525,6 +559,19 @@ class AnalyticsManager {
525559
}
526560
}
527561

562+
/// Send information about analysis statistics.
563+
Future<void> _sendAnalysisStatistics() async {
564+
if (_analysisWorkingDurations.valueCount == 0) {
565+
return;
566+
}
567+
analytics.send(
568+
Event.analysisStatistics(
569+
workingDuration: _analysisWorkingDurations.toAnalyticsString(),
570+
),
571+
);
572+
_analysisWorkingDurations.clear();
573+
}
574+
528575
/// Send information about the number of times each lint is enabled in an
529576
/// analysis options file.
530577
Future<void> _sendLintUsageCounts() async {
@@ -564,6 +611,7 @@ class AnalyticsManager {
564611
await _sendNotificationHandlingTimes();
565612
await _sendLintUsageCounts();
566613
await _sendSeverityAdjustments();
614+
await _sendAnalysisStatistics();
567615
}
568616

569617
/// Send information about the response times of plugins.

pkg/analysis_server/test/src/analytics/analytics_manager_test.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,23 @@ class AnalyticsManagerTest with ResourceProviderMixin {
150150
]);
151151
}
152152

153+
Future<void> test_server_notification_analysisStatistics() async {
154+
_defaultStartup();
155+
156+
// Record a brief working period.
157+
manager.analysisStatusChanged(true);
158+
await Future<void>.delayed(const Duration(milliseconds: 2));
159+
manager.analysisStatusChanged(false);
160+
161+
await manager.shutdown();
162+
analytics.assertEvents([
163+
_ExpectedEvent.session(),
164+
_ExpectedEvent.analysisStatistics(
165+
eventData: {'workingDuration': _IsPercentiles()},
166+
),
167+
]);
168+
}
169+
153170
Future<void> test_server_request_analysisDidChangeWorkspaceFolders() async {
154171
_defaultStartup();
155172
var params = DidChangeWorkspaceFoldersParams(
@@ -516,6 +533,9 @@ class _ExpectedEvent {
516533

517534
_ExpectedEvent(this.eventName, this.eventData);
518535

536+
_ExpectedEvent.analysisStatistics({Map<String, Object?>? eventData})
537+
: this(DashEvent.analysisStatistics, eventData);
538+
519539
_ExpectedEvent.commandExecuted({Map<String, Object?>? eventData})
520540
: this(DashEvent.commandExecuted, eventData);
521541

0 commit comments

Comments
 (0)