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); }
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); }
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); }
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); }