tools/code/extractor/ApiDiagnostic.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 ExtractApiDiagnostics(ApiName apiName, CancellationToken cancellationToken);
public delegate IAsyncEnumerable<(ApiDiagnosticName Name, ApiDiagnosticDto Dto)> ListApiDiagnostics(ApiName apiName, CancellationToken cancellationToken);
public delegate ValueTask WriteApiDiagnosticArtifacts(ApiDiagnosticName name, ApiDiagnosticDto dto, ApiName apiName, CancellationToken cancellationToken);
public delegate ValueTask WriteApiDiagnosticInformationFile(ApiDiagnosticName name, ApiDiagnosticDto dto, ApiName apiName, CancellationToken cancellationToken);
internal static class ApiDiagnosticModule
{
public static void ConfigureExtractApiDiagnostics(IHostApplicationBuilder builder)
{
ConfigureListApiDiagnostics(builder);
ConfigureWriteApiDiagnosticArtifacts(builder);
builder.Services.TryAddSingleton(GetExtractApiDiagnostics);
}
private static ExtractApiDiagnostics GetExtractApiDiagnostics(IServiceProvider provider)
{
var list = provider.GetRequiredService<ListApiDiagnostics>();
var writeArtifacts = provider.GetRequiredService<WriteApiDiagnosticArtifacts>();
var activitySource = provider.GetRequiredService<ActivitySource>();
var logger = provider.GetRequiredService<ILogger>();
return async (apiName, cancellationToken) =>
{
using var _ = activitySource.StartActivity(nameof(ExtractApiDiagnostics));
logger.LogInformation("Extracting diagnostics for API {ApiName}...", apiName);
await list(apiName, cancellationToken)
.IterParallel(async resource => await writeArtifacts(resource.Name, resource.Dto, apiName, cancellationToken),
cancellationToken);
};
}
private static void ConfigureListApiDiagnostics(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceUri(builder);
AzureModule.ConfigureHttpPipeline(builder);
builder.Services.TryAddSingleton(GetListApiDiagnostics);
}
private static ListApiDiagnostics GetListApiDiagnostics(IServiceProvider provider)
{
var serviceUri = provider.GetRequiredService<ManagementServiceUri>();
var pipeline = provider.GetRequiredService<HttpPipeline>();
return (apiName, cancellationToken) =>
{
var diagnosticsUri = ApiDiagnosticsUri.From(apiName, serviceUri);
return diagnosticsUri.List(pipeline, cancellationToken);
};
}
private static void ConfigureWriteApiDiagnosticArtifacts(IHostApplicationBuilder builder)
{
ConfigureWriteApiDiagnosticInformationFile(builder);
builder.Services.TryAddSingleton(GetWriteApiDiagnosticArtifacts);
}
private static WriteApiDiagnosticArtifacts GetWriteApiDiagnosticArtifacts(IServiceProvider provider)
{
var writeInformationFile = provider.GetRequiredService<WriteApiDiagnosticInformationFile>();
return async (name, dto, apiName, cancellationToken) =>
await writeInformationFile(name, dto, apiName, cancellationToken);
}
private static void ConfigureWriteApiDiagnosticInformationFile(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceDirectory(builder);
builder.Services.TryAddSingleton(GetWriteApiDiagnosticInformationFile);
}
private static WriteApiDiagnosticInformationFile GetWriteApiDiagnosticInformationFile(IServiceProvider provider)
{
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
var logger = provider.GetRequiredService<ILogger>();
return async (name, dto, apiName, cancellationToken) =>
{
var informationFile = ApiDiagnosticInformationFile.From(name, apiName, serviceDirectory);
logger.LogInformation("Writing API diagnostic information file {ApiDiagnosticInformationFile}...", informationFile);
await informationFile.WriteDto(dto, cancellationToken);
};
}
}