Skip to content

Commit 8d6b823

Browse files
fix: Support for inode when /proc/self/cgroup is a multiline string (#5683)
* Refactor docker code for simplicity --------- Co-authored-by: Andre Caron <andre.l.caron@gmail.com>
1 parent edde8b5 commit 8d6b823

File tree

2 files changed

+37
-39
lines changed

2 files changed

+37
-39
lines changed

packages/dd-trace/src/exporters/common/docker.js

+13-31
Original file line numberDiff line numberDiff line change
@@ -10,43 +10,25 @@ const uuidSource =
1010
'[0-9a-f]{8}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{12}|[0-9a-f]{8}(?:-[0-9a-f]{4}){4}$'
1111
const containerSource = '[0-9a-f]{64}'
1212
const taskSource = '[0-9a-f]{32}-\\d+'
13-
const lineReg = /^(\d+):([^:]*):(.+)$/
13+
const lineReg = /^(\d+):([^:]*):(.+)$/m
1414
const entityReg = new RegExp(`.*(${uuidSource}|${containerSource}|${taskSource})(?:\\.scope)?$`, 'm')
1515

16-
const cgroup = readControlGroup()
17-
const entityId = getEntityId()
18-
const inode = getInode()
16+
let inode = 0
17+
let cgroup = ''
18+
let entityId
1919

20-
function getEntityId () {
21-
const match = cgroup.match(entityReg) || []
20+
try {
21+
cgroup = fs.readFileSync('/proc/self/cgroup', 'utf8').trim()
22+
entityId = cgroup.match(entityReg)?.[1]
23+
} catch { /* Ignore error */ }
2224

23-
return match[1]
24-
}
25-
26-
function getInode () {
27-
const match = cgroup.match(lineReg) || []
28-
29-
return readInode(match[3])
30-
}
25+
const inodePath = cgroup.match(lineReg)?.[3]
26+
if (inodePath) {
27+
const strippedPath = inodePath.replace(/^\/|\/$/g, '')
3128

32-
function readControlGroup () {
3329
try {
34-
return fs.readFileSync('/proc/self/cgroup').toString().trim()
35-
} catch (err) {
36-
return ''
37-
}
38-
}
39-
40-
function readInode (path) {
41-
if (!path) return 0
42-
43-
const strippedPath = path.replace(/^\//, '').replace(/\/$/, '')
44-
45-
try {
46-
return fs.statSync(`/sys/fs/cgroup/${strippedPath}`).ino
47-
} catch (err) {
48-
return 0
49-
}
30+
inode = fs.statSync(`/sys/fs/cgroup/${strippedPath}`).ino
31+
} catch { /* Ignore error */ }
5032
}
5133

5234
module.exports = {

packages/dd-trace/test/exporters/common/docker.spec.js

+24-8
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ describe('docker', () => {
3535
`1:name=systemd:/docker/${id}`
3636
].join('\n')
3737

38-
fs.readFileSync.withArgs('/proc/self/cgroup').returns(Buffer.from(cgroup))
38+
fs.readFileSync.withArgs('/proc/self/cgroup', 'utf8').returns(cgroup)
3939
docker = proxyquire('../src/exporters/common/docker', { fs })
4040
docker.inject(carrier)
4141

@@ -49,7 +49,7 @@ describe('docker', () => {
4949
`1:name=systemd:/uuid/${id}`
5050
].join('\n')
5151

52-
fs.readFileSync.withArgs('/proc/self/cgroup').returns(Buffer.from(cgroup))
52+
fs.readFileSync.withArgs('/proc/self/cgroup', 'utf8').returns(cgroup)
5353
docker = proxyquire('../src/exporters/common/docker', { fs })
5454
docker.inject(carrier)
5555

@@ -63,7 +63,7 @@ describe('docker', () => {
6363
`1:name=systemd:/ecs/${id}`
6464
].join('\n')
6565

66-
fs.readFileSync.withArgs('/proc/self/cgroup').returns(Buffer.from(cgroup))
66+
fs.readFileSync.withArgs('/proc/self/cgroup', 'utf8').returns(cgroup)
6767
docker = proxyquire('../src/exporters/common/docker', { fs })
6868
docker.inject(carrier)
6969

@@ -77,7 +77,7 @@ describe('docker', () => {
7777
`1:name=systemd:/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod2d3da189_6407_48e3_9ab6_78188d75e609.slice/docker-${id}.scope` // eslint-disable-line @stylistic/js/max-len
7878
].join('\n')
7979

80-
fs.readFileSync.withArgs('/proc/self/cgroup').returns(Buffer.from(cgroup))
80+
fs.readFileSync.withArgs('/proc/self/cgroup', 'utf8').returns(cgroup)
8181
docker = proxyquire('../src/exporters/common/docker', { fs })
8282
docker.inject(carrier)
8383

@@ -93,7 +93,7 @@ describe('docker', () => {
9393
'3:cpu:/invalid'
9494
].join('\n')
9595

96-
fs.readFileSync.withArgs('/proc/self/cgroup').returns(Buffer.from(cgroup))
96+
fs.readFileSync.withArgs('/proc/self/cgroup', 'utf8').returns(cgroup)
9797
docker = proxyquire('../src/exporters/common/docker', { fs })
9898
docker.inject(carrier)
9999

@@ -107,7 +107,7 @@ describe('docker', () => {
107107
`0::/docker/${id}`
108108
].join('\n')
109109

110-
fs.readFileSync.withArgs('/proc/self/cgroup').returns(Buffer.from(cgroup))
110+
fs.readFileSync.withArgs('/proc/self/cgroup', 'utf8').returns(cgroup)
111111
docker = proxyquire('../src/exporters/common/docker', { fs })
112112
docker.inject(carrier)
113113

@@ -121,7 +121,7 @@ describe('docker', () => {
121121
`1:name=systemd:/system.slice/garden.service/garden/${id}`
122122
].join('\n')
123123

124-
fs.readFileSync.withArgs('/proc/self/cgroup').returns(Buffer.from(cgroup))
124+
fs.readFileSync.withArgs('/proc/self/cgroup', 'utf8').returns(cgroup)
125125
docker = proxyquire('../src/exporters/common/docker', { fs })
126126
docker.inject(carrier)
127127

@@ -135,7 +135,7 @@ describe('docker', () => {
135135
'1:name=systemd:/system.slice/garden.service/garden/'
136136
].join('\n')
137137

138-
fs.readFileSync.withArgs('/proc/self/cgroup').returns(Buffer.from(cgroup))
138+
fs.readFileSync.withArgs('/proc/self/cgroup', 'utf8').returns(cgroup)
139139
fs.statSync.withArgs('/sys/fs/cgroup/system.slice/garden.service/garden').returns({ ino })
140140
docker = proxyquire('../src/exporters/common/docker', { fs })
141141
docker.inject(carrier)
@@ -144,6 +144,22 @@ describe('docker', () => {
144144
expect(carrier['Datadog-Entity-ID']).to.equal(`in-${ino}`)
145145
})
146146

147+
it('should support inode when the ID is not available (any line)', () => {
148+
const ino = 1234
149+
const cgroup = [
150+
'1:name=systemd:/',
151+
'0::/'
152+
].join('\n')
153+
154+
fs.readFileSync.withArgs('/proc/self/cgroup', 'utf8').returns(cgroup)
155+
fs.statSync.withArgs('/sys/fs/cgroup/').returns({ ino })
156+
docker = proxyquire('../src/exporters/common/docker', { fs })
157+
docker.inject(carrier)
158+
159+
expect(carrier['Datadog-Container-Id']).to.be.undefined
160+
expect(carrier['Datadog-Entity-ID']).to.equal(`in-${ino}`)
161+
})
162+
147163
it('should support external env', () => {
148164
process.env.DD_EXTERNAL_ENV = 'test'
149165

0 commit comments

Comments
 (0)