internal CMetric Collect() { var metric = new CMetric(); Populate(metric); metric.Labels = _labelValues.WireLabels; return(metric); }
private static string WriteMetric(CMetricFamily family, CMetric cMetric) { var s = new StringBuilder(); var familyName = family.Name; if (cMetric.CGauge != null) { s.AppendLine(SimpleValue(familyName, cMetric.CGauge.Value, cMetric.Labels)); } else if (cMetric.CCounter != null) { s.AppendLine(SimpleValue(familyName, cMetric.CCounter.Value, cMetric.Labels)); } else if (cMetric.CSummary != null) { s.AppendLine(SimpleValue(familyName, cMetric.CSummary.SampleSum, cMetric.Labels, "_sum")); s.AppendLine(SimpleValue(familyName, cMetric.CSummary.SampleCount, cMetric.Labels, "_count")); foreach (var quantileValuePair in cMetric.CSummary.Quantiles) { var quantile = double.IsPositiveInfinity(quantileValuePair.Quantile) ? "+Inf" : quantileValuePair.Quantile.ToString(CultureInfo.InvariantCulture); s.AppendLine(SimpleValue(familyName, quantileValuePair.Value, cMetric.Labels.Concat(new[] { new CLabelPair { Name = "quantile", Value = quantile } }))); } } else if (cMetric.CHistogram != null) { s.AppendLine(SimpleValue(familyName, cMetric.CHistogram.SampleSum, cMetric.Labels, "_sum")); s.AppendLine(SimpleValue(familyName, cMetric.CHistogram.SampleCount, cMetric.Labels, "_count")); foreach (var bucket in cMetric.CHistogram.Buckets) { var value = double.IsPositiveInfinity(bucket.UpperBound) ? "+Inf" : bucket.UpperBound.ToString(CultureInfo.InvariantCulture); s.AppendLine(SimpleValue(familyName, bucket.CumulativeCount, cMetric.Labels.Concat(new[] { new CLabelPair { Name = "le", Value = value } }), "_bucket")); } } return(s.ToString()); }
protected override void Populate(CMetric cMetric) { var wireMetric = new Contracts.CHistogram { SampleCount = 0L }; for (var i = 0; i < _bucketCounts.Length; i++) { wireMetric.SampleCount += (ulong)_bucketCounts[i].Value; wireMetric.Buckets.Add(new CBucket { UpperBound = _upperBounds[i], CumulativeCount = wireMetric.SampleCount }); } wireMetric.SampleSum = _sum.Value; cMetric.CHistogram = wireMetric; }
internal void Populate(CMetric cMetric, DateTime now) { var summary = new CSummary(); var quantiles = new CQuantile[_objectives.Count]; lock (_bufLock) { lock (_lock) { // Swap bufs even if hotBuf is empty to set new hotBufExpTime. SwapBufs(now); FlushColdBuf(); summary.SampleCount = _count; summary.SampleSum = _sum; for (var idx = 0; idx < _sortedObjectives.Length; idx++) { var rank = _sortedObjectives[idx]; var q = _headStream.Count == 0 ? double.NaN : _headStream.Query(rank); quantiles[idx] = new CQuantile { Quantile = rank, Value = q }; } } } if (quantiles.Length > 0) { Array.Sort(quantiles, _quantileComparer); } foreach (var quantile in quantiles) { summary.Quantiles.Add(quantile); } cMetric.CSummary = summary; }
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.ThisChild(); child.Init(sum, LabelValues.Empty, baseTime); CSummary m; var metric = new CMetric(); 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.CSummary; var got = m.Quantiles[0].Value; var want = Math.Max((double)i / 10, (double)i - 90); Assert.True(Math.Abs(got - want) <= 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.CSummary; Assert.True(double.IsNaN(m.Quantiles[0].Value)); }
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 CMetric(); summary.Populate(metric, DateTime.UtcNow); var m = metric.CSummary; Assert.Equal(numObservations * numIterations, (int)m.SampleCount); Assert.Equal(expectedSum, m.SampleSum); Assert.True(m.Quantiles.Single(_ => _.Quantile.Equals(0.5)).Value >= 50 - 2); Assert.True(m.Quantiles.Single(_ => _.Quantile.Equals(0.5)).Value <= 50 + 2); Assert.True(m.Quantiles.Single(_ => _.Quantile.Equals(0.9)).Value >= 90 - 2); Assert.True(m.Quantiles.Single(_ => _.Quantile.Equals(0.9)).Value <= 90 + 2); Assert.True(m.Quantiles.Single(_ => _.Quantile.Equals(0.99)).Value >= 99 - 2); Assert.True(m.Quantiles.Single(_ => _.Quantile.Equals(0.99)).Value <= 99 + 2); }
protected override void Populate(CMetric cMetric) { cMetric.CCounter = new CCounter { Value = Value }; }
protected override void Populate(CMetric cMetric) { Populate(cMetric, DateTime.UtcNow); }
protected abstract void Populate(CMetric cMetric);
protected override void Populate(CMetric cMetric) { cMetric.CGauge = new Contracts.CGauge { Value = Value }; }