Skip to content

Commit 94d0a6a

Browse files
authored
fix(ebpf): prefer pid targets over container targets (#2761)
1 parent 000930f commit 94d0a6a

File tree

3 files changed

+55
-10
lines changed

3 files changed

+55
-10
lines changed

ebpf/sd/procfs.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ import (
88

99
var (
1010
// cgroupContainerIDRe matches a container ID from a /proc/{pid}}/cgroup
11-
// 12:cpuset:/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod471203d1_984f_477e_9c35_db96487ffe5e.slice/cri-containerd-a534eb629135e43beb13213976e37bb2ab95cba4c0d1d0b4e27c6bc4d8091b83.scope"
12-
// 11:devices:/kubepods/besteffort/pod85adbef3-622f-4ef2-8f60-a8bdf3eb6c72/7edda1de1e0d1d366351e478359cf5fa16bb8ab53063a99bb119e56971bfb7e2
13-
cgroupContainerIDRe = regexp.MustCompile(`^.*/(?:.*-)?([0-9a-f]+)(?:\.|\s*$)`)
11+
cgroupContainerIDRe = regexp.MustCompile(`^.*/(?:.*-)?([0-9a-f]{64})(?:\.|\s*$)`)
1412
)
1513

1614
func (tf *targetFinder) getContainerIDFromPID(pid uint32) containerID {

ebpf/sd/target.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -181,16 +181,16 @@ func (tf *targetFinder) setTargets(opts TargetsOptions) {
181181
containerID2Target := make(map[containerID]*Target)
182182
pid2Target := make(map[uint32]*Target)
183183
for _, target := range opts.Targets {
184-
if cid := containerIDFromTarget(target); cid != "" {
185-
t := NewTarget(cid, 0, target)
186-
containerID2Target[cid] = t
187-
} else if pid := pidFromTarget(target); pid != 0 {
184+
if pid := pidFromTarget(target); pid != 0 {
188185
t := NewTarget("", pid, target)
189186
pid2Target[pid] = t
187+
} else if cid := containerIDFromTarget(target); cid != "" {
188+
t := NewTarget(cid, 0, target)
189+
containerID2Target[cid] = t
190190
}
191191
}
192-
if len(opts.Targets) > 0 && len(containerID2Target) == 0 {
193-
_ = level.Warn(tf.l).Log("msg", "No container IDs found in targets")
192+
if len(opts.Targets) > 0 && len(containerID2Target) == 0 && len(pid2Target) == 0 {
193+
_ = level.Warn(tf.l).Log("msg", "No targets found")
194194
}
195195
tf.cid2target = containerID2Target
196196
tf.pid2target = pid2Target

ebpf/sd/target_test.go

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ package sd
22

33
import (
44
"fmt"
5-
"github.com/grafana/pyroscope/ebpf/util"
65
"io/fs"
76
"os"
87
"path/filepath"
98
"testing"
109

10+
"github.com/grafana/pyroscope/ebpf/util"
11+
1112
"github.com/stretchr/testify/require"
1213
)
1314

@@ -49,6 +50,11 @@ func TestCGroupMatching(t *testing.T) {
4950
"7edda1de1e0d1d366351e478359cf5fa16bb8ab53063a99bb119e56971bfb7e2",
5051
expectedID: "7edda1de1e0d1d366351e478359cf5fa16bb8ab53063a99bb119e56971bfb7e2",
5152
},
53+
{
54+
containerID: "",
55+
cgroup: "0::/../../user.slice/user-501.slice/session-3.scope",
56+
expectedID: "",
57+
},
5258
}
5359
for i, tc := range testcases {
5460
t.Run(fmt.Sprintf("testcase %d %s", i, tc.cgroup), func(t *testing.T) {
@@ -136,3 +142,44 @@ func TestTargetFinder(t *testing.T) {
136142
target = tf.FindTarget(239)
137143
require.Nil(t, target)
138144
}
145+
146+
func TestPreferPIDOverContainerID(t *testing.T) {
147+
fs, err := newMockFS()
148+
require.NoError(t, err)
149+
defer fs.rm()
150+
151+
options := TargetsOptions{
152+
Targets: []DiscoveryTarget{
153+
map[string]string{
154+
"__meta_kubernetes_pod_container_id": "containerd://9a7c72f122922fe3445ba85ce72c507c8976c0f3d919403fda7c22dfe516f66f",
155+
"__meta_kubernetes_namespace": "foo",
156+
"__meta_kubernetes_pod_container_name": "bar",
157+
"__process_pid__": "1801264",
158+
"exe": "/bin/bash",
159+
},
160+
map[string]string{
161+
"__meta_kubernetes_pod_container_id": "containerd://9a7c72f122922fe3445ba85ce72c507c8976c0f3d919403fda7c22dfe516f66f",
162+
"__meta_kubernetes_namespace": "foo",
163+
"__meta_kubernetes_pod_container_name": "bar",
164+
"__process_pid__": "1801265",
165+
"exe": "/bin/dash",
166+
},
167+
},
168+
TargetsOnly: true,
169+
DefaultTarget: nil,
170+
ContainerCacheSize: 1024,
171+
}
172+
173+
tf, err := NewTargetFinder(fs.root, util.TestLogger(t), options)
174+
require.NoError(t, err)
175+
176+
target := tf.FindTarget(1801264)
177+
require.NotNil(t, target)
178+
require.Equal(t, "ebpf/foo/bar", target.labels.Get("service_name"))
179+
require.Equal(t, "/bin/bash", target.labels.Get("exe"))
180+
181+
target = tf.FindTarget(1801265)
182+
require.NotNil(t, target)
183+
require.Equal(t, "ebpf/foo/bar", target.labels.Get("service_name"))
184+
require.Equal(t, "/bin/dash", target.labels.Get("exe"))
185+
}

0 commit comments

Comments
 (0)