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"); }
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"); }