public static async Task SendDeviceToCloudMessageAsync(CancellationToken cancelToken) { var diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.Client, 50); var deviceClient = DeviceClientWrapper.CreateFromConnectionString(deviceConnectionString, diagnosticProvider); const int avgWindSpeed = 10; // m/s var rand = new Random(); while (true) { if (cancelToken.IsCancellationRequested) { break; } var currentWindSpeed = avgWindSpeed + rand.NextDouble() * 4 - 2; var telemetryDataPoint = new { windSpeed = currentWindSpeed }; var messageString = JsonConvert.SerializeObject(telemetryDataPoint); var message = new Message(Encoding.ASCII.GetBytes(messageString)); await deviceClient.SendEventAsync(message); Console.WriteLine("{0} > Sending message: {1} | Count:{2}", DateTime.Now, messageString, diagnosticProvider.MessageNumber); await Task.Delay(500, cancelToken); } }
public void ThrowExceptionWhenUserMessageHasReservedProperty() { var diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.Client, 100); Assert.ThrowsException <PropertyConflictException>(() => { var message = new Message(); message.Properties[BaseDiagnosticProvider.CorrelationIdKey] = "xxxxx"; diagnosticProvider.Process(message); }); Assert.ThrowsException <PropertyConflictException>(() => { var message = new Message(); message.Properties[BaseDiagnosticProvider.TimeStampKey] = "xxxxx"; diagnosticProvider.Process(message); }); Assert.ThrowsException <PropertyConflictException>(() => { var message = new Message(); message.Properties[BaseDiagnosticProvider.VersionKey] = "xxxxx"; diagnosticProvider.Process(message); }); }
public void SamplingRateIsDefaultZeroWhenUsingServerSamplingSource() { var diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.Server, 50); Assert.AreEqual(diagnosticProvider.SamplingRatePercentage, 0); Assert.AreNotEqual(diagnosticProvider.SamplingRatePercentage, 50); }
public void SamplingSwitchIsOnOnWhenSamplingSourceIsNotNone() { var diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.Client, 50); Assert.AreEqual(diagnosticProvider.SamplingOn, true); diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.Server, 50); Assert.AreEqual(diagnosticProvider.SamplingOn, true); }
public void ProbabilityDiagnosticProviderTest() { var diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.Client, 100); for (var i = 0; i < 10000; i++) { Assert.AreEqual(diagnosticProvider.ShouldAddDiagnosticProperties(), true); } diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.Client, 0); for (var i = 0; i < 10000; i++) { diagnosticProvider.Process(new Message()); Assert.AreEqual(diagnosticProvider.ShouldAddDiagnosticProperties(), false); } diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.Client, 50); var needSamplingCount = 0; for (var i = 0; i < 1000000; i++) { diagnosticProvider.Process(new Message()); if (diagnosticProvider.ShouldAddDiagnosticProperties()) { needSamplingCount++; } } Trace.WriteLine("Need sampling count:" + needSamplingCount); var permissibleError = 0.2; Assert.IsTrue(needSamplingCount / 1000000.0 > 0.5 - permissibleError && needSamplingCount / 1000000.0 < 0.5 + permissibleError); diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.Client, 25); needSamplingCount = 0; for (var i = 0; i < 1000000; i++) { diagnosticProvider.Process(new Message()); if (diagnosticProvider.ShouldAddDiagnosticProperties()) { needSamplingCount++; } } Assert.IsTrue(needSamplingCount / 1000000.0 > 0.25 - permissibleError && needSamplingCount / 1000000.0 < 0.25 + permissibleError); diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.Client, 20); needSamplingCount = 0; for (var i = 0; i < 1000000; i++) { diagnosticProvider.Process(new Message()); if (diagnosticProvider.ShouldAddDiagnosticProperties()) { needSamplingCount++; } } Assert.IsTrue(needSamplingCount / 1000000.0 > 0.2 - permissibleError && needSamplingCount / 1000000.0 < 0.2 + permissibleError); }
public void DoNotChangeSamplingRateWhenUseClientSamlingSourceAfterReceiveSettingsFromServer() { var diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.Server, 50); Assert.AreEqual(diagnosticProvider.SamplingRatePercentage, 0); var twin = new Twin(); twin.Properties.Desired[BaseDiagnosticProvider.TwinDiagEnableKey] = "True"; twin.Properties.Desired[BaseDiagnosticProvider.TwinDiagSamplingRateKey] = "10"; diagnosticProvider.SetSamplingConfigFromTwin(twin.Properties.Desired); Assert.AreEqual(diagnosticProvider.SamplingRatePercentage, 10); }
public void SamplingSwitchIsNotOnWhenSamplingSourceIsNone() { var diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.None, 50); Assert.AreEqual(diagnosticProvider.SamplingOn, false); }
public static async Task SendDeviceToCloudMessageAsync(CancellationToken cancelToken) { Console.ReadLine(); var diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.Server); var deviceClient = DeviceClientWrapper.CreateFromConnectionString(_deviceConnectionString, diagnosticProvider); const int avgWindSpeed = 10; var rand = new Random(); var count = 0; var beforeStartSendTimeStamp = DateTime.Now; while (true) { count++; if (cancelToken.IsCancellationRequested) { break; } var currentWindSpeed = avgWindSpeed + rand.NextDouble() * 4 - 2; var telemetryDataPoint = new { windSpeed = currentWindSpeed }; var messageString = JsonConvert.SerializeObject(telemetryDataPoint); var message = new Message(Encoding.ASCII.GetBytes(messageString)); try { var timeout = 1000000; Console.WriteLine("{0} > Start to send D2C message: {1} | Count:{2}", DateTime.Now, messageString, count); var task = deviceClient.SendEventAsync(message); if (await Task.WhenAny(task, Task.Delay(timeout)) == task) { Console.WriteLine("{0} > Sending D2C message success: {1} | Count:{2}", DateTime.Now, messageString, count); } else { Console.WriteLine("Send message timeout"); } } catch (Exception ex) { Console.WriteLine("Error occur when send D2C message:" + ex); } if (count == _maxMessageCount) { break; } await Task.Delay(500, cancelToken); } var afterSendTimeStamp = DateTime.Now; var totalTimeConsume = afterSendTimeStamp - beforeStartSendTimeStamp; Console.WriteLine($"StartTime: {beforeStartSendTimeStamp} | EndTime: {afterSendTimeStamp} | TotalTimeConsume: {totalTimeConsume.TotalMilliseconds}"); Console.WriteLine("All task complete!"); }