Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[release/v1.33.x] Fix the logic to get container.id resource attribute #11333

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Optional;
import java.util.logging.Level;
import java.util.logging.Logger;
Expand All @@ -25,6 +26,7 @@ class CgroupV2ContainerIdExtractor {

static final Path V2_CGROUP_PATH = Paths.get("/proc/self/mountinfo");
private static final Pattern CONTAINER_ID_RE = Pattern.compile("^[0-9a-f]{64}$");
private static final Pattern CRI_CONTAINER_ID_RE = Pattern.compile("cri-containerd:[0-9a-f]{64}");

private final ContainerResource.Filesystem filesystem;

Expand All @@ -41,18 +43,31 @@ Optional<String> extractContainerId() {
if (!filesystem.isReadable(V2_CGROUP_PATH)) {
return empty();
}

List<String> fileAsList;
try {
return filesystem
.lines(V2_CGROUP_PATH)
.filter(line -> line.contains("hostname"))
.flatMap(line -> Stream.of(line.split("/")))
.map(CONTAINER_ID_RE::matcher)
.filter(Matcher::matches)
.findFirst()
.map(matcher -> matcher.group(0));
fileAsList = filesystem.lineList(V2_CGROUP_PATH);
} catch (IOException e) {
logger.log(Level.WARNING, "Unable to read v2 cgroup path", e);
return empty();
}

Optional<String> optCid =
fileAsList.stream()
.filter(line -> line.contains("/containers/"))
.flatMap(line -> Stream.of(line.split("/")))
.map(CONTAINER_ID_RE::matcher)
.filter(Matcher::matches)
.reduce((first, second) -> second)
.map(matcher -> matcher.group(0));
if (optCid.isPresent()) {
return optCid;
}
return empty();
return fileAsList.stream()
.filter(line -> line.contains("cri-containerd:"))
.map(CRI_CONTAINER_ID_RE::matcher)
.filter(Matcher::find)
.findFirst()
.map(matcher -> matcher.group(0).substring(15));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
Expand Down Expand Up @@ -75,5 +77,11 @@ boolean isReadable(Path path) {
Stream<String> lines(Path path) throws IOException {
return Files.lines(path);
}

List<String> lineList(Path path) throws IOException {
try (Stream<String> lines = lines(path)) {
return lines.collect(Collectors.toList());
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
Expand All @@ -33,39 +34,61 @@ void fileNotReadable() {
assertThat(result).isSameAs(Optional.empty());
}

@Test
void extractSuccess_docker() throws Exception {
private void verifyContainerId(String rawFileContent, String containerId) throws Exception {
when(filesystem.isReadable(V2_CGROUP_PATH)).thenReturn(true);
Stream<String> fileContent = getTestDockerFileContent();
when(filesystem.lines(V2_CGROUP_PATH)).thenReturn(fileContent);
when(filesystem.lineList(V2_CGROUP_PATH)).thenReturn(fileToListOfLines(rawFileContent));
CgroupV2ContainerIdExtractor extractor = new CgroupV2ContainerIdExtractor(filesystem);
Optional<String> result = extractor.extractContainerId();
assertThat(result.orElse("fail"))
.isEqualTo("be522444b60caf2d3934b8b24b916a8a314f4b68d4595aa419874657e8d103f2");
assertThat(result.orElse("fail")).isEqualTo(containerId);
}

@Test
void extractSuccess_docker() throws Exception {
verifyContainerId(
"docker_proc_self_mountinfo",
"be522444b60caf2d3934b8b24b916a8a314f4b68d4595aa419874657e8d103f2");
}

@Test
void extractSuccess_docker1() throws Exception {
verifyContainerId(
"docker_proc_self_mountinfo1",
"188329f95b930c32eeeffd34658ed2538960947e166743fa3743f5ce3d739b40");
}

@Test
void extractSuccess_containerd() throws Exception {
verifyContainerId(
"containerd_proc_self_mountinfo",
"f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91");
}

@Test
void extractSuccess_podman() throws Exception {
when(filesystem.isReadable(V2_CGROUP_PATH)).thenReturn(true);
Stream<String> fileContent = getTestPodmanFileContent();
when(filesystem.lines(V2_CGROUP_PATH)).thenReturn(fileContent);
CgroupV2ContainerIdExtractor extractor = new CgroupV2ContainerIdExtractor(filesystem);
Optional<String> result = extractor.extractContainerId();
assertThat(result.orElse("fail"))
.isEqualTo("2a33efc76e519c137fe6093179653788bed6162d4a15e5131c8e835c968afbe6");
verifyContainerId(
"podman_proc_self_mountinfo",
"2a33efc76e519c137fe6093179653788bed6162d4a15e5131c8e835c968afbe6");
}

private static Stream<String> getTestDockerFileContent() throws Exception {
return fileToStreamOfLines("docker_proc_self_mountinfo");
@Test
void extractSuccess_crio() throws Exception {
verifyContainerId(
"crio_proc_self_mountinfo",
"a8f62e52ed7c2cd85242dcf0eb1d727b643540ceca7f328ad7d2f31aedf07731");
}

private static Stream<String> getTestPodmanFileContent() throws Exception {
return fileToStreamOfLines("podman_proc_self_mountinfo");
@Test
void extractSuccess_crio1() throws Exception {
verifyContainerId(
"crio_proc_self_mountinfo1",
"f23ec1d4b715c6531a17e9c549222fbbe1f7ffff697a29a2212b3b4cdc37f52e");
}

private static Stream<String> fileToStreamOfLines(String filename) {
private static List<String> fileToListOfLines(String filename) {
InputStream in =
CgroupV2ContainerIdExtractorTest.class.getClassLoader().getResourceAsStream(filename);
return new BufferedReader(new InputStreamReader(in, UTF_8)).lines();
return new BufferedReader(new InputStreamReader(in, UTF_8))
.lines()
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
2002 1895 0:226 / / rw,relatime master:629 - overlay overlay rw,lowerdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/75438/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/75437/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/75394/fs,upperdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/75439/fs,workdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/75439/work,xino=off
2003 2002 0:227 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
2004 2002 0:228 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
2005 2004 0:229 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666
2006 2004 0:117 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw
2007 2002 0:124 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro
2008 2007 0:230 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,mode=755
2009 2008 0:32 /system.slice/containerd.service/kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/systemd ro,nosuid,nodev,noexec,relatime master:11 - cgroup cgroup rw,xattr,name=systemd
2010 2008 0:35 /system.slice/containerd.service/kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/pids ro,nosuid,nodev,noexec,relatime master:15 - cgroup cgroup rw,pids
2011 2008 0:36 /kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/freezer ro,nosuid,nodev,noexec,relatime master:16 - cgroup cgroup rw,freezer
2012 2008 0:37 /system.slice/containerd.service/kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/cpu,cpuacct ro,nosuid,nodev,noexec,relatime master:17 - cgroup cgroup rw,cpu,cpuacct
2013 2008 0:38 /system.slice/containerd.service/kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/blkio ro,nosuid,nodev,noexec,relatime master:18 - cgroup cgroup rw,blkio
2014 2008 0:39 /kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/cpuset ro,nosuid,nodev,noexec,relatime master:19 - cgroup cgroup rw,cpuset
2015 2008 0:40 /kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/hugetlb ro,nosuid,nodev,noexec,relatime master:20 - cgroup cgroup rw,hugetlb
2016 2008 0:41 /system.slice/containerd.service/kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/memory ro,nosuid,nodev,noexec,relatime master:21 - cgroup cgroup rw,memory
2017 2008 0:42 /kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/net_cls,net_prio ro,nosuid,nodev,noexec,relatime master:22 - cgroup cgroup rw,net_cls,net_prio
2018 2008 0:43 /system.slice/containerd.service/kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/devices ro,nosuid,nodev,noexec,relatime master:23 - cgroup cgroup rw,devices
2019 2008 0:44 /kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/rdma ro,nosuid,nodev,noexec,relatime master:24 - cgroup cgroup rw,rdma
2020 2008 0:45 /kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/perf_event ro,nosuid,nodev,noexec,relatime master:25 - cgroup cgroup rw,perf_event
2021 2002 253:1 /var/lib/kubelet/pods/321c09bf-282b-44e4-a467-39daf144ef1f/etc-hosts /etc/hosts rw,relatime - xfs /dev/mapper/ubuntu--vg-root rw,attr2,inode64,logbufs=8,logbsize=32k,noquota
2022 2004 253:1 /var/lib/kubelet/pods/321c09bf-282b-44e4-a467-39daf144ef1f/containers/accountingservice/82b03b66 /dev/termination-log rw,relatime - xfs /dev/mapper/ubuntu--vg-root rw,attr2,inode64,logbufs=8,logbsize=32k,noquota
2023 2002 253:1 /var/lib/containerd/io.containerd.grpc.v1.cri/sandboxes/b136f3d296b4c2024b3e7ad816f2a804a47cf1acc3d445075c6d78cf159ef58d/hostname /etc/hostname rw,relatime - xfs /dev/mapper/ubuntu--vg-root rw,attr2,inode64,logbufs=8,logbsize=32k,noquota
2024 2002 253:1 /var/lib/containerd/io.containerd.grpc.v1.cri/sandboxes/b136f3d296b4c2024b3e7ad816f2a804a47cf1acc3d445075c6d78cf159ef58d/resolv.conf /etc/resolv.conf rw,relatime - xfs /dev/mapper/ubuntu--vg-root rw,attr2,inode64,logbufs=8,logbsize=32k,noquota
2025 2004 0:115 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k
2026 2002 0:96 / /run/secrets/kubernetes.io/serviceaccount ro,relatime - tmpfs tmpfs rw,size=32768456k
1896 2003 0:227 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw
1897 2003 0:227 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw
1898 2003 0:227 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw
1899 2003 0:227 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw
1900 2003 0:227 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw
1901 2003 0:231 / /proc/asound ro,relatime - tmpfs tmpfs ro
1902 2003 0:232 / /proc/acpi ro,relatime - tmpfs tmpfs ro
1903 2003 0:228 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
1904 2003 0:228 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
1905 2003 0:228 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
1906 2003 0:228 /null /proc/sched_debug rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
1907 2003 0:233 / /proc/scsi ro,relatime - tmpfs tmpfs ro
1908 2007 0:234 / /sys/firmware ro,relatime - tmpfs tmpfs ro
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
10303 9025 0:676 / / rw,relatime master:2633 - overlay overlay rw,context="system_u:object_r:container_file_t:s0:c285,c353",lowerdir=/var/lib/containers/storage/overlay/l/MOUYF2QTVBFHJCEJ7L4FQSJBYL:/var/lib/containers/storage/overlay/l/G6UHPBRIDD4LUQGKZ3B3LQNNBF:/var/lib/containers/storage/overlay/l/NYLNBZF5BPFKTTPCUH2NV2CI76,upperdir=/var/lib/containers/storage/overlay/7af2ec0ca188ec1e39e53f5a89d81ddcc721d39b6d2b818d0b00c6accf871382/diff,workdir=/var/lib/containers/storage/overlay/7af2ec0ca188ec1e39e53f5a89d81ddcc721d39b6d2b818d0b00c6accf871382/work,volatile
10304 10303 0:680 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
10305 10303 0:681 / /dev rw,nosuid - tmpfs tmpfs rw,context="system_u:object_r:container_file_t:s0:c285,c353",size=65536k,mode=755,inode64
10306 10305 0:689 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,context="system_u:object_r:container_file_t:s0:c285,c353",gid=5,mode=620,ptmxmode=666
10307 10305 0:668 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw,seclabel
10308 10303 0:690 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro,seclabel
10309 10308 0:26 / /sys/fs/cgroup ro,nosuid,nodev,noexec,relatime - cgroup2 cgroup rw,seclabel
10310 10305 0:667 / /dev/shm rw,nosuid,nodev,noexec,relatime master:2583 - tmpfs shm rw,context="system_u:object_r:container_file_t:s0:c285,c353",size=65536k,inode64
10311 10303 0:25 /containers/storage/overlay-containers/2ac4c84cb0d3c3beb04beeef6ccf71c17b5fdd0252ce3a2b66bc2fdd0aaa1814/userdata/resolv.conf /etc/resolv.conf rw,nosuid,nodev,noexec master:15 - tmpfs tmpfs rw,seclabel,size=6416204k,nr_inodes=819200,mode=755,inode64
10312 10303 0:25 /containers/storage/overlay-containers/2ac4c84cb0d3c3beb04beeef6ccf71c17b5fdd0252ce3a2b66bc2fdd0aaa1814/userdata/hostname /etc/hostname rw,nosuid,nodev master:15 - tmpfs tmpfs rw,seclabel,size=6416204k,nr_inodes=819200,mode=755,inode64
10313 10303 0:25 /containers/storage/overlay-containers/2ac4c84cb0d3c3beb04beeef6ccf71c17b5fdd0252ce3a2b66bc2fdd0aaa1814/userdata/.containerenv /run/.containerenv rw,nosuid,nodev master:15 - tmpfs tmpfs rw,seclabel,size=6416204k,nr_inodes=819200,mode=755,inode64
10314 10303 252:4 /ostree/deploy/rhcos/var/lib/kubelet/pods/0a947273-7214-4824-8411-875ebd7626e4/etc-hosts /etc/hosts rw,relatime - xfs /dev/vda4 rw,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota
10315 10305 252:4 /ostree/deploy/rhcos/var/lib/kubelet/pods/0a947273-7214-4824-8411-875ebd7626e4/containers/ubuntu23/354653d0 /dev/termination-log rw,relatime - xfs /dev/vda4 rw,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota
10316 10303 0:25 /containers/storage/overlay-containers/a8f62e52ed7c2cd85242dcf0eb1d727b643540ceca7f328ad7d2f31aedf07731/userdata/run/secrets /run/secrets rw,nosuid,nodev - tmpfs tmpfs rw,seclabel,size=6416204k,nr_inodes=819200,mode=755,inode64
10317 10316 0:666 / /run/secrets/kubernetes.io/serviceaccount ro,relatime - tmpfs tmpfs rw,seclabel,size=30930028k,inode64
9026 10304 0:680 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw
9027 10304 0:680 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw
9029 10304 0:680 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw
9030 10304 0:680 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw
9031 10304 0:680 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw
9032 10304 0:691 / /proc/acpi ro,relatime - tmpfs tmpfs ro,context="system_u:object_r:container_file_t:s0:c285,c353",inode64
9033 10304 0:681 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,context="system_u:object_r:container_file_t:s0:c285,c353",size=65536k,mode=755,inode64
9034 10304 0:681 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,context="system_u:object_r:container_file_t:s0:c285,c353",size=65536k,mode=755,inode64
9035 10304 0:681 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,context="system_u:object_r:container_file_t:s0:c285,c353",size=65536k,mode=755,inode64
9036 10304 0:692 / /proc/scsi ro,relatime - tmpfs tmpfs ro,context="system_u:object_r:container_file_t:s0:c285,c353",inode64
9037 10308 0:693 / /sys/firmware ro,relatime - tmpfs tmpfs ro,context="system_u:object_r:container_file_t:s0:c285,c353",inode64
Loading
Loading