public void TestCollapsed()
        {
            IHystrixCollapserKey key   = HystrixCollapserKeyDefault.AsKey("CumulativeCollapser-B");
            CountdownEvent       latch = new CountdownEvent(1);
            var observer = new LatchedObserver(output, latch);

            stream            = CumulativeCollapserEventCounterStream.GetInstance(key, 10, 100);
            latchSubscription = stream.Observe().Subscribe(observer);

            List <Task> tasks = new List <Task>();

            for (int i = 0; i < 3; i++)
            {
                tasks.Add(Collapser.From(output, key, i).ExecuteAsync());
            }

            Task.WaitAll(tasks.ToArray());
            Assert.True(WaitForLatchedObserverToUpdate(observer, 1, 500, output), "Latch took to long to update");

            Assert.Equal(CollapserEventTypeHelper.Values.Count, stream.Latest.Length);
            long[] expected = new long[CollapserEventTypeHelper.Values.Count];
            expected[(int)CollapserEventType.BATCH_EXECUTED] = 1;
            expected[(int)CollapserEventType.ADDED_TO_BATCH] = 3;
            Assert.Equal(expected, stream.Latest);
        }
Beispiel #2
0
        public void TestCollapsedAndResponseFromCache()
        {
            IHystrixCollapserKey key   = HystrixCollapserKeyDefault.AsKey("RollingCollapser-C");
            CountdownEvent       latch = new CountdownEvent(1);
            var observer = new LatchedObserver(output, latch);

            stream            = RollingCollapserEventCounterStream.GetInstance(key, 10, 100);
            latchSubscription = stream.Observe().Subscribe(observer);
            Assert.True(Time.WaitUntil(() => observer.StreamRunning, 1000), "Stream failed to start");

            List <Task> cTasks = new List <Task>();

            for (int i = 0; i < 3; i++)
            {
                cTasks.Add(Collapser.From(output, key, i).ExecuteAsync());
                cTasks.Add(Collapser.From(output, key, i).ExecuteAsync()); // same arg - should get a response from cache
                cTasks.Add(Collapser.From(output, key, i).ExecuteAsync()); // same arg - should get a response from cache
            }

            Task.WaitAll(cTasks.ToArray());

            Assert.True(WaitForLatchedObserverToUpdate(observer, 1, 500, output), "Latch took to long to update");

            Assert.Equal(CollapserEventTypeHelper.Values.Count, stream.Latest.Length);
            long[] expected = new long[CollapserEventTypeHelper.Values.Count];
            expected[(int)CollapserEventType.BATCH_EXECUTED]      = 1;
            expected[(int)CollapserEventType.ADDED_TO_BATCH]      = 3;
            expected[(int)CollapserEventType.RESPONSE_FROM_CACHE] = 6;
            Assert.Equal(expected, stream.Latest);
        }
        public void TestCollapsedAndResponseFromCacheAgeOutOfCumulativeWindow()
        {
            IHystrixCollapserKey key = HystrixCollapserKeyDefault.AsKey("CumulativeCollapser-D");

            stream = CumulativeCollapserEventCounterStream.GetInstance(key, 10, 100);
            stream.StartCachingStreamValuesIfUnstarted();

            CountdownEvent latch = new CountdownEvent(1);

            latchSubscription = stream.Observe().Take(20 + LatchedObserver.STABLE_TICK_COUNT).Subscribe(new LatchedObserver(output, latch));

            for (int i = 0; i < 3; i++)
            {
                Collapser.From(output, key, i).Observe();
                Collapser.From(output, key, i).Observe(); // same arg - should get a response from cache
                Collapser.From(output, key, i).Observe(); // same arg - should get a response from cache
            }

            Assert.True(latch.Wait(10000), "CountdownEvent was not set!");

            Assert.Equal(CollapserEventTypeHelper.Values.Count, stream.Latest.Length);
            long[] expected = new long[CollapserEventTypeHelper.Values.Count];
            expected[(int)CollapserEventType.BATCH_EXECUTED]      = 1;
            expected[(int)CollapserEventType.ADDED_TO_BATCH]      = 3;
            expected[(int)CollapserEventType.RESPONSE_FROM_CACHE] = 6;
            Assert.Equal(expected, stream.Latest);
        }
Beispiel #4
0
        public void TestCollapsedAndResponseFromCacheAgeOutOfRollingWindow()
        {
            IHystrixCollapserKey key = HystrixCollapserKeyDefault.AsKey("RollingCollapser-D");

            stream = RollingCollapserEventCounterStream.GetInstance(key, 10, 100);
            stream.StartCachingStreamValuesIfUnstarted();

            CountdownEvent latch = new CountdownEvent(1);

            stream.Observe().Take(30).Subscribe(new LatchedObserver(output, latch));

            for (int i = 0; i < 3; i++)
            {
                Collapser.From(output, key, i).Observe();
                Collapser.From(output, key, i).Observe(); // same arg - should get a response from cache
                Collapser.From(output, key, i).Observe(); // same arg - should get a response from cache
            }

            Assert.True(latch.Wait(10000), "CountdownEvent was not set!");
            output.WriteLine("ReqLog : " + HystrixRequestLog.CurrentRequestLog.GetExecutedCommandsAsString());
            Assert.Equal(CollapserEventTypeHelper.Values.Count, stream.Latest.Length);
            long[] expected = new long[CollapserEventTypeHelper.Values.Count];
            expected[(int)CollapserEventType.BATCH_EXECUTED]      = 0;
            expected[(int)CollapserEventType.ADDED_TO_BATCH]      = 0;
            expected[(int)CollapserEventType.RESPONSE_FROM_CACHE] = 0;
            Assert.Equal(expected, stream.Latest);
        }
        public void TestCollapsed()
        {
            var key      = HystrixCommandKeyDefault.AsKey("BatchCommand");
            var latch    = new CountdownEvent(1);
            var observer = new LatchedObserver(output, latch);

            stream            = RollingCommandEventCounterStream.GetInstance(key, 10, 100);
            latchSubscription = stream.Observe().Subscribe(observer);
            Assert.True(Time.WaitUntil(() => observer.StreamRunning, 1000), "Stream failed to start");

            var tasks = new List <Task>();

            for (var i = 0; i < 3; i++)
            {
                tasks.Add(Collapser.From(output, i).ExecuteAsync());
            }

            Task.WaitAll(tasks.ToArray());

            Assert.True(WaitForLatchedObserverToUpdate(observer, 1, 500, output), "Latch took to long to update");

            Assert.Equal(HystrixEventTypeHelper.Values.Count, stream.Latest.Length);
            var expected = new long[HystrixEventTypeHelper.Values.Count];

            expected[(int)HystrixEventType.SUCCESS]   = 1;
            expected[(int)HystrixEventType.COLLAPSED] = 3;
            Assert.Equal(expected, stream.Latest);
        }
        public void TestCollapsedAndResponseFromCacheAgeOutOfRollingWindow()
        {
            var key      = HystrixCollapserKeyDefault.AsKey("RollingCollapser-D");
            var latch    = new CountdownEvent(1);
            var observer = new LatchedObserver(output, latch);

            stream            = RollingCollapserEventCounterStream.GetInstance(key, 10, 100);
            latchSubscription = stream.Observe().Take(20 + LatchedObserver.STABLE_TICK_COUNT).Subscribe(observer);
            Assert.True(Time.WaitUntil(() => observer.StreamRunning, 1000), "Stream failed to start");

            var cTasks = new List <Task>();

            for (var i = 0; i < 3; i++)
            {
                cTasks.Add(Collapser.From(output, key, i).ExecuteAsync());
                cTasks.Add(Collapser.From(output, key, i).ExecuteAsync()); // same arg - should get a response from cache
                cTasks.Add(Collapser.From(output, key, i).ExecuteAsync()); // same arg - should get a response from cache
            }

            Task.WaitAll(cTasks.ToArray());

            Assert.True(latch.Wait(10000), "CountdownEvent was not set!");
            output.WriteLine("ReqLog : " + HystrixRequestLog.CurrentRequestLog.GetExecutedCommandsAsString());
            Assert.Equal(CollapserEventTypeHelper.Values.Count, stream.Latest.Length);
            var expected = new long[CollapserEventTypeHelper.Values.Count];

            expected[(int)CollapserEventType.BATCH_EXECUTED]      = 0;
            expected[(int)CollapserEventType.ADDED_TO_BATCH]      = 0;
            expected[(int)CollapserEventType.RESPONSE_FROM_CACHE] = 0;
            Assert.Equal(expected, stream.Latest);
        }
Beispiel #7
0
        public void SimpleTest()
        {
            var parsed = SyntaxFactory.ParseCompilationUnit(@"
                using Foo;

                namespace Bar
                {
                    public class Baz
                    {
                    }
                }"
                                                            );

            var collapsed = Collapser.Collapse(parsed);

            Console.WriteLine(collapsed.ToFullString());
        }
Beispiel #8
0
        public void TestCollapsed()
        {
            IHystrixCommandKey key = HystrixCommandKeyDefault.AsKey("BatchCommand");

            stream = RollingCommandEventCounterStream.GetInstance(key, 10, 100);
            stream.StartCachingStreamValuesIfUnstarted();

            CountdownEvent latch = new CountdownEvent(1);

            stream.Observe().Take(10).Subscribe(new LatchedObserver(output, latch));

            for (int i = 0; i < 3; i++)
            {
                Collapser.From(output, i).Observe();
            }

            Assert.True(latch.Wait(10000), "CountdownEvent was not set!");
            Assert.Equal(HystrixEventTypeHelper.Values.Count, stream.Latest.Length);
            long[] expected = new long[HystrixEventTypeHelper.Values.Count];
            expected[(int)HystrixEventType.SUCCESS]   = 1;
            expected[(int)HystrixEventType.COLLAPSED] = 3;
            output.WriteLine("ReqLog : " + HystrixRequestLog.CurrentRequestLog.GetExecutedCommandsAsString());
            Assert.Equal(expected, stream.Latest);
        }
Beispiel #9
0
        public void TestBatches()
        {
            IHystrixCollapserKey key = HystrixCollapserKeyDefault.AsKey("Collapser-Batch-Size-B");

            stream = RollingCollapserBatchSizeDistributionStream.GetInstance(key, 10, 100);
            stream.StartCachingStreamValuesIfUnstarted();

            CountdownEvent latch = new CountdownEvent(1);

            stream.Observe().Take(10).Subscribe(
                (distribution) =>
            {
                output.WriteLine("OnNext @ " + (DateTime.Now.Ticks / 10000) + " : " + distribution.GetMean() + "/" + distribution.GetTotalCount() + " " + Thread.CurrentThread.ManagedThreadId);
            },
                (e) =>
            {
                Assert.True(false, e.Message);
            },
                () =>
            {
                latch.SignalEx();
            });

            Collapser.From(output, key, 1).Observe();
            Collapser.From(output, key, 2).Observe();
            Collapser.From(output, key, 3).Observe();

            try
            {
                Time.Wait(250);
            }
            catch (Exception)
            {
                Assert.False(true, "Interrupted ex");
            }

            Collapser.From(output, key, 4).Observe();

            try
            {
                Time.Wait(250);
            }
            catch (Exception)
            {
                Assert.False(true, "Interrupted ex");
            }

            Collapser.From(output, key, 5).Observe();
            Collapser.From(output, key, 6).Observe();
            Collapser.From(output, key, 7).Observe();
            Collapser.From(output, key, 8).Observe();
            Collapser.From(output, key, 9).Observe();

            try
            {
                Time.Wait(250);
            }
            catch (Exception)
            {
                Assert.False(true, "Interrupted ex");
            }

            Collapser.From(output, key, 10).Observe();
            Collapser.From(output, key, 11).Observe();
            Collapser.From(output, key, 12).Observe();

            Assert.True(latch.Wait(10000), "CountdownEvent was not set!");

            // should have 4 batches: 3, 1, 5, 3
            Assert.Equal(4, stream.Latest.GetTotalCount());
            Assert.Equal(3, stream.LatestMean);
            Assert.Equal(1, stream.GetLatestPercentile(0));
            Assert.Equal(5, stream.GetLatestPercentile(100));
        }
Beispiel #10
0
        public void TestBatches()
        {
            IHystrixCollapserKey key   = HystrixCollapserKeyDefault.AsKey("Collapser-Batch-Size-B");
            CountdownEvent       latch = new CountdownEvent(1);
            var observer = new LatchedObserver(output, latch);

            stream            = RollingCollapserBatchSizeDistributionStream.GetInstance(key, 10, 100);
            latchSubscription = stream.Observe().Subscribe(observer);
            Assert.True(Time.WaitUntil(() => observer.StreamRunning, 1000), "Stream failed to start");

            // First collapser created with key will be used for all command creations
            List <Task> tasks = new List <Task>();

            var c1 = Collapser.From(output, key, 1);

            tasks.Add(c1.ExecuteAsync());
            var c2 = Collapser.From(output, key, 2);

            tasks.Add(c2.ExecuteAsync());
            var c3 = Collapser.From(output, key, 3);

            tasks.Add(c3.ExecuteAsync());
            Assert.True(Time.WaitUntil(() => c1.CommandCreated, 500), "Batch 1 too long to start");
            c1.CommandCreated = false;

            var c4 = Collapser.From(output, key, 4);

            tasks.Add(c4.ExecuteAsync());
            Assert.True(Time.WaitUntil(() => c1.CommandCreated, 500), "Batch 2 too long to start");
            c1.CommandCreated = false;

            var c5 = Collapser.From(output, key, 5);

            tasks.Add(c5.ExecuteAsync());
            var c6 = Collapser.From(output, key, 6);

            tasks.Add(c6.ExecuteAsync());
            var c7 = Collapser.From(output, key, 7);

            tasks.Add(c7.ExecuteAsync());
            var c8 = Collapser.From(output, key, 8);

            tasks.Add(c8.ExecuteAsync());
            var c9 = Collapser.From(output, key, 9);

            tasks.Add(c9.ExecuteAsync());
            Assert.True(Time.WaitUntil(() => c1.CommandCreated, 500), "Batch 3 too long to start");
            c1.CommandCreated = false;

            var c10 = Collapser.From(output, key, 10);

            tasks.Add(c10.ExecuteAsync());
            var c11 = Collapser.From(output, key, 11);

            tasks.Add(c11.ExecuteAsync());
            var c12 = Collapser.From(output, key, 12);

            tasks.Add(c12.ExecuteAsync());
            Assert.True(Time.WaitUntil(() => c1.CommandCreated, 500), "Batch 4 too long to start");

            Task.WaitAll(tasks.ToArray());
            Assert.True(WaitForLatchedObserverToUpdate(observer, 1, 500, output), "Latch took to long to update");

            // should have 4 batches: 3, 1, 5, 3
            Assert.Equal(4, stream.Latest.GetTotalCount());
            Assert.Equal(3, stream.LatestMean);
            Assert.Equal(1, stream.GetLatestPercentile(0));
            Assert.Equal(5, stream.GetLatestPercentile(100));
        }
Beispiel #11
0
        public void TestBatchesAgeOut()
        {
            IHystrixCollapserKey key   = HystrixCollapserKeyDefault.AsKey("Collapser-Batch-Size-B");
            CountdownEvent       latch = new CountdownEvent(1);
            var observer = new LatchedObserver(output, latch);

            stream            = RollingCollapserBatchSizeDistributionStream.GetInstance(key, 10, 100);
            latchSubscription = stream.Observe().Take(20 + LatchedObserver.STABLE_TICK_COUNT).Subscribe(observer);
            Assert.True(Time.WaitUntil(() => observer.StreamRunning, 1000), "Stream failed to start");

            // First collapser created with key will be used for all command creations
            List <Task> tasks = new List <Task>();

            var c1 = Collapser.From(output, key, 1);

            tasks.Add(c1.ExecuteAsync());
            var c2 = Collapser.From(output, key, 2);

            tasks.Add(c2.ExecuteAsync());
            var c3 = Collapser.From(output, key, 3);

            tasks.Add(c3.ExecuteAsync());
            Assert.True(Time.WaitUntil(() => c1.CommandCreated, 500), "Batch 1 too long to start");
            c1.CommandCreated = false;

            var c4 = Collapser.From(output, key, 4);

            tasks.Add(c4.ExecuteAsync());
            Assert.True(Time.WaitUntil(() => c1.CommandCreated, 500), "Batch 2 too long to start");
            c1.CommandCreated = false;

            var c5 = Collapser.From(output, key, 5);

            tasks.Add(c5.ExecuteAsync());
            var c6 = Collapser.From(output, key, 6);

            tasks.Add(c6.ExecuteAsync());
            var c7 = Collapser.From(output, key, 7);

            tasks.Add(c7.ExecuteAsync());
            var c8 = Collapser.From(output, key, 8);

            tasks.Add(c8.ExecuteAsync());
            var c9 = Collapser.From(output, key, 9);

            tasks.Add(c9.ExecuteAsync());
            Assert.True(Time.WaitUntil(() => c1.CommandCreated, 500), "Batch 3 too long to start");
            c1.CommandCreated = false;

            var c10 = Collapser.From(output, key, 10);

            tasks.Add(c10.ExecuteAsync());
            var c11 = Collapser.From(output, key, 11);

            tasks.Add(c11.ExecuteAsync());
            var c12 = Collapser.From(output, key, 12);

            tasks.Add(c12.ExecuteAsync());
            Assert.True(Time.WaitUntil(() => c1.CommandCreated, 500), "Batch 4 too long to start");

            Task.WaitAll(tasks.ToArray());

            Assert.True(latch.Wait(10000), "CountdownEvent was not set!");

            Assert.Equal(0, stream.Latest.GetTotalCount());
            Assert.Equal(0, stream.LatestMean);
        }
Beispiel #12
0
        private static async Task <int> MainAsync(string[] args)
        {
            var result = Parser.Default.ParseArguments <ScrapeOptions, CollapseOptions>(args);

            if (result.Tag == ParserResultType.NotParsed)
            {
                return(1);
            }

            var parsedResult = (Parsed <object>)result;

            if (parsedResult.Value is ScrapeOptions)
            {
                // initialize
                var systemTime       = new SystemTime();
                var httpClient       = new HttpClient();
                var connectorClient  = new Client(httpClient);
                var connectorScraper = new Scraper(systemTime, connectorClient);
                var jsonWriter       = new JsonTextWriter(Console.Out);
                var writer           = new JsonScrapeResultWriter(jsonWriter);

                // act
                await connectorScraper.RealTimeScrapeAsync(writer);

                return(0);
            }

            if (parsedResult.Value is CollapseOptions)
            {
                // initialize
                var options     = (CollapseOptions)parsedResult.Value;
                var pathBuilder = new PathBuilder();
                var collapser   = new Collapser(pathBuilder);
                IAsyncEqualityComparer <Stream> comparer;
                switch (options.ComparisonType)
                {
                case ComparisonType.ScrapeResult:
                    comparer = new ScrapeResultEqualityComparer();
                    break;

                default:
                    comparer = new ZipArchiveEqualityComparer();
                    break;
                }

                var request = new CollapseRequest
                {
                    ConnectionString = options.ConnectionString,
                    PathFormat       = options.PathFormat,
                    Container        = options.Container,
                    Trace            = Console.Out,
                    Comparer         = new AdapterCollapserComparer(StringComparer.Ordinal, comparer)
                };

                // act
                await collapser.CollapseAsync(request);

                return(0);
            }

            return(0);
        }