File: Telemetry\ProfilingTelemetryContextTests.cs
Web Access
Project: src\tests\Aspire.Cli.Tests\Aspire.Cli.Tests.csproj (Aspire.Cli.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Diagnostics;
using Aspire.Cli.Telemetry;
using Aspire.Hosting;
using Aspire.Tests;
using Microsoft.Extensions.Configuration;
 
namespace Aspire.Cli.Tests.Telemetry;
 
public class ProfilingTelemetryContextTests
{
    [Fact]
    public void AddActivityContextToEnvironment_EmitsActivityValues()
    {
        using var source = new ActivitySource("test-profiling-context");
        using var listener = ActivityListenerHelper.Create(source);
        using var activity = source.StartActivity("parent");
        Assert.NotNull(activity);
 
        activity.SetBaggage(ProfilingTelemetry.Baggage.SessionId, "session-1");
        activity.TraceStateString = "state-1";
 
        var environment = new Dictionary<string, string>();
        ProfilingTelemetry.AddActivityContextToEnvironment(activity, environment);
 
        Assert.Equal("true", environment[ProfilingTelemetry.EnvironmentVariables.Enabled]);
        Assert.Equal("session-1", environment[ProfilingTelemetry.EnvironmentVariables.SessionId]);
        Assert.Equal(activity.Id, environment[ProfilingTelemetry.EnvironmentVariables.TraceParent]);
        Assert.Equal("state-1", environment[ProfilingTelemetry.EnvironmentVariables.TraceState]);
        Assert.Equal("true", environment[KnownConfigNames.Legacy.StartupProfilingEnabled]);
        Assert.Equal("session-1", environment[KnownConfigNames.Legacy.StartupOperationId]);
        Assert.Equal(activity.Id, environment[KnownConfigNames.Legacy.StartupTraceParent]);
        Assert.Equal("state-1", environment[KnownConfigNames.Legacy.StartupTraceState]);
    }
 
    [Fact]
    public void AddActivityContextToEnvironment_AllowsMissingActivity()
    {
        var environment = new Dictionary<string, string>();
 
        ProfilingTelemetry.AddActivityContextToEnvironment(null, environment);
 
        Assert.Empty(environment);
    }
 
    [Fact]
    public void AddActivityContextToEnvironment_IgnoresNonProfilingActivity()
    {
        using var source = new ActivitySource("test-profiling-context");
        using var listener = ActivityListenerHelper.Create(source);
        using var activity = source.StartActivity("parent");
        Assert.NotNull(activity);
 
        var environment = new Dictionary<string, string>();
        ProfilingTelemetry.AddActivityContextToEnvironment(activity, environment);
 
        Assert.Empty(environment);
    }
 
    [Fact]
    public void StartRunCommand_ContinuesConfiguredRemoteParentAndSession()
    {
        var startedActivities = new List<Activity>();
        using var profilingTelemetry = new ProfilingTelemetry(CreateConfiguration(
            (ProfilingTelemetry.EnvironmentVariables.Enabled, "true"),
            (ProfilingTelemetry.EnvironmentVariables.SessionId, "session-1"),
            (ProfilingTelemetry.EnvironmentVariables.TraceParent, "00-0102030405060708090a0b0c0d0e0f10-1112131415161718-01"),
            (ProfilingTelemetry.EnvironmentVariables.TraceState, "state-1")));
        using var listener = ActivityListenerHelper.Create(profilingTelemetry.ActivitySource, onActivityStarted: startedActivities.Add);
 
        using var activity = profilingTelemetry.StartRunCommand();
 
        Assert.True(activity.IsRunning);
        var startedActivity = Assert.Single(startedActivities, activity => activity.OperationName == ProfilingTelemetry.Activities.RunCommand);
        Assert.Equal("0102030405060708090a0b0c0d0e0f10", startedActivity.TraceId.ToString());
        Assert.Equal("session-1", startedActivity.GetBaggageItem(ProfilingTelemetry.Baggage.SessionId));
        Assert.Equal("session-1", startedActivity.GetTagItem(ProfilingTelemetry.Tags.ProfilingSessionId));
    }
 
    [Theory]
    [InlineData(null, false)]
    [InlineData("", false)]
    [InlineData("false", false)]
    [InlineData("0", false)]
    [InlineData("true", true)]
    [InlineData("TRUE", true)]
    [InlineData("1", true)]
    public void IsEnabled_ReturnsExpectedValue(string? enabled, bool expected)
    {
        var isEnabled = ProfilingTelemetry.IsProfilingEnabled(CreateConfiguration(
            (ProfilingTelemetry.EnvironmentVariables.Enabled, enabled)));
 
        Assert.Equal(expected, isEnabled);
    }
 
    [Fact]
    public void StartRunCommand_ReadsLegacyStartupNames()
    {
        var startedActivities = new List<Activity>();
        using var profilingTelemetry = new ProfilingTelemetry(CreateConfiguration(
            (KnownConfigNames.Legacy.StartupProfilingEnabled, "true"),
            (KnownConfigNames.Legacy.StartupOperationId, "session-1"),
            (KnownConfigNames.Legacy.StartupTraceParent, "00-0102030405060708090a0b0c0d0e0f10-1112131415161718-01"),
            (KnownConfigNames.Legacy.StartupTraceState, "state-1")));
        using var listener = ActivityListenerHelper.Create(profilingTelemetry.ActivitySource, onActivityStarted: startedActivities.Add);
 
        using var activity = profilingTelemetry.StartRunCommand();
 
        Assert.True(activity.IsRunning);
        var startedActivity = Assert.Single(startedActivities, activity => activity.OperationName == ProfilingTelemetry.Activities.RunCommand);
        Assert.Equal("0102030405060708090a0b0c0d0e0f10", startedActivity.TraceId.ToString());
        Assert.Equal("session-1", startedActivity.GetBaggageItem(ProfilingTelemetry.Baggage.SessionId));
    }
 
    private static IConfiguration CreateConfiguration(params (string Key, string? Value)[] values)
    {
        return new ConfigurationBuilder()
            .AddInMemoryCollection(values.Select(value => new KeyValuePair<string, string?>(value.Key, value.Value)))
            .Build();
    }
}