public void BencharmSummaryWrite(int w) { var stopwatch = new Stopwatch(); var summary = new Summary("test_summary", "helpless", new string[0]); var child = new Summary.Child(); var now = new DateTime(2016, 1, 1, 0, 0, 0, DateTimeKind.Utc); child.Init(summary, LabelValues.Empty, now); const int N = 1000; for (var obsNum = 0; obsNum < 1000000; obsNum++) { child.Observe(obsNum, now); } stopwatch.Start(); var tasks = new Task[w]; for (var taskNum = 0; taskNum < w; taskNum++) { var metric = new Metric(); tasks[taskNum] = Task.Factory.StartNew(() => { for (var i = 0; i < N; i++) child.Populate(metric, now); }); } Task.WaitAll(tasks); stopwatch.Stop(); TestContext.WriteLine($"{w} tasks doing {N} writes took {stopwatch.Elapsed.TotalMilliseconds} milliseconds"); }
internal Metric Collect() { var metric = new Metric(); Populate(metric); metric.label = _labelValues.WireLabels; //metric.timestamp_ms = (long) (ts.Subtract(new DateTime(1970, 1, 1))).TotalMilliseconds; return metric; }
private static void WriteMetric(StreamWriter streamWriter, MetricFamily family, Metric metric) { var familyName = family.name; if (metric.gauge!=null) { streamWriter.WriteLine(SimpleValue(familyName, metric.gauge.value, metric.label)); } else if (metric.counter!=null) { streamWriter.WriteLine(SimpleValue(familyName, metric.counter.value, metric.label)); } else if (metric.summary != null) { streamWriter.WriteLine(SimpleValue(familyName, metric.summary.sample_sum, metric.label, "_sum")); streamWriter.WriteLine(SimpleValue(familyName, metric.summary.sample_count, metric.label, "_count")); foreach (var quantileValuePair in metric.summary.quantile) { var quantile = double.IsPositiveInfinity(quantileValuePair.quantile) ? "+Inf" : quantileValuePair.quantile.ToString(CultureInfo.InvariantCulture); streamWriter.WriteLine(SimpleValue(familyName, quantileValuePair.value, metric.label.Concat(new []{new LabelPair{name= "quantile", value = quantile}}))); } } else if (metric.histogram != null) { streamWriter.WriteLine(SimpleValue(familyName, metric.histogram.sample_sum, metric.label, "_sum")); streamWriter.WriteLine(SimpleValue(familyName, metric.histogram.sample_count, metric.label, "_count")); foreach (var bucket in metric.histogram.bucket) { var value = double.IsPositiveInfinity(bucket.upper_bound) ? "+Inf" : bucket.upper_bound.ToString(CultureInfo.InvariantCulture); streamWriter.WriteLine(SimpleValue(familyName, bucket.cumulative_count, metric.label.Concat(new []{new LabelPair{name = "le", value = value}}), "_bucket")); } } else { //not supported } }
protected abstract void Populate(Metric metric);
public void TestSummaryDecay() { var baseTime = new DateTime(2015, 1, 1, 0, 0, 0, DateTimeKind.Utc); var sum = new Summary("test_summary", "helpless", new string[0], objectives: new List<QuantileEpsilonPair> {new QuantileEpsilonPair(0.1d, 0.001d)}, maxAge: TimeSpan.FromSeconds(100), ageBuckets: 10); var child = new Summary.Child(); child.Init(sum, LabelValues.Empty, baseTime); Advanced.DataContracts.Summary m; var metric = new Metric(); for (var i = 0; i < 1000; i++) { var now = baseTime.AddSeconds(i); child.Observe(i, now); if (i%10 == 0) { child.Populate(metric, now); m = metric.summary; var got = m.quantile[0].value; var want = Math.Max((double) i/10, (double) i - 90); Assert.That(Math.Abs(got-want), Is.LessThanOrEqualTo(1), $"{i}. got {got} want {want}"); } } // Wait for MaxAge without observations and make sure quantiles are NaN. child.Populate(metric, baseTime.AddSeconds(1000).AddSeconds(100)); m = metric.summary; Assert.That(m.quantile[0].value, Is.NaN); }
public void TestSummary() { var summary = Metrics.CreateSummary("Summary", "helpless", "labelName").Labels("labelValue"); // Default objectives are 0.5, 0.9, 0.99 quantile const int numIterations = 1000; const int numObservations = 100; var expectedSum = 0; for (var iteration = 0; iteration < numIterations; iteration++) { // 100 observations from 0 to 99 for (var observation = 0; observation < numObservations; observation++) { summary.Observe(observation); expectedSum += observation; } } var metric = new Metric(); summary.Populate(metric, DateTime.UtcNow); var m = metric.summary; Assert.That(m.sample_count, Is.EqualTo(numObservations * numIterations)); Assert.That(m.sample_sum, Is.EqualTo(expectedSum)); Assert.That(m.quantile.Single(_ => _.quantile.Equals(0.5)).value, Is.EqualTo(50).Within(2)); Assert.That(m.quantile.Single(_ => _.quantile.Equals(0.9)).value, Is.EqualTo(90).Within(2)); Assert.That(m.quantile.Single(_ => _.quantile.Equals(0.99)).value, Is.EqualTo(99).Within(2)); }