| File: Telemetry\MSBuildActivitySource.cs | Web Access |
| Project: src\msbuild\src\Framework\Microsoft.Build.Framework.csproj (Microsoft.Build.Framework) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. #if NETFRAMEWORK using Microsoft.VisualStudio.Telemetry; #else using System.Diagnostics; #endif namespace Microsoft.Build.Framework.Telemetry { /// <summary> /// Wrapper class for ActivitySource with a <see cref="StartActivity(string)"/> method that wraps Activity name with MSBuild prefix. /// On .NET Framework, activities are also forwarded to VS Telemetry. /// </summary> internal class MSBuildActivitySource { #if NETFRAMEWORK private readonly TelemetrySession? _telemetrySession; public MSBuildActivitySource(TelemetrySession? telemetrySession) { _telemetrySession = telemetrySession; } #else private readonly ActivitySource _source; public MSBuildActivitySource(string name) { _source = new ActivitySource(name); } #endif /// <summary> /// Starts a new activity with the appropriate telemetry prefix. /// </summary> /// <param name="name">Name of the telemetry event without prefix.</param> /// <returns>An <see cref="IActivity"/> wrapping the underlying Activity, or null if not sampled.</returns> public IActivity? StartActivity(string name) { string eventName = $"{TelemetryConstants.EventPrefix}{name}"; #if NETFRAMEWORK TelemetryScope<OperationEvent>? operation = _telemetrySession?.StartOperation(eventName); return operation != null ? new VsTelemetryActivity(operation) : null; #else Activity? activity = Activity.Current?.HasRemoteParent == true ? _source.StartActivity(eventName, ActivityKind.Internal, parentId: Activity.Current.ParentId) : _source.StartActivity(eventName); if (activity == null) { return null; } activity.SetTag("SampleRate", TelemetryConstants.DefaultSampleRate); return new DiagnosticActivity(activity); #endif } } }