diff --git a/src/ApplicationInsights.Kubernetes/Extensions/AppInsightsForKubernetesOptions.cs b/src/ApplicationInsights.Kubernetes/Extensions/AppInsightsForKubernetesOptions.cs index 6fa8e46..4b2e3f6 100644 --- a/src/ApplicationInsights.Kubernetes/Extensions/AppInsightsForKubernetesOptions.cs +++ b/src/ApplicationInsights.Kubernetes/Extensions/AppInsightsForKubernetesOptions.cs @@ -53,5 +53,11 @@ public class AppInsightsForKubernetesOptions /// Default to false and look into totally get rid of it in the future. /// public bool OverwriteSDKVersion { get; set; } + + /// + /// Exclude node information from cluster info by skipping calls to the nodes endpoint. + /// Default is false. + /// + public bool ExcludeNodeInformation { get; set; } } } diff --git a/src/ApplicationInsights.Kubernetes/K8sEnvironmentFactory.cs b/src/ApplicationInsights.Kubernetes/K8sEnvironmentFactory.cs index 38e5fbf..0e14857 100644 --- a/src/ApplicationInsights.Kubernetes/K8sEnvironmentFactory.cs +++ b/src/ApplicationInsights.Kubernetes/K8sEnvironmentFactory.cs @@ -11,27 +11,29 @@ using Microsoft.ApplicationInsights.Kubernetes.Containers; using Microsoft.ApplicationInsights.Kubernetes.Debugging; using Microsoft.ApplicationInsights.Kubernetes.Pods; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; namespace Microsoft.ApplicationInsights.Kubernetes; internal class K8sEnvironmentFactory : IK8sEnvironmentFactory { private readonly ApplicationInsightsKubernetesDiagnosticSource _logger = ApplicationInsightsKubernetesDiagnosticSource.Instance; - private readonly IContainerIdHolder _containerIdHolder; private readonly IPodInfoManager _podInfoManager; private readonly IContainerStatusManager _containerStatusManager; private readonly IK8sClientService _k8sClient; + private readonly AppInsightsForKubernetesOptions _options; public K8sEnvironmentFactory( - IContainerIdHolder containerIdHolder, IPodInfoManager podInfoManager, IContainerStatusManager containerStatusManager, - IK8sClientService k8sClient) + IK8sClientService k8sClient, + IOptions options) { - _containerIdHolder = containerIdHolder ?? throw new ArgumentNullException(nameof(containerIdHolder)); _podInfoManager = podInfoManager ?? throw new ArgumentNullException(nameof(podInfoManager)); _containerStatusManager = containerStatusManager ?? throw new ArgumentNullException(nameof(containerStatusManager)); _k8sClient = k8sClient ?? throw new ArgumentNullException(nameof(k8sClient)); + _options = options?.Value ?? throw new ArgumentNullException(nameof(options)); } /// @@ -57,10 +59,14 @@ public K8sEnvironmentFactory( V1Deployment? deployment = replicaSet?.GetMyDeployment(allDeployment); // Fetch node info - string nodeName = myPod.Spec.NodeName; - IEnumerable allNodes = await _k8sClient.GetNodesAsync(ignoreForbiddenException: true, cancellationToken).ConfigureAwait(false); - V1Node? node = allNodes.FirstOrDefault(n => string.Equals(n.Metadata.Name, nodeName, StringComparison.Ordinal)); - + V1Node? node = null; + if (!_options.ExcludeNodeInformation) + { + string nodeName = myPod.Spec.NodeName; + IEnumerable allNodes = await _k8sClient.GetNodesAsync(ignoreForbiddenException: true, cancellationToken).ConfigureAwait(false); + node = allNodes.FirstOrDefault(n => string.Equals(n.Metadata.Name, nodeName, StringComparison.Ordinal)); + } + K8sEnvironment k8SEnvironment = new K8sEnvironment(containerStatus, myPod, replicaSet, deployment, node); _logger.LogDebug(JsonSerializer.Serialize(k8SEnvironment).EscapeForLoggingMessage()); return k8SEnvironment; diff --git a/tests/UnitTests/K8sEnvironemntFactoryTests.cs b/tests/UnitTests/K8sEnvironemntFactoryTests.cs index ae1d704..1b91ffd 100644 --- a/tests/UnitTests/K8sEnvironemntFactoryTests.cs +++ b/tests/UnitTests/K8sEnvironemntFactoryTests.cs @@ -4,6 +4,8 @@ using k8s.Models; using Microsoft.ApplicationInsights.Kubernetes.Containers; using Microsoft.ApplicationInsights.Kubernetes.Pods; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Moq; using Xunit; @@ -14,10 +16,13 @@ public class K8sEnvironemntFactoryTests [Fact] public async Task ShouldTimeoutWaitingPodReady() { - Mock containerIdHolderMock = new(); Mock podInfoManagerMock = new(); Mock containerStatusManagerMock = new(); Mock k8sClientServiceMock = new(); + Mock> appInsightsForKubernetesOptionsMock = new(); + appInsightsForKubernetesOptionsMock + .Setup(o => o.Value) + .Returns(new AppInsightsForKubernetesOptions()); // Timeout TimeSpan timeout = TimeSpan.FromMilliseconds(1); @@ -34,8 +39,9 @@ public async Task ShouldTimeoutWaitingPodReady() } }); - K8sEnvironmentFactory target = new K8sEnvironmentFactory(containerIdHolderMock.Object, podInfoManagerMock.Object, containerStatusManagerMock.Object, k8sClientServiceMock.Object); - + K8sEnvironmentFactory target = new K8sEnvironmentFactory(podInfoManagerMock.Object, + containerStatusManagerMock.Object, k8sClientServiceMock.Object, + appInsightsForKubernetesOptionsMock.Object); IK8sEnvironment environment = null; CancellationToken timeoutToken; using (CancellationTokenSource timeoutSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(1))) @@ -52,10 +58,13 @@ public async Task ShouldTimeoutWaitingPodReady() [Obsolete("The scenario covered is deprecated", error: false)] public async Task ShouldTimeoutWaitingContainerReady() { - Mock containerIdHolderMock = new(); Mock podInfoManagerMock = new(); Mock containerStatusManagerMock = new(); Mock k8sClientServiceMock = new(); + Mock> appInsightsForKubernetesOptionsMock = new(); + appInsightsForKubernetesOptionsMock + .Setup(o => o.Value) + .Returns(new AppInsightsForKubernetesOptions()); // Timeout TimeSpan timeout = TimeSpan.FromMilliseconds(1); @@ -76,7 +85,9 @@ public async Task ShouldTimeoutWaitingContainerReady() } }); - K8sEnvironmentFactory target = new K8sEnvironmentFactory(containerIdHolderMock.Object, podInfoManagerMock.Object, containerStatusManagerMock.Object, k8sClientServiceMock.Object); + K8sEnvironmentFactory target = new K8sEnvironmentFactory(podInfoManagerMock.Object, + containerStatusManagerMock.Object, k8sClientServiceMock.Object, + appInsightsForKubernetesOptionsMock.Object); IK8sEnvironment environment = null; CancellationToken timeoutToken;