Skip to content
20 changes: 20 additions & 0 deletions src/Build.UnitTests/Telemetry/OpenTelemetryManager_Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<BuildManager.DeferredBuildMessage>();
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 */

/// <summary>
Expand Down
2 changes: 0 additions & 2 deletions src/Build.UnitTests/Telemetry/Telemetry_Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
23 changes: 22 additions & 1 deletion src/Build/BackEnd/BuildManager/BuildManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,8 @@ private void UpdatePriority(Process p, ProcessPriorityClass priority)
/// <exception cref="InvalidOperationException">Thrown if a build is already in progress.</exception>
public void BeginBuild(BuildParameters parameters)
{
OpenTelemetryManager.Instance.Initialize(isStandalone: false);
InitializeTelemetry();

if (_previousLowPriority != null)
{
if (parameters.LowPriority != _previousLowPriority)
Expand Down Expand Up @@ -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<DeferredBuildMessage> 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
/// <summary>
/// Configure the build to use I/O tracking for nodes.
Expand Down
3 changes: 3 additions & 0 deletions src/Build/Resources/Strings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -2392,6 +2392,9 @@ Utilization: {0} Average Utilization: {1:###.0}</value>
<value>succeeded: {0}</value>
<comment>{0} whole number</comment>
</data>
<data name="OpenTelemetryLoadFailed" xml:space="preserve">
<value>Loading telemetry libraries failed with exception: {0}.</value>
</data>
<!--
The Build message bucket is: MSB4000 - MSB4999

Expand Down
5 changes: 5 additions & 0 deletions src/Build/Resources/xlf/Strings.cs.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Build/Resources/xlf/Strings.de.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Build/Resources/xlf/Strings.es.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Build/Resources/xlf/Strings.fr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Build/Resources/xlf/Strings.it.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Build/Resources/xlf/Strings.ja.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Build/Resources/xlf/Strings.ko.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Build/Resources/xlf/Strings.pl.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Build/Resources/xlf/Strings.pt-BR.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Build/Resources/xlf/Strings.ru.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Build/Resources/xlf/Strings.tr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Build/Resources/xlf/Strings.zh-Hans.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/Build/Resources/xlf/Strings.zh-Hant.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/Framework/Telemetry/OpenTelemetryManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ internal class OpenTelemetryManager
private IOpenTelemetryCollector? _collector;
#endif

public string? LoadFailureExceptionMessage { get; set; }

/// <summary>
/// Optional activity source for MSBuild or other telemetry usage.
/// </summary>
Expand Down Expand Up @@ -104,6 +106,7 @@ public void Initialize(bool isStandalone)
{
// catch exceptions from loading the OTel SDK or Collector to maintain usability of Microsoft.Build.Framework package in our and downstream tests in VS.
_telemetryState = TelemetryState.Unsampled;
LoadFailureExceptionMessage = ex.ToString();
return;
}
#endif
Expand Down
Loading