in src/ServiceProfiler.EventPipe.Otel/Azure.Monitor.OpenTelemetry.Profiler.Core/ServiceCollectionExtensions.cs [36:167]
public static IServiceCollection AddServiceProfilerCore(this IServiceCollection services)
{
// Utilities
services.AddSingleton<IConnectionStringParserFactory, ConnectionStringParserFactory>();
// Role name detectors and sources
services.AddSingleton<OtelResourceDetector>();
services.AddSingleton<IRoleNameDetector, OtelResourceRoleNameDetector>();
services.AddSingleton<IRoleNameDetector, EnvRoleNameDetector>(_ => new EnvRoleNameDetector("WEBSITE_SITE_NAME"));
services.AddSingleton<IRoleNameDetector, EnvRoleNameDetector>(_ => new EnvRoleNameDetector("RoleName"));
services.AddSingleton<IRoleNameDetector, UnknownRoleNameDetector>();
services.AddSingleton<IRoleNameSource, AggregatedRoleNameSource>();
// Role instance detectors and sources
services.AddSingleton<IRoleInstanceDetector, ServiceProfilerContextRoleInstanceDetector>();
services.AddSingleton<IRoleInstanceDetector, OtelResourceRoleInstanceDetector>();
services.AddSingleton<IRoleInstanceSource, AggregatedRoleInstanceSource>();
services.AddSingleton<IFile, SystemFile>();
services.AddSingleton<IEnvironment, SystemEnvironment>();
services.AddSingleton<IZipFile, SystemZipFile>();
services.AddSingleton<IDelaySource, DefaultDelaySource>();
services.AddSingleton<IRandomSource, DefaultRandomSource>();
services.AddSingleton<IProfilerCoreAssemblyInfo>(_ => ProfilerCoreAssemblyInfo.Instance);
services.AddSingleton<IUserCacheManager, UserCacheManager>();
services.AddSingleton<IPayloadSerializer, HighPerfJsonSerializationProvider>();
services.AddSingleton<ISerializationProvider, HighPerfJsonSerializationProvider>();
services.AddSingleton<ISerializationOptionsProvider<JsonSerializerOptions>, HighPerfJsonSerializationProvider>();
services.AddSingleton<ISerializationProvider, HighPerfJsonSerializationProvider>();
// Uploader caller
AddUploaderCallerServices(services);
// Named pipe client
services.AddSingleton<INamedPipeClientFactory, NamedPipeClientFactory>();
// Profiler Context
services.AddSingleton<IEndpointProvider, EndpointProvider>();
services.AddTransient<IMetadataWriter, MetadataWriter>();
// Transient trace session listeners
services.AddTransient<SampleActivityContainer>();
services.AddTransient<SampleCollector>();
services.AddSingleton<TraceSessionListenerFactory>();
// Profiler
services.AddTransient<ICustomEventsBuilder, CustomEventsBuilder>();
services.AddSingleton<IPostStopProcessorFactory, PostStopProcessorFactory>();
services.AddSingleton(_ => DiagnosticsClientProvider.Instance);
services.AddSingleton<DiagnosticsClientTraceConfiguration>();
services.AddSingleton<ITraceControl, DiagnosticsClientTrace>();
services.AddSingleton<IServiceProfilerContext, ServiceProfilerContext>();
services.AddSingleton<IServiceProfilerProvider, OpenTelemetryProfilerProvider>();
// Client
services.AddSingleton(p => ActivatorUtilities.CreateInstance<ProfilerFrontendClientFactory>(p).CreateProfilerFrontendClient());
// Token
services.AddSingleton<IAuthTokenProvider, AuthTokenProvider>();
// Orchestrator
AddSchedulers(services);
// Compatibility test
bool isRunningOnWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
if (isRunningOnWindows)
{
services.AddTransient<INetCoreAppVersion, WindowsNetCoreAppVersion>();
}
else
{
services.AddTransient<INetCoreAppVersion, LinuxNetCoreAppVersion>();
}
services.AddTransient<IVersionProvider>(p => ActivatorUtilities.CreateInstance<VersionProvider>(p, RuntimeInformation.FrameworkDescription));
services.AddSingleton<ICompatibilityUtilityFactory, RuntimeCompatibilityUtilityFactory>();
// ~
// Customizations
services.AddSingleton<ProfilerSettings>();
services.AddSingleton<IProfilerSettingsService>(p =>
{
ServiceProfilerOptions userConfiguration = p.GetRequiredService<IOptions<ServiceProfilerOptions>>().Value;
if (userConfiguration.StandaloneMode)
{
return ActivatorUtilities.CreateInstance<LocalProfileSettingsService>(p);
}
else
{
return ActivatorUtilities.CreateInstance<RemoteSettingsService>(p);
}
});
services.AddHostedService(p =>
{
BackgroundService? backgroundService = p.GetRequiredService<IProfilerSettingsService>() as BackgroundService;
return backgroundService ?? throw new InvalidOperationException($"The {nameof(IProfilerSettingsService)} is required to be a background service.");
});
// Triggers
services.AddSingleton(_ => SettingsParser.Instance);
services.AddSingleton<CpuTriggerSettings>();
services.AddSingleton<MemoryTriggerSettings>();
services.AddKeyedSingleton<IMetricsProvider, ProcessInfoCPUMetricsProvider>(MetricsProviderCategory.CPU);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
services.AddKeyedSingleton<IMetricsProvider, WindowsMemoryMetricsProvider>(MetricsProviderCategory.Memory);
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
services.AddSingleton<MemInfoItemParser>();
services.AddSingleton<IMemInfoReader, ProcMemInfoReader>();
services.AddKeyedSingleton<IMetricsProvider, MemInfoFileMemoryMetricsProvider>(MetricsProviderCategory.Memory);
}
else
{
throw new NotSupportedException($"Only support {OSPlatform.Windows} and {OSPlatform.Linux}.");
}
services.AddSingleton<IResourceUsageSource, ResourceUsageSource>();
// Scavengers
AddTraceScavengerServices(services);
return services;
}