Skip to content

Commit 327bb81

Browse files
authored
Merge pull request #219 from StackVista/STAC-23435
[STAC-23435] fix: always close rootNsHandle
2 parents e78f39f + 08de4f4 commit 327bb81

3 files changed

Lines changed: 30 additions & 25 deletions

File tree

checks/net.go

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717
"github.com/DataDog/datadog-agent/pkg/network/protocols/postgres"
1818
"github.com/DataDog/datadog-agent/pkg/network/tracer"
1919
"github.com/DataDog/datadog-agent/pkg/process/util"
20-
"github.com/DataDog/datadog-agent/pkg/util/kernel"
2120
"github.com/DataDog/datadog-agent/pkg/util/kubernetes/kubelet"
2221
"github.com/StackVista/stackstate-process-agent/pkg/pods"
2322
"github.com/StackVista/stackstate-receiver-go-client/pkg/model/telemetry"
@@ -61,6 +60,9 @@ type ConnectionsCheck struct {
6160
cache *NetworkRelationCache
6261

6362
podCorrelation *podCorrelationInfo
63+
64+
// Inode of the root network namespace
65+
rootNSIno uint32
6466
}
6567

6668
// Name returns the name of the ConnectionsCheck.
@@ -533,32 +535,21 @@ func (c *ConnectionsCheck) formatConnections(
533535
// It is unlikely that we will be able to correlate connections from the root namespace
534536
var unsentNonRootObservations = 0
535537
var unsentNonRootConnectionMetrics = 0
536-
rootHandle, err := kernel.GetRootNetNamespace(kernel.ProcFSRoot())
537-
if err == nil {
538-
ino, err := kernel.GetInoForNs(rootHandle)
539-
if err == nil {
540-
for k, v := range uncorrelatedObservations {
541-
if k.NetNs != ino {
542-
log.Debugf("Unsent non-root observation: %v:%d<-%v:%d @ %d = %v", util.FromLowHigh(k.DstIPLow, k.DstIPHigh), k.DstPort, util.FromLowHigh(k.SrcIPLow, k.SrcIPHigh), k.SrcPort, k.NetNs, v)
543-
unsentNonRootObservations++
544-
continue
545-
}
546-
log.Debugf("Unsent connection observation: %v:%d<-%v:%d @ %d = %v", util.FromLowHigh(k.DstIPLow, k.DstIPHigh), k.DstPort, util.FromLowHigh(k.SrcIPLow, k.SrcIPHigh), k.SrcPort, k.NetNs, v)
547-
}
548538

549-
for k := range uncorrelatedConnectionMetrics {
550-
if k.NetNs != ino {
551-
unsentNonRootConnectionMetrics++
552-
continue
553-
}
554-
}
555-
} else {
556-
unsentNonRootObservations = 0
557-
unsentNonRootConnectionMetrics = 0
539+
for k, v := range uncorrelatedObservations {
540+
if k.NetNs != c.rootNSIno {
541+
log.Debugf("Unsent non-root observation: %v:%d<-%v:%d @ %d = %v", util.FromLowHigh(k.DstIPLow, k.DstIPHigh), k.DstPort, util.FromLowHigh(k.SrcIPLow, k.SrcIPHigh), k.SrcPort, k.NetNs, v)
542+
unsentNonRootObservations++
543+
continue
544+
}
545+
log.Debugf("Unsent connection observation: %v:%d<-%v:%d @ %d = %v", util.FromLowHigh(k.DstIPLow, k.DstIPHigh), k.DstPort, util.FromLowHigh(k.SrcIPLow, k.SrcIPHigh), k.SrcPort, k.NetNs, v)
546+
}
547+
548+
for k := range uncorrelatedConnectionMetrics {
549+
if k.NetNs != c.rootNSIno {
550+
unsentNonRootConnectionMetrics++
551+
continue
558552
}
559-
} else {
560-
unsentNonRootObservations = 0
561-
unsentNonRootConnectionMetrics = 0
562553
}
563554

564555
connectionMetricsProcessedCounter.WithLabelValues("no_process").Add(connectionMetricNoProcess)

checks/net_linux.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"time"
1010

1111
"github.com/DataDog/datadog-agent/pkg/network/tracer"
12+
"github.com/DataDog/datadog-agent/pkg/util/kernel"
1213
"github.com/StackVista/stackstate-process-agent/config"
1314
"github.com/StackVista/stackstate-process-agent/model"
1415
"github.com/StackVista/stackstate-process-agent/pkg/pods"
@@ -33,6 +34,18 @@ func (c *ConnectionsCheck) Init(cfg *config.AgentConfig, _ *model.SystemInfo) er
3334
return fmt.Errorf("failed to create network tracer: %s. Set the environment STS_NETWORK_TRACING_ENABLED to false to disable network connections reporting", err)
3435
}
3536

37+
// Get the root NS inode so that we will reuse it when formatting connections.
38+
rootHandle, err := kernel.GetRootNetNamespace(kernel.ProcFSRoot())
39+
if err != nil {
40+
return fmt.Errorf("Failed to get root net namespace handle: %v", err)
41+
}
42+
defer rootHandle.Close()
43+
44+
c.rootNSIno, err = kernel.GetInoForNs(rootHandle)
45+
if err != nil {
46+
return fmt.Errorf("failed to get root network namespace inode: %s", err)
47+
}
48+
3649
if cfg.NetworkTracer.PodCorrelation.Enabled {
3750
cfg.NetworkTracer.PodCorrelation.ObserverLogLevel = cfg.LogLevel
3851
c.podCorrelation, err = newPodCorrelationInfo(&cfg.NetworkTracer.PodCorrelation)

checks/net_pod_correlation.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ func newPodCorrelationInfo(cfg *config.PodCorrelationConfig) (*podCorrelationInf
169169
if err != nil {
170170
return nil, fmt.Errorf("Failed to get root net namespace: %v", err)
171171
}
172+
defer rootHandle.Close()
172173

173174
podCorrelationInfo.rootNSIno, err = kernel.GetInoForNs(rootHandle)
174175
if err != nil {

0 commit comments

Comments
 (0)