Skip to content

Commit ddcbcbb

Browse files
authored
Ddd dynamodb payload tagging (#5224)
* add dynamodb payload tagging * add tests for ddb payload tagging * lint and remove version dependent checks
1 parent 9f5b7c4 commit ddcbcbb

File tree

3 files changed

+158
-1
lines changed

3 files changed

+158
-1
lines changed

packages/datadog-plugin-aws-sdk/src/services/dynamodb.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const { extractPrimaryKeys, generatePointerHash } = require('../util')
88
class DynamoDb extends BaseAwsSdkPlugin {
99
static get id () { return 'dynamodb' }
1010
static get peerServicePrecursors () { return ['tablename'] }
11+
static get isPayloadReporter () { return true }
1112

1213
generateTags (params, operation, response) {
1314
const tags = {}

packages/datadog-plugin-aws-sdk/test/dynamodb.spec.js

Lines changed: 149 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,25 @@ describe('Plugin', () => {
4040
})
4141

4242
before(async () => {
43+
await agent.load('aws-sdk')
44+
await agent.close({ ritmReset: false, wipe: true })
45+
await agent.load(
46+
'aws-sdk',
47+
{},
48+
{
49+
cloudPayloadTagging: {
50+
requestsEnabled: true,
51+
responsesEnabled: true,
52+
request: '$.Item.name',
53+
response: '$.Attributes,$.Item.data',
54+
maxDepth: 5
55+
}
56+
}
57+
)
4358
AWS = require(`../../../versions/${dynamoClientName}@${version}`).get()
4459
dynamo = new AWS.DynamoDB({ endpoint: 'http://127.0.0.1:4566', region: 'us-east-1' })
4560

46-
const deleteTable = async (tableName) => {
61+
const deleteTable = async tableName => {
4762
if (dynamoClientName === '@aws-sdk/client-dynamodb') {
4863
try {
4964
await dynamo.deleteTable({ TableName: tableName })
@@ -125,6 +140,139 @@ describe('Plugin', () => {
125140
return agent.close({ ritmReset: false })
126141
})
127142

143+
describe('with payload tagging', () => {
144+
it('adds request and response payloads as flattened tags for putItem', done => {
145+
agent
146+
.use(traces => {
147+
const span = traces[0][0]
148+
149+
expect(span.resource).to.equal(`putItem ${oneKeyTableName}`)
150+
expect(span.meta).to.include({
151+
'aws.dynamodb.table_name': oneKeyTableName,
152+
aws_service: 'DynamoDB',
153+
region: 'us-east-1',
154+
'aws.request.body.TableName': oneKeyTableName,
155+
'aws.request.body.Item.name': 'redacted',
156+
'aws.request.body.Item.data.S': 'test-data'
157+
})
158+
})
159+
.then(done, done)
160+
161+
dynamo.putItem(
162+
{
163+
TableName: oneKeyTableName,
164+
Item: {
165+
name: { S: 'test-name' },
166+
data: { S: 'test-data' }
167+
}
168+
},
169+
e => e && done(e)
170+
)
171+
})
172+
173+
it('adds request and response payloads as flattened tags for updateItem', (done) => {
174+
agent
175+
.use((traces) => {
176+
const span = traces[0][0]
177+
178+
expect(span.resource).to.equal(`updateItem ${oneKeyTableName}`)
179+
expect(span.meta).to.include({
180+
'aws.dynamodb.table_name': oneKeyTableName,
181+
aws_service: 'DynamoDB',
182+
region: 'us-east-1',
183+
'aws.request.body.TableName': oneKeyTableName,
184+
'aws.request.body.Key.name.S': 'test-name',
185+
'aws.request.body.AttributeUpdates.data.Value.S': 'updated-data'
186+
})
187+
})
188+
.then(done, done)
189+
190+
dynamo.updateItem(
191+
{
192+
TableName: oneKeyTableName,
193+
Key: {
194+
name: { S: 'test-name' }
195+
},
196+
AttributeUpdates: {
197+
data: {
198+
Action: 'PUT',
199+
Value: { S: 'updated-data' }
200+
}
201+
}
202+
},
203+
(e) => e && done(e)
204+
)
205+
})
206+
207+
it('adds request and response payloads as flattened tags for deleteItem', (done) => {
208+
agent
209+
.use((traces) => {
210+
const span = traces[0][0]
211+
212+
expect(span.resource).to.equal(`deleteItem ${oneKeyTableName}`)
213+
expect(span.meta).to.include({
214+
'aws.dynamodb.table_name': oneKeyTableName,
215+
aws_service: 'DynamoDB',
216+
region: 'us-east-1',
217+
'aws.request.body.TableName': oneKeyTableName,
218+
'aws.request.body.Key.name.S': 'test-name'
219+
})
220+
})
221+
.then(done, done)
222+
223+
dynamo.deleteItem(
224+
{
225+
TableName: oneKeyTableName,
226+
Key: {
227+
name: { S: 'test-name' }
228+
}
229+
},
230+
(e) => e && done(e)
231+
)
232+
})
233+
234+
it('adds request and response payloads as flattened tags for getItem', (done) => {
235+
dynamo.putItem({
236+
TableName: oneKeyTableName,
237+
Item: {
238+
name: { S: 'test-get-name' },
239+
data: { S: 'test-get-data' }
240+
}
241+
}, (putErr) => {
242+
if (putErr) return done(putErr)
243+
244+
setTimeout(() => {
245+
agent
246+
.use((traces) => {
247+
const span = traces[0][0]
248+
249+
expect(span.resource).to.equal(`getItem ${oneKeyTableName}`)
250+
expect(span.meta).to.include({
251+
'aws.dynamodb.table_name': oneKeyTableName,
252+
aws_service: 'DynamoDB',
253+
region: 'us-east-1',
254+
'aws.request.body.TableName': oneKeyTableName,
255+
'aws.request.body.Key.name.S': 'test-get-name',
256+
'aws.response.body.Item.name.S': 'test-get-name',
257+
'aws.response.body.Item.data': 'redacted'
258+
})
259+
})
260+
.then(done, done)
261+
262+
dynamo.getItem(
263+
{
264+
TableName: oneKeyTableName,
265+
Key: {
266+
name: { S: 'test-get-name' }
267+
}
268+
},
269+
(e) => e && done(e)
270+
)
271+
}, 100) // Small delay to ensure put completes
272+
})
273+
})
274+
})
275+
128276
describe('span pointers', () => {
129277
beforeEach(() => {
130278
DynamoDb.dynamoPrimaryKeyConfig = null

packages/dd-trace/src/payload-tagging/config/aws.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,5 +94,13 @@
9494
],
9595
"expand": [
9696
]
97+
},
98+
"dynamodb": {
99+
"request": [
100+
],
101+
"response": [
102+
],
103+
"expand": [
104+
]
97105
}
98106
}

0 commit comments

Comments
 (0)