示例#1
0
        public async Task <IActionResult> OnGet()
        {
            const int PageSize = 25;

            if (string.IsNullOrEmpty(BuildQuery))
            {
                BuildQuery = new SearchBuildsRequest()
                {
                    Definition = "runtime"
                }.GetQueryString();
                return(Page());
            }

            if (!SearchBuildsRequest.TryCreate(BuildQuery ?? "", out var buildsRequest, out var errorMessage) ||
                !SearchTimelinesRequest.TryCreate(TimelineQuery ?? "", out var timelinesRequest, out errorMessage))
            {
                ErrorMessage = errorMessage;
                return(Page());
            }

            try
            {
                IQueryable <ModelTimelineIssue> query = TriageContextUtil.Context.ModelTimelineIssues;
                query = buildsRequest.Filter(query);
                query = timelinesRequest.Filter(query);
                var totalCount = await query.CountAsync();

                query = query
                        .OrderByDescending(x => x.ModelBuild.BuildNumber)
                        .Skip(PageNumber * PageSize)
                        .Take(PageSize);
                TimelineIssuesDisplay = await TimelineIssuesDisplay.Create(
                    query,
                    includeBuildColumn : true,
                    includeIssueTypeColumn : timelinesRequest.Type is null,
                    includeAttemptColumn : true);

                IncludeIssueTypeColumn = timelinesRequest.Type is null;
                PaginationDisplay      = new PaginationDisplay(
                    "/Search/Timelines",
                    new Dictionary <string, string>()
                {
                    { "bq", BuildQuery ?? "" },
                    { "tq", TimelineQuery ?? "" }
                },
                    PageNumber,
                    totalCount / PageSize);
                TotalCount = totalCount;
                return(Page());
            }
            catch (SqlException ex) when(ex.IsTimeoutViolation())
            {
                ErrorMessage = "Timeout fetching data from the server";
                return(Page());
            }
        }
示例#2
0
        public async Task OnGetAsync()
        {
            const int PageSize = 25;

            IQueryable <ModelTrackingIssue> query = Context.ModelTrackingIssues;

            if (!string.IsNullOrEmpty(Query))
            {
                try
                {
                    var request = new SearchTrackingIssuesRequest();
                    request.ParseQueryString(Query);
                    query = request.Filter(query);
                }
                catch (Exception ex)
                {
                    ErrorMessage = ex.Message;
                    return;
                }
            }

            var week = DateTime.UtcNow - TimeSpan.FromDays(7);

            Issues = await query
                     .Where(x => x.IsActive)
                     .Select(issue => new IssueData()
            {
                Id         = issue.Id,
                Title      = issue.IssueTitle,
                Kind       = issue.TrackingKind.ToString(),
                TotalCount = issue.ModelTrackingIssueMatches.Count(),
                WeekCount  = issue.ModelTrackingIssueMatches.Where(x => x.ModelBuildAttempt.ModelBuild.StartTime >= week).Count()
            })
                     .OrderByDescending(x => x.WeekCount)
                     .Skip(PageSize * PageNumber)
                     .Take(PageSize)
                     .ToListAsync();

            PaginationDisplay = new PaginationDisplay(
                "/Tracking/Index",
                new Dictionary <string, string>()
            {
                { nameof(Query), Query ?? "" }
            },
                PageNumber);
        }
示例#3
0
        public async Task OnGet()
        {
            const int pageSize = 50;

            ErrorMessage = null;

            if (string.IsNullOrEmpty(BuildQuery))
            {
                BuildQuery = new SearchBuildsRequest()
                {
                    Definition = "runtime",
                    Started    = new DateRequestValue(dayQuery: 3),
                }.GetQueryString();
                return;
            }

            if (!SearchBuildsRequest.TryCreate(BuildQuery, out var buildsRequest, out var errorMessage) ||
                !SearchHelixLogsRequest.TryCreate(LogQuery ?? "", out var logsRequest, out errorMessage))
            {
                ErrorMessage = errorMessage;
                return;
            }

            // Helix logs are only kept for failed builds. If the user doesn't specify a specific result type,
            // like say cancelled, then just search all non succeeded builds.
            if (buildsRequest.Result is null)
            {
                buildsRequest.Result = new BuildResultRequestValue(BuildResult.Succeeded, EqualsKind.NotEquals);
                BuildQuery           = buildsRequest.GetQueryString();
            }

            if (logsRequest.HelixLogKinds.Count == 0)
            {
                logsRequest.HelixLogKinds.Add(HelixLogKind.Console);
                LogQuery = logsRequest.GetQueryString();
            }

            if (string.IsNullOrEmpty(logsRequest.Text))
            {
                ErrorMessage = @"Must specify text to search for 'text: ""StackOverflowException""'";
                return;
            }

            try
            {
                IQueryable <ModelTestResult> query = TriageContextUtil.Context.ModelTestResults.Where(x => x.IsHelixTestResult);
                query = buildsRequest.Filter(query);
                var totalBuildCount = await query.CountAsync();

                var modelResults = await query
                                   .Skip(PageNumber *pageSize)
                                   .Take(pageSize)
                                   .Select(x => new
                {
                    x.ModelBuild.BuildNumber,
                    x.ModelBuild.AzureOrganization,
                    x.ModelBuild.AzureProject,
                    x.ModelBuild.StartTime,
                    x.ModelBuild.GitHubOrganization,
                    x.ModelBuild.GitHubRepository,
                    x.ModelBuild.GitHubTargetBranch,
                    x.ModelBuild.PullRequestNumber,
                    x.HelixConsoleUri,
                    x.HelixCoreDumpUri,
                    x.HelixRunClientUri,
                    x.HelixTestResultsUri,
                })
                                   .ToListAsync();

                var toQuery = modelResults
                              .Select(x => (
                                          new BuildInfo(x.AzureOrganization, x.AzureProject, x.BuildNumber,
                                                        new GitHubBuildInfo(x.GitHubOrganization, x.GitHubRepository, x.PullRequestNumber, x.GitHubTargetBranch)),
                                          new HelixLogInfo(
                                              runClientUri: x.HelixRunClientUri,
                                              consoleUri: x.HelixConsoleUri,
                                              coreDumpUri: x.HelixCoreDumpUri,
                                              testResultsUri: x.HelixTestResultsUri)));

                var helixServer  = new HelixServer();
                var errorBuilder = new StringBuilder();
                var results      = await helixServer.SearchHelixLogsAsync(
                    toQuery,
                    logsRequest,
                    ex => errorBuilder.AppendLine(ex.Message));

                foreach (var result in results)
                {
                    HelixLogs.Add(new HelixLogData()
                    {
                        BuildNumber  = result.BuildInfo.Number,
                        Line         = result.Line,
                        HelixLogKind = result.HelixLogKind.GetDisplayFileName(),
                        HelixLogUri  = result.HelixLogUri,
                    });
                }

                if (errorBuilder.Length > 0)
                {
                    ErrorMessage = errorBuilder.ToString();
                }

                PaginationDisplay = new PaginationDisplay(
                    "/Search/HelixLogs",
                    new Dictionary <string, string>()
                {
                    { "bq", BuildQuery },
                    { "lq", LogQuery ?? "" },
                },
                    PageNumber,
                    totalBuildCount / pageSize);
                BuildResultText = $"Results for {PageNumber * pageSize}-{(PageNumber * pageSize) + pageSize} of {totalBuildCount} builds";
                DidSearch       = true;
            }
            catch (SqlException ex) when(ex.IsTimeoutViolation())
            {
                ErrorMessage = "Timeout fetching data from the server";
            }
        }
示例#4
0
        public async Task OnGet()
        {
            const int pageSize = 25;

            if (string.IsNullOrEmpty(Query))
            {
                Query = new SearchBuildsRequest()
                {
                    Definition = "roslyn-ci",
                    Started    = new DateRequestValue(dayQuery: 5),
                }.GetQueryString();
                return;
            }

            if (!SearchBuildsRequest.TryCreate(Query, out var request, out var errorMessage))
            {
                ErrorMessage = errorMessage;
                return;
            }

            TotalBuildCount = await request
                              .Filter(TriageContext.ModelBuilds)
                              .CountAsync();

            PaginationDisplay = new PaginationDisplay(
                "/Search/Builds",
                new Dictionary <string, string>()
            {
                { "q", Query },
            },
                PageNumber,
                TotalBuildCount / pageSize);

            var skipCount = PageNumber * pageSize;
            List <BuildResultInfo> results;

            try
            {
                results = await request
                          .Filter(TriageContext.ModelBuilds)
                          .OrderByDescending(x => x.BuildNumber)
                          .Skip(skipCount)
                          .Take(pageSize)
                          .ToBuildResultInfoListAsync();
            }
            catch (SqlException ex) when(ex.IsTimeoutViolation())
            {
                ErrorMessage = "Timeout fetching data from the server";
                return;
            }

            Builds = results
                     .Select(x =>
            {
                return(new BuildData()
                {
                    BuildResult = x.BuildResult,
                    Result = x.BuildResult.ToString(),
                    BuildNumber = x.Number,
                    Kind = x.PullRequestKey.HasValue ? "Pull Request" : "Rolling",
                    PullRequestKey = x.PullRequestKey,
                    BuildUri = x.BuildUri,
                    Definition = x.DefinitionName,
                    DefinitionUri = x.DefinitionInfo.DefinitionUri,
                    TargetBranch = x.GitHubBuildInfo?.TargetBranch,
                    Queued = DateTimeUtil.ConvertDateTime(x.QueueTime)?.ToString("yyyy-MM-dd hh:mm tt"),
                });
            })
                     .ToList();

            IncludeDefinitionColumn   = !request.HasDefinition;
            IncludeTargetBranchColumn = !request.TargetBranch.HasValue;
        }