@datadog/browser-logs
Version:
102 lines (88 loc) • 4.17 kB
text/typescript
import type { TrackingConsentState, BufferedObservable, BufferedData } from '@datadog/browser-core'
import {
sendToExtension,
createPageMayExitObservable,
willSyntheticsInjectRum,
canUseEventBridge,
startAccountContext,
startGlobalContext,
startUserContext,
} from '@datadog/browser-core'
import { startLogsSessionManager, startLogsSessionManagerStub } from '../domain/logsSessionManager'
import type { LogsConfiguration } from '../domain/configuration'
import { startLogsAssembly } from '../domain/assembly'
import { startConsoleCollection } from '../domain/console/consoleCollection'
import { startReportCollection } from '../domain/report/reportCollection'
import { startNetworkErrorCollection } from '../domain/networkError/networkErrorCollection'
import { startRuntimeErrorCollection } from '../domain/runtimeError/runtimeErrorCollection'
import { LifeCycle, LifeCycleEventType } from '../domain/lifeCycle'
import { startLoggerCollection } from '../domain/logger/loggerCollection'
import { startLogsBatch } from '../transport/startLogsBatch'
import { startLogsBridge } from '../transport/startLogsBridge'
import { startInternalContext } from '../domain/contexts/internalContext'
import { startReportError } from '../domain/reportError'
import type { CommonContext } from '../rawLogsEvent.types'
import type { Hooks } from '../domain/hooks'
import { startRUMInternalContext } from '../domain/contexts/rumInternalContext'
import { startSessionContext } from '../domain/contexts/sessionContext'
import { startTrackingConsentContext } from '../domain/contexts/trackingConsentContext'
const LOGS_STORAGE_KEY = 'logs'
export type StartLogs = typeof startLogs
export type StartLogsResult = ReturnType<StartLogs>
export function startLogs(
configuration: LogsConfiguration,
getCommonContext: () => CommonContext,
// `startLogs` and its subcomponents assume tracking consent is granted initially and starts
// collecting logs unconditionally. As such, `startLogs` should be called with a
// `trackingConsentState` set to "granted".
trackingConsentState: TrackingConsentState,
bufferedDataObservable: BufferedObservable<BufferedData>,
hooks: Hooks
) {
const lifeCycle = new LifeCycle()
const cleanupTasks: Array<() => void> = []
lifeCycle.subscribe(LifeCycleEventType.LOG_COLLECTED, (log) => sendToExtension('logs', log))
const reportError = startReportError(lifeCycle)
const pageMayExitObservable = createPageMayExitObservable(configuration)
const session =
configuration.sessionStoreStrategyType && !canUseEventBridge() && !willSyntheticsInjectRum()
? startLogsSessionManager(configuration, trackingConsentState)
: startLogsSessionManagerStub(configuration)
startTrackingConsentContext(hooks, trackingConsentState)
// Start user and account context first to allow overrides from global context
startSessionContext(hooks, configuration, session)
const accountContext = startAccountContext(hooks, configuration, LOGS_STORAGE_KEY)
const userContext = startUserContext(hooks, configuration, session, LOGS_STORAGE_KEY)
const globalContext = startGlobalContext(hooks, configuration, LOGS_STORAGE_KEY, false)
startRUMInternalContext(hooks)
startNetworkErrorCollection(configuration, lifeCycle)
startRuntimeErrorCollection(configuration, lifeCycle, bufferedDataObservable)
bufferedDataObservable.unbuffer()
startConsoleCollection(configuration, lifeCycle)
startReportCollection(configuration, lifeCycle)
const { handleLog } = startLoggerCollection(lifeCycle)
startLogsAssembly(configuration, lifeCycle, hooks, getCommonContext, reportError)
if (!canUseEventBridge()) {
const { stop: stopLogsBatch } = startLogsBatch(
configuration,
lifeCycle,
reportError,
pageMayExitObservable,
session
)
cleanupTasks.push(() => stopLogsBatch())
} else {
startLogsBridge(lifeCycle)
}
const internalContext = startInternalContext(session)
return {
handleLog,
getInternalContext: internalContext.get,
accountContext,
globalContext,
userContext,
stop: () => {
cleanupTasks.forEach((task) => task())
},
}
}