tools/code/extractor/WorkspaceDiagnostic.cs (83 lines of code) (raw):

using Azure.Core.Pipeline; using common; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; namespace extractor; public delegate ValueTask ExtractWorkspaceDiagnostics(WorkspaceName workspaceName, CancellationToken cancellationToken); public delegate IAsyncEnumerable<(DiagnosticName Name, WorkspaceDiagnosticDto Dto)> ListWorkspaceDiagnostics(WorkspaceName workspaceName, CancellationToken cancellationToken); public delegate ValueTask WriteWorkspaceDiagnosticArtifacts(DiagnosticName name, WorkspaceDiagnosticDto dto, WorkspaceName workspaceName, CancellationToken cancellationToken); public delegate ValueTask WriteWorkspaceDiagnosticInformationFile(DiagnosticName name, WorkspaceDiagnosticDto dto, WorkspaceName workspaceName, CancellationToken cancellationToken); internal static class WorkspaceDiagnosticModule { public static void ConfigureExtractWorkspaceDiagnostics(IHostApplicationBuilder builder) { ConfigureListWorkspaceDiagnostics(builder); ConfigureWriteWorkspaceDiagnosticArtifacts(builder); builder.Services.TryAddSingleton(GetExtractWorkspaceDiagnostics); } private static ExtractWorkspaceDiagnostics GetExtractWorkspaceDiagnostics(IServiceProvider provider) { var list = provider.GetRequiredService<ListWorkspaceDiagnostics>(); var writeArtifacts = provider.GetRequiredService<WriteWorkspaceDiagnosticArtifacts>(); var activitySource = provider.GetRequiredService<ActivitySource>(); var logger = provider.GetRequiredService<ILogger>(); return async (workspaceName, cancellationToken) => { using var _ = activitySource.StartActivity(nameof(ExtractWorkspaceDiagnostics)); logger.LogInformation("Extracting diagnostics for workspace {WorkspaceName}...", workspaceName); await list(workspaceName, cancellationToken) .IterParallel(async diagnostic => await writeArtifacts(diagnostic.Name, diagnostic.Dto, workspaceName, cancellationToken), cancellationToken); }; } private static void ConfigureListWorkspaceDiagnostics(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceUri(builder); AzureModule.ConfigureHttpPipeline(builder); builder.Services.TryAddSingleton(GetListWorkspaceDiagnostics); } private static ListWorkspaceDiagnostics GetListWorkspaceDiagnostics(IServiceProvider provider) { var serviceUri = provider.GetRequiredService<ManagementServiceUri>(); var pipeline = provider.GetRequiredService<HttpPipeline>(); return (workspaceName, cancellationToken) => WorkspaceDiagnosticsUri.From(workspaceName, serviceUri) .List(pipeline, cancellationToken); } private static void ConfigureWriteWorkspaceDiagnosticArtifacts(IHostApplicationBuilder builder) { ConfigureWriteWorkspaceDiagnosticInformationFile(builder); builder.Services.TryAddSingleton(GetWriteWorkspaceDiagnosticArtifacts); } private static WriteWorkspaceDiagnosticArtifacts GetWriteWorkspaceDiagnosticArtifacts(IServiceProvider provider) { var writeInformationFile = provider.GetRequiredService<WriteWorkspaceDiagnosticInformationFile>(); return async (name, dto, workspaceName, cancellationToken) => { await writeInformationFile(name, dto, workspaceName, cancellationToken); }; } private static void ConfigureWriteWorkspaceDiagnosticInformationFile(IHostApplicationBuilder builder) { AzureModule.ConfigureManagementServiceDirectory(builder); builder.Services.TryAddSingleton(GetWriteWorkspaceDiagnosticInformationFile); } private static WriteWorkspaceDiagnosticInformationFile GetWriteWorkspaceDiagnosticInformationFile(IServiceProvider provider) { var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>(); var logger = provider.GetRequiredService<ILogger>(); return async (name, dto, workspaceName, cancellationToken) => { var informationFile = WorkspaceDiagnosticInformationFile.From(name, workspaceName, serviceDirectory); logger.LogInformation("Writing workspace diagnostic information file {WorkspaceDiagnosticInformationFile}...", informationFile); await informationFile.WriteDto(dto, cancellationToken); }; } }