Beispiel #1
0
        public static void Run()
        {
            // [2] Results aggregation (Or raw measurement collection, see RawDataMeasurementsDemo.cs)
            // Define how data gets aggregated.
            // Dimensions are like GROUP BY keys in SQL
            // Metrics are aggregation functions like COUNT, SUM, etc..
            // Extensive HistogramAggregator demo now WiP
            HistogramAggregator aggregator = new HistogramAggregator()
                                             .Add(new TimeDimension(TimeSpan.FromSeconds(5)))
                                             .Add(new CountMetric())
                                             .Add(new ErrorCountMetric())
                                             .Add(new TransactionsPerSecMetric())
                                             .Add(new PercentileMetric(0.95, 0.99));

            // Secondary aggregation just to monitor key metrics.
            KpiPrinterAggregator kpiPrinter = new KpiPrinterAggregator(
                TimeSpan.FromSeconds(5),
                new CountMetric(Checkpoint.NotMeassuredCheckpoints),
                new ErrorCountMetric(false),
                new TransactionsPerSecMetric()
                );

            // [3] Execution settings
            // Using StrategyBuilder put defined aggregation, scenario, and execution settings into one object
            StrategyBuilder strategy = new StrategyBuilder()
                                       .SetAggregator(aggregator, kpiPrinter)             // Optional
                                       .SetScenario <BlankScenario>()                     // Required
                                       .SetLimit(new TimeLimit(TimeSpan.FromSeconds(20))) // Optional, but if not provided, execution will never stop - unless running test with RunAsync() and stopping later with CancelAsync(true)
                                       .SetSpeed(new FixedSpeed(100000))                  // Optional (Skip for maximum throughput)
                                       .SetThreading(new FixedThreadCount(4));            // Required



            // [4] Execution
            // All that's left is Build(), run and wait for completion and print out measured results.
            LoadRunnerEngine engine = strategy.Build();

            engine.Run();

            IEnumerable <object> result = aggregator.BuildResultsObjects();

            Console.WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
        }
Beispiel #2
0
        public static void Run()
        {
            HistogramAggregator aggregator = new HistogramAggregator()
                                             .Add(new TimeDimension(TimeSpan.FromSeconds(5)))
                                             .Add(new CountMetric())
                                             .Add(new GlobalTimerPeriodMetric())
                                             .Add(new TransactionsPerSecMetric());

            StrategyBuilder strategy = new StrategyBuilder()
                                       .SetScenario <BatchStrategyDemo>()
                                       .AddSpeed(new BatchByTimeIntervalSpeed(TimeSpan.FromSeconds(5), 10))
                                       .SetThreading(new FixedThreadCount(15))
                                       .SetLimit(new TimeLimit(TimeSpan.FromSeconds(20)))
                                       .SetAggregator(aggregator);

            strategy.Build().Run();

            Console.WriteLine(JsonConvert.SerializeObject(aggregator.BuildResultsObjects(), Formatting.Indented));
        }
Beispiel #3
0
        public void EmptyPolicy_WhenException_Throw(bool isPositive, bool expectedException)
        {
            var policyRegistry = new StrategyBuilder();
            var timesExecuted  = 0;

            var policy          = policyRegistry.Build();
            var executionResult = policy.Execute(() =>
            {
                timesExecuted++;
                var num = GetNumber(isPositive);
                if (num <= 0)
                {
                    throw new Exception();
                }
                return(num);
            });

            Assert.Equal(1, timesExecuted);
            Assert.Equal(expectedException, executionResult.Exception != null);
        }
        public ITypeBuilderStrategy Build(IActionConfiguration actionConfiguration, Type returnType)
        {
            string key = actionConfiguration.ActionMethodInfo.ToString() + returnType.ToString();

            return(StrategyCache.GetCachedOrAdd(key,
                                                () =>
            {
                var sirenMetadataTypes = actionConfiguration.MetadataProvider.GetRegisteredMetadataTypes().ToList();

                Func <CustomAttributeBuilder> jsonPropAttrNullValueHandling = () =>
                {
                    var type = typeof(JsonPropertyAttribute);

                    var ctor = type.GetConstructor(Type.EmptyTypes);

                    return new CustomAttributeBuilder(ctor,
                                                      new object[] {},
                                                      new[] { type.GetProperty("NullValueHandling") }, new object[] { NullValueHandling.Ignore });
                };

                // Do not use IActionConfiguration from parameter list as configuration might be altered on call
                Action <object, object, IActionConfiguration> classNameAssigner =
                    (proxyObject, originalObject, configuration) =>
                {
                    var classProp = proxyObject.GetType().GetProperty("class");
                    classProp.SetValue(proxyObject, configuration.Class);
                };

                var strategyBuilder = new StrategyBuilder()
                                      .For(returnType)
                                      .WithPayloadPropertyStrategy(returnType, "properties")
                                      .WithSimpleAttributedPropertyStrategy(typeof(string[]), "class", new [] { jsonPropAttrNullValueHandling })
                                      .WithSimpleAttributedPropertyStrategy(typeof(string), "href", new[] { jsonPropAttrNullValueHandling })
                                      .WithSimpleAttributedPropertyStrategy(typeof(string[]), "rel", new[] { jsonPropAttrNullValueHandling })
                                      .WithCustomActivationStrategy(classNameAssigner);

                sirenMetadataTypes.ForEach(metadataType => strategyBuilder.WithTypedMetadataProperty(metadataType, metadataType.Name.ToLower()));

                return strategyBuilder.Build();
            }));
        }
Beispiel #5
0
        public static void Run()
        {
            HistogramAggregator aggregator = new HistogramAggregator()
                                             .Add(new CountMetric())
                                             .Add(new FuncMetric <TimeSpan>("max", TimeSpan.Zero, (s, result) => s < result.IterationStarted ? result.IterationStarted : s));

            AssertIterationIdsAggregator idsValidator = new AssertIterationIdsAggregator();

            int streamCount = 0;
            StreamAggregator streamAggregator = new StreamAggregator(results => streamCount = results.Count());

            CountingScenarioFactory factory = new CountingScenarioFactory();

            StrategyBuilder strategy = new StrategyBuilder()
                                       .SetScenario(factory)
                                       .SetThreading(new FixedThreadCount(16))
                                       .SetLimit(new TimeLimit(TimeSpan.FromSeconds(12)))
                                       .SetAggregator(aggregator, idsValidator, streamAggregator);


            Stopwatch sw = new Stopwatch();

            sw.Start();
            strategy.Build().Run();
            sw.Stop();

            Console.WriteLine(JsonConvert.SerializeObject(aggregator.BuildResultsObjects(), Formatting.Indented));
            factory.PrintSum();
            int      expected      = factory.GetSum();
            int      actual        = (int)aggregator.BuildResults().Data[0][1];
            TimeSpan lastIteration = (TimeSpan)aggregator.BuildResults().Data[0][3];

            Console.WriteLine($@"TPS {expected / lastIteration.TotalSeconds:N}");
            Console.WriteLine($@"Last iteration ended at: {lastIteration:g}");
            Console.WriteLine($@"Aggregator catchup took: {(sw.Elapsed-lastIteration):g}");
            Console.WriteLine();
            Console.WriteLine($@"{expected}/{actual} & {streamCount} ? {expected==actual} && {expected==streamCount}");
            Console.WriteLine();
            idsValidator.PrintResults();
        }
        public ITypeBuilderStrategy Build(IActionConfiguration actionConfiguration, Type returnType)
        {
            string key = actionConfiguration.ActionMethodInfo.ToString() + returnType.ToString();

            return(StrategyCache.GetCachedOrAdd(key,
                                                () =>
            {
                var rels =
                    (Dictionary <string, IList <string> >)
                    actionConfiguration.MetadataProvider.GetMetadataByType(
                        typeof(Dictionary <string, IList <string> >));

                IList <string> topRels = rels.Values.ToList().ConvertAll(c => c.FirstOrDefault());

                var strategyBuilder = new StrategyBuilder()
                                      .For(returnType)
                                      .WithSimpleProperties()
                                      .WithPlainRouteInformation(topRels);

                return strategyBuilder.Build();
            }));
        }
Beispiel #7
0
        public static void Run()
        {
            HistogramAggregator aggregator = new HistogramAggregator()
                                             .Add(new TimeDimension(TimeSpan.FromSeconds(4)))
                                             .Add(new CountMetric())
                                             .Add(new TransactionsPerSecMetric());

            //var kpiAggregator = new KpiPrinterAggregator(
            //    TimeSpan.FromSeconds(1),
            //    new MaxDurationMetric(),
            //    new CountMetric(Checkpoint.NotMeassuredCheckpoints),
            //    new TransactionsPerSecMetric());

            StrategyBuilder strategy = new StrategyBuilder()
                                       .SetScenario(new CountingScenarioFactory())
                                       .SetThreading(new FixedThreadCount(4))
                                       .SetLimit(new TimeLimit(TimeSpan.FromSeconds(13)))
                                       .SetAggregator(aggregator);

            strategy.Build().Run();

            Console.WriteLine(JsonConvert.SerializeObject(aggregator.BuildResultsObjects(), Formatting.Indented));
        }
Beispiel #8
0
        public static void Run()
        {
            CountingScenarioFactory scenarioFactory = new CountingScenarioFactory();

            StrategyBuilder strategy = new StrategyBuilder()
                                       .SetScenario(scenarioFactory)
                                       .SetThreading(new FixedThreadCount(4))
                                       .SetLimit(new TimeLimit(TimeSpan.FromSeconds(10)));

            // Increase TimeLimit precision
            LoadRunnerEngine engine = strategy.Build();

            engine.HeartBeatMs = 1;

            Stopwatch watch = new Stopwatch();

            watch.Start();
            engine.Run();
            watch.Stop();

            scenarioFactory.PrintSum();
            Console.WriteLine($@"TPS {scenarioFactory.GetSum() / watch.Elapsed.TotalSeconds:N}");
            Console.WriteLine(watch.Elapsed.ToString("g"));
        }
        public static void Run()
        {
            IEnumerable <IResult> rawResults       = null;
            StreamAggregator      streamAggregator = new StreamAggregator(results => rawResults = results);

            HistogramAggregator aggregator = CreateAggregator();

            HistogramAggregator aggregagorOriginal = CreateAggregator();

            StrategyBuilder strategy = new StrategyBuilder()
                                       .SetScenario <BlankScenario>()
                                       .SetThreading(new FixedThreadCount(3))
                                       .SetLimit(new TimeLimit(TimeSpan.FromSeconds(5)))
                                       .SetAggregator(streamAggregator, aggregagorOriginal);

            strategy.Build().Run();

            StreamAggregator.Replay(rawResults, aggregator);

            Console.WriteLine(@"-------- FROM LIVE AGGREGATION --------");
            Console.WriteLine(JsonConvert.SerializeObject(aggregagorOriginal.BuildResultsObjects(), Formatting.Indented));
            Console.WriteLine(@"-------- FROM STREAM --------");
            Console.WriteLine(JsonConvert.SerializeObject(aggregator.BuildResultsObjects(), Formatting.Indented));
        }
Beispiel #10
0
        public static StrategyBuilder Build(ILoggerFactory loggerFactory)
        {
            var builder = new StrategyBuilder(loggerFactory);

            return(builder);
        }
Beispiel #11
0
        /// <summary>
        /// Called when process is starting
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task StartAsync(CancellationToken cancellationToken)
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;

            string environment = null;

            FileConfigurationProvider ProviderForFile(string name) => new FileConfigurationProvider
            {
                File           = name,
                Path           = environment.IsNullOrEmpty() ? Path.Combine(AppContext.BaseDirectory, $"configs") : Path.Combine(AppContext.BaseDirectory, $"configs", environment),
                ReloadOnAccess = false
            };

            // set active configuration
            EnvironmentConfiguration.UseProvider(ProviderForFile("environment.config.json"));
            environment = EnvironmentConfiguration.Instance.Environment;

            // load custom configurations from file

            // Signals core application configuration
            ApplicationConfiguration.UseProvider(ProviderForFile("application.config.json"));
            // Signals core background application configuration
            BackgroundApplicationConfiguration.UseProvider(ProviderForFile("background.application.config.json"));
            // Application custom domain configuration
            DomainConfiguration.UseProvider(ProviderForFile("domain.config.json"));

            // use general exception handling strategy
            var strategyBuilder = new StrategyBuilder();

            strategyBuilder.Add <Exception>(new RetryStrategy {
                RetryCount = 3, RetryCooldown = TimeSpan.FromMinutes(5)
            }).SetAutoHandling(false);

            // configure Signals aspects
            var config = new BackgroundApplicationBootstrapConfiguration
            {
                // configure dependency injection
                RegistrationService = new RegistrationService(),
                // recurring task registry
                TaskRegistry = new FluentRegistry(),
                // configure caching
                CacheConfiguration = new InMemoryCacheConfiguration
                {
                    DataProvider     = new InMemoryDataProvider(),
                    ExpirationPolicy = CacheExpirationPolicy.Sliding,
                    ExpirationTime   = TimeSpan.FromMinutes(1)
                },
                // configure logging in database
                LoggerConfiguration = new DatabaseLoggingConfiguration
                {
                    Database     = DomainConfiguration.Instance.DatabaseConfiguration.ActiveConfiguration.Database,
                    Host         = DomainConfiguration.Instance.DatabaseConfiguration.ActiveConfiguration.IpAddress,
                    Username     = DomainConfiguration.Instance.DatabaseConfiguration.ActiveConfiguration.Uid,
                    Password     = DomainConfiguration.Instance.DatabaseConfiguration.ActiveConfiguration.Pwd,
                    DataProvider = DataProvider.SqlClient,
                    TableName    = "LogEntity"
                },
                // configure localization from json files
                LocalizationConfiguration = new JsonDataProviderConfiguration
                {
                    DirectoryPath       = Path.Combine(AppContext.BaseDirectory, "system.resources"),
                    FileExtension       = "app",
                    LocalizationSources = new List <LocalizationSource>
                    {
                        new LocalizationSource
                        {
                            Name       = "Mail messages",
                            SourcePath = "mailmessages"
                        },
                        new LocalizationSource
                        {
                            Name       = "Validation rules",
                            SourcePath = "validationrules"
                        },
                        new LocalizationSource
                        {
                            Name       = "Pages",
                            SourcePath = "pages"
                        },
                        new LocalizationSource
                        {
                            Name       = "Processes",
                            SourcePath = "processes"
                        }
                    }
                },
                // configure pubsub with MSSQL broker
                ChannelConfiguration = new MsSqlChannelConfiguration
                {
                    // make sure broker is enabled in the database
                    // ex: ALTER DATABASE [acme.db] SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
                    ConnectionString         = DomainConfiguration.Instance.DatabaseConfiguration.ActiveConfiguration.ConnectionString,
                    DbTableName              = DomainConfiguration.Instance.NotificationConfiguration.DbTableName,
                    MessageListeningStrategy = MessageListeningStrategy.Broker
                },
                StrategyBuilder = new StrategyBuilder().SetAutoHandling(false),
            };

            // set default serialization settings
            config.JsonSerializerSettings = new Newtonsoft.Json.JsonSerializerSettings();
            config.JsonSerializerSettings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);

            // bootstrap the configuration from the references assemblies
            var assemblies = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "App.*.dll").Select(file => Assembly.LoadFrom(file)).ToArray();

            config.Bootstrap(assemblies);

            // set current culture and UI culture
            Thread.CurrentThread.CurrentCulture   = new CultureInfo(DomainConfiguration.Instance.LocalizationConfiguration.DefaultCulture);
            Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

            return(Task.CompletedTask);
        }