private void FillRepositoryWithPreviousResults(IMetricsRepository repository)
        {
            Enumerable.Range(1, 31)
            .ToList()
            .ForEach(pastDay =>
            {
                var pastResultsEU = new Dictionary <IAnalyzer <IMetric>, IMetric>
                {
                    { Initializers.Size(), new DoubleMetric(MetricEntity.Dataset, "*", "Size", Math.Floor(pastDay / 3.0)) },
                    { Initializers.Mean("sales"), new DoubleMetric(MetricEntity.Column, "sales", "Mean", pastDay * 7) }
                };

                var pastResultsNA = new Dictionary <IAnalyzer <IMetric>, IMetric>
                {
                    { Initializers.Size(), new DoubleMetric(MetricEntity.Dataset, "*", "Size", pastDay) },
                    { Initializers.Mean("sales"), new DoubleMetric(MetricEntity.Column, "sales", "Mean", pastDay * 9) }
                };

                var analyzerContextEU = new AnalyzerContext(pastResultsEU);
                var analyzerContextNA = new AnalyzerContext(pastResultsNA);

                long dateTime = CreateDate(2018, 7, pastDay);

                repository.Save(new ResultKey(dateTime, new Dictionary <string, string> {
                    { "marketplace", "EU" }
                }),
                                analyzerContextEU);

                repository.Save(new ResultKey(dateTime, new Dictionary <string, string> {
                    { "marketplace", "NA" }
                }),
                                analyzerContextNA);
            });
        }
        private VerificationResult CreateAnomalyChecksAndRunEverything(
            DataFrame data,
            IMetricsRepository repository,
            Check otherCheck,
            IEnumerable <IAnalyzer <IMetric> > additionalRequiredAnalyzers)
        {
            // We only want to use historic data with the EU tag for the anomaly checks since the new
            // data point is from the EU marketplace
            var filterEU = new Dictionary <string, string> {
                { "marketplace", "EU" }
            };

            // We only want to use data points before the date time associated with the current
            // data point and only ones that are from 2018
            var afterDateTime  = CreateDate(2018, 1, 1);
            var beforeDateTime = CreateDate(2018, 8, 1);

            // Config for the size anomaly check
            var sizeAnomalyCheckConfig = new AnomalyCheckConfig(CheckLevel.Error, "Size only increases",
                                                                filterEU, afterDateTime, beforeDateTime);
            var sizeAnomalyDetectionStrategy = new AbsoluteChangeStrategy(0);

            // Config for the mean sales anomaly check
            var meanSalesAnomalyCheckConfig = new AnomalyCheckConfig(
                CheckLevel.Warning,
                "Sales mean within 2 standard deviations",
                filterEU,
                afterDateTime,
                beforeDateTime
                );

            var meanSalesAnomalyDetectionStrategy = new OnlineNormalStrategy(upperDeviationFactor: 2, lowerDeviationFactor: Option <double> .None,
                                                                             ignoreAnomalies: false);

            // ResultKey to be used when saving the results of this run
            var currentRunResultKey =
                new ResultKey(CreateDate(2018, 8, 1), new Dictionary <string, string> {
                { "marketplace", "EU" }
            });


            return(new VerificationSuite()
                   .OnData(data)
                   .AddCheck(otherCheck)
                   .AddRequiredAnalyzers(additionalRequiredAnalyzers)
                   .UseRepository(repository)
                   // Add the Size anomaly check
                   .AddAnomalyCheck(sizeAnomalyDetectionStrategy, Initializers.Size(), sizeAnomalyCheckConfig)
                   // Add the Mean sales anomaly check
                   .AddAnomalyCheck(meanSalesAnomalyDetectionStrategy, Initializers.Mean("sales"),
                                    meanSalesAnomalyCheckConfig)
                   // Save new data point in the repository after we calculated everything
                   .SaveOrAppendResult(currentRunResultKey)
                   .Run());
        }
        private static void Evaluate(SparkSession session, Action <AnalyzerContext, IMetricsRepository> func)
        {
            DataFrame data = FixtureSupport.GetDFFull(session);

            AnalyzerContext results = CreateAnalysis().Run(data, Option <IStateLoader> .None,
                                                           Option <IStatePersister> .None);

            IMetricsRepository repository = CreateRepository();

            func(results, repository);
        }
示例#4
0
 public MetricsStore(
     IMetricsRepository <Metric> metricRepository,
     ILogger <MetricsStore> logger,
     IDbQueryConfiguration dbQuery,
     ICacheManager cacheManager)
 {
     _metricRepository = metricRepository;
     _cacheManager     = cacheManager;
     _dbQuery          = dbQuery;
     _logger           = logger;
 }
        private void TestAnomalyDetection(
            SparkSession session,
            IMetricsRepository repository)
        {
            var data = GetTestData(session);

            // Fill repository with some fake results from previous runs for July 2018
            FillRepositoryWithPreviousResults(repository);

            // Some other checks and analyzers we are interested in not related to the anomaly detection
            var(otherCheck, additionalRequiredAnalyzers) = GetNormalCheckAndRequiredAnalyzers();

            // This method is where the interesting stuff happens
            var verificationResult = CreateAnomalyChecksAndRunEverything(data, repository, otherCheck,
                                                                         additionalRequiredAnalyzers);

            PrintConstraintResults(verificationResult);

            AssertAnomalyCheckResultsAreCorrect(verificationResult);
        }
示例#6
0
        public QueueConsumerServiceTests()
        {
            var logger        = new Mock <ILogger>();
            var loggerFactory = new Mock <ILoggerFactory>();

            loggerFactory.Setup(c => c.CreateLogger(It.IsAny <string>())).Returns(logger.Object);
            _loggerFactory = loggerFactory.Object;

            var metricsRepo = new Mock <IMetricsRepository>();

            _metricsRepo = metricsRepo.Object;

            var model      = new Mock <IModel>();
            var connection = new Mock <IConnection>();

            connection.Setup(c => c.CreateModel()).Returns(model.Object);
            var connectonFactory = new Mock <ConnectionFactory>();

            connectonFactory.Setup(c => c.CreateConnection()).Returns(connection.Object);
            _connectionFactory = connectonFactory.Object;
        }
示例#7
0
 /// <summary>
 /// Set a metrics repository associated with the current data to enable features like reusing previously computed results and storing the results of the current run.
 /// </summary>
 /// <param name="metricsRepository">A metrics repository to store and load results associated with the run</param>
 /// <returns></returns>
 public VerificationRunBuilderWithRepository UseRepository(IMetricsRepository metricsRepository) =>
 new VerificationRunBuilderWithRepository(this,
                                          new Option <IMetricsRepository>(metricsRepository));
示例#8
0
 public QueueConsumerService(ILoggerFactory loggerFactory, IMetricsRepository metricsRepository)
 {
     _metricsRepository = metricsRepository;
     _logger            = loggerFactory.CreateLogger <QueueConsumerService>();
 }
 public ServiceBusMetricsController(IMetricsRepository <ServiceBusModel> serviceBusMetricsRepository)
 {
     _serviceBusMetricsRepository = serviceBusMetricsRepository;
 }
示例#10
0
 public MetricsModel(IMetricsRepository metricsRepo)
 {
     _metricsRepo = metricsRepo;
 }
示例#11
0
 public MetricGetHandler(IMetricsRepository repository = null)
 {
     _repository = repository ?? new MetricRepository();
 }
 public QueueMetricsController(IMetricsRepository <QueueMetricModel> queuesMetricRepository)
 {
     _queuesMetricRepository = queuesMetricRepository;
 }
 public MetricsService(IMetricsRepository metricsRepository)
 {
     _metricsRepository = metricsRepository;
 }
示例#14
0
 public MetricsService(IMetricsRepository metricsRepo, IUnitOfWork unitOfWork)
 {
     _metricsRepo = metricsRepo;
     _unitOfWork  = unitOfWork;
 }
示例#15
0
 public MetricsController(IMetricsRepository metricsRepository)
 {
     _metricsRepository = metricsRepository;
 }