blob: 3942f8cd6fb946f379cfd1e32cc19bb01e283376 [file] [log] [blame] [edit]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/src/analytics/percentile_calculator.dart';
import 'package:analyzer/src/dart/analysis/status.dart';
import 'package:analyzer/src/fine/requirement_failure.dart';
/// Accumulated statistics over multiple analysis working periods.
class AnalyticsAnalysisWorkingStatistics {
final bool withFineDependencies;
/// Files changed before the described set of working period.
/// Usually probably small, as the user works in a few files.
final Set<String> uniqueChangedFiles = {};
/// The total number of change file events.
int changeFileEventCount = 0;
/// Files removed before the described working period.
/// Usually hopefully zero, as this is expensive operation.
final Set<String> uniqueRemovedFiles = {};
/// The total number of change file events.
int removeFileEventCount = 0;
/// The number of immediate files that were analyzed.
///
/// Allows us to understand if the number of files was changing significantly
/// over the period.
final PercentileCalculator immediateFileCountPercentiles =
PercentileCalculator();
/// The number of lines in the immediate files.
final PercentileCalculator immediateFileLineCountPercentiles =
PercentileCalculator();
/// The number of transitive files. If a single file is referenced from
/// multiple analysis drivers, it will be counted multiple times.
///
/// Allows us to understand the kind of the workspace: many dependencies,
/// small application; or few dependencies and relatively large application.
final PercentileCalculator transitiveFileCountPercentiles =
PercentileCalculator();
/// The number of lines in the same files that are included in the
/// [transitiveFileCountPercentiles].
final PercentileCalculator transitiveFileLineCountPercentiles =
PercentileCalculator();
/// The time for producing errors (background file analysis).
int produceErrorsMs = 0;
/// The time for loading elements while producing errors.
int produceErrorsElementsMs = 0;
/// The count of files that we initially decided to produce errors.
int produceErrorsPotentialFileCount = 0;
/// The sum of line counts for [produceErrorsActualFileCount].
int produceErrorsPotentialFileLineCount = 0;
/// The count of files that were actually analyzed, as opposite to
/// producing errors from the cache, or not producing because no changes.
int produceErrorsActualFileCount = 0;
/// The sum of line counts for [produceErrorsActualFileCount].
int produceErrorsActualFileLineCount = 0;
/// The counts of requirement failures for library diagnostics bundles.
final Map<RequirementFailureKindId, int>
libraryDiagnosticsBundleRequirementsFailures = {};
AnalyticsAnalysisWorkingStatistics({required this.withFineDependencies});
void append(AnalysisStatusWorkingStatistics statistics) {
uniqueChangedFiles.addAll(statistics.changedFiles);
uniqueRemovedFiles.addAll(statistics.removedFiles);
changeFileEventCount += statistics.changedFiles.length;
removeFileEventCount += statistics.removedFiles.length;
immediateFileCountPercentiles.addValue(
statistics.fileCounts.immediateFileCount,
);
immediateFileLineCountPercentiles.addValue(
statistics.fileCounts.immediateFileLineCount,
);
transitiveFileCountPercentiles.addValue(
statistics.fileCounts.transitiveFileCount,
);
transitiveFileLineCountPercentiles.addValue(
statistics.fileCounts.transitiveFileLineCount,
);
produceErrorsMs += statistics.produceErrorsTimer.elapsedMilliseconds;
produceErrorsElementsMs +=
statistics.produceErrorsElementsTimer.elapsedMilliseconds;
produceErrorsPotentialFileCount +=
statistics.produceErrorsPotentialFileCount;
produceErrorsPotentialFileLineCount +=
statistics.produceErrorsPotentialFileLineCount;
produceErrorsActualFileCount += statistics.produceErrorsActualFileCount;
produceErrorsActualFileLineCount +=
statistics.produceErrorsActualFileLineCount;
for (var entry
in statistics.libraryDiagnosticsBundleRequirementsFailures.entries) {
libraryDiagnosticsBundleRequirementsFailures.update(
entry.key,
(value) => value + entry.value,
ifAbsent: () => entry.value,
);
}
}
}
/// Data about the current session.
class SessionData {
/// The time at which the current session started.
final DateTime startTime;
/// The command-line arguments passed to the server on startup.
final String commandLineArguments;
/// The parameters passed on initialize.
String initializeParams = '';
/// The name of the client that started the server.
final String clientId;
/// The version of the client that started the server, or an empty string if
/// no version information was provided.
final String clientVersion;
/// Initialize a newly created data holder.
SessionData({
required this.startTime,
required this.commandLineArguments,
required this.clientId,
required this.clientVersion,
});
}