示例#1
0
        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());
        }
示例#3
0
            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;
            }
示例#4
0
            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;
            }
示例#5
0
        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));
        }
示例#6
0
        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);
        }
示例#7
0
 protected override void Populate(CMetric cMetric)
 {
     cMetric.CCounter = new CCounter {
         Value = Value
     };
 }
示例#8
0
 protected override void Populate(CMetric cMetric)
 {
     Populate(cMetric, DateTime.UtcNow);
 }
示例#9
0
 protected abstract void Populate(CMetric cMetric);
示例#10
0
 protected override void Populate(CMetric cMetric)
 {
     cMetric.CGauge = new Contracts.CGauge {
         Value = Value
     };
 }