public void HelixLogsRoundTrip(string toParse, string userQuery) { var options = new SearchHelixLogsRequest(); options.ParseQueryString(toParse); Assert.Equal(userQuery, options.GetQueryString()); }
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"; } }