tools/code/publisher/Diagnostic.cs (203 lines of code) (raw):
using Azure.Core.Pipeline;
using common;
using LanguageExt;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace publisher;
public delegate ValueTask PutDiagnostics(CancellationToken cancellationToken);
public delegate Option<DiagnosticName> TryParseDiagnosticName(FileInfo file);
public delegate bool IsDiagnosticNameInSourceControl(DiagnosticName name);
public delegate ValueTask PutDiagnostic(DiagnosticName name, CancellationToken cancellationToken);
public delegate ValueTask<Option<DiagnosticDto>> FindDiagnosticDto(DiagnosticName name, CancellationToken cancellationToken);
public delegate ValueTask PutDiagnosticInApim(DiagnosticName name, DiagnosticDto dto, CancellationToken cancellationToken);
public delegate ValueTask DeleteDiagnostics(CancellationToken cancellationToken);
public delegate ValueTask DeleteDiagnostic(DiagnosticName name, CancellationToken cancellationToken);
public delegate ValueTask DeleteDiagnosticFromApim(DiagnosticName name, CancellationToken cancellationToken);
internal static class DiagnosticModule
{
public static void ConfigurePutDiagnostics(IHostApplicationBuilder builder)
{
CommonModule.ConfigureGetPublisherFiles(builder);
ConfigureTryParseDiagnosticName(builder);
ConfigureIsDiagnosticNameInSourceControl(builder);
ConfigurePutDiagnostic(builder);
builder.Services.TryAddSingleton(GetPutDiagnostics);
}
private static PutDiagnostics GetPutDiagnostics(IServiceProvider provider)
{
var getPublisherFiles = provider.GetRequiredService<GetPublisherFiles>();
var tryParseName = provider.GetRequiredService<TryParseDiagnosticName>();
var isNameInSourceControl = provider.GetRequiredService<IsDiagnosticNameInSourceControl>();
var put = provider.GetRequiredService<PutDiagnostic>();
var activitySource = provider.GetRequiredService<ActivitySource>();
var logger = provider.GetRequiredService<ILogger>();
return async cancellationToken =>
{
using var _ = activitySource.StartActivity(nameof(PutDiagnostics));
logger.LogInformation("Putting diagnostics...");
await getPublisherFiles()
.Choose(tryParseName.Invoke)
.Where(isNameInSourceControl.Invoke)
.Distinct()
.IterParallel(put.Invoke, cancellationToken);
};
}
private static void ConfigureTryParseDiagnosticName(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceDirectory(builder);
builder.Services.TryAddSingleton(GetTryParseDiagnosticName);
}
private static TryParseDiagnosticName GetTryParseDiagnosticName(IServiceProvider provider)
{
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
return file => from informationFile in DiagnosticInformationFile.TryParse(file, serviceDirectory)
select informationFile.Parent.Name;
}
private static void ConfigureIsDiagnosticNameInSourceControl(IHostApplicationBuilder builder)
{
CommonModule.ConfigureGetArtifactFiles(builder);
AzureModule.ConfigureManagementServiceDirectory(builder);
builder.Services.TryAddSingleton(GetIsDiagnosticNameInSourceControl);
}
private static IsDiagnosticNameInSourceControl GetIsDiagnosticNameInSourceControl(IServiceProvider provider)
{
var getArtifactFiles = provider.GetRequiredService<GetArtifactFiles>();
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
return doesInformationFileExist;
bool doesInformationFileExist(DiagnosticName name)
{
var artifactFiles = getArtifactFiles();
var informationFile = DiagnosticInformationFile.From(name, serviceDirectory);
return artifactFiles.Contains(informationFile.ToFileInfo());
}
}
private static void ConfigurePutDiagnostic(IHostApplicationBuilder builder)
{
ConfigureFindDiagnosticDto(builder);
ConfigurePutDiagnosticInApim(builder);
builder.Services.TryAddSingleton(GetPutDiagnostic);
}
private static PutDiagnostic GetPutDiagnostic(IServiceProvider provider)
{
var findDto = provider.GetRequiredService<FindDiagnosticDto>();
var putInApim = provider.GetRequiredService<PutDiagnosticInApim>();
var activitySource = provider.GetRequiredService<ActivitySource>();
return async (name, cancellationToken) =>
{
using var _ = activitySource.StartActivity(nameof(PutDiagnostic))
?.AddTag("diagnostic.name", name);
var dtoOption = await findDto(name, cancellationToken);
await dtoOption.IterTask(async dto => await putInApim(name, dto, cancellationToken));
};
}
private static void ConfigureFindDiagnosticDto(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceDirectory(builder);
CommonModule.ConfigureTryGetFileContents(builder);
OverrideDtoModule.ConfigureOverrideDtoFactory(builder);
builder.Services.TryAddSingleton(GetFindDiagnosticDto);
}
private static FindDiagnosticDto GetFindDiagnosticDto(IServiceProvider provider)
{
var serviceDirectory = provider.GetRequiredService<ManagementServiceDirectory>();
var tryGetFileContents = provider.GetRequiredService<TryGetFileContents>();
var overrideFactory = provider.GetRequiredService<OverrideDtoFactory>();
var overrideDto = overrideFactory.Create<DiagnosticName, DiagnosticDto>();
return async (name, cancellationToken) =>
{
var informationFile = DiagnosticInformationFile.From(name, serviceDirectory);
var informationFileInfo = informationFile.ToFileInfo();
var contentsOption = await tryGetFileContents(informationFileInfo, cancellationToken);
return from contents in contentsOption
let dto = contents.ToObjectFromJson<DiagnosticDto>()
select overrideDto(name, dto);
};
}
private static void ConfigurePutDiagnosticInApim(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceUri(builder);
AzureModule.ConfigureHttpPipeline(builder);
builder.Services.TryAddSingleton(GetPutDiagnosticInApim);
}
private static PutDiagnosticInApim GetPutDiagnosticInApim(IServiceProvider provider)
{
var serviceUri = provider.GetRequiredService<ManagementServiceUri>();
var pipeline = provider.GetRequiredService<HttpPipeline>();
var logger = provider.GetRequiredService<ILogger>();
return async (name, dto, cancellationToken) =>
{
logger.LogInformation("Putting diagnostic {DiagnosticName}...", name);
await DiagnosticUri.From(name, serviceUri)
.PutDto(dto, pipeline, cancellationToken);
};
}
public static void ConfigureDeleteDiagnostics(IHostApplicationBuilder builder)
{
CommonModule.ConfigureGetPublisherFiles(builder);
ConfigureTryParseDiagnosticName(builder);
ConfigureIsDiagnosticNameInSourceControl(builder);
ConfigureDeleteDiagnostic(builder);
builder.Services.TryAddSingleton(GetDeleteDiagnostics);
}
private static DeleteDiagnostics GetDeleteDiagnostics(IServiceProvider provider)
{
var getPublisherFiles = provider.GetRequiredService<GetPublisherFiles>();
var tryParseName = provider.GetRequiredService<TryParseDiagnosticName>();
var isNameInSourceControl = provider.GetRequiredService<IsDiagnosticNameInSourceControl>();
var delete = provider.GetRequiredService<DeleteDiagnostic>();
var activitySource = provider.GetRequiredService<ActivitySource>();
var logger = provider.GetRequiredService<ILogger>();
return async cancellationToken =>
{
using var _ = activitySource.StartActivity(nameof(DeleteDiagnostics));
logger.LogInformation("Deleting diagnostics...");
await getPublisherFiles()
.Choose(tryParseName.Invoke)
.Where(name => isNameInSourceControl(name) is false)
.Distinct()
.IterParallel(delete.Invoke, cancellationToken);
};
}
private static void ConfigureDeleteDiagnostic(IHostApplicationBuilder builder)
{
ConfigureDeleteDiagnosticFromApim(builder);
builder.Services.TryAddSingleton(GetDeleteDiagnostic);
}
private static DeleteDiagnostic GetDeleteDiagnostic(IServiceProvider provider)
{
var deleteFromApim = provider.GetRequiredService<DeleteDiagnosticFromApim>();
var activitySource = provider.GetRequiredService<ActivitySource>();
return async (name, cancellationToken) =>
{
using var _ = activitySource.StartActivity(nameof(DeleteDiagnostic))
?.AddTag("diagnostic.name", name);
await deleteFromApim(name, cancellationToken);
};
}
private static void ConfigureDeleteDiagnosticFromApim(IHostApplicationBuilder builder)
{
AzureModule.ConfigureManagementServiceUri(builder);
AzureModule.ConfigureHttpPipeline(builder);
builder.Services.TryAddSingleton(GetDeleteDiagnosticFromApim);
}
private static DeleteDiagnosticFromApim GetDeleteDiagnosticFromApim(IServiceProvider provider)
{
var serviceUri = provider.GetRequiredService<ManagementServiceUri>();
var pipeline = provider.GetRequiredService<HttpPipeline>();
var logger = provider.GetRequiredService<ILogger>();
return async (name, cancellationToken) =>
{
logger.LogInformation("Deleting diagnostic {DiagnosticName}...", name);
await DiagnosticUri.From(name, serviceUri)
.Delete(pipeline, cancellationToken);
};
}
}