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);
            }
        }
Exemple #2
0
        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);
            });
        }
Exemple #3
0
        public void SamplingRateIsDefaultZeroWhenUsingServerSamplingSource()
        {
            var diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.Server, 50);

            Assert.AreEqual(diagnosticProvider.SamplingRatePercentage, 0);
            Assert.AreNotEqual(diagnosticProvider.SamplingRatePercentage, 50);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        public void SamplingSwitchIsNotOnWhenSamplingSourceIsNone()
        {
            var diagnosticProvider = new ProbabilityDiagnosticProvider(SamplingRateSource.None, 50);

            Assert.AreEqual(diagnosticProvider.SamplingOn, false);
        }
Exemple #8
0
        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!");
        }