internal PerOperationSampler(int maxOperations, double samplingRate, double lowerBound, ILoggerFactory loggerFactory, ISamplerFactory samplerFactory) { _maxOperations = maxOperations; _samplingRate = samplingRate; _lowerBound = lowerBound; _logger = loggerFactory?.CreateLogger <PerOperationSampler>() ?? throw new ArgumentNullException(nameof(loggerFactory)); _factory = samplerFactory ?? throw new ArgumentNullException(nameof(samplerFactory)); _defaultSampler = _factory.NewProbabilisticSampler(_samplingRate); }
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 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 PerOperationSamplerTests() { _samplingRate = 1.0; _lowerBound = 0.5; _maxOperations = 3; _mockGtpSampler = Substitute.For <IGuaranteedThroughputProbabilisticSampler>(); _mockLoggerFactory = Substitute.For <ILoggerFactory>(); _mockLogger = Substitute.For <ILogger <PerOperationSampler> >(); _mockDefaultSampler = Substitute.For <IProbabilisticSampler>(); _mockSamplerFactory = Substitute.For <ISamplerFactory>(); _mockSamplerFactory.NewGuaranteedThroughputProbabilisticSampler( Arg.Is <double>(x => x == _samplingRate), Arg.Is <double>(x => x == _lowerBound) ).Returns(_mockGtpSampler); _mockSamplerFactory.NewProbabilisticSampler( Arg.Is <double>(x => x == _samplingRate) ).Returns(_mockDefaultSampler); _mockLoggerFactory.CreateLogger <PerOperationSampler>().Returns(_mockLogger); _testingSampler = new PerOperationSampler(_maxOperations, _samplingRate, _lowerBound, _mockLoggerFactory, _mockSamplerFactory); }