File: Sampling\TraceBasedSamplerTests.cs
Web Access
Project: src\test\Libraries\Microsoft.Extensions.Telemetry.Tests\Microsoft.Extensions.Telemetry.Tests.csproj (Microsoft.Extensions.Telemetry.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;
using System.Collections.Generic;
using System.Diagnostics;
using Microsoft.Extensions.Diagnostics.Sampling;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Xunit;
 
namespace Microsoft.Extensions.Telemetry.Sampling;
 
public class TraceBasedSamplerTests
{
    private readonly InvalidOperationException _dummyException = new("test.");
    private readonly IReadOnlyList<KeyValuePair<string, object?>> _dummyState = [];
    private readonly Func<IReadOnlyList<KeyValuePair<string, object?>>, Exception?, string> _dummyFormatter = (_, _) => string.Empty;
 
    [Fact]
    public void WhenNoActivity_SamplesIn()
    {
        // Arrange
        var sampler = new TraceBasedSampler();
 
        // Act
        bool shouldSample = sampler.ShouldSample(
            new LogEntry<IReadOnlyList<KeyValuePair<string, object?>>>(
                LogLevel.Trace, nameof(WhenNoActivity_SamplesIn), 0, _dummyState, _dummyException, _dummyFormatter));
 
        // Assert
        Assert.True(shouldSample);
    }
 
    [Fact]
    public void WhenActivityIsRecorded_SamplesIn()
    {
        // Arrange
        var sampler = new TraceBasedSampler();
 
        // Act
        using var activity = new Activity("my activity");
        activity.ActivityTraceFlags |= ActivityTraceFlags.Recorded;
        activity.Start();
 
        bool shouldSample = sampler.ShouldSample(
            new LogEntry<IReadOnlyList<KeyValuePair<string, object?>>>(
                LogLevel.Trace, nameof(WhenActivityIsRecorded_SamplesIn), 0, _dummyState, _dummyException, _dummyFormatter));
 
        // Assert
        Assert.True(shouldSample);
 
        activity.Stop();
    }
 
    [Fact]
    public void WhenActivityIsNotRecorded_SamplesOut()
    {
        // Arrange
        var sampler = new TraceBasedSampler();
 
        // Act
        using var activity = new Activity("my activity");
        activity.ActivityTraceFlags &= ~ActivityTraceFlags.Recorded;
        activity.Start();
 
        bool shouldSample = sampler.ShouldSample(
            new LogEntry<IReadOnlyList<KeyValuePair<string, object?>>>(
                LogLevel.Trace, nameof(WhenActivityIsNotRecorded_SamplesOut), 0, _dummyState, _dummyException, _dummyFormatter));
 
        // Assert
        Assert.False(shouldSample);
 
        activity.Stop();
    }
}