Skip to content

Commit d9fa778

Browse files
opentelemetrybotRui Liulaurit
authored
[release/v1.33.x] Fix the logic to get container.id resource attribute (#11333)
Co-authored-by: Rui Liu <[email protected]> Co-authored-by: Lauri Tulmin <[email protected]>
1 parent db36233 commit d9fa778

File tree

7 files changed

+214
-29
lines changed

7 files changed

+214
-29
lines changed

instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/CgroupV2ContainerIdExtractor.java

+24-9
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.io.IOException;
1111
import java.nio.file.Path;
1212
import java.nio.file.Paths;
13+
import java.util.List;
1314
import java.util.Optional;
1415
import java.util.logging.Level;
1516
import java.util.logging.Logger;
@@ -25,6 +26,7 @@ class CgroupV2ContainerIdExtractor {
2526

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

2931
private final ContainerResource.Filesystem filesystem;
3032

@@ -41,18 +43,31 @@ Optional<String> extractContainerId() {
4143
if (!filesystem.isReadable(V2_CGROUP_PATH)) {
4244
return empty();
4345
}
46+
47+
List<String> fileAsList;
4448
try {
45-
return filesystem
46-
.lines(V2_CGROUP_PATH)
47-
.filter(line -> line.contains("hostname"))
48-
.flatMap(line -> Stream.of(line.split("/")))
49-
.map(CONTAINER_ID_RE::matcher)
50-
.filter(Matcher::matches)
51-
.findFirst()
52-
.map(matcher -> matcher.group(0));
49+
fileAsList = filesystem.lineList(V2_CGROUP_PATH);
5350
} catch (IOException e) {
5451
logger.log(Level.WARNING, "Unable to read v2 cgroup path", e);
52+
return empty();
53+
}
54+
55+
Optional<String> optCid =
56+
fileAsList.stream()
57+
.filter(line -> line.contains("/containers/"))
58+
.flatMap(line -> Stream.of(line.split("/")))
59+
.map(CONTAINER_ID_RE::matcher)
60+
.filter(Matcher::matches)
61+
.reduce((first, second) -> second)
62+
.map(matcher -> matcher.group(0));
63+
if (optCid.isPresent()) {
64+
return optCid;
5565
}
56-
return empty();
66+
return fileAsList.stream()
67+
.filter(line -> line.contains("cri-containerd:"))
68+
.map(CRI_CONTAINER_ID_RE::matcher)
69+
.filter(Matcher::find)
70+
.findFirst()
71+
.map(matcher -> matcher.group(0).substring(15));
5772
}
5873
}

instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/ContainerResource.java

+8
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
import java.io.IOException;
1414
import java.nio.file.Files;
1515
import java.nio.file.Path;
16+
import java.util.List;
1617
import java.util.Optional;
18+
import java.util.stream.Collectors;
1719
import java.util.stream.Stream;
1820

1921
/**
@@ -75,5 +77,11 @@ boolean isReadable(Path path) {
7577
Stream<String> lines(Path path) throws IOException {
7678
return Files.lines(path);
7779
}
80+
81+
List<String> lineList(Path path) throws IOException {
82+
try (Stream<String> lines = lines(path)) {
83+
return lines.collect(Collectors.toList());
84+
}
85+
}
7886
}
7987
}

instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/CgroupV2ContainerIdExtractorTest.java

+43-20
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@
1313
import java.io.BufferedReader;
1414
import java.io.InputStream;
1515
import java.io.InputStreamReader;
16+
import java.util.List;
1617
import java.util.Optional;
17-
import java.util.stream.Stream;
18+
import java.util.stream.Collectors;
1819
import org.junit.jupiter.api.Test;
1920
import org.junit.jupiter.api.extension.ExtendWith;
2021
import org.mockito.Mock;
@@ -33,39 +34,61 @@ void fileNotReadable() {
3334
assertThat(result).isSameAs(Optional.empty());
3435
}
3536

36-
@Test
37-
void extractSuccess_docker() throws Exception {
37+
private void verifyContainerId(String rawFileContent, String containerId) throws Exception {
3838
when(filesystem.isReadable(V2_CGROUP_PATH)).thenReturn(true);
39-
Stream<String> fileContent = getTestDockerFileContent();
40-
when(filesystem.lines(V2_CGROUP_PATH)).thenReturn(fileContent);
39+
when(filesystem.lineList(V2_CGROUP_PATH)).thenReturn(fileToListOfLines(rawFileContent));
4140
CgroupV2ContainerIdExtractor extractor = new CgroupV2ContainerIdExtractor(filesystem);
4241
Optional<String> result = extractor.extractContainerId();
43-
assertThat(result.orElse("fail"))
44-
.isEqualTo("be522444b60caf2d3934b8b24b916a8a314f4b68d4595aa419874657e8d103f2");
42+
assertThat(result.orElse("fail")).isEqualTo(containerId);
43+
}
44+
45+
@Test
46+
void extractSuccess_docker() throws Exception {
47+
verifyContainerId(
48+
"docker_proc_self_mountinfo",
49+
"be522444b60caf2d3934b8b24b916a8a314f4b68d4595aa419874657e8d103f2");
50+
}
51+
52+
@Test
53+
void extractSuccess_docker1() throws Exception {
54+
verifyContainerId(
55+
"docker_proc_self_mountinfo1",
56+
"188329f95b930c32eeeffd34658ed2538960947e166743fa3743f5ce3d739b40");
57+
}
58+
59+
@Test
60+
void extractSuccess_containerd() throws Exception {
61+
verifyContainerId(
62+
"containerd_proc_self_mountinfo",
63+
"f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91");
4564
}
4665

4766
@Test
4867
void extractSuccess_podman() throws Exception {
49-
when(filesystem.isReadable(V2_CGROUP_PATH)).thenReturn(true);
50-
Stream<String> fileContent = getTestPodmanFileContent();
51-
when(filesystem.lines(V2_CGROUP_PATH)).thenReturn(fileContent);
52-
CgroupV2ContainerIdExtractor extractor = new CgroupV2ContainerIdExtractor(filesystem);
53-
Optional<String> result = extractor.extractContainerId();
54-
assertThat(result.orElse("fail"))
55-
.isEqualTo("2a33efc76e519c137fe6093179653788bed6162d4a15e5131c8e835c968afbe6");
68+
verifyContainerId(
69+
"podman_proc_self_mountinfo",
70+
"2a33efc76e519c137fe6093179653788bed6162d4a15e5131c8e835c968afbe6");
5671
}
5772

58-
private static Stream<String> getTestDockerFileContent() throws Exception {
59-
return fileToStreamOfLines("docker_proc_self_mountinfo");
73+
@Test
74+
void extractSuccess_crio() throws Exception {
75+
verifyContainerId(
76+
"crio_proc_self_mountinfo",
77+
"a8f62e52ed7c2cd85242dcf0eb1d727b643540ceca7f328ad7d2f31aedf07731");
6078
}
6179

62-
private static Stream<String> getTestPodmanFileContent() throws Exception {
63-
return fileToStreamOfLines("podman_proc_self_mountinfo");
80+
@Test
81+
void extractSuccess_crio1() throws Exception {
82+
verifyContainerId(
83+
"crio_proc_self_mountinfo1",
84+
"f23ec1d4b715c6531a17e9c549222fbbe1f7ffff697a29a2212b3b4cdc37f52e");
6485
}
6586

66-
private static Stream<String> fileToStreamOfLines(String filename) {
87+
private static List<String> fileToListOfLines(String filename) {
6788
InputStream in =
6889
CgroupV2ContainerIdExtractorTest.class.getClassLoader().getResourceAsStream(filename);
69-
return new BufferedReader(new InputStreamReader(in, UTF_8)).lines();
90+
return new BufferedReader(new InputStreamReader(in, UTF_8))
91+
.lines()
92+
.collect(Collectors.toList());
7093
}
7194
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
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
2+
2003 2002 0:227 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
3+
2004 2002 0:228 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
4+
2005 2004 0:229 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666
5+
2006 2004 0:117 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw
6+
2007 2002 0:124 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro
7+
2008 2007 0:230 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,mode=755
8+
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
9+
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
10+
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
11+
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
12+
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
13+
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
14+
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
15+
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
16+
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
17+
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
18+
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
19+
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
20+
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
21+
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
22+
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
23+
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
24+
2025 2004 0:115 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k
25+
2026 2002 0:96 / /run/secrets/kubernetes.io/serviceaccount ro,relatime - tmpfs tmpfs rw,size=32768456k
26+
1896 2003 0:227 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw
27+
1897 2003 0:227 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw
28+
1898 2003 0:227 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw
29+
1899 2003 0:227 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw
30+
1900 2003 0:227 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw
31+
1901 2003 0:231 / /proc/asound ro,relatime - tmpfs tmpfs ro
32+
1902 2003 0:232 / /proc/acpi ro,relatime - tmpfs tmpfs ro
33+
1903 2003 0:228 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
34+
1904 2003 0:228 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
35+
1905 2003 0:228 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
36+
1906 2003 0:228 /null /proc/sched_debug rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
37+
1907 2003 0:233 / /proc/scsi ro,relatime - tmpfs tmpfs ro
38+
1908 2007 0:234 / /sys/firmware ro,relatime - tmpfs tmpfs ro
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
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
2+
10304 10303 0:680 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
3+
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
4+
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
5+
10307 10305 0:668 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw,seclabel
6+
10308 10303 0:690 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro,seclabel
7+
10309 10308 0:26 / /sys/fs/cgroup ro,nosuid,nodev,noexec,relatime - cgroup2 cgroup rw,seclabel
8+
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
9+
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
10+
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
11+
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
12+
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
13+
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
14+
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
15+
10317 10316 0:666 / /run/secrets/kubernetes.io/serviceaccount ro,relatime - tmpfs tmpfs rw,seclabel,size=30930028k,inode64
16+
9026 10304 0:680 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw
17+
9027 10304 0:680 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw
18+
9029 10304 0:680 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw
19+
9030 10304 0:680 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw
20+
9031 10304 0:680 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw
21+
9032 10304 0:691 / /proc/acpi ro,relatime - tmpfs tmpfs ro,context="system_u:object_r:container_file_t:s0:c285,c353",inode64
22+
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
23+
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
24+
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
25+
9036 10304 0:692 / /proc/scsi ro,relatime - tmpfs tmpfs ro,context="system_u:object_r:container_file_t:s0:c285,c353",inode64
26+
9037 10308 0:693 / /sys/firmware ro,relatime - tmpfs tmpfs ro,context="system_u:object_r:container_file_t:s0:c285,c353",inode64

0 commit comments

Comments
 (0)