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)); }
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)); }
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)); }
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>()); }
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)); }
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); } } }
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>>()); }
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); }
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)); }