public void DelayingPublish() { 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.AddProvider("debug", new DebugMetricsProvider(1, true)); factory.AddProvider("trace", new TraceMetricsProvider(1, true)); factory.AddProvider("console", new ConsoleMetricsProvider(1, true)); var counter = factory.CreateSummary("Metric1", "Test metric for #1", 1, true, new string[] { "label1", "label2" }); Task.Delay(5000).GetAwaiter().GetResult(); } Assert.IsTrue(summaryValues.IsEmpty, "Single value count not expected"); Assert.IsTrue(summaryValues.IsEmpty, "Summary value count not expected"); }
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 SimpleCountSetMultiProvider() { var singleValues = new ConcurrentBag <SingleMetricHolder>(); var summaryValues = new ConcurrentBag <SummaryMetricHolder>(); var testValue = 123.5678; 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.AddProvider("debug", new DebugMetricsProvider(1, true)); factory.AddProvider("trace", new TraceMetricsProvider(1, true)); factory.AddProvider("console", new ConsoleMetricsProvider(1, true)); var counter = factory.CreateCounter("Metric1", "Test metric for #1", true, new string[] { "label1", "label2" }); for (var index = 0; index < 500; index++) { counter.SetTo(testValue); if (index < 499) { Task.Delay(10).GetAwaiter().GetResult(); } } Task.Delay(1000).GetAwaiter().GetResult(); } 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(); var maxValue = itemList.Max(item => item.Value); Assert.IsTrue(itemList.Length >= 6, $"Single value count within groupings not within expected tolerance (value { itemList.Length })"); Assert.IsTrue(maxValue.HasValue, "Max value should not be null"); Assert.IsTrue(maxValue == testValue, "Maximum value not expected"); } Assert.IsTrue(summaryValues.Count == 0, "Summary 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 SimpleCountIteration() { 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"); var pulse = factory.CreatePulse("Metric1", "Test metric for #1", true, new string[] { "label1", "label2" }); for (var index = 0; index < 500; index++) { pulse.Observe(); if (index < 499) { Task.Delay(10).GetAwaiter().GetResult(); } } Task.Delay(1000).GetAwaiter().GetResult(); } 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(); var mean = itemList.Average(item => item.Value ?? 0); Assert.IsTrue(itemList.Length >= 6, $"Single value count within groupings not within expected tolerance (value { itemList.Length })"); Assert.IsTrue(mean >= 50, $"Mean value count not in tolerance (value { mean })"); } Assert.IsTrue(summaryValues.Count == 0, "Summary 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"); }