Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions packages/dd-trace/src/appsec/sdk/track_event.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ const waf = require('../waf')
const { keepTrace } = require('../../priority_sampler')
const addresses = require('../addresses')
const { ASM } = require('../../standalone/product')
const { incrementSdkEventMetric } = require('../telemetry')

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

incrementSdkEventMetric('login_success')

const rootSpan = getRootSpan(tracer)
if (!rootSpan) {
log.warn('[ASM] Root span not available in trackUserLoginSuccessEvent')
Expand Down Expand Up @@ -48,6 +51,8 @@ function trackUserLoginFailureEvent (tracer, userId, exists, metadata) {
trackEvent('users.login.failure', fields, 'trackUserLoginFailureEvent', getRootSpan(tracer))

runWaf('users.login.failure', { login: userId })

incrementSdkEventMetric('login_failure')
}

function trackCustomEvent (tracer, eventName, metadata) {
Expand All @@ -57,6 +62,8 @@ function trackCustomEvent (tracer, eventName, metadata) {
}

trackEvent(eventName, metadata, 'trackCustomEvent', getRootSpan(tracer))

incrementSdkEventMetric('custom')
}

function trackEvent (eventName, fields, sdkMethodName, rootSpan) {
Expand Down
9 changes: 8 additions & 1 deletion packages/dd-trace/src/appsec/telemetry/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

const { DD_TELEMETRY_REQUEST_METRICS } = require('./common')
const { addRaspRequestMetrics, trackRaspMetrics } = require('./rasp')
const { incrementMissingUserId, incrementMissingUserLogin } = require('./user')
const { incrementMissingUserId, incrementMissingUserLogin, incrementSdkEvent } = require('./user')
const {
addWafRequestMetrics,
trackWafMetrics,
Expand Down Expand Up @@ -107,6 +107,12 @@ function incrementMissingUserIdMetric (framework, eventType) {
incrementMissingUserId(framework, eventType)
}

function incrementSdkEventMetric (framework, eventType) {
if (!enabled) return

incrementSdkEvent(framework, eventType)
}

function getRequestMetrics (req) {
if (req) {
const store = getStore(req)
Expand All @@ -125,6 +131,7 @@ module.exports = {
incrementWafRequestsMetric,
incrementMissingUserLoginMetric,
incrementMissingUserIdMetric,
incrementSdkEventMetric,

getRequestMetrics
}
10 changes: 9 additions & 1 deletion packages/dd-trace/src/appsec/telemetry/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,15 @@ function incrementMissingUserId (framework, eventType) {
}).inc()
}

function incrementSdkEvent (eventType) {
appsecMetrics.count('sdk.event', {
event_type: eventType,
sdk_version: 'v1'
}).inc()
}

module.exports = {
incrementMissingUserLogin,
incrementMissingUserId
incrementMissingUserId,
incrementSdkEvent
}
22 changes: 21 additions & 1 deletion packages/dd-trace/test/appsec/sdk/track_event.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ describe('track_event', () => {
let getRootSpan
let setUserTags
let waf
let telemetry
let trackUserLoginSuccessEvent, trackUserLoginFailureEvent, trackCustomEvent

beforeEach(() => {
Expand All @@ -42,6 +43,10 @@ describe('track_event', () => {
run: sinon.spy()
}

telemetry = {
incrementSdkEventMetric: sinon.stub()
}

const trackEvents = proxyquire('../../../src/appsec/sdk/track_event', {
'../../log': log,
'./utils': {
Expand All @@ -50,7 +55,8 @@ describe('track_event', () => {
'./set_user': {
setUserTags
},
'../waf': waf
'../waf': waf,
'../telemetry': telemetry
})

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

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

it('should call setUser and addTags with metadata', () => {
Expand Down Expand Up @@ -111,6 +119,7 @@ describe('track_event', () => {
[USER_LOGIN]: 'user_id'
}
})
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('login_success')
})

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

it('should call waf with user login', () => {
Expand All @@ -157,6 +167,7 @@ describe('track_event', () => {
[USER_LOGIN]: 'user_login'
}
})
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('login_success')
})
})

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

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

it('should call addTags with metadata', () => {
Expand Down Expand Up @@ -211,6 +224,7 @@ describe('track_event', () => {
[USER_LOGIN]: 'user_id'
}
})
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('login_failure')
})

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

it('should call addTags without metadata', () => {
Expand All @@ -262,6 +277,7 @@ describe('track_event', () => {
[USER_LOGIN]: 'user_id'
}
})
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('login_failure')
})
})

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

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

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

it('should call addTags without metadata', () => {
Expand All @@ -318,6 +337,7 @@ describe('track_event', () => {
})
expect(prioritySampler.setPriority)
.to.have.been.calledOnceWithExactly(rootSpan, USER_KEEP, ASM)
expect(telemetry.incrementSdkEventMetric).to.have.been.calledWith('custom')
})
})
})
Expand Down
11 changes: 11 additions & 0 deletions packages/dd-trace/test/appsec/telemetry/user.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,16 @@ describe('Appsec User Telemetry metrics', () => {
})
})
})

describe('incrementSdkEventMetric', () => {
it('should increment sdk.event metric', () => {
appsecTelemetry.incrementSdkEventMetric('login_success')

expect(count).to.have.been.calledOnceWithExactly('sdk.event', {
event_type: 'login_success',
sdk_version: 'v1'
})
})
})
})
})
Loading