From 369658c2008e19cba5bcf8613ca3796466b17414 Mon Sep 17 00:00:00 2001 From: Laplie Anderson Date: Tue, 16 Jul 2019 10:53:07 -0400 Subject: [PATCH 1/7] Initial cgroups parsing implementation --- .../datadog/opentracing/ContainerInfo.java | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java b/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java new file mode 100644 index 0000000000..09c848edfc --- /dev/null +++ b/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java @@ -0,0 +1,102 @@ +package datadog.opentracing; + +import lombok.Data; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Data +public class ContainerInfo { + private static final Path CGROUP_DEFAULT_PROCFILE = Paths.get("/proc/self/cgroup"); + private static final String UUID_REGEX = + "[0-9a-f]{8}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{12}"; + private static final String CONTAINER_REGEX = "[0-9a-f]{64}"; + private static final Pattern LINE_PATTERN = Pattern.compile("(\\d+):([^:]*):(.+)$"); + private static final Pattern POD_PATTERN = Pattern.compile("pod(" + UUID_REGEX + ")(?:.slice)?$"); + private static final Pattern CONTAINER_PATTERN = + Pattern.compile("(" + UUID_REGEX + "|" + CONTAINER_REGEX + ")(?:.scope)?$"); + + public String containerId; + public String podId; + public List cGroups; + + @Data + public static class CGroupInfo { + public int id; + public String path; + public List controllers; + public String containerId; + public String podId; + } + + public static boolean isRunningInContainer() { + return Files.isReadable(CGROUP_DEFAULT_PROCFILE); + } + + public static ContainerInfo fromDefaultProcFile() throws IOException, ParseException { + final String content = new String(Files.readAllBytes(CGROUP_DEFAULT_PROCFILE)); + return parse(content); + } + + public static ContainerInfo parse(final String cgroupsContent) throws ParseException { + final ContainerInfo containerInfo = new ContainerInfo(); + + final String[] lines = cgroupsContent.split("\n"); + final List parsedCGroups = new ArrayList<>(); + for (final String line : lines) { + final CGroupInfo cGroupInfo = parseLine(line); + + parsedCGroups.add(cGroupInfo); + + if (cGroupInfo.getPodId() != null) { + containerInfo.setPodId(cGroupInfo.getPodId()); + } + + if (cGroupInfo.getContainerId() != null) { + containerInfo.setContainerId(cGroupInfo.getContainerId()); + } + } + + containerInfo.setCGroups(parsedCGroups); + + return containerInfo; + } + + static CGroupInfo parseLine(final String line) throws ParseException { + final Matcher matcher = LINE_PATTERN.matcher(line); + + if (!matcher.matches()) { + throw new ParseException("Unable to match cgroup", 0); + } + + final CGroupInfo cGroupInfo = new CGroupInfo(); + cGroupInfo.setId(Integer.parseInt(matcher.group(1))); + cGroupInfo.setControllers(Arrays.asList(matcher.group(2).split(","))); + + final String path = matcher.group(3); + final String[] pathParts = path.split("/"); + + cGroupInfo.setPath(path); + + if (pathParts.length >= 1) { + final Matcher containerIdMatcher = CONTAINER_PATTERN.matcher(pathParts[0]); + final String containerId = containerIdMatcher.matches() ? containerIdMatcher.group(1) : null; + cGroupInfo.setContainerId(containerId); + } + + if (pathParts.length >= 2) { + final Matcher podIdMatcher = POD_PATTERN.matcher(pathParts[1]); + final String podId = podIdMatcher.matches() ? podIdMatcher.group(1) : null; + cGroupInfo.setPodId(podId); + } + + return cGroupInfo; + } +} From d74ffc3db02f83b14e9b1acbc61716ab1ed68335 Mon Sep 17 00:00:00 2001 From: Laplie Anderson Date: Tue, 16 Jul 2019 11:44:35 -0400 Subject: [PATCH 2/7] Parsing tests from RFC and reference impl --- .../opentracing/ContainerInfoTest.groovy | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 dd-trace-ot/src/test/groovy/datadog/opentracing/ContainerInfoTest.groovy diff --git a/dd-trace-ot/src/test/groovy/datadog/opentracing/ContainerInfoTest.groovy b/dd-trace-ot/src/test/groovy/datadog/opentracing/ContainerInfoTest.groovy new file mode 100644 index 0000000000..e5d014e594 --- /dev/null +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/ContainerInfoTest.groovy @@ -0,0 +1,148 @@ +package datadog.opentracing + +import spock.lang.Specification +import spock.lang.Unroll + + +class ContainerInfoTest extends Specification { + + @Unroll + def "CGroupInfo is parsed from individual lines"() { + when: + ContainerInfo.CGroupInfo cGroupInfo = ContainerInfo.parseLine(line) + + then: + cGroupInfo.getId() == id + cGroupInfo.getPath() == path + cGroupInfo.getControllers() == controllers + cGroupInfo.getContainerId() == containerId + cGroupInfo.podId == podId + + // Examples from DataDog/architecture/rfcs/apm/agent/containers-tagging/rfc.md and Qard/container-info + where: + id | controllers | path | containerId | podId | line + + // Docker examples + 13 | ["name=systemd"] | "/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | "13:name=systemd:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" + 12 | ["pids"] | "/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | "12:pids:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" + 11 | ["hugetlb"] | "/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | "11:hugetlb:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" + 10 | ["net_prio"] | "/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | "10:net_prio:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" + 9 | ["perf_event"] | "/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | "9:perf_event:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" + 8 | ["net_cls"] | "/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | "8:net_cls:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" + 7 | ["freezer"] | "/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | "7:freezer:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" + 6 | ["devices"] | "/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | "6:devices:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" + 5 | ["memory"] | "/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | "5:memory:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" + 4 | ["blkio"] | "/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | "4:blkio:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" + 3 | ["cpuacct"] | "/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | "3:cpuacct:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" + 2 | ["cpu"] | "/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | "2:cpu:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" + 1 | ["cpuset"] | "/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | "1:cpuset:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" + + // Kubernates examples + 11 | ["perf_event"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "11:perf_event:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" + 10 | ["pids"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "10:pids:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" + 9 | ["memory"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "9:memory:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" + 8 | ["cpu", "cpuacct"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "8:cpu,cpuacct:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" + 7 | ["blkio"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "7:blkio:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" + 6 | ["cpuset"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "6:cpuset:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" + 5 | ["devices"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "5:devices:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" + 4 | ["freezer"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "4:freezer:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" + 3 | ["net_cls", "net_prop"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "3:net_cls,net_prio:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" + 2 | ["hugetlb"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "2:hugetlb:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" + 1 | ["name=systemd"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "1:name=systemd:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" + + //ECS examples + 9 | ["perf_event"] | "/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | "38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | null | "9:perf_event:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" + 8 | ["memory"] | "/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | "38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | null | "8:memory:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" + 7 | ["hugetlb"] | "/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | "38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | null | "7:hugetlb:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" + 6 | ["freezer"] | "/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | "38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | null | "6:freezer:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" + 5 | ["devices"] | "/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | "38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | null | "5:devices:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" + 4 | ["cpuset"] | "/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | "38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | null | "4:cpuset:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" + 3 | ["cpuacct"] | "/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | "38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | null | "3:cpuacct:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" + 2 | ["cpu"] | "/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | "38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | null | "2:cpu:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" + 1 | ["blkio"] | "/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | "38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | null | "1:blkio:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" + + //Fargate Examples + 11 | ["hugetlb"] | "/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | "432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | null | "11:hugetlb:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" + 10 | ["pids"] | "/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | "432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | null | "10:pids:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" + 9 | ["cpuset"] | "/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | "432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | null | "9:cpuset:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" + 8 | ["net_cls", "net_prio"] | "/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | "432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | null | "8:net_cls,net_prio:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" + 7 | ["cpu", "cpuacct"] | "/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | "432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | null | "7:cpu,cpuacct:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" + 6 | ["perf_event"] | "/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | "432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | null | "6:perf_event:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" + 5 | ["freezer"] | "/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | "432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | null | "5:freezer:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" + 4 | ["devices"] | "/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | "432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | null | "4:devices:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" + 3 | ["blkio"] | "/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | "432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | null | "3:blkio:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" + 2 | ["memory"] | "/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | "432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | null | "2:memory:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" + 1 | ["name=systemd"] | "/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | "432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | null | "1:name=systemd:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" + + //Reference impl examples + 1 | ["name=systemd"] | "/system.slice/docker-cde7c2bab394630a42d73dc610b9c57415dced996106665d427f6d0566594411.scope" | "cde7c2bab394630a42d73dc610b9c57415dced996106665d427f6d0566594411" | null | "1:name=systemd:/system.slice/docker-cde7c2bab394630a42d73dc610b9c57415dced996106665d427f6d0566594411.scope" + 1 | ["name=systemd"] | "/docker/051e2ee0bce99116029a13df4a9e943137f19f957f38ac02d6bad96f9b700f76/not_hex" | null | null | "1:name=systemd:/docker/051e2ee0bce99116029a13df4a9e943137f19f957f38ac02d6bad96f9b700f76/not_hex" + 1 | ["name=systemd"] | "/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod90d81341_92de_11e7_8cf2_507b9d4141fa.slice/crio-2227daf62df6694645fee5df53c1f91271546a9560e8600a525690ae252b7f63.scope" | "2227daf62df6694645fee5df53c1f91271546a9560e8600a525690ae252b7f63" | "90d81341_92de_11e7_8cf2_507b9d4141fa" | "1:name=systemd:/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod90d81341_92de_11e7_8cf2_507b9d4141fa.slice/crio-2227daf62df6694645fee5df53c1f91271546a9560e8600a525690ae252b7f63.scope" + + } + + @Unroll + def "Container info parsed from file content"() { + when: + ContainerInfo containerInfo = ContainerInfo.parse(content) + + then: + containerInfo.getContainerId() == containerId + containerInfo.getPodId() == podId + containerInfo.getCGroups().size() == size + + where: + containerId | podId | size | content + // Docker + "3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860" | null | 13 | """13:name=systemd:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860 +12:pids:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860 +11:hugetlb:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860 +10:net_prio:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860 +9:perf_event:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860 +8:net_cls:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860 +7:freezer:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860 +6:devices:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860 +5:memory:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860 +4:blkio:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860 +3:cpuacct:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860 +2:cpu:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860 +1:cpuset:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860""" + + // Kubernetes + "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | 11 | """11:perf_event:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1 +10:pids:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1 +9:memory:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1 +8:cpu,cpuacct:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1 +7:blkio:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1 +6:cpuset:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1 +5:devices:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1 +4:freezer:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1 +3:net_cls,net_prio:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1 +2:hugetlb:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1 +1:name=systemd:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1""" + + // ECS + "38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce" | null | 9 | """9:perf_event:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce +8:memory:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce +7:hugetlb:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce +6:freezer:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce +5:devices:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce +4:cpuset:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce +3:cpuacct:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce +2:cpu:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce +1:blkio:/ecs/haissam-ecs-classic/5a0d5ceddf6c44c1928d367a815d890f/38fac3e99302b3622be089dd41e7ccf38aff368a86cc339972075136ee2710ce""" + + // Fargate + "432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da" | null | 11 | """11:hugetlb:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da +10:pids:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da +9:cpuset:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da +8:net_cls,net_prio:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da +7:cpu,cpuacct:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da +6:perf_event:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da +5:freezer:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da +4:devices:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da +3:blkio:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da +2:memory:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da +1:name=systemd:/ecs/55091c13-b8cf-4801-b527-f4601742204d/432624d2150b349fe35ba397284dea788c2bf66b885d14dfc1569b01890ca7da""" + } +} From 9dbe3a0a17b19b34301cab28172ddbd89e186641 Mon Sep 17 00:00:00 2001 From: Laplie Anderson Date: Tue, 16 Jul 2019 15:31:15 -0400 Subject: [PATCH 3/7] Fix part of path to match --- .../src/main/java/datadog/opentracing/ContainerInfo.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java b/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java index 09c848edfc..2cbb7d2ace 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java @@ -12,6 +12,10 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +/** + * Parses container information from /proc/self/cgroup. Implementation based largely on + * Qard/container-info + */ @Data public class ContainerInfo { private static final Path CGROUP_DEFAULT_PROCFILE = Paths.get("/proc/self/cgroup"); @@ -86,13 +90,13 @@ public class ContainerInfo { cGroupInfo.setPath(path); if (pathParts.length >= 1) { - final Matcher containerIdMatcher = CONTAINER_PATTERN.matcher(pathParts[0]); + final Matcher containerIdMatcher = CONTAINER_PATTERN.matcher(pathParts[pathParts.length - 1]); final String containerId = containerIdMatcher.matches() ? containerIdMatcher.group(1) : null; cGroupInfo.setContainerId(containerId); } if (pathParts.length >= 2) { - final Matcher podIdMatcher = POD_PATTERN.matcher(pathParts[1]); + final Matcher podIdMatcher = POD_PATTERN.matcher(pathParts[pathParts.length - 2]); final String podId = podIdMatcher.matches() ? podIdMatcher.group(1) : null; cGroupInfo.setPodId(podId); } From 48538018133b675e829b8492219c84493cb49a6f Mon Sep 17 00:00:00 2001 From: Laplie Anderson Date: Tue, 16 Jul 2019 17:21:59 -0400 Subject: [PATCH 4/7] Add container id headers to request builder --- .../datadog/opentracing/ContainerInfo.java | 7 +++--- .../datadog/opentracing/DDTraceOTInfo.java | 16 ++++++++++++++ .../datadog/trace/common/writer/DDApi.java | 22 +++++++++++++------ .../opentracing/ContainerInfoTest.groovy | 2 +- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java b/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java index 2cbb7d2ace..5ec79a0b24 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java @@ -1,6 +1,5 @@ package datadog.opentracing; -import lombok.Data; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -11,6 +10,7 @@ import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import lombok.Data; /** * Parses container information from /proc/self/cgroup. Implementation based largely on @@ -23,9 +23,10 @@ public class ContainerInfo { "[0-9a-f]{8}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{12}"; private static final String CONTAINER_REGEX = "[0-9a-f]{64}"; private static final Pattern LINE_PATTERN = Pattern.compile("(\\d+):([^:]*):(.+)$"); - private static final Pattern POD_PATTERN = Pattern.compile("pod(" + UUID_REGEX + ")(?:.slice)?$"); + private static final Pattern POD_PATTERN = + Pattern.compile("(?:.+)?pod(" + UUID_REGEX + ")(?:.slice)?$"); private static final Pattern CONTAINER_PATTERN = - Pattern.compile("(" + UUID_REGEX + "|" + CONTAINER_REGEX + ")(?:.scope)?$"); + Pattern.compile("(?:.+)?(" + UUID_REGEX + "|" + CONTAINER_REGEX + ")(?:.scope)?$"); public String containerId; public String podId; diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/DDTraceOTInfo.java b/dd-trace-ot/src/main/java/datadog/opentracing/DDTraceOTInfo.java index 28840ad8e1..20ce98c057 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/DDTraceOTInfo.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/DDTraceOTInfo.java @@ -1,7 +1,9 @@ package datadog.opentracing; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; +import java.text.ParseException; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -13,6 +15,8 @@ public class DDTraceOTInfo { public static final String VERSION; + public static final String CONTAINER_ID; + static { String v; try { @@ -30,6 +34,18 @@ public class DDTraceOTInfo { } VERSION = v; log.info("dd-trace - version: {}", v); + + ContainerInfo containerInfo = null; + + if (ContainerInfo.isRunningInContainer()) { + try { + containerInfo = ContainerInfo.fromDefaultProcFile(); + } catch (final IOException | ParseException e) { + log.error("Unable to parse proc file"); + } + } + + CONTAINER_ID = containerInfo == null ? null : containerInfo.getContainerId(); } public static void main(final String... args) { diff --git a/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDApi.java b/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDApi.java index 8fa1bd170a..d81ac79a2a 100644 --- a/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDApi.java +++ b/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDApi.java @@ -35,6 +35,7 @@ public class DDApi { private static final String DATADOG_META_LANG_INTERPRETER_VENDOR = "Datadog-Meta-Lang-Interpreter-Vendor"; private static final String DATADOG_META_TRACER_VERSION = "Datadog-Meta-Tracer-Version"; + private static final String DATADOG_CONTAINER_ID = "Datadog-Container-ID"; private static final String X_DATADOG_TRACE_COUNT = "X-Datadog-Trace-Count"; private static final int HTTP_TIMEOUT = 1; // 1 second for conenct/read/write operations @@ -261,13 +262,20 @@ public class DDApi { } private static Request.Builder prepareRequest(final HttpUrl url) { - return new Request.Builder() - .url(url) - .addHeader(DATADOG_META_LANG, "java") - .addHeader(DATADOG_META_LANG_VERSION, DDTraceOTInfo.JAVA_VERSION) - .addHeader(DATADOG_META_LANG_INTERPRETER, DDTraceOTInfo.JAVA_VM_NAME) - .addHeader(DATADOG_META_LANG_INTERPRETER_VENDOR, DDTraceOTInfo.JAVA_VM_VENDOR) - .addHeader(DATADOG_META_TRACER_VERSION, DDTraceOTInfo.VERSION); + final Request.Builder builder = + new Request.Builder() + .url(url) + .addHeader(DATADOG_META_LANG, "java") + .addHeader(DATADOG_META_LANG_VERSION, DDTraceOTInfo.JAVA_VERSION) + .addHeader(DATADOG_META_LANG_INTERPRETER, DDTraceOTInfo.JAVA_VM_NAME) + .addHeader(DATADOG_META_LANG_INTERPRETER_VENDOR, DDTraceOTInfo.JAVA_VM_VENDOR) + .addHeader(DATADOG_META_TRACER_VERSION, DDTraceOTInfo.VERSION); + + if (DDTraceOTInfo.CONTAINER_ID == null) { + return builder; + } else { + return builder.addHeader(DATADOG_CONTAINER_ID, DDTraceOTInfo.CONTAINER_ID); + } } @Override diff --git a/dd-trace-ot/src/test/groovy/datadog/opentracing/ContainerInfoTest.groovy b/dd-trace-ot/src/test/groovy/datadog/opentracing/ContainerInfoTest.groovy index e5d014e594..61190f5bc3 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/ContainerInfoTest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/ContainerInfoTest.groovy @@ -46,7 +46,7 @@ class ContainerInfoTest extends Specification { 6 | ["cpuset"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "6:cpuset:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" 5 | ["devices"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "5:devices:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" 4 | ["freezer"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "4:freezer:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" - 3 | ["net_cls", "net_prop"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "3:net_cls,net_prio:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" + 3 | ["net_cls", "net_prio"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "3:net_cls,net_prio:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" 2 | ["hugetlb"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "2:hugetlb:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" 1 | ["name=systemd"] | "/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" | "3d274242-8ee0-11e9-a8a6-1e68d864ef1a" | "1:name=systemd:/kubepods/besteffort/pod3d274242-8ee0-11e9-a8a6-1e68d864ef1a/3e74d3fd9db4c9dd921ae05c2502fb984d0cde1b36e581b13f79c639da4518a1" From d03a2a95e2f4ba0a457b022451346b9bea736e7e Mon Sep 17 00:00:00 2001 From: Laplie Anderson Date: Tue, 16 Jul 2019 19:09:00 -0400 Subject: [PATCH 5/7] Change to @Getter/@Setter to be above coverage threshold Since toString(), equals(), and hashCode() are never called, the code coverage for the classes are too low. In the future, we should ignore code coverage of lombok generated methods --- .../src/main/java/datadog/opentracing/ContainerInfo.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java b/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java index 5ec79a0b24..47c0b9894a 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java @@ -10,13 +10,15 @@ import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; /** * Parses container information from /proc/self/cgroup. Implementation based largely on * Qard/container-info */ -@Data +@Getter +@Setter public class ContainerInfo { private static final Path CGROUP_DEFAULT_PROCFILE = Paths.get("/proc/self/cgroup"); private static final String UUID_REGEX = @@ -32,7 +34,8 @@ public class ContainerInfo { public String podId; public List cGroups; - @Data + @Getter + @Setter public static class CGroupInfo { public int id; public String path; From 719bf0ad76b08dd7980d861792629aeb8e6a0637 Mon Sep 17 00:00:00 2001 From: Laplie Anderson Date: Wed, 17 Jul 2019 12:00:31 -0400 Subject: [PATCH 6/7] Remove reference to private repo --- .../test/groovy/datadog/opentracing/ContainerInfoTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-trace-ot/src/test/groovy/datadog/opentracing/ContainerInfoTest.groovy b/dd-trace-ot/src/test/groovy/datadog/opentracing/ContainerInfoTest.groovy index 61190f5bc3..051ab2c9c1 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/ContainerInfoTest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/ContainerInfoTest.groovy @@ -18,7 +18,7 @@ class ContainerInfoTest extends Specification { cGroupInfo.getContainerId() == containerId cGroupInfo.podId == podId - // Examples from DataDog/architecture/rfcs/apm/agent/containers-tagging/rfc.md and Qard/container-info + // Examples from container tagging rfc and Qard/container-info where: id | controllers | path | containerId | podId | line From 5956f51e07a2d9d44a174542e46456d361121e6d Mon Sep 17 00:00:00 2001 From: Laplie Anderson Date: Wed, 17 Jul 2019 13:01:08 -0400 Subject: [PATCH 7/7] Change container info to a singleton ContainerInfo DDTraceOTInfo wasn't the best place for container information. Changed ContainerInfo.java to have a static instance --- .../datadog/opentracing/ContainerInfo.java | 28 +++++++++++++++---- .../datadog/opentracing/DDTraceOTInfo.java | 16 ----------- .../datadog/trace/common/writer/DDApi.java | 6 ++-- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java b/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java index 47c0b9894a..455bb34969 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/ContainerInfo.java @@ -12,6 +12,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import lombok.Getter; import lombok.Setter; +import lombok.extern.slf4j.Slf4j; /** * Parses container information from /proc/self/cgroup. Implementation based largely on @@ -19,6 +20,7 @@ import lombok.Setter; */ @Getter @Setter +@Slf4j public class ContainerInfo { private static final Path CGROUP_DEFAULT_PROCFILE = Paths.get("/proc/self/cgroup"); private static final String UUID_REGEX = @@ -30,9 +32,24 @@ public class ContainerInfo { private static final Pattern CONTAINER_PATTERN = Pattern.compile("(?:.+)?(" + UUID_REGEX + "|" + CONTAINER_REGEX + ")(?:.scope)?$"); + private static final ContainerInfo INSTANCE; + public String containerId; public String podId; - public List cGroups; + public List cGroups = new ArrayList<>(); + + static { + ContainerInfo containerInfo = new ContainerInfo(); + if (ContainerInfo.isRunningInContainer()) { + try { + containerInfo = ContainerInfo.fromDefaultProcFile(); + } catch (final IOException | ParseException e) { + log.error("Unable to parse proc file"); + } + } + + INSTANCE = containerInfo; + } @Getter @Setter @@ -44,6 +61,10 @@ public class ContainerInfo { public String podId; } + public static ContainerInfo get() { + return INSTANCE; + } + public static boolean isRunningInContainer() { return Files.isReadable(CGROUP_DEFAULT_PROCFILE); } @@ -57,11 +78,10 @@ public class ContainerInfo { final ContainerInfo containerInfo = new ContainerInfo(); final String[] lines = cgroupsContent.split("\n"); - final List parsedCGroups = new ArrayList<>(); for (final String line : lines) { final CGroupInfo cGroupInfo = parseLine(line); - parsedCGroups.add(cGroupInfo); + containerInfo.getCGroups().add(cGroupInfo); if (cGroupInfo.getPodId() != null) { containerInfo.setPodId(cGroupInfo.getPodId()); @@ -72,8 +92,6 @@ public class ContainerInfo { } } - containerInfo.setCGroups(parsedCGroups); - return containerInfo; } diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/DDTraceOTInfo.java b/dd-trace-ot/src/main/java/datadog/opentracing/DDTraceOTInfo.java index 20ce98c057..28840ad8e1 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/DDTraceOTInfo.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/DDTraceOTInfo.java @@ -1,9 +1,7 @@ package datadog.opentracing; import java.io.BufferedReader; -import java.io.IOException; import java.io.InputStreamReader; -import java.text.ParseException; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -15,8 +13,6 @@ public class DDTraceOTInfo { public static final String VERSION; - public static final String CONTAINER_ID; - static { String v; try { @@ -34,18 +30,6 @@ public class DDTraceOTInfo { } VERSION = v; log.info("dd-trace - version: {}", v); - - ContainerInfo containerInfo = null; - - if (ContainerInfo.isRunningInContainer()) { - try { - containerInfo = ContainerInfo.fromDefaultProcFile(); - } catch (final IOException | ParseException e) { - log.error("Unable to parse proc file"); - } - } - - CONTAINER_ID = containerInfo == null ? null : containerInfo.getContainerId(); } public static void main(final String... args) { diff --git a/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDApi.java b/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDApi.java index d81ac79a2a..e3acc6ed5b 100644 --- a/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDApi.java +++ b/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDApi.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import datadog.opentracing.ContainerInfo; import datadog.opentracing.DDSpan; import datadog.opentracing.DDTraceOTInfo; import datadog.trace.common.writer.unixdomainsockets.UnixDomainSocketFactory; @@ -271,10 +272,11 @@ public class DDApi { .addHeader(DATADOG_META_LANG_INTERPRETER_VENDOR, DDTraceOTInfo.JAVA_VM_VENDOR) .addHeader(DATADOG_META_TRACER_VERSION, DDTraceOTInfo.VERSION); - if (DDTraceOTInfo.CONTAINER_ID == null) { + final String containerId = ContainerInfo.get().getContainerId(); + if (containerId == null) { return builder; } else { - return builder.addHeader(DATADOG_CONTAINER_ID, DDTraceOTInfo.CONTAINER_ID); + return builder.addHeader(DATADOG_CONTAINER_ID, containerId); } }