File: Sampling\LogSamplingRuleSelectorTests.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.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Diagnostics.Sampling;
using Microsoft.Extensions.Logging;
using Xunit;
 
namespace Microsoft.Extensions.Telemetry.Sampling;
 
public class LogSamplingRuleSelectorTests
{
    private readonly LogSamplingRuleSelector<RandomProbabilisticSamplerFilterRule> _ruleSelector = new();
 
    [Fact]
    public void SelectsRightRule()
    {
        // Arrange
        var rules = new List<RandomProbabilisticSamplerFilterRule>
        {
            new RandomProbabilisticSamplerFilterRule (probability: 0),
            new RandomProbabilisticSamplerFilterRule (probability: 0, eventId: 1),
            new RandomProbabilisticSamplerFilterRule (probability: 0, logLevel: LogLevel.Information, eventId: 1 ),
            new RandomProbabilisticSamplerFilterRule (probability: 0, logLevel: LogLevel.Information, eventId: 1 ),
            new RandomProbabilisticSamplerFilterRule (probability: 0, logLevel: LogLevel.Warning),
            new RandomProbabilisticSamplerFilterRule (probability: 0, logLevel : LogLevel.Warning, eventId : 2),
            new RandomProbabilisticSamplerFilterRule (probability: 0, logLevel : LogLevel.Warning, eventId : 1),
            new RandomProbabilisticSamplerFilterRule (probability: 0, categoryName: "Program1.MyLogger", logLevel: LogLevel.Warning, eventId: 1),
            new RandomProbabilisticSamplerFilterRule (probability : 0, categoryName : "Program.*MyLogger1", logLevel : LogLevel.Warning, eventId : 1),
            new RandomProbabilisticSamplerFilterRule (probability : 0, categoryName : "Program.MyLogger", logLevel : LogLevel.Warning, eventId : 1), // the best rule
            new RandomProbabilisticSamplerFilterRule (probability : 0, categoryName : "Program.MyLogger", logLevel : LogLevel.Warning, eventId : 2),
            new RandomProbabilisticSamplerFilterRule (probability : 0, categoryName : "Program.MyLogger", eventId : 1),
            new RandomProbabilisticSamplerFilterRule (probability : 0, logLevel : LogLevel.Warning, eventId : 1),
            new RandomProbabilisticSamplerFilterRule (probability : 0, categoryName : "Program", logLevel : LogLevel.Warning, eventId : 1),
            new RandomProbabilisticSamplerFilterRule (probability : 0, categoryName : "Program.MyLogger", logLevel : LogLevel.Warning),
            new RandomProbabilisticSamplerFilterRule (probability : 0, categoryName : "Program.MyLogger", logLevel : LogLevel.Error, eventId : 1),
        };
 
        // Act
        RandomProbabilisticSamplerFilterRule? actualResult = _ruleSelector.Select(rules, "Program.MyLogger", LogLevel.Warning, 1);
 
        // Assert
        Assert.Same(rules[9], actualResult);
    }
 
    [Fact]
    public void WhenManyRuleApply_SelectsLast()
    {
        // Arrange
        var rules = new List<RandomProbabilisticSamplerFilterRule>
        {
            new RandomProbabilisticSamplerFilterRule(probability : 0, logLevel : LogLevel.Information, eventId : 1),
            new RandomProbabilisticSamplerFilterRule(probability : 0, logLevel : LogLevel.Information, eventId : 1),
            new RandomProbabilisticSamplerFilterRule(probability: 0, logLevel: LogLevel.Warning),
            new RandomProbabilisticSamplerFilterRule(probability : 0, logLevel : LogLevel.Warning, eventId : 2),
            new RandomProbabilisticSamplerFilterRule(probability : 0, logLevel : LogLevel.Warning, eventId : 1),
            new RandomProbabilisticSamplerFilterRule(probability : 0, categoryName : "Program1.MyLogger", logLevel : LogLevel.Warning, eventId : 1),
            new RandomProbabilisticSamplerFilterRule(probability : 0, categoryName : "Program.*MyLogger1", logLevel : LogLevel.Warning, eventId : 1),
            new RandomProbabilisticSamplerFilterRule(probability : 0, categoryName : "Program.MyLogger", logLevel : LogLevel.Warning, eventId : 1), // the best rule
            new RandomProbabilisticSamplerFilterRule(probability: 0, categoryName: "Program.MyLogger*", logLevel: LogLevel.Warning, eventId: 1), // same as the best, but last, and should be selected
        };
 
        // Act
        RandomProbabilisticSamplerFilterRule? actualResult = _ruleSelector.Select(rules, "Program.MyLogger", LogLevel.Warning, 1);
 
        // Assert
        Assert.Same(rules.Last(), actualResult);
    }
 
    [Fact]
    public void SelectsRuleBasedOnLogLevel()
    {
        // Arrange
        var rules = new List<RandomProbabilisticSamplerFilterRule>
        {
            new RandomProbabilisticSamplerFilterRule(probability: 0, logLevel: LogLevel.Information),
            new RandomProbabilisticSamplerFilterRule(probability: 0, logLevel: LogLevel.Warning), // the best rule
            new RandomProbabilisticSamplerFilterRule(probability: 0, logLevel: LogLevel.Error),
        };
 
        // Act
        RandomProbabilisticSamplerFilterRule? actualResult = _ruleSelector.Select(rules, "AnyCategory", LogLevel.Warning, 0);
 
        // Assert
        Assert.Same(rules[1], actualResult);
    }
 
    [Fact]
    public void SelectsRuleBasedOnEventId()
    {
        // Arrange
        var rules = new List<RandomProbabilisticSamplerFilterRule>
        {
            new RandomProbabilisticSamplerFilterRule(probability: 0, eventId: 1),
            new RandomProbabilisticSamplerFilterRule(probability: 0, eventId: 2), // the best rule
            new RandomProbabilisticSamplerFilterRule(probability: 0, eventId: 3),
        };
 
        // Act
        RandomProbabilisticSamplerFilterRule? actualResult = _ruleSelector.Select(rules, "AnyCategory", LogLevel.Information, 2);
 
        // Assert
        Assert.Same(rules[1], actualResult);
    }
 
    [Fact]
    public void SelectsRuleBasedOnLogLevelAndEventId()
    {
        // Arrange
        var rules = new List<RandomProbabilisticSamplerFilterRule>
        {
            new RandomProbabilisticSamplerFilterRule(probability: 0, logLevel: LogLevel.Information, eventId: 1),
            new RandomProbabilisticSamplerFilterRule(probability: 0, logLevel: LogLevel.Warning, eventId: 2), // the best rule
            new RandomProbabilisticSamplerFilterRule(probability: 0, logLevel: LogLevel.Error, eventId: 3),
        };
 
        // Act
        RandomProbabilisticSamplerFilterRule? actualResult = _ruleSelector.Select(rules, "AnyCategory", LogLevel.Warning, 2);
 
        // Assert
        Assert.Same(rules[1], actualResult);
    }
 
    [Fact]
    public void SelectsRuleWithWildcardCategory()
    {
        // Arrange
        var rules = new List<RandomProbabilisticSamplerFilterRule>
        {
            new RandomProbabilisticSamplerFilterRule(probability: 0, categoryName: "Program.*"),
            new RandomProbabilisticSamplerFilterRule(probability: 0, categoryName: "Program.MyLogger*"), // the best rule
            new RandomProbabilisticSamplerFilterRule(probability: 0, categoryName: "Program.MyLogger"),
        };
 
        // Act
        RandomProbabilisticSamplerFilterRule? actualResult = _ruleSelector.Select(rules, "Program.MyLogger", LogLevel.Information, 0);
 
        // Assert
        Assert.Same(rules[1], actualResult);
    }
 
    [Fact]
    public void SelectsRuleWithoutCategory()
    {
        // Arrange
        var rules = new List<RandomProbabilisticSamplerFilterRule>
        {
            new RandomProbabilisticSamplerFilterRule(probability: 0),
            new RandomProbabilisticSamplerFilterRule(probability: 0, categoryName: "Program.MyLogger"),
        };
 
        // Act
        RandomProbabilisticSamplerFilterRule? actualResult = _ruleSelector.Select(rules, "AnyCategory", LogLevel.Information, 0);
 
        // Assert
        Assert.Same(rules[0], actualResult);
    }
 
    [Fact]
    public void SelectsRuleWithHigherLogLevelWhenNoExactMatch()
    {
        // Arrange
        var rules = new List<RandomProbabilisticSamplerFilterRule>
        {
            new RandomProbabilisticSamplerFilterRule(probability: 0, logLevel: LogLevel.Error), // the best rule
            new RandomProbabilisticSamplerFilterRule(probability: 0, logLevel: LogLevel.Critical),
        };
 
        // Act
        RandomProbabilisticSamplerFilterRule? actualResult = _ruleSelector.Select(rules, "AnyCategory", LogLevel.Warning, 0);
 
        // Assert
        Assert.Same(rules[0], actualResult);
    }
}