示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }