Пример #1
0
        private async Task <bool> TriageTimelineAsync(ModelBuildAttempt modelBuildAttempt, ModelTrackingIssue modelTrackingIssue)
        {
            Debug.Assert(modelBuildAttempt.ModelBuild is object);
            Debug.Assert(modelTrackingIssue.IsActive);
            Debug.Assert(modelTrackingIssue.TrackingKind == TrackingKind.Timeline);
            Debug.Assert(modelTrackingIssue.SearchQuery is object);

            var request = new SearchTimelinesRequest();

            request.ParseQueryString(modelTrackingIssue.SearchQuery);
            var timelineQuery = request.Filter(Context.ModelTimelineIssues)
                                .Where(x =>
                                       x.ModelBuildId == modelBuildAttempt.ModelBuild.Id &&
                                       x.Attempt == modelBuildAttempt.Attempt);
            var any = false;

            foreach (var modelTimelineIssue in await timelineQuery.ToListAsync().ConfigureAwait(false))
            {
                var modelMatch = new ModelTrackingIssueMatch()
                {
                    ModelTrackingIssue = modelTrackingIssue,
                    ModelBuildAttempt  = modelBuildAttempt,
                    ModelTimelineIssue = modelTimelineIssue,
                    JobName            = modelTimelineIssue.JobName,
                };
                Context.ModelTrackingIssueMatches.Add(modelMatch);
                any = true;
            }

            return(any);
        }
Пример #2
0
        private async Task <bool> TriageTestAsync(ModelBuildAttempt modelBuildAttempt, ModelTrackingIssue modelTrackingIssue)
        {
            Debug.Assert(modelBuildAttempt.ModelBuild is object);
            Debug.Assert(modelTrackingIssue.IsActive);
            Debug.Assert(modelTrackingIssue.TrackingKind == TrackingKind.Test);
            Debug.Assert(modelTrackingIssue.SearchQuery is object);

            var request = new SearchTestsRequest();

            request.ParseQueryString(modelTrackingIssue.SearchQuery);
            IQueryable <ModelTestResult> testQuery = request
                                                     .Filter(Context.ModelTestResults)
                                                     .Where(x =>
                                                            x.ModelBuildId == modelBuildAttempt.ModelBuildId &&
                                                            x.ModelTestRun.Attempt == modelBuildAttempt.Attempt)
                                                     .Include(x => x.ModelTestRun);
            var any = false;

            foreach (var testResult in await testQuery.ToListAsync().ConfigureAwait(false))
            {
                var modelMatch = new ModelTrackingIssueMatch()
                {
                    ModelTrackingIssue = modelTrackingIssue,
                    ModelBuildAttempt  = modelBuildAttempt,
                    ModelTestResult    = testResult,
                    JobName            = testResult.ModelTestRun.Name,
                };

                Context.ModelTrackingIssueMatches.Add(modelMatch);
                any = true;
            }

            return(any);
        }
Пример #3
0
        private async Task <bool> TriageHelixLogsAsync(ModelBuildAttempt modelBuildAttempt, ModelTrackingIssue modelTrackingIssue)
        {
            Debug.Assert(modelBuildAttempt.ModelBuild is object);
            Debug.Assert(modelTrackingIssue.IsActive);
            Debug.Assert(modelTrackingIssue.SearchQuery is object);

            var request = new SearchHelixLogsRequest()
            {
                Limit = 100,
            };

            request.ParseQueryString(modelTrackingIssue.SearchQuery);

            var query = request.Filter(Context.ModelTestResults)
                        .Where(x => x.ModelBuild.Id == modelBuildAttempt.ModelBuild.Id && x.ModelTestRun.Attempt == modelBuildAttempt.Attempt);

            // TODO: selecting a lot of info here. Can improve perf by selecting only the needed
            // columns. The search helix logs page already optimizes this. Consider factoring out
            // the shared code.
            var testResultList = await query.ToListAsync().ConfigureAwait(false);

            var buildInfo     = modelBuildAttempt.ModelBuild.GetBuildInfo();
            var helixLogInfos = testResultList
                                .Select(x => x.GetHelixLogInfo())
                                .SelectNotNull()
                                .Select(x => (buildInfo, x));

            var results = await HelixServer.SearchHelixLogsAsync(
                helixLogInfos,
                request,
                onError : x => Logger.LogWarning(x.Message)).ConfigureAwait(false);

            var any = false;

            foreach (var result in results)
            {
                any = true;
                var modelMatch = new ModelTrackingIssueMatch()
                {
                    ModelBuildAttempt  = modelBuildAttempt,
                    ModelTrackingIssue = modelTrackingIssue,
                    HelixLogKind       = result.HelixLogKind,
                    HelixLogUri        = result.HelixLogUri,
                };
                Context.ModelTrackingIssueMatches.Add(modelMatch);
            }
            return(any);
        }
Пример #4
0
        public ModelTrackingIssueMatch AddTrackingMatch(
            ModelTrackingIssue trackingIssue,
            ModelBuildAttempt attempt,
            ModelTimelineIssue?timelineIssue = null,
            ModelTestResult?testResult       = null,
            string?helixLogUri = null)
        {
            var match = new ModelTrackingIssueMatch()
            {
                ModelTrackingIssue = trackingIssue,
                ModelBuildAttempt  = attempt,
                ModelTimelineIssue = timelineIssue,
                ModelTestResult    = testResult,
                HelixLogUri        = helixLogUri,
            };

            Context.ModelTrackingIssueMatches.Add(match);
            return(match);
        }