Skip to content

Commit

Permalink
Clean up lifetime of registered services (#309)
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaomi7732 committed Sep 8, 2022
1 parent f5f7a76 commit 3fd73c5
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 18 deletions.
8 changes: 7 additions & 1 deletion dev/F5WebApi/Program.cs
Expand Up @@ -2,8 +2,14 @@

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
// Always turn on scope validations for debugging purpose.
builder.WebHost.UseDefaultServiceProvider((opt) =>
{
opt.ValidateScopes = true;
opt.ValidateOnBuild = true;
});

// Add services to the container.
builder.Configuration.AddUserSecrets(Assembly.GetExecutingAssembly());

builder.Services.AddApplicationInsightsTelemetry();
Expand Down
Expand Up @@ -54,7 +54,7 @@ private static bool KubernetesTelemetryInitializerExists(IServiceCollection serv
IClusterEnvironmentCheck? clusterCheck)
{
IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = new KubernetesServiceCollectionBuilder(overwriteOptions, clusterCheck);
kubernetesServiceCollectionBuilder.RegisterServices(services);
_ = kubernetesServiceCollectionBuilder.RegisterServices(services);
}
}
}
Expand Up @@ -80,11 +80,12 @@ private void ConfigureOptions(IServiceCollection serviceCollection)
private static void RegisterCommonServices(IServiceCollection serviceCollection)
{
serviceCollection.AddSingleton<ITelemetryKeyCache, TelemetryKeyCache>();
serviceCollection.AddSingleton<SDKVersionUtils>(p => SDKVersionUtils.Instance);
serviceCollection.AddSingleton<IK8sClientService>(p => K8sClientService.Instance);
serviceCollection.AddSingleton<SDKVersionUtils>(_ => SDKVersionUtils.Instance);
serviceCollection.AddSingleton<IK8sClientService>(_ => K8sClientService.Instance);
serviceCollection.AddSingleton<IContainerIdHolder, ContainerIdHolder>();
serviceCollection.AddSingleton<IPodInfoManager, PodInfoManager>();
serviceCollection.AddSingleton<IContainerStatusManager, ContainerStatusManager>();

serviceCollection.AddScoped<IPodInfoManager, PodInfoManager>();
serviceCollection.AddScoped<IContainerStatusManager, ContainerStatusManager>();
}

/// <summary>
Expand All @@ -94,39 +95,39 @@ private static void RegisterCommonServices(IServiceCollection serviceCollection)
protected virtual void RegisterSettingsProvider(IServiceCollection serviceCollection)
{
// This happens before any of the other IContainerIdProvider. See comments below for details.
serviceCollection.TryAddEnumerable(ServiceDescriptor.Singleton<IContainerIdProvider, EnvironmentVariableContainerIdProvider>()); // Environment variable - works for both Linux & Windows;
serviceCollection.TryAddEnumerable(ServiceDescriptor.Scoped<IContainerIdProvider, EnvironmentVariableContainerIdProvider>()); // Environment variable - works for both Linux & Windows;

if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
// Matchers are dependencies of the container id providers.
serviceCollection.AddSingleton<CGroupV1Matcher>();
serviceCollection.AddSingleton<DockerEngineMountInfoMatcher>();
serviceCollection.AddSingleton<ContainerDMountInfoMatcher>();
serviceCollection.AddScoped<CGroupV1Matcher>();
serviceCollection.AddScoped<DockerEngineMountInfoMatcher>();
serviceCollection.AddScoped<ContainerDMountInfoMatcher>();

// Notes: pay attention to the order. Injecting uses the order of registering in this case.
// For example, EnvironmentVariableContainerIdProvider will take precedence, then CGroupContainerIdProvider on Linux.
serviceCollection.TryAddEnumerable(ServiceDescriptor.Singleton<IContainerIdProvider, CGroupContainerIdProvider>()); // Then CGroupV1
serviceCollection.TryAddEnumerable(ServiceDescriptor.Singleton<IContainerIdProvider, ContainerDMountInfoContainerIdProvider>()); // Then ContainerD
serviceCollection.TryAddEnumerable(ServiceDescriptor.Singleton<IContainerIdProvider, DockerEngineMountInfoContainerIdProvider>()); // Then DockerEngine
serviceCollection.TryAddEnumerable(ServiceDescriptor.Scoped<IContainerIdProvider, CGroupContainerIdProvider>()); // Then CGroupV1
serviceCollection.TryAddEnumerable(ServiceDescriptor.Scoped<IContainerIdProvider, ContainerDMountInfoContainerIdProvider>()); // Then ContainerD
serviceCollection.TryAddEnumerable(ServiceDescriptor.Scoped<IContainerIdProvider, DockerEngineMountInfoContainerIdProvider>()); // Then DockerEngine
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
// Notes: pay attention to the order. Injecting uses the order of registering in this case.
// For example, EnvironmentVariableContainerIdProvider will take precedence, then EmptyContainerIdProvider on Windows.
serviceCollection.TryAddEnumerable(ServiceDescriptor.Singleton<IContainerIdProvider, EmptyContainerIdProvider>());
serviceCollection.TryAddEnumerable(ServiceDescriptor.Scoped<IContainerIdProvider, EmptyContainerIdProvider>());
}
else
{
_logger.LogError("Unsupported OS.");
}

serviceCollection.TryAddSingleton<IContainerIdNormalizer, ContainerIdNormalizer>();
serviceCollection.TryAddScoped<IContainerIdNormalizer, ContainerIdNormalizer>();

// Notes: pay attention to the order. Injecting uses the order of registering in this case.
// For backward compatibility, $APPINSIGHTS_KUBERNETES_POD_NAME has been agreed upon to allow customize pod name with downward API.
serviceCollection.TryAddEnumerable(ServiceDescriptor.Singleton<IPodNameProvider, UserSetPodNameProvider>());
serviceCollection.TryAddEnumerable(ServiceDescriptor.Scoped<IPodNameProvider, UserSetPodNameProvider>());
// $Hostname will be overwritten by Kubernetes to reveal pod name: https://kubernetes.io/docs/concepts/containers/container-environment/#container-information.
serviceCollection.TryAddEnumerable(ServiceDescriptor.Singleton<IPodNameProvider, HostNamePodNameProvider>());
serviceCollection.TryAddEnumerable(ServiceDescriptor.Scoped<IPodNameProvider, HostNamePodNameProvider>());
}

/// <summary>
Expand Down
2 changes: 1 addition & 1 deletion src/ApplicationInsights.Kubernetes/Pods/PodInfoManager.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 3fd73c5

Please sign in to comment.