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;