public async Task <DatetimeSerieModel> GetDailySeriesById(int journeyId, DatePeriodValue period) { var journey = await this._dbContext.GetJourney(journeyId); var sourceIds = journey.FeatureMap.SelectMany(c => c.Feature.Indicators) .Select(c => c.SourceId).Distinct(); var sourceItems = await this._dbContext.GetSourceItems(sourceIds, period.Start, period.End); foreach (var map in journey.FeatureMap) { foreach (var indicator in map.Feature.Indicators) { indicator.Source.SourceItems = sourceItems.Where(c => c.SourceId == indicator.SourceId).ToList(); } } var result = new DatetimeSerieModel { Start = period.Start, End = period.End, Name = journey.Name, Avatar = journey.Avatar, }; var aggregator = new JourneyDailyAggregate(journey, period); var(availability, features) = aggregator.MeasureQuality; result.Availability.AddItems( availability.OrderBy(c => c.Date).Select(c => (c.Date, c.Measure.Availability)).ToList() ); result.Latency.AddItems( availability.OrderBy(c => c.Date).Select(c => (c.Date, c.Measure.Latency)).ToList() ); result.Experience.AddItems( availability.OrderBy(c => c.Date).Select(c => (c.Date, c.Measure.Experience)).ToList() ); foreach (var(feature, avaValues) in features) { var pivotAvailability = new DatetimeSerieListModel(feature.Name, feature.Avatar); pivotAvailability.AddItems(avaValues.OrderBy(c => c.Date) .Select(c => (c.Date, QualityUtils.MeasureDebt(c.Measure.Availability, journey.AvailabilitySlo))).ToList()); result.AvailabilityDetail.Add(pivotAvailability); var pivotLatency = new DatetimeSerieListModel(feature.Name, feature.Avatar); pivotLatency.AddItems(avaValues.OrderBy(c => c.Date) .Select(c => (c.Date, QualityUtils.MeasureLatencyDebt(c.Measure.Latency, journey.LatencySlo))).ToList()); result.LatencyDetail.Add(pivotLatency); var pivotExperience = new DatetimeSerieListModel(feature.Name, feature.Avatar); pivotExperience.AddItems(avaValues.OrderBy(c => c.Date) .Select(c => (c.Date, QualityUtils.MeasureDebt(c.Measure.Experience, journey.ExperienceSlo))).ToList()); result.ExperienceDetail.Add(pivotExperience); } return(result); }
public async Task <DatetimeSerieModel> GetJourneyGroupDailyErrorBudget(int productId, DatePeriodValue period, string group) { var product = await this._dbContext.FullLoadProductWithGroupAndSourceItems(productId, group, period.Start, period.End); var result = new DatetimeSerieModel(); result.Start = period.Start; result.End = period.End; result.Name = product.Name; var days = period.ToDaysPeriods(); foreach (var item in days) { var temp = product.Journeys.Select(c => c.Measure(item)); result.Availability.Items.Add(new DatetimeSerieItemModel(item.Start, temp.Sum(c => c.AvailabilityDebt))); result.Latency.Items.Add(new DatetimeSerieItemModel(item.Start, temp.Sum(c => c.LatencyDebt))); result.Experience.Items.Add(new DatetimeSerieItemModel(item.Start, temp.Sum(c => c.ExperienceDebt))); } foreach (var journey in product.Journeys) { var temp = new DatetimeSerieListModel() { Name = journey.Name, Avatar = journey.Avatar }; temp.AddItems(days.Select(c => (c.Start, journey.Measure(c).AvailabilityDebt)).ToList()); result.AvailabilityDetail.Add(temp); var tempL = new DatetimeSerieListModel() { Name = journey.Name, Avatar = journey.Avatar }; tempL.AddItems(days.Select(c => (c.Start, journey.Measure(c).LatencyDebt)).ToList()); result.LatencyDetail.Add(tempL); var tempE = new DatetimeSerieListModel() { Name = journey.Name, Avatar = journey.Avatar }; tempE.AddItems(days.Select(c => (c.Start, journey.Measure(c).ExperienceDebt)).ToList()); result.ExperienceDetail.Add(tempE); } return(result); }
public async Task <AnnualJourneyGroupListRp> GetAnnualGroupReport(int productId, DateTime start) { var result = new AnnualJourneyGroupListRp(); var period = DatePeriodValue.ToYearFromStart(start); var product = await this._dbContext.FullLoadProductWithSourceItems(productId, period.Start, period.End); var months = period.ToYearPeriods(); var journeysGroups = product.Journeys.GroupBy(c => c.Group).ToList(); var pivot = new Dictionary <string, List <(int count, decimal availability, decimal latency, decimal experience)> >(); foreach (var monthperiod in months) { var groupsReport = new List <(string name, int count, decimal availability, decimal latency, decimal experience)>(); foreach (var group in journeysGroups) { var measures = group.Select(c => new { measure = c.Measure(monthperiod), slo = c.AvailabilitySlo }).ToList(); groupsReport.Add((group.Key, group.Count(), measures.Sum(c => c.measure.AvailabilityDebt), measures.Sum(c => c.measure.LatencyDebt), measures.Sum(c => c.measure.ExperienceDebt) )); } foreach (var group in groupsReport) { if (!pivot.ContainsKey(group.name)) { pivot.Add(group.name, new List <(int count, decimal availability, decimal latency, decimal experience)>()); } pivot[group.name].Add((group.count, group.availability, group.latency, group.experience)); } if (!pivot.ContainsKey("[Total]")) { pivot.Add("[Total]", new List <(int count, decimal availability, decimal latency, decimal experience)>()); } pivot["[Total]"].Add( ( groupsReport.Sum(c => c.count), groupsReport.Sum(c => c.availability), groupsReport.Sum(c => c.latency), groupsReport.Sum(c => c.experience) )); } if (pivot.Count == 0) { return(result); } result.Availability = pivot.Select(c => { var tmp = new MonthRp() { Name = c.Key, Count = c.Value.ElementAt(0).count }; for (int i = 0; i < c.Value.Count; i++) { tmp.SetMonthValue(i, c.Value[i].availability); } return(tmp); }).ToList(); result.Latency = pivot.Select(c => { var tmp = new MonthRp() { Name = c.Key, Count = c.Value.ElementAt(0).count }; for (int i = 0; i < c.Value.Count; i++) { tmp.SetMonthValue(i, c.Value[i].latency); } return(tmp); }).ToList(); result.Experience = pivot.Select(c => { var tmp = new MonthRp() { Name = c.Key, Count = c.Value.ElementAt(0).count }; for (int i = 0; i < c.Value.Count; i++) { tmp.SetMonthValue(i, c.Value[i].experience); } return(tmp); }).ToList(); var weeks = period.ToWeeksPeriods(); var days = period.ToDaysPeriods(); var dayli_measures = days.Select(date => (date, product.Journeys.Select(d => d.Measure(date)))).ToList(); foreach (var item in dayli_measures) { result.Series.Availability.Items.Add(new DatetimeSerieItemModel(item.date.Start, item.Item2.Sum(c => c.AvailabilityDebt))); result.Series.Latency.Items.Add(new DatetimeSerieItemModel(item.date.Start, item.Item2.Sum(c => c.LatencyDebt))); result.Series.Experience.Items.Add(new DatetimeSerieItemModel(item.date.Start, item.Item2.Sum(c => c.ExperienceDebt))); } foreach (var item in journeysGroups) { var measures_weeks = weeks.Select(week => (week, item.Select(c => c.Measure(week)))); var temp = new DatetimeSerieListModel(item.Key); temp.Items.AddRange(measures_weeks.Select(c => new DatetimeSerieItemModel(c.week.Start, c.Item2.Sum(d => d.AvailabilityDebt))).ToList()); result.Series.AvailabilityDetail.Add(temp); var tempLatency = new DatetimeSerieListModel(item.Key); tempLatency.Items.AddRange(measures_weeks.Select(c => new DatetimeSerieItemModel(c.week.Start, c.Item2.Sum(d => d.LatencyDebt))).ToList()); result.Series.LatencyDetail.Add(tempLatency); var tempExperience = new DatetimeSerieListModel(item.Key); tempExperience.Items.AddRange(measures_weeks.Select(c => new DatetimeSerieItemModel(c.week.Start, c.Item2.Sum(d => d.ExperienceDebt))).ToList()); result.Series.ExperienceDetail.Add(tempExperience); } return(result); }