Skip to content

Commit

Permalink
Merge branch 'bcaudan/v5-error.origin' into bcaudan/v5-error.origin--…
Browse files Browse the repository at this point in the history
…fix-staging
  • Loading branch information
bcaudan committed Jun 15, 2023
2 parents 91282a9 + 8f1bc22 commit 1790641
Show file tree
Hide file tree
Showing 67 changed files with 583 additions and 1,222 deletions.
4 changes: 2 additions & 2 deletions developer-extension/src/panel/hooks/useSdkInfos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,13 @@ async function getInfos(): Promise<SdkInfos> {
version: window.DD_RUM?.version,
config: window.DD_RUM?.getInitConfiguration?.(),
internalContext: window.DD_RUM?.getInternalContext?.(),
globalContext: window.DD_RUM?.getRumGlobalContext?.(),
globalContext: window.DD_RUM?.getGlobalContext?.(),
user: window.DD_RUM?.getUser?.(),
}
const logs = window.DD_LOGS && {
version: window.DD_LOGS?.version,
config: window.DD_LOGS?.getInitConfiguration?.(),
globalContext: window.DD_LOGS?.getLoggerGlobalContext?.(),
globalContext: window.DD_LOGS?.getGlobalContext?.(),
user: window.DD_LOGS?.getUser?.(),
}
return { rum, logs, cookie }
Expand Down
4 changes: 3 additions & 1 deletion packages/core/src/browser/fetchObservable.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ describe('fetch proxy', () => {
fetchStub(new Request(FAKE_URL, { method: 'PUT' }), { method: 'POST' }).resolveWith({ status: 500 })
fetchStub(new Request(FAKE_URL), { method: 'POST' }).resolveWith({ status: 500 })
fetchStub(FAKE_URL, { method: 'POST' }).resolveWith({ status: 500 })
fetchStub(FAKE_URL, { method: 'post' }).resolveWith({ status: 500 })
fetchStub(null as any).resolveWith({ status: 500 })
fetchStub({ method: 'POST' } as any).resolveWith({ status: 500 })

Expand All @@ -123,8 +124,9 @@ describe('fetch proxy', () => {
expect(requests[3].method).toEqual('POST')
expect(requests[4].method).toEqual('POST')
expect(requests[5].method).toEqual('POST')
expect(requests[6].method).toEqual('GET')
expect(requests[6].method).toEqual('POST')
expect(requests[7].method).toEqual('GET')
expect(requests[8].method).toEqual('GET')
done()
})
})
Expand Down
3 changes: 2 additions & 1 deletion packages/core/src/browser/fetchObservable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ function createFetchObservable() {
}

function beforeSend(observable: Observable<FetchContext>, input: unknown, init?: RequestInit) {
const method = (init && init.method) || (input instanceof Request && input.method) || 'GET'
const methodFromParams = (init && init.method) || (input instanceof Request && input.method)
const method = methodFromParams ? methodFromParams.toUpperCase() : 'GET'
const url = input instanceof Request ? input.url : normalizeUrl(String(input))
const startClocks = clocksNow()

Expand Down
25 changes: 15 additions & 10 deletions packages/core/src/browser/xhrObservable.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,27 @@ describe('xhr observable', () => {
expect(request.url).toContain('/ok')
expect(request.status).toBe(200)
expect(request.isAborted).toBe(false)
expect(request.startTime).toEqual(jasmine.any(Number))
expect(request.duration).toEqual(jasmine.any(Number))
done()
},
})
})

it('should sanitize request method', (done) => {
withXhr({
setup(xhr) {
xhr.open('get', '/ok')
xhr.send()
xhr.complete(200, 'ok')
},
onComplete() {
const request = requests[0]
expect(request.method).toBe('GET')
done()
},
})
})

it('should track client error', (done) => {
withXhr({
setup(xhr) {
Expand All @@ -67,7 +81,6 @@ describe('xhr observable', () => {
expect(request.url).toContain('/expected-404')
expect(request.status).toBe(404)
expect(request.isAborted).toBe(false)
expect(request.startTime).toEqual(jasmine.any(Number))
expect(request.duration).toEqual(jasmine.any(Number))
done()
},
Expand All @@ -87,7 +100,6 @@ describe('xhr observable', () => {
expect(request.url).toContain('/throw')
expect(request.status).toBe(500)
expect(request.isAborted).toBe(false)
expect(request.startTime).toEqual(jasmine.any(Number))
expect(request.duration).toEqual(jasmine.any(Number))
done()
},
Expand All @@ -107,7 +119,6 @@ describe('xhr observable', () => {
expect(request.url).toBe('http://foo.bar/qux')
expect(request.status).toBe(0)
expect(request.isAborted).toBe(false)
expect(request.startTime).toEqual(jasmine.any(Number))
expect(request.duration).toEqual(jasmine.any(Number))
done()
},
Expand All @@ -133,7 +144,6 @@ describe('xhr observable', () => {
expect(request.method).toBe('GET')
expect(request.url).toContain('/ok')
expect(request.status).toBe(200)
expect(request.startTime).toEqual(jasmine.any(Number))
expect(request.duration).toEqual(jasmine.any(Number))
expect(request.isAborted).toBe(false)
expect(xhr.status).toBe(0)
Expand All @@ -155,7 +165,6 @@ describe('xhr observable', () => {
expect(request.method).toBe('GET')
expect(request.url).toContain('/ok')
expect(request.status).toBe(0)
expect(request.startTime).toEqual(jasmine.any(Number))
expect(request.duration).toEqual(jasmine.any(Number))
expect(request.isAborted).toBe(true)
expect(xhr.status).toBe(0)
Expand All @@ -178,7 +187,6 @@ describe('xhr observable', () => {
expect(request.url).toContain('/ok')
expect(request.status).toBe(200)
expect(request.isAborted).toBe(false)
expect(request.startTime).toEqual(jasmine.any(Number))
expect(request.duration).toEqual(jasmine.any(Number))
expect(xhr.onreadystatechange).toHaveBeenCalled()
done()
Expand All @@ -200,7 +208,6 @@ describe('xhr observable', () => {
expect(request.url).toContain('/ok')
expect(request.status).toBe(200)
expect(request.isAborted).toBe(false)
expect(request.startTime).toEqual(jasmine.any(Number))
expect(request.duration).toEqual(jasmine.any(Number))
expect(xhr.onreadystatechange).toHaveBeenCalled()
done()
Expand Down Expand Up @@ -273,15 +280,13 @@ describe('xhr observable', () => {
expect(firstRequest.url).toContain('/ok?request=1')
expect(firstRequest.status).toBe(200)
expect(firstRequest.isAborted).toBe(false)
expect(firstRequest.startTime).toEqual(jasmine.any(Number))
expect(firstRequest.duration).toEqual(jasmine.any(Number))

const secondRequest = requests[1]
expect(secondRequest.method).toBe('GET')
expect(secondRequest.url).toContain('/ok?request=2')
expect(secondRequest.status).toBe(400)
expect(secondRequest.isAborted).toBe(false)
expect(secondRequest.startTime).toEqual(jasmine.any(Number))
expect(secondRequest.duration).toEqual(jasmine.any(Number))

expect(xhr.onreadystatechange).toHaveBeenCalledTimes(2)
Expand Down
10 changes: 4 additions & 6 deletions packages/core/src/browser/xhrObservable.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { instrumentMethodAndCallOriginal } from '../tools/instrumentMethod'
import { Observable } from '../tools/observable'
import type { Duration, RelativeTime, ClocksState } from '../tools/utils/timeUtils'
import { elapsed, relativeNow, clocksNow, timeStampNow } from '../tools/utils/timeUtils'
import type { Duration, ClocksState } from '../tools/utils/timeUtils'
import { elapsed, clocksNow, timeStampNow } from '../tools/utils/timeUtils'
import { normalizeUrl } from '../tools/utils/urlPolyfill'
import { shallowClone } from '../tools/utils/objectUtils'
import { addEventListener } from './addEventListener'
Expand All @@ -14,7 +14,6 @@ export interface XhrOpenContext {

export interface XhrStartContext extends Omit<XhrOpenContext, 'state'> {
state: 'start'
startTime: RelativeTime // deprecated
startClocks: ClocksState
isAborted: boolean
xhr: XMLHttpRequest
Expand Down Expand Up @@ -66,7 +65,7 @@ function createXhrObservable() {
function openXhr(this: XMLHttpRequest, method: string, url: string | URL | undefined | null) {
xhrContexts.set(this, {
state: 'open',
method,
method: method.toUpperCase(),
url: normalizeUrl(String(url)),
})
}
Expand All @@ -79,7 +78,6 @@ function sendXhr(this: XMLHttpRequest, observable: Observable<XhrContext>) {

const startContext = context as XhrStartContext
startContext.state = 'start'
startContext.startTime = relativeNow()
startContext.startClocks = clocksNow()
startContext.isAborted = false
startContext.xhr = this
Expand All @@ -91,7 +89,7 @@ function sendXhr(this: XMLHttpRequest, observable: Observable<XhrContext>) {
if (this.readyState === XMLHttpRequest.DONE) {
// Try to report the XHR as soon as possible, because the XHR may be mutated by the
// application during a future event. For example, Angular is calling .abort() on
// completed requests during a onreadystatechange event, so the status becomes '0'
// completed requests during an onreadystatechange event, so the status becomes '0'
// before the request is collected.
onEnd()
}
Expand Down
17 changes: 0 additions & 17 deletions packages/core/src/domain/configuration/configuration.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,23 +65,6 @@ describe('validateAndBuildConfiguration', () => {
expect(displaySpy).not.toHaveBeenCalled()
})

it('requires deprecated sampleRate to be a percentage', () => {
expect(
validateAndBuildConfiguration({ clientToken, sampleRate: 'foo' } as unknown as InitConfiguration)
).toBeUndefined()
expect(displaySpy).toHaveBeenCalledOnceWith('Session Sample Rate should be a number between 0 and 100')

displaySpy.calls.reset()
expect(
validateAndBuildConfiguration({ clientToken, sampleRate: 200 } as unknown as InitConfiguration)
).toBeUndefined()
expect(displaySpy).toHaveBeenCalledOnceWith('Session Sample Rate should be a number between 0 and 100')

displaySpy.calls.reset()
validateAndBuildConfiguration({ clientToken: 'yes', sampleRate: 1 })
expect(displaySpy).not.toHaveBeenCalled()
})

it('requires sessionSampleRate to be a percentage', () => {
expect(
validateAndBuildConfiguration({ clientToken, sessionSampleRate: 'foo' } as unknown as InitConfiguration)
Expand Down
18 changes: 4 additions & 14 deletions packages/core/src/domain/configuration/configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,6 @@ export interface InitConfiguration {
// global options
clientToken: string
beforeSend?: GenericBeforeSendCallback | undefined
/**
* @deprecated use sessionSampleRate instead
*/
sampleRate?: number | undefined
sessionSampleRate?: number | undefined
telemetrySampleRate?: number | undefined
silentMultipleInit?: boolean | undefined
Expand All @@ -36,10 +32,6 @@ export interface InitConfiguration {

// transport options
proxy?: string | undefined
/**
* @deprecated use `proxy` instead
*/
proxyUrl?: string | undefined
site?: string | undefined

// tag and context options
Expand Down Expand Up @@ -100,8 +92,7 @@ export function validateAndBuildConfiguration(initConfiguration: InitConfigurati
return
}

const sessionSampleRate = initConfiguration.sessionSampleRate ?? initConfiguration.sampleRate
if (sessionSampleRate !== undefined && !isPercentage(sessionSampleRate)) {
if (initConfiguration.sessionSampleRate !== undefined && !isPercentage(initConfiguration.sessionSampleRate)) {
display.error('Session Sample Rate should be a number between 0 and 100')
return
}
Expand Down Expand Up @@ -133,7 +124,7 @@ export function validateAndBuildConfiguration(initConfiguration: InitConfigurati
beforeSend:
initConfiguration.beforeSend && catchUserErrors(initConfiguration.beforeSend, 'beforeSend threw an error:'),
sessionStoreStrategyType: selectSessionStoreStrategyType(initConfiguration),
sessionSampleRate: sessionSampleRate ?? 100,
sessionSampleRate: initConfiguration.sessionSampleRate ?? 100,
telemetrySampleRate: initConfiguration.telemetrySampleRate ?? 20,
telemetryConfigurationSampleRate: initConfiguration.telemetryConfigurationSampleRate ?? 5,
service: initConfiguration.service,
Expand Down Expand Up @@ -165,15 +156,14 @@ export function validateAndBuildConfiguration(initConfiguration: InitConfigurati
}

export function serializeConfiguration(initConfiguration: InitConfiguration): Partial<RawTelemetryConfiguration> {
const proxy = initConfiguration.proxy ?? initConfiguration.proxyUrl
return {
session_sample_rate: initConfiguration.sessionSampleRate ?? initConfiguration.sampleRate,
session_sample_rate: initConfiguration.sessionSampleRate,
telemetry_sample_rate: initConfiguration.telemetrySampleRate,
telemetry_configuration_sample_rate: initConfiguration.telemetryConfigurationSampleRate,
use_before_send: !!initConfiguration.beforeSend,
use_cross_site_session_cookie: initConfiguration.useCrossSiteSessionCookie,
use_secure_session_cookie: initConfiguration.useSecureSessionCookie,
use_proxy: proxy !== undefined ? !!proxy : undefined,
use_proxy: !!initConfiguration.proxy,
silent_multiple_init: initConfiguration.silentMultipleInit,
track_session_across_subdomains: initConfiguration.trackSessionAcrossSubdomains,
track_resources: initConfiguration.trackResources,
Expand Down
40 changes: 0 additions & 40 deletions packages/core/src/domain/configuration/endpointBuilder.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,46 +63,6 @@ describe('endpointBuilder', () => {
)
).toBeTrue()
})

it('uses `proxy` over `proxyUrl`', () => {
expect(
createEndpointBuilder(
{ ...initConfiguration, proxy: 'https://proxy.io/path', proxyUrl: 'https://legacy-proxy.io/path' },
'rum',
[]
).build('xhr')
).toMatch(/^https:\/\/proxy.io\/path\?/)

expect(
createEndpointBuilder(
{ ...initConfiguration, proxy: false as any, proxyUrl: 'https://legacy-proxy.io/path' },
'rum',
[]
).build('xhr')
).toMatch(/^https:\/\/rum.browser-intake-datadoghq.com\//)
})
})

describe('deprecated proxyUrl configuration', () => {
it('should replace the full intake endpoint by the proxyUrl and set it in the attribute ddforward', () => {
expect(
createEndpointBuilder({ ...initConfiguration, proxyUrl: 'https://proxy.io/path' }, 'rum', []).build('xhr')
).toMatch(
`https://proxy.io/path\\?ddforward=${encodeURIComponent(
`https://rum.browser-intake-datadoghq.com/api/v2/rum?ddsource=(.*)&ddtags=(.*)&dd-api-key=${clientToken}` +
'&dd-evp-origin-version=(.*)&dd-evp-origin=browser&dd-request-id=(.*)&batch_time=(.*)'
)}`
)
})

it('normalizes the proxy url', () => {
expect(
startsWith(
createEndpointBuilder({ ...initConfiguration, proxyUrl: '/path' }, 'rum', []).build('xhr'),
`${location.origin}/path?ddforward`
)
).toBeTrue()
})
})

describe('tags', () => {
Expand Down
12 changes: 1 addition & 11 deletions packages/core/src/domain/configuration/endpointBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,22 +59,12 @@ function createEndpointUrlWithParametersBuilder(
endpointType: EndpointType
): (parameters: string) => string {
const path = `/api/v2/${INTAKE_TRACKS[endpointType]}`

const { proxy, proxyUrl } = initConfiguration
const proxy = initConfiguration.proxy
if (proxy) {
const normalizedProxyUrl = normalizeUrl(proxy)
return (parameters) => `${normalizedProxyUrl}?ddforward=${encodeURIComponent(`${path}?${parameters}`)}`
}

const host = buildEndpointHost(initConfiguration, endpointType)

if (proxy === undefined && proxyUrl) {
// TODO: remove this in a future major.
const normalizedProxyUrl = normalizeUrl(proxyUrl)
return (parameters) =>
`${normalizedProxyUrl}?ddforward=${encodeURIComponent(`https://${host}${path}?${parameters}`)}`
}

return (parameters) => `https://${host}${path}?${parameters}`
}

Expand Down
Loading

0 comments on commit 1790641

Please sign in to comment.