private void WriteToDisk(Recorder recorder) { //Sample every second until flagged as completed. var accumulatingHistogram = new LongHistogram(TimeStamp.Hours(1), 3); while (_isCompleted == 0) { Thread.Sleep(1000); var histogram = recorder.GetIntervalHistogram(); accumulatingHistogram.Add(histogram); _logWriter.Append(histogram); Console.WriteLine($"{DateTime.Now:o} Interval.TotalCount = {histogram.TotalCount,10:G}. Accumulated.TotalCount = {accumulatingHistogram.TotalCount,10:G}."); } _logWriter.Dispose(); _outputStream.Dispose(); Console.WriteLine("Log contents"); Console.WriteLine(File.ReadAllText(LogPath)); Console.WriteLine(); Console.WriteLine("Percentile distribution (values reported in milliseconds)"); accumulatingHistogram.OutputPercentileDistribution(Console.Out, outputValueUnitScalingRatio: OutputScalingFactor.TimeStampToMilliseconds); Console.WriteLine("Output thread finishing."); }
public async void AmazonIotStreamer([FromQuery] int messageToSend = 10, [FromQuery] int delayBtwMessageInMs = 50) { var rd = new Random(100); var histogram = new LongHistogram(TimeStamp.Hours(1), 3); var writer = new StringWriter(); var messages = messageToSend; string[] currencyPairs = new string[] { "EUR/USD", "EUR/JPY", "EUR/GBP", "USD/JPY", "USD/GBP" }; for (int currIndex = 0; currIndex < currencyPairs.Length; currIndex++) { var pair = currencyPairs[currIndex]; Task.Run(async() => { var publisher = new AmazonIotDataClient(IotEndpoint, new BasicAWSCredentials(IotAccessKey, IotSecret)); for (var i = 1; i <= messages; i++) { long startTimestamp = Stopwatch.GetTimestamp(); long timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); var currency = new Currency() { Id = i, CurrencyType = pair, Price = rd.NextDouble(), Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds().ToString(), Ladders = new LadderFactory().Build(10) }; var cur = JsonConvert.SerializeObject(currency); publisher.PublishAsync(new Amazon.IotData.Model.PublishRequest() { Topic = pair, Payload = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(cur)), Qos = 0 }); long elapsed = Stopwatch.GetTimestamp() - startTimestamp; histogram.RecordValue(elapsed); await Task.Delay(delayBtwMessageInMs).ConfigureAwait(false); } var scalingRatio = OutputScalingFactor.TimeStampToMilliseconds; histogram.OutputPercentileDistribution( writer, outputValueUnitScalingRatio: scalingRatio); System.IO.File.WriteAllText(@"d:\cloud\appsync.txt", writer.ToString()); }); } }
public void TimeStamp_values_are_accurate() { var delay = TimeSpan.FromSeconds(1); var expected = TimeStamp.Seconds(delay.Seconds); var start = Stopwatch.GetTimestamp(); Thread.Sleep(delay); var end = Stopwatch.GetTimestamp(); var actual = end - start; Assert.AreEqual(expected, actual, expected * 0.05); Assert.AreEqual(TimeStamp.Seconds(60), TimeStamp.Minutes(1)); Assert.AreEqual(TimeStamp.Minutes(60), TimeStamp.Hours(1)); }
public static void Stream(Func <string, string, Random, string> createQuery, int messageToSend, int delayBtwMessageInMs, string apiKey, string endpointUrl) { var client = new HttpClient(); System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; var rd = new Random(100); var histogram = new LongHistogram(TimeStamp.Hours(1), 3); var writer = new StringWriter(); var messages = messageToSend; Task.Run(async() => { for (var i = 1; i <= messages; i++) { var req = new HttpRequestMessage(); req.Headers.TryAddWithoutValidation("x-api-key", apiKey); req.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); req.Headers.TryAddWithoutValidation("Content-Type", "application/json"); req.Method = HttpMethod.Post; req.RequestUri = new Uri(endpointUrl); long startTimestamp = Stopwatch.GetTimestamp(); long timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(); req.Content = new StringContent(createQuery(i.ToString(), timestamp.ToString(), rd), Encoding.UTF8, "application/json"); await client.SendAsync((req)).ConfigureAwait(false); long elapsed = Stopwatch.GetTimestamp() - startTimestamp; histogram.RecordValue(elapsed); await Task.Delay(delayBtwMessageInMs).ConfigureAwait(false); } var scalingRatio = OutputScalingFactor.TimeStampToMilliseconds; histogram.OutputPercentileDistribution( writer, outputValueUnitScalingRatio: scalingRatio); System.IO.File.WriteAllText(@"d:\cloud\appsync.txt", writer.ToString()); }); }
public void TimeStamp_values_are_accurate() { var delay = TimeSpan.FromSeconds(1); var expected = TimeStamp.Seconds(delay.Seconds); long minAccepted = (long)(expected * 0.95); long maxAccepted = (long)(expected * 1.05); var start = Stopwatch.GetTimestamp(); Spin.Wait(delay); var end = Stopwatch.GetTimestamp(); var actual = end - start; actual.Should().BeInRange(minAccepted, maxAccepted); Assert.Equal(TimeStamp.Seconds(60), TimeStamp.Minutes(1)); Assert.Equal(TimeStamp.Minutes(60), TimeStamp.Hours(1)); }
public void SignalRStreamer([FromQuery] int messageToSend = 10, [FromQuery] int delayBtwMessageInMs = 50) { var histogram = new LongHistogram(TimeStamp.Hours(1), 3); var writer = new StringWriter(); string[] currencyPairs = new string[] { "EUR/USD", "EUR/JPY", "EUR/GBP", "USD/JPY", "USD/GBP" }; for (int currIndex = 0; currIndex < currencyPairs.Length; currIndex++) { var pair = currencyPairs[currIndex]; Task.Run(async() => { var rd = new Random(100); for (var i = 1; i <= messageToSend; i++) { long startTimestamp = Stopwatch.GetTimestamp(); var currency = new Currency() { Id = i, CurrencyType = pair, Price = rd.NextDouble(), Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds().ToString(), Ladders = new LadderFactory().Build(10) }; var cur = JsonConvert.SerializeObject(currency); await context.Clients.Group(pair).SendAsync("broadcastMessage", "currency", cur).ConfigureAwait(false); long elapsed = Stopwatch.GetTimestamp() - startTimestamp; histogram.RecordValue(elapsed); await Task.Delay(delayBtwMessageInMs).ConfigureAwait(false); } var scalingRatio = OutputScalingFactor.TimeStampToMilliseconds; histogram.OutputPercentileDistribution( writer, outputValueUnitScalingRatio: scalingRatio); System.IO.File.WriteAllText(@"d:\cloud\signalr.txt", writer.ToString()); }); } }
static LongHistogram CreateTimeHistogram() { return(new LongHistogram(TimeStamp.Hours(1), 3)); }
public async void AmazonMQStreamer([FromQuery] int messageToSend = 10, [FromQuery] int delayBtwMessageInMs = 50) { NMSConnectionFactory factory = new NMSConnectionFactory(ActiveMqEndpoint); var rd = new Random(100); var histogram = new LongHistogram(TimeStamp.Hours(1), 3); var writer = new StringWriter(); string[] currencyPairs = new string[] { "EUR/USD", "EUR/JPY", "EUR/GBP", "USD/JPY", "USD/GBP" }; for (int currIndex = 0; currIndex < currencyPairs.Length; currIndex++) { var pair = currencyPairs[currIndex]; Task.Run(async() => { using (var connection = factory.CreateConnection(ActiveMqLogin, ActiveMqMdp)) { connection.Start(); var session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); var topic = new ActiveMQTopic("VirtualTopic." + pair); var producer = session.CreateProducer(topic); producer.DeliveryMode = MsgDeliveryMode.NonPersistent; for (var i = 0; i <= messageToSend; i++) { var currency = new Currency() { Id = i, CurrencyType = pair, Price = rd.NextDouble(), Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds().ToString(), Ladders = new LadderFactory().Build(10) }; var cur = JsonConvert.SerializeObject(currency); long startTimestamp = Stopwatch.GetTimestamp(); producer.Send(session.CreateTextMessage(cur)); long elapsed = Stopwatch.GetTimestamp() - startTimestamp; histogram.RecordValue(elapsed); await Task.Delay(delayBtwMessageInMs).ConfigureAwait(false); } session.Close(); connection.Close(); var scalingRatio = OutputScalingFactor.TimeStampToMilliseconds; histogram.OutputPercentileDistribution( writer, outputValueUnitScalingRatio: scalingRatio); System.IO.File.WriteAllText(@"d:\cloud\amq.txt", writer.ToString()); } }); } }