예제 #1
0
        private static void PackMetricWithSetItems <T, TU>(
            IMetricPayloadBuilder <T> payloadBuilder,
            Func <string, string, string> metricNameFormatter,
            string context,
            MetricValueSourceBase <TU> valueSource,
            MetricTags setItemTags,
            IDictionary <string, object> itemData,
            string metricSetItemSuffix)
        {
            var keys   = itemData.Keys.ToList();
            var values = keys.Select(k => itemData[k]);
            var tags   = ConcatMetricTags(valueSource, setItemTags);

            if (valueSource.IsMultidimensional)
            {
                payloadBuilder.Pack(
                    metricNameFormatter(context, valueSource.MultidimensionalName + metricSetItemSuffix),
                    keys,
                    values,
                    tags);

                return;
            }

            payloadBuilder.Pack(metricNameFormatter(context, valueSource.Name + metricSetItemSuffix), keys, values, tags);
        }
예제 #2
0
        public void Build <TPayload>(MetricsDataValueSource metricsData, IMetricPayloadBuilder <TPayload> payloadBuilder)
        {
            foreach (var contextValueSource in metricsData.Contexts)
            {
                foreach (var valueSource in contextValueSource.ApdexScores)
                {
                    BuildMetricPayload(contextValueSource.Context, valueSource, payloadBuilder);
                }

                foreach (var valueSource in contextValueSource.Gauges)
                {
                    BuildMetricPayload(contextValueSource.Context, valueSource, payloadBuilder);
                }

                foreach (var valueSource in contextValueSource.Counters)
                {
                    BuildMetricPayload(contextValueSource.Context, valueSource, payloadBuilder);
                }

                foreach (var valueSource in contextValueSource.Meters)
                {
                    BuildMetricPayload(contextValueSource.Context, valueSource, payloadBuilder);
                }

                foreach (var valueSource in contextValueSource.Timers)
                {
                    BuildMetricPayload(contextValueSource.Context, valueSource, payloadBuilder);
                }

                foreach (var valueSource in contextValueSource.Histograms)
                {
                    BuildMetricPayload(contextValueSource.Context, valueSource, payloadBuilder);
                }
            }
        }
예제 #3
0
 private static void BuildMeterPayload <T>(
     string context,
     MetricValueSourceBase <MeterValue> valueSource,
     IMetricPayloadBuilder <T> payloadBuilder)
 {
     payloadBuilder.PackMeter(context, valueSource);
 }
예제 #4
0
        public static void PackCounter <T>(
            this IMetricPayloadBuilder <T> payloadBuilder,
            Func <string, string, string> metricNameFormatter,
            string context,
            MetricValueSourceBase <CounterValue> valueSource,
            CounterValueSource counterValueSource,
            IDictionary <CounterValueDataKeys, string> dataKeys)
        {
            if (counterValueSource == null)
            {
                return;
            }

            if (counterValueSource.Value.Items.Any() && counterValueSource.ReportSetItems)
            {
                foreach (var item in counterValueSource.Value.Items.Distinct())
                {
                    var itemData = new Dictionary <string, object> {
                        { dataKeys[CounterValueDataKeys.Total], item.Count }
                    };

                    if (counterValueSource.ReportItemPercentages)
                    {
                        itemData.AddIfNotNanOrInfinity(dataKeys[CounterValueDataKeys.SetItemPercent], item.Percent);
                    }

                    PackMetricWithSetItems(payloadBuilder, metricNameFormatter, context, valueSource, item.Tags, itemData, dataKeys[CounterValueDataKeys.MetricSetItemSuffix]);
                }
            }

            var count = valueSource.ValueProvider.GetValue(resetMetric: counterValueSource.ResetOnReporting).Count;

            PackMetricValue(payloadBuilder, metricNameFormatter, context, valueSource, count);
        }
예제 #5
0
 private static void BuildApdexPayload <T>(
     string context,
     MetricValueSourceBase <ApdexValue> valueSource,
     IMetricPayloadBuilder <T> payloadBuilder)
 {
     payloadBuilder.PackApdex(context, valueSource);
 }
예제 #6
0
 private static void BuildHistogramPayload <T>(
     string context,
     MetricValueSourceBase <HistogramValue> valueSource,
     IMetricPayloadBuilder <T> payloadBuilder)
 {
     payloadBuilder.PackHistogram(context, valueSource);
 }
예제 #7
0
 public TestReporter(IMetricPayloadBuilder <TestMetricPayload> payloadBuilder, MetricValueDataKeys dataKeys = null)
 {
     _dataKeys            = dataKeys ?? new MetricValueDataKeys();
     _payloadBuilder      = payloadBuilder;
     _metricNameFormatter = (metricContext, metricName) => metricContext.IsMissing()
         ? $"{metricName}".Replace(' ', '_').ToLowerInvariant()
         : $"{metricContext}__{metricName}".Replace(' ', '_').ToLowerInvariant();
 }
예제 #8
0
        private static void BuildCounterPayload <T>(
            string context,
            MetricValueSourceBase <CounterValue> valueSource,
            IMetricPayloadBuilder <T> payloadBuilder)
        {
            var counterValueSource = valueSource as CounterValueSource;

            payloadBuilder.PackCounter(context, valueSource, counterValueSource);
        }
예제 #9
0
        public static void PackTimer <T>(
            this IMetricPayloadBuilder <T> payloadBuilder,
            string context,
            MetricValueSourceBase <TimerValue> valueSource)
        {
            valueSource.Value.Rate.AddMeterValues(out IDictionary <string, object> data, payloadBuilder.DataKeys.Meter);
            valueSource.Value.Histogram.AddHistogramValues(data, payloadBuilder.DataKeys.Histogram);

            PackMetric(payloadBuilder, context, valueSource, data);
        }
예제 #10
0
        public static void PackHistogram <T>(
            this IMetricPayloadBuilder <T> payloadBuilder,
            string context,
            MetricValueSourceBase <HistogramValue> valueSource)
        {
            var data = new Dictionary <string, object>();

            valueSource.Value.AddHistogramValues(data, payloadBuilder.DataKeys.Histogram);
            PackMetric(payloadBuilder, context, valueSource, data);
        }
예제 #11
0
 public static void PackGauge <T>(
     this IMetricPayloadBuilder <T> payloadBuilder,
     string context,
     MetricValueSourceBase <double> valueSource)
 {
     if (!double.IsNaN(valueSource.Value) && !double.IsInfinity(valueSource.Value))
     {
         PackMetricValue(payloadBuilder, context, valueSource, valueSource.Value);
     }
 }
        private static IMetricReporter CreateReporter(IMetricPayloadBuilder <GraphitePayload> payloadBuilder)
        {
            var reportInterval = TimeSpan.FromSeconds(1);
            var loggerFactory  = new LoggerFactory();

            return(new ReportRunner <GraphitePayload>(
                       p => Task.FromResult(true),
                       payloadBuilder,
                       reportInterval,
                       "Graphite Reporter",
                       loggerFactory));
        }
예제 #13
0
        public static void PackHistogram <T>(
            this IMetricPayloadBuilder <T> payloadBuilder,
            Func <string, string, string> metricNameFormatter,
            string context,
            MetricValueSourceBase <HistogramValue> valueSource,
            IDictionary <HistogramValueDataKeys, string> dataKeys)
        {
            var data = new Dictionary <string, object>();

            valueSource.Value.AddHistogramValues(data, dataKeys);
            PackMetric(payloadBuilder, metricNameFormatter, context, valueSource, data);
        }
예제 #14
0
        private static IMetricReporter CreateReporter(IMetricPayloadBuilder <LineProtocolPayload> payloadBuilder)
        {
            var reportInterval = TimeSpan.FromSeconds(1);
            var loggerFactory  = new LoggerFactory();

            return(new ReportRunner <LineProtocolPayload>(
                       p => AppMetricsTaskCache.SuccessTask,
                       payloadBuilder,
                       reportInterval,
                       "InfluxDB Reporter",
                       loggerFactory));
        }
예제 #15
0
        public static void PackTimer <T>(
            this IMetricPayloadBuilder <T> payloadBuilder,
            Func <string, string, string> metricNameFormatter,
            string context,
            MetricValueSourceBase <TimerValue> valueSource,
            IDictionary <MeterValueDataKeys, string> meterDataKeys,
            IDictionary <HistogramValueDataKeys, string> histogramDataKeys)
        {
            valueSource.Value.Rate.AddMeterValues(out IDictionary <string, object> data, meterDataKeys);
            valueSource.Value.Histogram.AddHistogramValues(data, histogramDataKeys);

            PackMetric(payloadBuilder, metricNameFormatter, context, valueSource, data);
        }
예제 #16
0
 public ReportRunner(
     Func <IMetricPayloadBuilder <T>, Task <bool> > flushAsync,
     IMetricPayloadBuilder <T> payloadBuilder,
     TimeSpan reportInterval,
     ILoggerFactory loggerFactory)
     : this(
         flushAsync,
         payloadBuilder,
         reportInterval,
         typeof(ReportRunner <T>).Name,
         loggerFactory)
 {
 }
예제 #17
0
        public ReportRunner(
            Func <IMetricPayloadBuilder <T>, Task <bool> > flushAsync,
            IMetricPayloadBuilder <T> payloadBuilder,
            TimeSpan reportInterval,
            string name,
            ILoggerFactory loggerFactory)
        {
            ReportInterval = reportInterval;
            Name           = name;

            _payloadBuilder = payloadBuilder;
            _logger         = loggerFactory.CreateLogger <ReportRunner <T> >();
            _flushAsync     = flushAsync;
        }
예제 #18
0
        public static void PackApdex <T>(
            this IMetricPayloadBuilder <T> payloadBuilder,
            string context,
            MetricValueSourceBase <ApdexValue> valueSource)
        {
            if (valueSource == null)
            {
                return;
            }

            var data = new Dictionary <string, object>();

            valueSource.Value.AddApdexValues(data, payloadBuilder.DataKeys.Apdex);
            PackMetric(payloadBuilder, context, valueSource, data);
        }
예제 #19
0
 public ReportRunner(
     Func <IMetricPayloadBuilder <T>, Task <bool> > flushAsync,
     IMetricPayloadBuilder <T> payloadBuilder,
     TimeSpan reportInterval,
     ILoggerFactory loggerFactory,
     Func <string, string, string> metricNameFormatter,
     MetricValueDataKeys customDataKeys = null)
     : this(
         flushAsync,
         payloadBuilder,
         reportInterval,
         typeof(ReportRunner <T>).Name,
         loggerFactory,
         metricNameFormatter,
         customDataKeys)
 {
 }
예제 #20
0
        public static void PackApdex <T>(
            this IMetricPayloadBuilder <T> payloadBuilder,
            Func <string, string, string> metricNameFormatter,
            string context,
            MetricValueSourceBase <ApdexValue> valueSource,
            IDictionary <ApdexValueDataKeys, string> dataKeys)
        {
            if (valueSource == null)
            {
                return;
            }

            var data = new Dictionary <string, object>();

            valueSource.Value.AddApdexValues(data, dataKeys);
            PackMetric(payloadBuilder, metricNameFormatter, context, valueSource, data);
        }
예제 #21
0
        private static IMetricReporter CreateReporter(IMetricPayloadBuilder <TestMetricPayload> payloadBuilder)
        {
            var loggerFactory = new LoggerFactory();
            var settings      = new TestReporterSettings();

            return(new ReportRunner <TestMetricPayload>(
                       p =>
            {
                var payload = p.Payload();
                return AppMetricsTaskCache.SuccessTask;
            },
                       payloadBuilder,
                       settings.ReportInterval,
                       "Test Reporter",
                       loggerFactory,
                       settings.MetricNameFormatter,
                       settings.DataKeys));
        }
예제 #22
0
        public ReportRunner(
            Func <IMetricPayloadBuilder <T>, Task <bool> > flushAsync,
            IMetricPayloadBuilder <T> payloadBuilder,
            TimeSpan reportInterval,
            string name,
            ILoggerFactory loggerFactory,
            Func <string, string, string> metricNameFormatter,
            MetricValueDataKeys customDataKeys = null)
        {
            ReportInterval = reportInterval;
            Name           = name;

            _payloadBuilder      = payloadBuilder;
            _metricNameFormatter = metricNameFormatter;
            _dataKeys            = customDataKeys ?? new MetricValueDataKeys();
            _logger     = loggerFactory.CreateLogger <ReportRunner <T> >();
            _flushAsync = flushAsync;
        }
예제 #23
0
        public static void PackMeter <T>(
            this IMetricPayloadBuilder <T> payloadBuilder,
            Func <string, string, string> metricNameFormatter,
            string context,
            MetricValueSourceBase <MeterValue> valueSource,
            IDictionary <MeterValueDataKeys, string> dataKeys)
        {
            if (valueSource.Value.Items.Any())
            {
                foreach (var item in valueSource.Value.Items.Distinct())
                {
                    item.AddMeterSetItemValues(out IDictionary <string, object> setItemData, dataKeys);
                    PackMetricWithSetItems(payloadBuilder, metricNameFormatter, context, valueSource, item.Tags, setItemData, dataKeys[MeterValueDataKeys.MetricSetItemSuffix]);
                }
            }

            valueSource.Value.AddMeterValues(out IDictionary <string, object> data, dataKeys);

            PackMetric(payloadBuilder, metricNameFormatter, context, valueSource, data);
        }
예제 #24
0
        private static void PackMetricValue <T, TU>(
            IMetricPayloadBuilder <T> payloadBuilder,
            Func <string, string, string> metricNameFormatter,
            string context,
            MetricValueSourceBase <TU> valueSource,
            object value)
        {
            var tags = ConcatMetricTags(valueSource);

            if (valueSource.IsMultidimensional)
            {
                payloadBuilder.Pack(
                    metricNameFormatter(context, valueSource.MultidimensionalName),
                    value,
                    tags);

                return;
            }

            payloadBuilder.Pack(metricNameFormatter(context, valueSource.Name), value, tags);
        }
예제 #25
0
        private static void BuildMetricPayload <TMetric, TPayload>(
            string context,
            MetricValueSourceBase <TMetric> valueSource,
            IMetricPayloadBuilder <TPayload> payloadBuilder)
        {
            if (typeof(TMetric) == typeof(double))
            {
                BuildGaugePayload(context, valueSource as MetricValueSourceBase <double>, payloadBuilder);
                return;
            }

            if (typeof(TMetric) == typeof(CounterValue))
            {
                BuildCounterPayload(context, valueSource as MetricValueSourceBase <CounterValue>, payloadBuilder);
                return;
            }

            if (typeof(TMetric) == typeof(MeterValue))
            {
                BuildMeterPayload(context, valueSource as MetricValueSourceBase <MeterValue>, payloadBuilder);
                return;
            }

            if (typeof(TMetric) == typeof(TimerValue))
            {
                BuildTimerPayload(context, valueSource as MetricValueSourceBase <TimerValue>, payloadBuilder);
                return;
            }

            if (typeof(TMetric) == typeof(HistogramValue))
            {
                BuildHistogramPayload(context, valueSource as MetricValueSourceBase <HistogramValue>, payloadBuilder);
                return;
            }

            if (typeof(TMetric) == typeof(ApdexValue))
            {
                BuildApdexPayload(context, valueSource as MetricValueSourceBase <ApdexValue>, payloadBuilder);
            }
        }
예제 #26
0
        private static void PackMetric <T1, T2>(
            IMetricPayloadBuilder <T1> payloadBuilder,
            Func <string, string, string> metricNameFormatter,
            string context,
            MetricValueSourceBase <T2> valueSource,
            IDictionary <string, object> data)
        {
            var keys   = data.Keys.ToList();
            var values = keys.Select(k => data[k]);
            var tags   = ConcatMetricTags(valueSource);

            if (valueSource.IsMultidimensional)
            {
                payloadBuilder.Pack(
                    metricNameFormatter(context, valueSource.MultidimensionalName),
                    keys,
                    values,
                    tags);

                return;
            }

            payloadBuilder.Pack(metricNameFormatter(context, valueSource.Name), keys, values, tags);
        }
예제 #27
0
 private static void BuildGaugePayload <T>(string context, MetricValueSourceBase <double> valueSource, IMetricPayloadBuilder <T> payloadBuilder)
 {
     payloadBuilder.PackGauge(context, valueSource);
 }
예제 #28
0
 public TestReporter(IMetricPayloadBuilder <TestMetricPayload> payloadBuilder)
 {
     _payloadBuilder = payloadBuilder;
 }