From 63540409482dc11f78dd48e4cfb7cdf8f20dd7d1 Mon Sep 17 00:00:00 2001 From: Drew Noakes Date: Tue, 10 Dec 2024 23:34:03 +1100 Subject: [PATCH] Add error code to DTB error telemetry --- .../DesignTimeBuildLoggerProvider.cs | 41 +++++++++++-------- .../Telemetry/TelemetryPropertyName.cs | 4 +- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/DesignTimeBuilds/DesignTimeBuildLoggerProvider.cs b/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/DesignTimeBuilds/DesignTimeBuildLoggerProvider.cs index 87d731519b..2f6bdbf4a0 100644 --- a/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/DesignTimeBuilds/DesignTimeBuildLoggerProvider.cs +++ b/src/Microsoft.VisualStudio.ProjectSystem.Managed.VS/ProjectSystem/VS/DesignTimeBuilds/DesignTimeBuildLoggerProvider.cs @@ -60,24 +60,22 @@ private sealed class DesignTimeTelemetryLogger(ITelemetryService telemetryServic private readonly Dictionary _targetRecordById = new(capacity: 140); /// - /// The names of any targets that reported errors. Names may be hashed. - /// May be empty even when errors exist, as not all errors come from a target. + /// Data about any errors that occurred during the build. Note that design-time build + /// targets are supposed to be authored to respect ContinueOnError, so errors might + /// not fail the build. However it's still useful to know which targets reported errors. + /// + /// Similarly, this collection may be empty even when the build fails. /// /// /// Targets can run concurrently, so use of this collection must be protected by a lock. /// - private readonly List _errorTargets = []; + private readonly List _errors = []; /// /// Whether the build succeeded. /// private bool? _succeeded; - /// - /// The number of errors reported during the build. - /// - private int _errorCount; - LoggerVerbosity ILogger.Verbosity { get; set; } string? ILogger.Parameters { get; set; } @@ -115,14 +113,16 @@ void OnTargetFinished(object sender, TargetFinishedEventArgs e) void OnErrorRaised(object sender, BuildErrorEventArgs e) { - _errorCount++; + string? targetName = null; if (TryGetTargetRecord(e.BuildEventContext, out TargetRecord? record)) { - lock (_errorTargets) - { - _errorTargets.Add(GetHashedTargetName(record)); - } + targetName = GetHashedTargetName(record); + } + + lock (_errors) + { + _errors.Add(new(targetName, e.Code)); } } @@ -155,7 +155,7 @@ void ILogger.Shutdown() void SendTelemetry() { object[][] targetDurations; - string[] errorTargets; + ErrorData[] errors; lock (_targetRecordById) { @@ -168,7 +168,7 @@ void SendTelemetry() .Select(record => new object[] { GetHashedTargetName(record), record.Elapsed.Milliseconds }) .ToArray(); - errorTargets = _errorTargets.ToArray(); + errors = _errors.ToArray(); } telemetryService.PostProperties( @@ -176,8 +176,8 @@ void SendTelemetry() [ (TelemetryPropertyName.DesignTimeBuildComplete.Succeeded, _succeeded), (TelemetryPropertyName.DesignTimeBuildComplete.Targets, new ComplexPropertyValue(targetDurations)), - (TelemetryPropertyName.DesignTimeBuildComplete.ErrorCount, _errorCount), - (TelemetryPropertyName.DesignTimeBuildComplete.ErrorTargets, errorTargets), + (TelemetryPropertyName.DesignTimeBuildComplete.ErrorCount, errors.Length), + (TelemetryPropertyName.DesignTimeBuildComplete.Errors, new ComplexPropertyValue(errors)), ]); } @@ -232,5 +232,12 @@ private sealed record class TargetRecord(string TargetName, bool IsMicrosoft, Da public TimeSpan Elapsed => Ended - Started; } + + /// + /// Data about errors reported during design-time builds. + /// + /// Names of the targets that reported the error. May be hashed. if the target name could not be identified. + /// An error code that identifies the type of error. + private sealed record class ErrorData(string? TargetName, string ErrorCode); } } diff --git a/src/Microsoft.VisualStudio.ProjectSystem.Managed/Telemetry/TelemetryPropertyName.cs b/src/Microsoft.VisualStudio.ProjectSystem.Managed/Telemetry/TelemetryPropertyName.cs index 5ae6d62343..0b9ff4e26e 100644 --- a/src/Microsoft.VisualStudio.ProjectSystem.Managed/Telemetry/TelemetryPropertyName.cs +++ b/src/Microsoft.VisualStudio.ProjectSystem.Managed/Telemetry/TelemetryPropertyName.cs @@ -199,9 +199,9 @@ public static class DesignTimeBuildComplete public const string ErrorCount = "vs.projectsystem.managed.designtimebuildcomplete.errorcount"; /// - /// The names of targets that failed during the design-time build. + /// Data about errors that occur during design-time builds. /// - public const string ErrorTargets = "vs.projectsystem.managed.designtimebuildcomplete.errortargets"; + public const string Errors = "vs.projectsystem.managed.designtimebuildcomplete.errors"; } public static class SDKVersion