public void AllTelemetryCapturedWhenProductionRateIsLow() { var sentTelemetry = new List<ITelemetry>(); int itemsProduced = 0; using (var tc = new TelemetryConfiguration() { TelemetryChannel = new StubTelemetryChannel() }) { var chainBuilder = new TelemetryProcessorChainBuilder(tc); // set up addaptive sampling that evaluates and changes sampling % frequently chainBuilder .UseAdaptiveSampling( new SamplingPercentageEstimatorSettings() { EvaluationInterval = TimeSpan.FromSeconds(1), SamplingPercentageDecreaseTimeout = TimeSpan.FromSeconds(2), SamplingPercentageIncreaseTimeout = TimeSpan.FromSeconds(2), }, this.TraceSamplingPercentageEvaluation) .Use((next) => new StubTelemetryProcessor(next) { OnProcess = (t) => sentTelemetry.Add(t) }); chainBuilder.Build(); const int productionFrequencyMs = 1000; using (var productionTimer = new Timer( (state) => { tc.TelemetryProcessorChain.Process(new RequestTelemetry()); itemsProduced++; }, null, productionFrequencyMs, productionFrequencyMs)) { Thread.Sleep(25000); } } Assert.Equal(itemsProduced, sentTelemetry.Count); }
public void SamplingPercentageAdjustsAccordingToConstantHighProductionRate() { var sentTelemetry = new List<ITelemetry>(); int itemsProduced = 0; using (var tc = new TelemetryConfiguration() { TelemetryChannel = new StubTelemetryChannel() }) { var chainBuilder = new TelemetryProcessorChainBuilder(tc); // set up addaptive sampling that evaluates and changes sampling % frequently chainBuilder .UseAdaptiveSampling( new SamplingPercentageEstimatorSettings() { EvaluationInterval = TimeSpan.FromSeconds(1), SamplingPercentageDecreaseTimeout = TimeSpan.FromSeconds(2), SamplingPercentageIncreaseTimeout = TimeSpan.FromSeconds(2), }, this.TraceSamplingPercentageEvaluation) .Use((next) => new StubTelemetryProcessor(next) { OnProcess = (t) => sentTelemetry.Add(t) }); chainBuilder.Build(); const int productionFrequencyMs = 100; using (var productionTimer = new Timer( (state) => { for (int i = 0; i < 2; i++) { tc.TelemetryProcessorChain.Process(new RequestTelemetry()); itemsProduced++; } }, null, 0, productionFrequencyMs)) { Thread.Sleep(25000); } } // number of items produced should be close to target of 5/second int targetItemCount = 25 * 5; // tolrance +- int tolerance = targetItemCount / 2; Trace.WriteLine(string.Format("'Ideal' telemetry item count: {0}", targetItemCount)); Trace.WriteLine(string.Format( "Expected range: from {0} to {1}", targetItemCount - tolerance, targetItemCount + tolerance)); Trace.WriteLine(string.Format( "Actual telemetry item count: {0} ({1:##.##}% of ideal)", sentTelemetry.Count, 100.0 * sentTelemetry.Count / targetItemCount)); Assert.True(sentTelemetry.Count > targetItemCount - tolerance); Assert.True(sentTelemetry.Count < targetItemCount + tolerance); }