コード例 #1
0
        public LogsBenchmark(bool manyMinutes, bool manyYears)
        {
            _logs = new RaxNewLog[N][];

            var rnd = new Random();

            var lastLogTime = DateTime.UtcNow;

            long totalLogIndex = 0;

            for (int i = 0; i < N; i++)
            {
                _logs[i] = new RaxNewLog[LOGS];
                for (int j = 0; j < LOGS; j++, ++totalLogIndex)
                {
                    var local = new List <string>();

                    var indx = rnd.Next(0, _cats.Length);
                    if (rnd.NextDouble() > 0.5)
                    {
                        local.Add(_cats[indx]);
                        var nindx = rnd.Next(0, _cats.Length);
                        while (nindx == indx)
                        {
                            nindx = rnd.Next(0, _cats.Length);
                        }
                        indx = nindx;
                    }
                    local.Add(_cats[indx]);

                    _logs[i][j] = new RaxNewLog
                    {
                        Categories = local.ToArray(),
                        Message    = $"LOG ENTRY {i}x{j} - {Guid.NewGuid():N}".ToCharArray(),
                        Timestamp  = lastLogTime.ToTimestamp()
                    };

                    if (manyMinutes && rnd.NextDouble() > 0.4)
                    {
                        lastLogTime = lastLogTime.AddMinutes(rnd.Next(0, 60));
                    }
                    else if (manyYears && totalLogIndex % 5000 == 0)
                    {
                        lastLogTime = lastLogTime.AddMonths(3);
                    }
                }
            }

            string logsDir = $"_temp_bench_{N}_{LOGS}";

            if (!Directory.Exists(logsDir))
            {
                Directory.CreateDirectory(logsDir);
            }
            Directory.GetFiles(logsDir).ToList().ForEach(x => File.Delete(x));
            _table = RaxManager.OpenTable(logsDir);
        }
コード例 #2
0
        public void FullTest()
        {
            Console.WriteLine("-- BEGIN FULL TEST -- ");

            const string dir = "full-test";

            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }

            Directory.GetFiles(dir).ToList().ForEach(x => File.Delete(x));

            using var table = RaxManager.OpenTable(dir);

            var sw = Stopwatch.StartNew();

            foreach (var item in _logsToAdd)
            {
                table.AppendLogs(item);
            }
            sw.Stop();
            Console.WriteLine($"WRITE ({ITERS * LOGS_PER_ITER}) LOGS = {sw.Elapsed}");

            sw = Stopwatch.StartNew();
            var allLogs = GetLogs(0, long.MaxValue);

            sw.Stop();
            Console.WriteLine($"READ  ({allLogs.Length}) LOGS = {sw.Elapsed}");

            var testIndex = LOGS_PER_ITER / 3;

            var rangedLogs = GetLogs(testIndex, 101);

            if (rangedLogs.Length != 101)
            {
                throw new Exception("Выборка логов вернула больше или меньше, чем запрашивалось.");
            }

            if (rangedLogs[0].Text != allLogs[testIndex].Text)
            {
                throw new Exception("Выборка логов ошиблась в смещение (начало смещения).");
            }
            if (rangedLogs[100].Text != allLogs[testIndex + 100].Text)
            {
                throw new Exception("Выборка логов ошиблась в смещение (конец смещения).");
            }

            if (allLogs.Length != ITERS * LOGS_PER_ITER + 1)
            {
                throw new Exception("Количество прочитанных логов не соответсвует количеству добавленных.");
            }
            if (allLogs[1].Date.ToTimestamp() != _beginTime.ToTimestamp())
            {
                throw new Exception("Время первого лога не совпадает с действительным.");
            }
            if (allLogs.Last().Date.ToTimestamp() != _endTime.ToTimestamp())
            {
                throw new Exception("Время последнего лога не совпадает с действительным.");
            }


            var dict = new Dictionary <string, int>();

            foreach (var log in allLogs)
            {
                foreach (var cat in log.Categories)
                {
                    dict.TryGetValue(cat, out var prev);
                    dict[cat] = prev + 1;
                }
            }
            var tableCategories = table.Categories;

            foreach (var cat in tableCategories)
            {
                if (!dict.TryGetValue(cat.Name, out var logsCount))
                {
                    throw new Exception("В полученных логах нет одной из существующих категорий.");
                }
                if (logsCount != cat.LogsCount)
                {
                    throw new Exception("Количество полученных логов в одной из категорий не соответствует данным в таблице.");
                }
            }
            foreach (var catname in dict.Keys)
            {
                if (!tableCategories.Any(x => x.Name == catname))
                {
                    throw new Exception("В таблице нет информации о какой-то категории.");
                }
            }


            foreach (var log in allLogs)
            {
                if (log.Categories == null || log.Categories.Length == 0)
                {
                    throw new Exception("У какой-то записи лога нет категорий.");
                }
                if (log.Date < _beginTime)
                {
                    throw new Exception("Время одного из полученных логов меньше времени первого лога.");
                }
                if (log.Date > _endTime)
                {
                    throw new Exception("Время одного из полученных логов превышает время последнего лога.");
                }
            }


            RaxLogEntry[] GetLogs(long skip, long take) => table.GetLogs(table.MinTimestamp, table.MaxTimestamp, skip, take);

            var metrics = RaxManager.GetMetricsSource(dir);

            foreach (var metric in metrics.GetAllMetrics())
            {
                Console.WriteLine($" -- [{metric.Key,-10}] = {metric.Value}");
            }

            var compressedPercents =
                100.0 * metrics.GetMetricValue <long>(MetricsConstants.TOTAL_COMPRESSED_BYTES_COUNT_I64)
                /
                metrics.GetMetricValue <long>(MetricsConstants.TOTAL_PROCESSED_BYTES_COUNT_I64);

            Console.WriteLine($" -- [{'%',-10}] = {compressedPercents:00.###}%");

            Console.WriteLine("-- END FULL TEST -- ");
        }