Example #1
0
        public async Task ReportMetricAsync_GetsValidInputWithOneDimensions_SuccessfullyWritesMetric()
        {
            // Arrange
            var metricName            = _bogus.Name.FirstName();
            var metricDescription     = _bogus.Lorem.Sentence();
            var metricValue           = _bogus.Random.Double();
            var dimensionName         = _bogus.Name.FirstName();
            var dimensionValue        = _bogus.Name.FirstName();
            var expectedDimensionName = dimensionName.ToLower();
            var timeSeries            = new TimeSeriesElement
            {
                Metadatavalues = new List <MetadataValue> {
                    new MetadataValue(name: new LocalizableString(dimensionName), value: dimensionValue)
                }
            };
            var measuredMetric             = MeasuredMetric.CreateForDimension(metricValue, dimensionName.ToUpper(), timeSeries);
            var scrapeResult               = ScrapeResultGenerator.GenerateFromMetric(measuredMetric);
            var metricsDeclarationProvider = CreateMetricsDeclarationProvider(metricName);
            var prometheusConfiguration    = CreatePrometheusConfiguration();
            var mocks      = CreatePrometheusMetricFactoryMock();
            var metricSink = new PrometheusScrapingEndpointMetricSink(mocks.Factory.Object, metricsDeclarationProvider, prometheusConfiguration, NullLogger <PrometheusScrapingEndpointMetricSink> .Instance);

            // Act
            await metricSink.ReportMetricAsync(metricName, metricDescription, scrapeResult);

            // Assert
            mocks.Factory.Verify(mock => mock.CreateGauge(metricName, metricDescription, It.IsAny <bool>(), It.Is <string[]>(specified => specified.Contains(expectedDimensionName) && EnsureAllArrayEntriesAreSpecified(specified, scrapeResult.Labels.Keys.ToArray()))), Times.Once());
            mocks.MetricFamily.Verify(mock => mock.WithLabels(It.Is <string[]>(specified => specified.Contains(dimensionValue) && EnsureAllArrayEntriesAreSpecified(specified, scrapeResult.Labels.Values.ToArray()))), Times.Once());
            mocks.Gauge.Verify(mock => mock.Set(metricValue), Times.Once());
        }
Example #2
0
        public static TimeSeries GetValues(string measurementId, string mrid, int?numberOf, TimeSpan?timespan, DateTime?fromDate, DateTime?toDate)
        {
            Device[] devices = Devices.Where(d => mrid == null || d.Mrid.StartsWith(mrid)).ToArray();
            DateTime d0      = fromDate.HasValue ? fromDate.Value : StartDate;
            DateTime d1      = toDate.HasValue ? toDate.Value : DateTime.Now;
            TimeSpan total   = d1.Subtract(d0);
            int      number  = numberOf.HasValue ? numberOf.Value : (int)Math.Ceiling(total.Divide(timespan.Value));
            TimeSpan diff    = total.Divide(number);

            TimeSeriesElement[] elements = new TimeSeriesElement[number];
            DateTime            di       = d0;

            for (int i = 0; i < elements.Length; i++, di += diff)
            {
                elements[i] = new TimeSeriesElement {
                    Date = di, Value = 0
                };
            }
            foreach (Device device in devices)
            {
                for (int i = 0; i < elements.Length; i++)
                {
                    elements[i].Value += GetFloatAt(elements[i].Date.Value, Devices.IndexOf(device));
                }
            }
            return(new TimeSeries()
            {
                Data = new List <TimeSeriesElement>(elements), Typeid = measurementId
            });
        }
Example #3
0
        private MetricValue GetMostRecentMetricValue(string metricName, TimeSeriesElement timeSeries, DateTime recordDateTime)
        {
            var relevantMetricValue = timeSeries.Data.Where(metricValue => metricValue.TimeStamp < recordDateTime)
                                      .OrderByDescending(metricValue => metricValue.TimeStamp)
                                      .FirstOrDefault();

            if (relevantMetricValue == null)
            {
                throw new MetricInformationNotFoundException(metricName, $"No time series entry was found recorded before {recordDateTime}");
            }

            return(relevantMetricValue);
        }
        private void AreEqual(TimeSeriesElement exp, TimeSeriesElement act)
        {
            if (exp != null)
            {
                Assert.NotNull(act);

                AreEqual(exp.Data, act.Data);
                AreEqual(exp.Metadatavalues, act.Metadatavalues);
            }
            else
            {
                Assert.Null(act);
            }
        }
Example #5
0
        /// <summary>
        /// Create a measured metric for a given dimension
        /// </summary>
        /// <param name="value">Measured metric value</param>
        /// <param name="dimensionName">Name of dimension that is being scraped</param>
        /// <param name="timeseries">Timeseries representing one of the dimensions</param>
        public static MeasuredMetric CreateForDimension(double?value, string dimensionName, TimeSeriesElement timeseries)
        {
            Guard.NotNullOrWhitespace(dimensionName, nameof(dimensionName));
            Guard.NotNull(timeseries, nameof(timeseries));
            Guard.For <ArgumentException>(() => timeseries.Metadatavalues.Any() == false);

            var dimensionValue = timeseries.Metadatavalues.Single(metadataValue => metadataValue.Name?.Value.Equals(dimensionName, StringComparison.InvariantCultureIgnoreCase) == true);

            return(CreateForDimension(value, dimensionName, dimensionValue.Value));
        }