public async Task GetInfoPackage() { var contentDisposition = $"attachment; filename={DateTime.UtcNow:yyyy-MM-dd H:mm:ss} - Database [{Database.Name}].zip"; HttpContext.Response.Headers["Content-Disposition"] = contentDisposition; using (ServerStore.ContextPool.AllocateOperationContext(out JsonOperationContext context)) { await using (var ms = new MemoryStream()) { using (var archive = new ZipArchive(ms, ZipArchiveMode.Create, true)) { var localEndpointClient = new LocalEndpointClient(Server); var endpointParameters = new Dictionary <string, Microsoft.Extensions.Primitives.StringValues> { { "database", new Microsoft.Extensions.Primitives.StringValues(Database.Name) } }; var routes = DebugInfoPackageUtils.GetAuthorizedRoutes(Server, HttpContext, Database.Name) .Where(x => x.TypeOfRoute == RouteInformation.RouteType.Databases); foreach (var route in routes) { await ServerWideDebugInfoPackageHandler.InvokeAndWriteToArchive(archive, context, localEndpointClient, route, null, endpointParameters); } } ms.Position = 0; await ms.CopyToAsync(ResponseBodyStream()); } } }
private async Task WriteForServerOrDatabase(ZipArchive archive, JsonOperationContext context, LocalEndpointClient localEndpointClient, RouteInformation.RouteType routeType, string path, string databaseName, Dictionary <string, Microsoft.Extensions.Primitives.StringValues> endpointParameters = null, CancellationToken token = default) { var debugInfoDict = new Dictionary <string, TimeSpan>(); token.ThrowIfCancellationRequested(); var routes = DebugInfoPackageUtils.GetAuthorizedRoutes(Server, HttpContext, databaseName).Where(x => x.TypeOfRoute == routeType); var id = Guid.NewGuid(); if (_logger.IsOperationsEnabled) { _logger.Operations($"Creating Debug Package '{id}' for '{databaseName ?? "Server"}'."); } foreach (var route in routes) { Exception ex = null; var sw = Stopwatch.StartNew(); if (_logger.IsOperationsEnabled) { _logger.Operations($"Started gathering debug info from '{route.Path}' for Debug Package '{id}'."); } try { using (var operationToken = new CancellationTokenSource(TimeSpan.FromMinutes(5))) using (var mergedToken = CancellationTokenSource.CreateLinkedTokenSource(operationToken.Token, token)) { await InvokeAndWriteToArchive(archive, context, localEndpointClient, route, path, endpointParameters, mergedToken.Token); debugInfoDict[route.Path] = sw.Elapsed; } } catch (Exception e) { ex = e; } finally { if (_logger.IsOperationsEnabled) { _logger.Operations($"Finished gathering debug info from '{route.Path}' for Debug Package '{id}'. Took: {(int)sw.Elapsed.TotalMilliseconds} ms", ex); } } } await DebugInfoPackageUtils.WriteDebugInfoTimesAsZipEntryAsync(debugInfoDict, archive, databaseName); }
public async Task GetInfoPackage() { var contentDisposition = $"attachment; filename={DateTime.UtcNow:yyyy-MM-dd H:mm:ss} - Database [{Database.Name}].zip"; HttpContext.Response.Headers["Content-Disposition"] = contentDisposition; using (ServerStore.ContextPool.AllocateOperationContext(out JsonOperationContext context)) { await using (var ms = new MemoryStream()) { using (var archive = new ZipArchive(ms, ZipArchiveMode.Create, true)) { var localEndpointClient = new LocalEndpointClient(Server); var endpointParameters = new Dictionary <string, Microsoft.Extensions.Primitives.StringValues> { { "database", new Microsoft.Extensions.Primitives.StringValues(Database.Name) } }; var feature = HttpContext.Features.Get <IHttpAuthenticationFeature>() as RavenServer.AuthenticateConnection; Debug.Assert(feature != null); var routes = DebugInfoPackageUtils.GetAuthorizedRoutes(feature, Database.Name) .Where(x => x.TypeOfRoute == RouteInformation.RouteType.Databases); foreach (RouteInformation route in routes) { var entryName = DebugInfoPackageUtils.GetOutputPathFromRouteInformation(route, null); try { var entry = archive.CreateEntry(entryName); entry.ExternalAttributes = ((int)(FilePermissions.S_IRUSR | FilePermissions.S_IWUSR)) << 16; await using (var entryStream = entry.Open()) await using (var writer = new AsyncBlittableJsonTextWriter(context, entryStream)) { using (var endpointOutput = await localEndpointClient.InvokeAndReadObjectAsync(route, context, endpointParameters)) { context.Write(writer, endpointOutput); await writer.FlushAsync(); await entryStream.FlushAsync(); } } } catch (Exception e) { await DebugInfoPackageUtils.WriteExceptionAsZipEntryAsync(e, archive, entryName.Replace(".json", string.Empty)); } } } ms.Position = 0; await ms.CopyToAsync(ResponseBodyStream()); } } }