Пример #1
0
        public void HelixLogsRoundTrip(string toParse, string userQuery)
        {
            var options = new SearchHelixLogsRequest();

            options.ParseQueryString(toParse);
            Assert.Equal(userQuery, options.GetQueryString());
        }
Пример #2
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";
            }
        }