public override void Process(string meterName, string metricName, LabelSet labelSet, Aggregator <double> aggregator) { var metric = new ProcessedMetric <double>(meterName, metricName, meterName + metricName, labelSet.Labels, aggregator.GetAggregationType()); metric.Data = aggregator.ToMetricData(); this.DoubleMetrics.Add(metric); }
public override void Process(string meterName, string metricName, LabelSet labelSet, Aggregator <double> aggregator) { var metric = new ProcessedMetric <double>(meterName, metricName, meterName + metricName, labelSet.Labels, aggregator.GetAggregationType()); metric.Data = aggregator.ToMetricData(); var metricKey = new MetricKey(metricName, labelSet.Labels); if (this.DoubleMetrics.ContainsKey(metricKey)) { var previousMetric = DoubleMetrics[metricKey]; switch (previousMetric.AggregationType) { case AggregationType.LongSum: DoubleMetrics[metricKey] = UpdateSum(metric, previousMetric); break; case AggregationType.Summary: DoubleMetrics[metricKey] = UpdateSummary(metric, previousMetric); break; } } else { DoubleMetrics.Add(metricKey, metric); } }
public override void Process(string meterName, string metricName, LabelSet labelSet, Aggregator <long> aggregator) { var metric = new ProcessedMetric <long>(meterName, metricName, meterName + metricName, labelSet.Labels, aggregator.GetAggregationType()) { Data = aggregator.ToMetricData() }; LongMetrics.Add(metric); }
private Metric <T> UpdateSum <T>(ProcessedMetric <T> metric, Metric <T> previousMetric) where T : struct { var previousSummary = previousMetric.Data as SumData <T>; var currentSummary = metric.Data as SumData <T>; var newSum = Sum(previousSummary.Sum, currentSummary.Sum); var newSummary = new SumData <T>() { Sum = newSum, Timestamp = currentSummary.Timestamp }; metric.Data = newSummary; return(metric); }
internal SummaryData <T> GetMetricByName <T>(string name, List <KeyValuePair <string, string> > labels = null) where T : struct { ProcessedMetric <T> processedMetric; if (typeof(T) == typeof(long)) { var filtered = LongMetrics.Where(m => m.MetricName == name).Select(m => m as ProcessedMetric <T>); filtered = labels == null ? filtered : filtered.Where(m => m.Labels.Any(label => labels.Contains(label))).ToList(); processedMetric = filtered.Aggregate( (a, b) => { var c = new ProcessedMetric <T>(a.MetricNamespace, name, a.MetricDescription, a.Labels, a.AggregationType); switch (a.AggregationType) { case AggregationType.Summary: var aData = a.Data as SummaryData <T>; var bData = b.Data as SummaryData <T>; var aSum = aData.Sum; var bSum = bData.Sum; var aLongSum = Unsafe.As <T, long>(ref aSum); var bLongSum = Unsafe.As <T, long>(ref bSum); var cLongSum = aLongSum + bLongSum; c.Data = new SummaryData <T>() { Count = aData.Count + bData.Count, Max = Comparer <T> .Default.Compare(aData.Max, bData.Max) > 0 ? aData.Max : bData.Max, Min = Comparer <T> .Default.Compare(aData.Max, bData.Max) < 0 ? aData.Min : bData.Min, Sum = Unsafe.As <long, T>(ref cLongSum) }; break; default: break; } return(c); }); } else { var filtered = labels == null ? DoubleMetrics : DoubleMetrics.FindAll(m => m.Labels.Any(label => labels.Contains(label))).ToList(); processedMetric = filtered.FirstOrDefault(m => m.MetricName == name) as ProcessedMetric <T>; } return(processedMetric.Data as SummaryData <T>); }
private Metric <T> UpdateSummary <T>(ProcessedMetric <T> metric, Metric <T> previousMetric) where T : struct { var previousSummary = previousMetric.Data as SummaryData <T>; var currentSummary = metric.Data as SummaryData <T>; var newMax = Max(previousSummary.Max, currentSummary.Max); var newMin = Min(previousSummary.Min, currentSummary.Min); var newCount = previousSummary.Count + currentSummary.Count; var newSum = Sum(previousSummary.Sum, currentSummary.Sum); var newSummary = new SummaryData <T>() { Count = newCount, Min = newMin, Max = newMax, Sum = newSum, Timestamp = currentSummary.Timestamp }; metric.Data = newSummary; previousMetric = metric; return(previousMetric); }
public ProcessedMetric(ProcessedMetric<T> metric) : base(metric.MetricNamespace, metric.MetricName, metric.MetricDescription, metric.Labels, metric.AggregationType) { }
internal SummaryData <T> GetMetricByName <T>(string name, List <KeyValuePair <string, string> > labels = null) where T : struct { ProcessedMetric <T> processedMetric = null; if (typeof(T) == typeof(long)) { var filtered = LongMetrics.Where(m => m.MetricName == name).Select(m => m as ProcessedMetric <T>); filtered = labels == null ? filtered : filtered.Where(m => m.Labels.Any(label => labels.Contains(label))).ToList(); processedMetric = filtered.Count() < 1 ? default : filtered.Aggregate( (a, b) => { var c = new ProcessedMetric <T>(a.MetricNamespace, name, a.MetricDescription, a.Labels, a.AggregationType); switch (a.AggregationType) { case AggregationType.Summary: var aData = a.Data as SummaryData <T>; var bData = b.Data as SummaryData <T>; var aSum = aData.Sum; var bSum = bData.Sum; var aLongSum = Unsafe.As <T, long>(ref aSum); var bLongSum = Unsafe.As <T, long>(ref bSum); var cLongSum = aLongSum + bLongSum; c.Data = new SummaryData <T>() { Count = aData.Count + bData.Count, Max = Max(aData.Max, bData.Max), Min = Min(aData.Min, bData.Min), Sum = Unsafe.As <long, T>(ref cLongSum), }; break; default: // TODO: If we use more than Measure instruments we need more aggregations break; } return(c); }); } else { var filtered = DoubleMetrics.Where(m => m.MetricName == name).Select(m => m as ProcessedMetric <T>); filtered = labels == null ? filtered : filtered.Where(m => m.Labels.Any(label => labels.Contains(label))).ToList(); processedMetric = filtered.Count() < 1 ? default : filtered.Aggregate( (a, b) => { var c = new ProcessedMetric <T>(a.MetricNamespace, name, a.MetricDescription, a.Labels, a.AggregationType); switch (a.AggregationType) { case AggregationType.Summary: var aData = a.Data as SummaryData <T>; var bData = b.Data as SummaryData <T>; var aSum = aData.Sum; var bSum = bData.Sum; var aDoubleSum = Unsafe.As <T, double>(ref aSum); var bDoubleSum = Unsafe.As <T, double>(ref bSum); var cDoubleSum = aDoubleSum + bDoubleSum; c.Data = new SummaryData <T>() { Count = aData.Count + bData.Count, Max = Max(aData.Max, bData.Max), Min = Min(aData.Max, bData.Max), Sum = Unsafe.As <double, T>(ref cDoubleSum), }; break; default: // TODO: If we use more than Measure instruments we need more aggregations break; } return(c); }); } return(processedMetric?.Data as SummaryData <T>); }