Skip to content

Commit 762e2cf

Browse files
authored
add sdk.event to communicate a login or custom event (#5462)
* add sdk.event to communicate a login or custom event * change sdk version to v1
1 parent 50b5354 commit 762e2cf

File tree

5 files changed

+56
-3
lines changed

5 files changed

+56
-3
lines changed

packages/dd-trace/src/appsec/sdk/track_event.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const waf = require('../waf')
77
const { keepTrace } = require('../../priority_sampler')
88
const addresses = require('../addresses')
99
const { ASM } = require('../../standalone/product')
10+
const { incrementSdkEventMetric } = require('../telemetry')
1011

1112
function trackUserLoginSuccessEvent (tracer, user, metadata) {
1213
// TODO: better user check here and in _setUser() ?
@@ -15,6 +16,8 @@ function trackUserLoginSuccessEvent (tracer, user, metadata) {
1516
return
1617
}
1718

19+
incrementSdkEventMetric('login_success')
20+
1821
const rootSpan = getRootSpan(tracer)
1922
if (!rootSpan) {
2023
log.warn('[ASM] Root span not available in trackUserLoginSuccessEvent')
@@ -48,6 +51,8 @@ function trackUserLoginFailureEvent (tracer, userId, exists, metadata) {
4851
trackEvent('users.login.failure', fields, 'trackUserLoginFailureEvent', getRootSpan(tracer))
4952

5053
runWaf('users.login.failure', { login: userId })
54+
55+
incrementSdkEventMetric('login_failure')
5156
}
5257

5358
function trackCustomEvent (tracer, eventName, metadata) {
@@ -57,6 +62,8 @@ function trackCustomEvent (tracer, eventName, metadata) {
5762
}
5863

5964
trackEvent(eventName, metadata, 'trackCustomEvent', getRootSpan(tracer))
65+
66+
incrementSdkEventMetric('custom')
6067
}
6168

6269
function trackEvent (eventName, fields, sdkMethodName, rootSpan) {

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
const { DD_TELEMETRY_REQUEST_METRICS } = require('./common')
44
const { addRaspRequestMetrics, trackRaspMetrics } = require('./rasp')
5-
const { incrementMissingUserId, incrementMissingUserLogin } = require('./user')
5+
const { incrementMissingUserId, incrementMissingUserLogin, incrementSdkEvent } = require('./user')
66
const {
77
addWafRequestMetrics,
88
trackWafMetrics,
@@ -121,6 +121,12 @@ function incrementMissingUserIdMetric (framework, eventType) {
121121
incrementMissingUserId(framework, eventType)
122122
}
123123

124+
function incrementSdkEventMetric (framework, eventType) {
125+
if (!enabled) return
126+
127+
incrementSdkEvent(framework, eventType)
128+
}
129+
124130
function getRequestMetrics (req) {
125131
if (req) {
126132
const store = getStore(req)
@@ -141,6 +147,7 @@ module.exports = {
141147
incrementWafRequestsMetric,
142148
incrementMissingUserLoginMetric,
143149
incrementMissingUserIdMetric,
150+
incrementSdkEventMetric,
144151

145152
getRequestMetrics
146153
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,15 @@ function incrementMissingUserId (framework, eventType) {
1818
}).inc()
1919
}
2020

21+
function incrementSdkEvent (eventType) {
22+
appsecMetrics.count('sdk.event', {
23+
event_type: eventType,
24+
sdk_version: 'v1'
25+
}).inc()
26+
}
27+
2128
module.exports = {
2229
incrementMissingUserLogin,
23-
incrementMissingUserId
30+
incrementMissingUserId,
31+
incrementSdkEvent
2432
}

packages/dd-trace/test/appsec/sdk/track_event.spec.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ describe('track_event', () => {
1717
let getRootSpan
1818
let setUserTags
1919
let waf
20+
let telemetry
2021
let trackUserLoginSuccessEvent, trackUserLoginFailureEvent, trackCustomEvent
2122

2223
beforeEach(() => {
@@ -42,6 +43,10 @@ describe('track_event', () => {
4243
run: sinon.spy()
4344
}
4445

46+
telemetry = {
47+
incrementSdkEventMetric: sinon.stub()
48+
}
49+
4550
const trackEvents = proxyquire('../../../src/appsec/sdk/track_event', {
4651
'../../log': log,
4752
'./utils': {
@@ -50,7 +55,8 @@ describe('track_event', () => {
5055
'./set_user': {
5156
setUserTags
5257
},
53-
'../waf': waf
58+
'../waf': waf,
59+
'../telemetry': telemetry
5460
})
5561

5662
trackUserLoginSuccessEvent = trackEvents.trackUserLoginSuccessEvent
@@ -70,6 +76,7 @@ describe('track_event', () => {
7076
.to.have.been.calledWithExactly('[ASM] Invalid user provided to trackUserLoginSuccessEvent')
7177
expect(setUserTags).to.not.have.been.called
7278
expect(rootSpan.addTags).to.not.have.been.called
79+
expect(telemetry.incrementSdkEventMetric).to.not.have.been.called
7380
})
7481

7582
it('should log warning when root span is not available', () => {
@@ -80,6 +87,7 @@ describe('track_event', () => {
8087
expect(log.warn)
8188
.to.have.been.calledOnceWithExactly('[ASM] Root span not available in trackUserLoginSuccessEvent')
8289
expect(setUserTags).to.not.have.been.called
90+
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('login_success')
8391
})
8492

8593
it('should call setUser and addTags with metadata', () => {
@@ -111,6 +119,7 @@ describe('track_event', () => {
111119
[USER_LOGIN]: 'user_id'
112120
}
113121
})
122+
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('login_success')
114123
})
115124

116125
it('should call setUser and addTags without metadata', () => {
@@ -134,6 +143,7 @@ describe('track_event', () => {
134143
[USER_LOGIN]: 'user_id'
135144
}
136145
})
146+
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('login_success')
137147
})
138148

139149
it('should call waf with user login', () => {
@@ -157,6 +167,7 @@ describe('track_event', () => {
157167
[USER_LOGIN]: 'user_login'
158168
}
159169
})
170+
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('login_success')
160171
})
161172
})
162173

@@ -172,6 +183,7 @@ describe('track_event', () => {
172183
.to.have.been.calledWithExactly('[ASM] Invalid userId provided to trackUserLoginFailureEvent')
173184
expect(setUserTags).to.not.have.been.called
174185
expect(rootSpan.addTags).to.not.have.been.called
186+
expect(telemetry.incrementSdkEventMetric).to.not.have.been.called
175187
})
176188

177189
it('should log warning when root span is not available', () => {
@@ -182,6 +194,7 @@ describe('track_event', () => {
182194
expect(log.warn)
183195
.to.have.been.calledOnceWithExactly('[ASM] Root span not available in %s', 'trackUserLoginFailureEvent')
184196
expect(setUserTags).to.not.have.been.called
197+
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('login_failure')
185198
})
186199

187200
it('should call addTags with metadata', () => {
@@ -211,6 +224,7 @@ describe('track_event', () => {
211224
[USER_LOGIN]: 'user_id'
212225
}
213226
})
227+
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('login_failure')
214228
})
215229

216230
it('should send false `usr.exists` property when the user does not exist', () => {
@@ -240,6 +254,7 @@ describe('track_event', () => {
240254
[USER_LOGIN]: 'user_id'
241255
}
242256
})
257+
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('login_failure')
243258
})
244259

245260
it('should call addTags without metadata', () => {
@@ -262,6 +277,7 @@ describe('track_event', () => {
262277
[USER_LOGIN]: 'user_id'
263278
}
264279
})
280+
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('login_failure')
265281
})
266282
})
267283

@@ -277,6 +293,7 @@ describe('track_event', () => {
277293
.to.have.been.calledWithExactly('[ASM] Invalid eventName provided to trackCustomEvent')
278294
expect(setUserTags).to.not.have.been.called
279295
expect(rootSpan.addTags).to.not.have.been.called
296+
expect(telemetry.incrementSdkEventMetric).to.not.have.been.called
280297
})
281298

282299
it('should log warning when root span is not available', () => {
@@ -287,6 +304,7 @@ describe('track_event', () => {
287304
expect(log.warn)
288305
.to.have.been.calledOnceWithExactly('[ASM] Root span not available in %s', 'trackCustomEvent')
289306
expect(setUserTags).to.not.have.been.called
307+
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('custom')
290308
})
291309

292310
it('should call addTags with metadata', () => {
@@ -305,6 +323,7 @@ describe('track_event', () => {
305323
})
306324
expect(prioritySampler.setPriority)
307325
.to.have.been.calledOnceWithExactly(rootSpan, USER_KEEP, ASM)
326+
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('custom')
308327
})
309328

310329
it('should call addTags without metadata', () => {
@@ -318,6 +337,7 @@ describe('track_event', () => {
318337
})
319338
expect(prioritySampler.setPriority)
320339
.to.have.been.calledOnceWithExactly(rootSpan, USER_KEEP, ASM)
340+
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('custom')
321341
})
322342
})
323343
})

packages/dd-trace/test/appsec/telemetry/user.spec.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,16 @@ describe('Appsec User Telemetry metrics', () => {
4949
})
5050
})
5151
})
52+
53+
describe('incrementSdkEventMetric', () => {
54+
it('should increment sdk.event metric', () => {
55+
appsecTelemetry.incrementSdkEventMetric('login_success')
56+
57+
expect(count).to.have.been.calledOnceWithExactly('sdk.event', {
58+
event_type: 'login_success',
59+
sdk_version: 'v1'
60+
})
61+
})
62+
})
5263
})
5364
})

0 commit comments

Comments
 (0)