diff --git a/src/Build.UnitTests/Telemetry/OpenTelemetryManager_Tests.cs b/src/Build.UnitTests/Telemetry/OpenTelemetryManager_Tests.cs index 323326401c6..b10cf9465d4 100644 --- a/src/Build.UnitTests/Telemetry/OpenTelemetryManager_Tests.cs +++ b/src/Build.UnitTests/Telemetry/OpenTelemetryManager_Tests.cs @@ -2,7 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Collections.Generic; +using System.Linq; using System.Reflection; +using Microsoft.Build.Execution; using Microsoft.Build.Framework.Telemetry; using Microsoft.Build.UnitTests; using Shouldly; @@ -98,6 +101,23 @@ public void Initialize_ShouldNoOp_WhenCalledMultipleTimes() state2.ShouldBe(false); } + [Fact] + public void TelemetryLoadFailureIsLoggedOnce() + { + OpenTelemetryManager.Instance.LoadFailureExceptionMessage = new System.IO.FileNotFoundException().ToString(); + using BuildManager bm = new BuildManager(); + var deferredMessages = new List(); + bm.BeginBuild(new BuildParameters(), deferredMessages); + deferredMessages.ShouldContain(x => x.Text.Contains("FileNotFound")); + bm.EndBuild(); + bm.BeginBuild(new BuildParameters()); + bm.EndBuild(); + + // should not add message twice + int count = deferredMessages.Count(x => x.Text.Contains("FileNotFound")); + count.ShouldBe(1); + } + /* Helper methods */ /// diff --git a/src/Build.UnitTests/Telemetry/Telemetry_Tests.cs b/src/Build.UnitTests/Telemetry/Telemetry_Tests.cs index 6154403ab83..6939eda86e5 100644 --- a/src/Build.UnitTests/Telemetry/Telemetry_Tests.cs +++ b/src/Build.UnitTests/Telemetry/Telemetry_Tests.cs @@ -5,9 +5,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; -#if NET using System.Text.Json; -#endif using Microsoft.Build.Execution; using Microsoft.Build.Framework; using Microsoft.Build.Framework.Telemetry; diff --git a/src/Build/BackEnd/BuildManager/BuildManager.cs b/src/Build/BackEnd/BuildManager/BuildManager.cs index a60bd4ed0d8..ce330e93bdd 100644 --- a/src/Build/BackEnd/BuildManager/BuildManager.cs +++ b/src/Build/BackEnd/BuildManager/BuildManager.cs @@ -459,7 +459,8 @@ private void UpdatePriority(Process p, ProcessPriorityClass priority) /// Thrown if a build is already in progress. public void BeginBuild(BuildParameters parameters) { - OpenTelemetryManager.Instance.Initialize(isStandalone: false); + InitializeTelemetry(); + if (_previousLowPriority != null) { if (parameters.LowPriority != _previousLowPriority) @@ -723,6 +724,26 @@ void InitializeCaches() } } + private void InitializeTelemetry() + { + OpenTelemetryManager.Instance.Initialize(isStandalone: false); + string? failureMessage = OpenTelemetryManager.Instance.LoadFailureExceptionMessage; + if (_deferredBuildMessages != null && + failureMessage != null && + _deferredBuildMessages is ICollection deferredBuildMessagesCollection) + { + deferredBuildMessagesCollection.Add( + new DeferredBuildMessage( + ResourceUtilities.FormatResourceStringIgnoreCodeAndKeyword( + "OpenTelemetryLoadFailed", + failureMessage), + MessageImportance.Low)); + + // clean up the message from OpenTelemetryManager to avoid double logging it + OpenTelemetryManager.Instance.LoadFailureExceptionMessage = null; + } + } + #if FEATURE_REPORTFILEACCESSES /// /// Configure the build to use I/O tracking for nodes. diff --git a/src/Build/Resources/Strings.resx b/src/Build/Resources/Strings.resx index f36cdbcde75..f982a2c84e5 100644 --- a/src/Build/Resources/Strings.resx +++ b/src/Build/Resources/Strings.resx @@ -2392,6 +2392,9 @@ Utilization: {0} Average Utilization: {1:###.0} succeeded: {0} {0} whole number + + Loading telemetry libraries failed with exception: {0}. +