コード例 #1
0
        public void UpdatePerOperationSampler_ShouldUpdateParams_WhenSamplerIsAlreadyPerOp()
        {
            var perOpSampler = new PerOperationSampler(10, 0.5, 5, _mockLoggerFactory);

            _testingSampler = new RemoteControlledSampler(
                _serivceName,
                _mockSamplingManager,
                _mockLoggerFactory,
                _mockMetrics,
                perOpSampler,
                _mockSamplerFactory,
                _pollingIntervalMs,
                _mockPollTimer
                );
            var strategies = new PerOperationSamplingStrategies
            {
                DefaultSamplingProbability       = 0.5,
                DefaultLowerBoundTracesPerSecond = 10,
                PerOperationStrategies           = new List <OperationSamplingStrategy>()
            };

            _testingSampler.UpdatePerOperationSampler(strategies);

            _mockMetrics.Received(1).SamplerUpdated.Inc(Arg.Is <long>(d => d == 1));
        }
コード例 #2
0
        public void PerOperationSampler_Update_ShouldNotUpdateTheDefaultSamplerWhenAlreadySame()
        {
            var strat = new PerOperationSamplingStrategies
            {
                DefaultSamplingProbability = _samplingRate,
                PerOperationStrategies     = new List <OperationSamplingStrategy>()
            };

            var updated = _testingSampler.Update(strat);

            Assert.False(updated);
            _mockSamplerFactory.Received(2).NewProbabilisticSampler(Arg.Is <double>(v => v == strat.DefaultSamplingProbability));
        }
コード例 #3
0
        public void PerOperationSampler_Update_ShouldUpdateTheDefaultSampler()
        {
            var strat = new PerOperationSamplingStrategies
            {
                DefaultSamplingProbability = 0.75,
                PerOperationStrategies     = new List <OperationSamplingStrategy>()
            };
            var newMockDefaultSampler = Substitute.For <ISampler>();

            _mockSamplerFactory.NewProbabilisticSampler(Arg.Is <double>(v => v == strat.DefaultSamplingProbability)).Returns(newMockDefaultSampler);

            var updated = _testingSampler.Update(strat);

            Assert.True(updated);
            _mockSamplerFactory.Received(1).NewProbabilisticSampler(Arg.Is <double>(v => v == strat.DefaultSamplingProbability));
        }
コード例 #4
0
        public void PerOperationSampler_Update_ShouldAddSamplerToOperationThatDoesntHaveOneYet()
        {
            var samplingRate2 = 0.35;

            var strat = new PerOperationSamplingStrategies
            {
                DefaultSamplingProbability       = _samplingRate,
                DefaultLowerBoundTracesPerSecond = 0.7,
                PerOperationStrategies           = new List <OperationSamplingStrategy>
                {
                    new OperationSamplingStrategy
                    {
                        Operation             = "op1",
                        ProbabilisticSampling = new ProbabilisticSamplingStrategy
                        {
                            SamplingRate = _samplingRate
                        }
                    },
                    new OperationSamplingStrategy
                    {
                        Operation             = "op2",
                        ProbabilisticSampling = new ProbabilisticSamplingStrategy
                        {
                            SamplingRate = samplingRate2
                        }
                    }
                }
            };

            _mockSamplerFactory.NewGuaranteedThroughputProbabilisticSampler(
                Arg.Is <double>(x => x == _samplingRate),
                Arg.Is <double>(x => x == strat.DefaultLowerBoundTracesPerSecond)
                ).Returns(_mockGtpSampler);
            _mockSamplerFactory.NewGuaranteedThroughputProbabilisticSampler(
                Arg.Is <double>(x => x == samplingRate2),
                Arg.Is <double>(x => x == strat.DefaultLowerBoundTracesPerSecond)
                ).Returns(_mockGtpSampler);

            var updated = _testingSampler.Update(strat);

            Assert.True(updated);
            _mockSamplerFactory.Received(1).NewGuaranteedThroughputProbabilisticSampler(Arg.Is(_samplingRate), Arg.Is(strat.DefaultLowerBoundTracesPerSecond));
            _mockSamplerFactory.Received(1).NewGuaranteedThroughputProbabilisticSampler(Arg.Is(samplingRate2), Arg.Is(strat.DefaultLowerBoundTracesPerSecond));
            _mockGtpSampler.Received(0).Update(Arg.Any <double>(), Arg.Any <double>());
        }
コード例 #5
0
        public void UpdatePerOperationSampler_ShouldCreateNewPerOpSampler_WhenSamplerIsNotAlreadyPerOp()
        {
            var strategies = new PerOperationSamplingStrategies
            {
                DefaultSamplingProbability       = 0.5,
                DefaultLowerBoundTracesPerSecond = 10,
                PerOperationStrategies           = new List <OperationSamplingStrategy>()
            };

            _testingSampler.UpdatePerOperationSampler(strategies);

            _mockMetrics.Received(0).SamplerUpdated.Inc(Arg.Is <long>(d => d == 1));
            _mockSamplerFactory.Received(1).NewPerOperationSampler(
                Arg.Is <int>(mo => mo == 2000),
                Arg.Is <double>(dsp => dsp == strategies.DefaultSamplingProbability),
                Arg.Is <double>(dlbtps => dlbtps == strategies.DefaultLowerBoundTracesPerSecond),
                Arg.Is <ILoggerFactory>(lf => lf == _mockLoggerFactory));
        }
コード例 #6
0
 internal void UpdatePerOperationSampler(PerOperationSamplingStrategies samplingParameters)
 {
     lock (this)
     {
         if (_sampler is PerOperationSampler sampler)
         {
             if (sampler.Update(samplingParameters))
             {
                 _metrics.SamplerUpdated.Inc(1);
             }
         }
         else
         {
             _sampler = _samplerFactory.NewPerOperationSampler(_maxOperations,
                                                               samplingParameters.DefaultSamplingProbability,
                                                               samplingParameters.DefaultLowerBoundTracesPerSecond,
                                                               _loggerFactory);
         }
     }
 }
コード例 #7
0
        public void PerOperationSampler_Update_ShouldLogAndNotAddSamplerWhenWeHitTheMaxOps()
        {
            var expectedLogMessage = $"Exceeded the maximum number of operations ({_maxOperations}) for per operations sampling";
            var strat = new PerOperationSamplingStrategies
            {
                DefaultSamplingProbability       = _samplingRate,
                DefaultLowerBoundTracesPerSecond = 0.7,
                PerOperationStrategies           = new List <OperationSamplingStrategy>
                {
                    new OperationSamplingStrategy
                    {
                        Operation             = "op4",
                        ProbabilisticSampling = new ProbabilisticSamplingStrategy
                        {
                            SamplingRate = 0.25
                        }
                    },
                    new OperationSamplingStrategy
                    {
                        Operation             = "op5",
                        ProbabilisticSampling = new ProbabilisticSamplingStrategy
                        {
                            SamplingRate = 0.35
                        }
                    }
                }
            };

            _testingSampler.IsSampled(new TraceId(1), "op1");
            _testingSampler.IsSampled(new TraceId(1), "op2");
            _testingSampler.IsSampled(new TraceId(1), "op3");

            var updated = _testingSampler.Update(strat);

            Assert.False(updated);
            _mockSamplerFactory.Received(3).NewGuaranteedThroughputProbabilisticSampler(Arg.Is(_samplingRate), Arg.Is(_lowerBound));
            _mockGtpSampler.Received(0).Update(Arg.Any <double>(), Arg.Any <double>());
            // cannot mock extension methods :/ _mockLogger.Received(1).LogError(Arg.Is<string>(lm => lm == expectedLogMessage));
            //_mockLogger.Received(1).Log(Arg.Any<LogLevel>(), Arg.Any<EventId>(), Arg.Any<string>(), Arg.Any<Exception>(), Arg.Any<Func<object, Exception, string>>());
        }
コード例 #8
0
        public bool Update(PerOperationSamplingStrategies strategies)
        {
            var isUpdated = false;

            _lowerBound = strategies.DefaultLowerBoundTracesPerSecond;

            var defaultSampler = _factory.NewProbabilisticSampler(strategies.DefaultSamplingProbability);

            if (!defaultSampler.Equals(_defaultSampler))
            {
                _defaultSampler = defaultSampler;
                isUpdated       = true;
            }

            foreach (var strategy in strategies.PerOperationStrategies)
            {
                var operation    = strategy.Operation;
                var samplingRate = strategy.ProbabilisticSampling.SamplingRate;
                if (_samplers.TryGetValue(operation, out var sampler))
                {
                    isUpdated = sampler.Update(samplingRate, _lowerBound) || isUpdated;
                }
                else
                {
                    if (_samplers.Count < _maxOperations)
                    {
                        sampler = (IGuaranteedThroughputProbabilisticSampler)_factory.NewGuaranteedThroughputProbabilisticSampler(samplingRate, _lowerBound);
                        _samplers.Add(operation, sampler);
                        isUpdated = true;
                    }
                    else
                    {
                        _logger.LogInformation($"Exceeded the maximum number of operations ({_maxOperations}) for per operations sampling");
                    }
                }
            }

            return(isUpdated);
        }
コード例 #9
0
        public void PerOperationSampler_Update_ShouldReplaceOperationSamplersThatAlreadyExist()
        {
            var strat = new PerOperationSamplingStrategies
            {
                DefaultSamplingProbability       = _samplingRate,
                DefaultLowerBoundTracesPerSecond = 0.7,
                PerOperationStrategies           = new List <OperationSamplingStrategy>
                {
                    new OperationSamplingStrategy
                    {
                        Operation             = "op1",
                        ProbabilisticSampling = new ProbabilisticSamplingStrategy
                        {
                            SamplingRate = 0.25
                        }
                    },
                    new OperationSamplingStrategy
                    {
                        Operation             = "op2",
                        ProbabilisticSampling = new ProbabilisticSamplingStrategy
                        {
                            SamplingRate = 0.35
                        }
                    }
                }
            };

            _testingSampler.IsSampled(new TraceId(1), strat.PerOperationStrategies[0].Operation);
            _testingSampler.IsSampled(new TraceId(1), strat.PerOperationStrategies[1].Operation);
            _mockGtpSampler.Update(Arg.Any <double>(), Arg.Any <double>()).Returns(true);

            var updated = _testingSampler.Update(strat);

            Assert.True(updated);
            _mockSamplerFactory.Received(2).NewGuaranteedThroughputProbabilisticSampler(Arg.Any <double>(), Arg.Any <double>());
            _mockGtpSampler.Received(1).Update(Arg.Is(strat.PerOperationStrategies[0].ProbabilisticSampling.SamplingRate), Arg.Is(strat.DefaultLowerBoundTracesPerSecond));
            _mockGtpSampler.Received(1).Update(Arg.Is(strat.PerOperationStrategies[1].ProbabilisticSampling.SamplingRate), Arg.Is(strat.DefaultLowerBoundTracesPerSecond));
        }