public void SimpleTimer()
        {
            var singleValues  = new ConcurrentBag <SingleMetricHolder>();
            var summaryValues = new ConcurrentBag <SummaryMetricHolder>();

            using (var factory = new MetricFactory())
            {
                factory.AddCallback("callback1", 1, (object userState, string name, string[] labels, double?value, CancellationToken cancellationToken) =>
                {
                    singleValues.Add(new SingleMetricHolder {
                        SampleTime = DateTime.UtcNow, Labels = labels, Name = name, UserState = userState, Value = value
                    });
                    return(Task.CompletedTask);
                },
                                    (object userState, string name, string[] labels, int?count, double?minimum, double?maximum, double?mean, double?standardDeviation, double?p50, double?p90, double?p95, double?p98, double?p99, CancellationToken cancellationToken) =>
                {
                    summaryValues.Add(new SummaryMetricHolder {
                        SampleTime = DateTime.UtcNow, Labels = labels, Name = name, UserState = userState, Count = count, Minimum = minimum, Maximum = maximum, Mean = mean, StandardDeviation = standardDeviation, p50 = p50, p90 = p90, p95 = p95, p98 = p98, p99 = p99
                    });
                    return(Task.CompletedTask);
                }, "test");

                // Added to force aggregated to be added while allowing for callback tracking
                factory.AddDebug("debug", 1, false);

                var summary = factory.CreateSummary("Metric1", "Test metric for #1", 5, true, new string[] { "label1", "label2" });

                for (var index = 0; index < 1000; index++)
                {
                    using (summary.Time())
                    {
                        Task.Delay(10).GetAwaiter().GetResult();
                    }
                }

                Task.Delay(1000).GetAwaiter().GetResult();
            }

            var groupings = summaryValues.GroupBy(item => item.Name).ToArray();

            Assert.IsTrue(groupings.Length == 1, "Metric count not expected");

            var start = 0;

            foreach (var item in groupings)
            {
                var itemList = item.OrderBy(item => item.SampleTime).ToArray();

                var average = itemList.Average(item => item.p50);

                Assert.IsTrue(itemList.Length > 5, "More than 5 items were expected");
//                Assert.IsTrue(average >= 10 && average <= 20, "Average was not expected when more than 5 values in frame");

                start += itemList.Length;
            }

            Assert.IsTrue(singleValues.IsEmpty, "single value count not expected");
        }
        public void FactoryCreateCountIteration()
        {
            var singleValues  = new ConcurrentBag <SingleMetricHolder>();
            var summaryValues = new ConcurrentBag <SummaryMetricHolder>();

            using (var factory = new MetricFactory())
            {
                factory.AddCallback("callback1", 1, (object userState, string name, string[] labels, double?value, CancellationToken cancellationToken) =>
                {
                    singleValues.Add(new SingleMetricHolder {
                        SampleTime = DateTime.UtcNow, Labels = labels, Name = name, UserState = userState, Value = value
                    });
                    return(Task.CompletedTask);
                },
                                    (object userState, string name, string[] labels, int?count, double?minimum, double?maximum, double?mean, double?standardDeviation, double?p50, double?p90, double?p95, double?p98, double?p99, CancellationToken cancellationToken) =>
                {
                    summaryValues.Add(new SummaryMetricHolder {
                        SampleTime = DateTime.UtcNow, Labels = labels, Name = name, UserState = userState, Count = count, Minimum = minimum, Maximum = maximum, Mean = mean, StandardDeviation = standardDeviation, p50 = p50, p90 = p90, p95 = p95, p98 = p98, p99 = p99
                    });
                    return(Task.CompletedTask);
                }, "test");

                factory.AddDebug("debug", 1, true);
                factory.AddTrace("trace", 1, true);
                factory.AddConsole("console", 1, true);

                var summary = factory.CreateSummary("Metric1", "Test metric for #1", 5, true, new string[] { "label1", "label2" });

                for (var index = 0; index < 1500; index++)
                {
                    summary.Observe(_doubleValues[index % _doubleValues.Length]);
                    if (index < 1499)
                    {
                        Task.Delay(10).GetAwaiter().GetResult();
                    }
                }

                Task.Delay(1000).GetAwaiter().GetResult();
            }

            var groupings = summaryValues.GroupBy(item => item.Name).ToArray();

            Assert.IsTrue(groupings.Length == 1, "Metric count not expected");

            var start = 0;

            foreach (var item in groupings)
            {
                var itemList = item.OrderBy(item => item.SampleTime).ToArray();

                start += itemList.Length;
            }

            Assert.IsTrue(singleValues.IsEmpty, "single value count not expected");
        }
예제 #3
0
        public void SimpleGaugeTracker()
        {
            var singleValues  = new ConcurrentBag <SingleMetricHolder>();
            var summaryValues = new ConcurrentBag <SummaryMetricHolder>();

            using (var factory = new MetricFactory())
            {
                factory.AddCallback("callback1", 1, (object userState, string name, string[] labels, double?value, CancellationToken cancellationToken) =>
                {
                    singleValues.Add(new SingleMetricHolder {
                        SampleTime = DateTime.UtcNow, Labels = labels, Name = name, UserState = userState, Value = value
                    });
                    return(Task.CompletedTask);
                },
                                    (object userState, string name, string[] labels, int?count, double?minimum, double?maximum, double?mean, double?standardDeviation, double?p50, double?p90, double?p95, double?p98, double?p99, CancellationToken cancellationToken) =>
                {
                    summaryValues.Add(new SummaryMetricHolder {
                        SampleTime = DateTime.UtcNow, Labels = labels, Name = name, UserState = userState, Count = count, Minimum = minimum, Maximum = maximum, Mean = mean, StandardDeviation = standardDeviation, p50 = p50, p90 = p90, p95 = p95, p98 = p98, p99 = p99
                    });
                    return(Task.CompletedTask);
                }, "test");

                // Added to force aggregated to be added while allowing for callback tracking
                factory.AddDebug("debug", 1, false);
                var gauge = factory.CreateGauge("Metric1", "Test metric for #1", true, new string[] { "label1", "label2" });

                var disposalList = new List <IDisposable>();

                for (var index = 0; index < 500; index++)
                {
                    disposalList.Add(gauge.TrackExecution());
                    if (index < 499)
                    {
                        Task.Delay(10).GetAwaiter().GetResult();
                    }
                }

                Task.Delay(1000).GetAwaiter().GetResult();

                var maximumConcurrency = singleValues.Max(item => item.Value.Value);

                foreach (var item in disposalList)
                {
                    item.Dispose();
                }

                Task.Delay(1000).GetAwaiter().GetResult();

                var orderedValues = singleValues.OrderBy(item => item.SampleTime).ToArray();

//                Assert.IsTrue(orderedValues[orderedValues.Length - 1].Value > 50, $"The gauge final result was not expected (value {orderedValues[orderedValues.Length - 1].Value})");
            }

            var groupings = singleValues.GroupBy(item => item.Name).ToArray();

            Assert.IsTrue(groupings.Length == 1, "Metric count not expected");

            foreach (var item in groupings)
            {
                var itemList = item.OrderBy(item => item.SampleTime).ToArray();

                Assert.IsTrue(itemList.Length >= 6, $"Single value count within groupings not within expected tolerance (value { itemList.Length })");
                Assert.IsTrue((itemList.Max(item => item.Value ?? 0)) >= 500, "Maximum value count not expected");
            }

            Assert.IsTrue(summaryValues.Count == 0, "Summary value count not expected");
        }