Skip to content

Commit 372327a

Browse files
committed
Extract rewriter telemetry to another module
1 parent b23fe67 commit 372327a

File tree

6 files changed

+138
-115
lines changed

6 files changed

+138
-115
lines changed

packages/dd-trace/src/appsec/iast/taint-tracking/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const taintTrackingPlugin = require('./plugin')
66

77
module.exports = {
88
enableTaintTracking (telemetryVerbosity) {
9-
enableRewriter()
9+
enableRewriter(telemetryVerbosity)
1010
enableTaintOperations(telemetryVerbosity)
1111
taintTrackingPlugin.enable()
1212
},
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
'use strict'
2+
3+
const telemetry = require('../../telemetry')
4+
const { Verbosity } = require('../../telemetry/verbosity')
5+
const { IastMetric, PropagationType } = require('../iast-metric')
6+
7+
const telemetryRewriter = {
8+
off (content, filename, rewriter) {
9+
return rewriter.rewrite(content, filename)
10+
},
11+
12+
information (content, filename, rewriter) {
13+
const response = this.off(content, filename, rewriter)
14+
15+
const metrics = response.metrics
16+
if (metrics && metrics.instrumentedPropagation) {
17+
telemetry.add(IastMetric.INSTRUMENTED_PROPAGATION, metrics.instrumentedPropagation, PropagationType.STRING)
18+
}
19+
20+
return response
21+
},
22+
23+
debug (content, filename, rewriter) {
24+
const start = process.hrtime.bigint()
25+
const response = this.information(content, filename, rewriter)
26+
27+
// TODO: propagationDebug!
28+
const metrics = response.metrics
29+
if (metrics && metrics.propagationDebug) {
30+
// debug metrics are using logs telemetry API instead metrics telemetry API
31+
}
32+
33+
const rewriteTime = parseInt(process.hrtime.bigint() - start) * 1e-6
34+
telemetry.add(IastMetric.INSTRUMENTATION_TIME, rewriteTime)
35+
return response
36+
}
37+
}
38+
39+
function getRewriteFunction (rewriter) {
40+
switch (telemetry.verbosity) {
41+
case Verbosity.OFF:
42+
return (content, filename) => telemetryRewriter.off(content, filename, rewriter)
43+
case Verbosity.DEBUG:
44+
return (content, filename) => telemetryRewriter.debug(content, filename, rewriter)
45+
default:
46+
return (content, filename) => telemetryRewriter.information(content, filename, rewriter)
47+
}
48+
}
49+
50+
module.exports = { getRewriteFunction }

packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js

Lines changed: 8 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,18 @@ const shimmer = require('../../../../../datadog-shimmer')
55
const iastLog = require('../iast-log')
66
const { isPrivateModule, isNotLibraryFile } = require('./filter')
77
const { csiMethods } = require('./csi-methods')
8-
const telemetry = require('../../telemetry')
9-
const { Verbosity } = require('../../telemetry/verbosity')
10-
const { IastMetric, PropagationType } = require('../iast-metric')
8+
const { getName } = require('../../telemetry/verbosity')
9+
const { getRewriteFunction } = require('./rewriter-telemetry')
1110

1211
let rewriter
1312
let getPrepareStackTrace
14-
function getRewriter () {
13+
function getRewriter (telemetryVerbosity) {
1514
if (!rewriter) {
1615
try {
1716
const iastRewriter = require('@datadog/native-iast-rewriter')
1817
const Rewriter = iastRewriter.Rewriter
1918
getPrepareStackTrace = iastRewriter.getPrepareStackTrace
20-
rewriter = new Rewriter({ csiMethods, telemetryVerbosity: telemetry.getVerbosityName() })
19+
rewriter = new Rewriter({ csiMethods, telemetryVerbosity: getName(telemetryVerbosity) })
2120
} catch (e) {
2221
iastLog.error('Unable to initialize TaintTracking Rewriter')
2322
.errorAndPublish(e)
@@ -41,51 +40,8 @@ function getPrepareStackTraceAccessor () {
4140
}
4241
}
4342

44-
const telemetryOffRewrite = function (content, filename) {
45-
if (isPrivateModule(filename) && isNotLibraryFile(filename)) {
46-
return rewriter.rewrite(content, filename)
47-
}
48-
}
49-
50-
const telemetryInformationRewrite = function (content, filename) {
51-
const response = telemetryOffRewrite(content, filename)
52-
53-
const metrics = response.metrics
54-
if (metrics && metrics.instrumentedPropagation) {
55-
telemetry.add(IastMetric.INSTRUMENTED_PROPAGATION, metrics.instrumentedPropagation, PropagationType.STRING)
56-
}
57-
58-
return response
59-
}
60-
61-
const telemetryDebugRewrite = function (content, filename) {
62-
const start = process.hrtime.bigint()
63-
const response = telemetryInformationRewrite(content, filename)
64-
65-
// TODO: propagationDebug!
66-
const metrics = response.metrics
67-
if (metrics && metrics.propagationDebug) {
68-
// debug metrics are using logs telemetry API instead metrics telemetry API
69-
}
70-
71-
const rewriteTime = parseInt(process.hrtime.bigint() - start) * 1e-6
72-
telemetry.add(IastMetric.INSTRUMENTATION_TIME, rewriteTime)
73-
return response
74-
}
75-
76-
function getRewriteFunction () {
77-
switch (telemetry.verbosity) {
78-
case Verbosity.OFF:
79-
return telemetryOffRewrite
80-
case Verbosity.DEBUG:
81-
return telemetryDebugRewrite
82-
default:
83-
return telemetryInformationRewrite
84-
}
85-
}
86-
8743
function getCompileMethodFn (compileMethod) {
88-
const rewriteFn = getRewriteFunction()
44+
const rewriteFn = getRewriteFunction(rewriter)
8945
return function (content, filename) {
9046
try {
9147
if (isPrivateModule(filename) && isNotLibraryFile(filename)) {
@@ -102,9 +58,9 @@ function getCompileMethodFn (compileMethod) {
10258
}
10359
}
10460

105-
function enableRewriter () {
61+
function enableRewriter (telemetryVerbosity) {
10662
try {
107-
const rewriter = getRewriter()
63+
const rewriter = getRewriter(telemetryVerbosity)
10864
if (rewriter) {
10965
const pstDescriptor = Object.getOwnPropertyDescriptor(global.Error, 'prepareStackTrace')
11066
if (!pstDescriptor || pstDescriptor.configurable) {
@@ -124,5 +80,5 @@ function disableRewriter () {
12480
}
12581

12682
module.exports = {
127-
enableRewriter, disableRewriter, getRewriteFunction
83+
enableRewriter, disableRewriter
12884
}

packages/dd-trace/src/appsec/telemetry/index.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
const logs = require('./api/logs-plugin')
44
const metrics = require('./api/metrics-plugin')
5-
const { Verbosity, isDebugAllowed, isInfoAllowed, parseVerbosity, getName } = require('./verbosity')
5+
const { Verbosity, isDebugAllowed, isInfoAllowed, parseVerbosity } = require('./verbosity')
66
const {
77
add,
88
drain,
@@ -46,10 +46,6 @@ class Telemetry {
4646
return this.isEnabled() && isInfoAllowed(this.verbosity)
4747
}
4848

49-
getVerbosityName () {
50-
return getName(this.verbosity)
51-
}
52-
5349
increase (metric, tag, context) {
5450
add(metric, 1, tag, context)
5551
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
'use strict'
2+
const { expect } = require('chai')
3+
const proxyquire = require('proxyquire')
4+
5+
const { IastMetric, PropagationType } = require('../../../../src/appsec/iast/iast-metric')
6+
const { Verbosity } = require('../../../../src/appsec/telemetry/verbosity')
7+
8+
describe('rewriter telemetry', () => {
9+
let telemetry, rewriter, getRewriteFunction
10+
11+
beforeEach(() => {
12+
telemetry = {
13+
add: sinon.spy()
14+
}
15+
const rewriterTelemetry = proxyquire('../../../../src/appsec/iast/taint-tracking/rewriter-telemetry', {
16+
'../../telemetry': telemetry
17+
})
18+
getRewriteFunction = rewriterTelemetry.getRewriteFunction
19+
rewriter = {
20+
rewrite: (content) => {
21+
return {
22+
content: content + 'rewritten',
23+
metrics: {
24+
instrumentedPropagation: 2
25+
}
26+
}
27+
}
28+
}
29+
})
30+
31+
it('should not increase any metrics with OFF verbosity', () => {
32+
telemetry.verbosity = Verbosity.OFF
33+
34+
const rewriteFn = getRewriteFunction(rewriter)
35+
rewriteFn('const a = b + c', 'test.js')
36+
37+
expect(telemetry.add).to.not.be.called
38+
})
39+
40+
it('should increase information metrics with MANDATORY verbosity', () => {
41+
telemetry.verbosity = Verbosity.MANDATORY
42+
43+
const rewriteFn = getRewriteFunction(rewriter)
44+
const result = rewriteFn('const a = b + c', 'test.js')
45+
46+
expect(telemetry.add).to.be.calledOnceWith(IastMetric.INSTRUMENTED_PROPAGATION,
47+
result.metrics.instrumentedPropagation,
48+
PropagationType.STRING)
49+
})
50+
51+
it('should increase information metrics with INFORMATION verbosity', () => {
52+
telemetry.verbosity = Verbosity.INFORMATION
53+
54+
const rewriteFn = getRewriteFunction(rewriter)
55+
const result = rewriteFn('const a = b + c', 'test.js')
56+
57+
expect(telemetry.add).to.be.calledOnceWith(IastMetric.INSTRUMENTED_PROPAGATION,
58+
result.metrics.instrumentedPropagation,
59+
PropagationType.STRING)
60+
})
61+
62+
it('should increase debug metrics with DEBUG verbosity', () => {
63+
telemetry.verbosity = Verbosity.DEBUG
64+
65+
const rewriteFn = getRewriteFunction(rewriter)
66+
const result = rewriteFn('const a = b + c', 'test.js')
67+
68+
expect(telemetry.add).to.be.calledTwice
69+
const instrumentedPropagation = telemetry.add.getCall(0).args
70+
expect(instrumentedPropagation).to.be.deep.eq([IastMetric.INSTRUMENTED_PROPAGATION,
71+
result.metrics.instrumentedPropagation,
72+
PropagationType.STRING])
73+
74+
const instrumentationTime = telemetry.add.getCall(1).args
75+
expect(instrumentationTime[0]).to.be.eq(IastMetric.INSTRUMENTATION_TIME)
76+
})
77+
})

packages/dd-trace/test/appsec/iast/taint-tracking/rewriter.spec.js

Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
const { expect } = require('chai')
44
const proxyquire = require('proxyquire')
5-
const { IastMetric, PropagationType } = require('../../../../src/appsec/iast/iast-metric')
6-
const { Verbosity } = require('../../../../src/appsec/telemetry/verbosity')
75

86
describe('IAST Rewriter', () => {
97
it('Addon should return a rewritter instance', () => {
@@ -35,8 +33,7 @@ describe('IAST Rewriter', () => {
3533

3634
beforeEach(() => {
3735
telemetry = {
38-
add: sinon.spy(),
39-
getVerbosityName: () => 'OFF'
36+
add: sinon.spy()
4037
}
4138
rewriter = proxyquire('../../../../src/appsec/iast/taint-tracking/rewriter', {
4239
'@datadog/native-iast-rewriter': { Rewriter, getPrepareStackTrace: function () {} },
@@ -60,58 +57,5 @@ describe('IAST Rewriter', () => {
6057
expect(shimmer.unwrap).to.be.calledOnce
6158
expect(shimmer.unwrap.getCall(0).args[1]).eq('_compile')
6259
})
63-
64-
describe('telemetry', () => {
65-
it('should not increase any metrics with OFF verbosity', () => {
66-
telemetry.verbosity = Verbosity.OFF
67-
68-
rewriter.enableRewriter()
69-
const rewriteFn = rewriter.getRewriteFunction()
70-
rewriteFn('const a = b + c', 'test.js')
71-
72-
expect(telemetry.add).to.not.be.called
73-
})
74-
75-
it('should increase information metrics with MANDATORY verbosity', () => {
76-
telemetry.verbosity = Verbosity.MANDATORY
77-
78-
rewriter.enableRewriter()
79-
const rewriteFn = rewriter.getRewriteFunction()
80-
const result = rewriteFn('const a = b + c', 'test.js')
81-
82-
expect(telemetry.add).to.be.calledOnceWith(IastMetric.INSTRUMENTED_PROPAGATION,
83-
result.metrics.instrumentedPropagation,
84-
PropagationType.STRING)
85-
})
86-
87-
it('should increase information metrics with INFORMATION verbosity', () => {
88-
telemetry.verbosity = Verbosity.INFORMATION
89-
90-
rewriter.enableRewriter()
91-
const rewriteFn = rewriter.getRewriteFunction()
92-
const result = rewriteFn('const a = b + c', 'test.js')
93-
94-
expect(telemetry.add).to.be.calledOnceWith(IastMetric.INSTRUMENTED_PROPAGATION,
95-
result.metrics.instrumentedPropagation,
96-
PropagationType.STRING)
97-
})
98-
99-
it('should increase debug metrics with DEBUG verbosity', () => {
100-
telemetry.verbosity = Verbosity.DEBUG
101-
102-
rewriter.enableRewriter()
103-
const rewriteFn = rewriter.getRewriteFunction()
104-
const result = rewriteFn('const a = b + c', 'test.js')
105-
106-
expect(telemetry.add).to.be.calledTwice
107-
const instrumentedPropagation = telemetry.add.getCall(0).args
108-
expect(instrumentedPropagation).to.be.deep.eq([IastMetric.INSTRUMENTED_PROPAGATION,
109-
result.metrics.instrumentedPropagation,
110-
PropagationType.STRING])
111-
112-
const instrumentationTime = telemetry.add.getCall(1).args
113-
expect(instrumentationTime[0]).to.be.eq(IastMetric.INSTRUMENTATION_TIME)
114-
})
115-
})
11660
})
11761
})

0 commit comments

Comments
 (0)