Skip to content

Commit b99f36b

Browse files
authored
log telemetry load failures (#11613)
* log telemetry load failure * fix buildmanager state in test * fix usings broken by merge * fix race condition
1 parent a9d68ab commit b99f36b

18 files changed

+113
-3
lines changed

Diff for: src/Build.UnitTests/Telemetry/OpenTelemetryManager_Tests.cs

+20
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System;
5+
using System.Collections.Generic;
6+
using System.Linq;
57
using System.Reflection;
8+
using Microsoft.Build.Execution;
69
using Microsoft.Build.Framework.Telemetry;
710
using Microsoft.Build.UnitTests;
811
using Shouldly;
@@ -98,6 +101,23 @@ public void Initialize_ShouldNoOp_WhenCalledMultipleTimes()
98101
state2.ShouldBe(false);
99102
}
100103

104+
[Fact]
105+
public void TelemetryLoadFailureIsLoggedOnce()
106+
{
107+
OpenTelemetryManager.Instance.LoadFailureExceptionMessage = new System.IO.FileNotFoundException().ToString();
108+
using BuildManager bm = new BuildManager();
109+
var deferredMessages = new List<BuildManager.DeferredBuildMessage>();
110+
bm.BeginBuild(new BuildParameters(), deferredMessages);
111+
deferredMessages.ShouldContain(x => x.Text.Contains("FileNotFound"));
112+
bm.EndBuild();
113+
bm.BeginBuild(new BuildParameters());
114+
bm.EndBuild();
115+
116+
// should not add message twice
117+
int count = deferredMessages.Count(x => x.Text.Contains("FileNotFound"));
118+
count.ShouldBe(1);
119+
}
120+
101121
/* Helper methods */
102122

103123
/// <summary>

Diff for: src/Build.UnitTests/Telemetry/Telemetry_Tests.cs

-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
using System.Collections.Generic;
66
using System.Diagnostics;
77
using System.Linq;
8-
#if NET
98
using System.Text.Json;
10-
#endif
119
using Microsoft.Build.Execution;
1210
using Microsoft.Build.Framework;
1311
using Microsoft.Build.Framework.Telemetry;

Diff for: src/Build/BackEnd/BuildManager/BuildManager.cs

+22-1
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,8 @@ private void UpdatePriority(Process p, ProcessPriorityClass priority)
459459
/// <exception cref="InvalidOperationException">Thrown if a build is already in progress.</exception>
460460
public void BeginBuild(BuildParameters parameters)
461461
{
462-
OpenTelemetryManager.Instance.Initialize(isStandalone: false);
462+
InitializeTelemetry();
463+
463464
if (_previousLowPriority != null)
464465
{
465466
if (parameters.LowPriority != _previousLowPriority)
@@ -723,6 +724,26 @@ void InitializeCaches()
723724
}
724725
}
725726

727+
private void InitializeTelemetry()
728+
{
729+
OpenTelemetryManager.Instance.Initialize(isStandalone: false);
730+
string? failureMessage = OpenTelemetryManager.Instance.LoadFailureExceptionMessage;
731+
if (_deferredBuildMessages != null &&
732+
failureMessage != null &&
733+
_deferredBuildMessages is ICollection<DeferredBuildMessage> deferredBuildMessagesCollection)
734+
{
735+
deferredBuildMessagesCollection.Add(
736+
new DeferredBuildMessage(
737+
ResourceUtilities.FormatResourceStringIgnoreCodeAndKeyword(
738+
"OpenTelemetryLoadFailed",
739+
failureMessage),
740+
MessageImportance.Low));
741+
742+
// clean up the message from OpenTelemetryManager to avoid double logging it
743+
OpenTelemetryManager.Instance.LoadFailureExceptionMessage = null;
744+
}
745+
}
746+
726747
#if FEATURE_REPORTFILEACCESSES
727748
/// <summary>
728749
/// Configure the build to use I/O tracking for nodes.

Diff for: src/Build/Resources/Strings.resx

+3
Original file line numberDiff line numberDiff line change
@@ -2392,6 +2392,9 @@ Utilization: {0} Average Utilization: {1:###.0}</value>
23922392
<value>succeeded: {0}</value>
23932393
<comment>{0} whole number</comment>
23942394
</data>
2395+
<data name="OpenTelemetryLoadFailed" xml:space="preserve">
2396+
<value>Loading telemetry libraries failed with exception: {0}.</value>
2397+
</data>
23952398
<!--
23962399
The Build message bucket is: MSB4000 - MSB4999
23972400

Diff for: src/Build/Resources/xlf/Strings.cs.xlf

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Build/Resources/xlf/Strings.de.xlf

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Build/Resources/xlf/Strings.es.xlf

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Build/Resources/xlf/Strings.fr.xlf

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Build/Resources/xlf/Strings.it.xlf

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Build/Resources/xlf/Strings.ja.xlf

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Build/Resources/xlf/Strings.ko.xlf

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Build/Resources/xlf/Strings.pl.xlf

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Build/Resources/xlf/Strings.pt-BR.xlf

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Build/Resources/xlf/Strings.ru.xlf

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Build/Resources/xlf/Strings.tr.xlf

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Build/Resources/xlf/Strings.zh-Hans.xlf

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Build/Resources/xlf/Strings.zh-Hant.xlf

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/Framework/Telemetry/OpenTelemetryManager.cs

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ internal class OpenTelemetryManager
3939
private IOpenTelemetryCollector? _collector;
4040
#endif
4141

42+
public string? LoadFailureExceptionMessage { get; set; }
43+
4244
/// <summary>
4345
/// Optional activity source for MSBuild or other telemetry usage.
4446
/// </summary>
@@ -104,6 +106,7 @@ public void Initialize(bool isStandalone)
104106
{
105107
// catch exceptions from loading the OTel SDK or Collector to maintain usability of Microsoft.Build.Framework package in our and downstream tests in VS.
106108
_telemetryState = TelemetryState.Unsampled;
109+
LoadFailureExceptionMessage = ex.ToString();
107110
return;
108111
}
109112
#endif

0 commit comments

Comments
 (0)