| 1 | /** |
| 2 | * Copyright (c) Meta Platforms, Inc. and affiliates. |
| 3 | * |
| 4 | * This source code is licensed under the MIT license found in the |
| 5 | * LICENSE file in the root directory of this source tree. |
| 6 | */ |
| 7 | |
| 8 | import type {Repository} from '../Repository'; |
| 9 | import type {Logger} from '../logger'; |
| 10 | import type {ServerPlatform} from '../serverPlatform'; |
| 11 | import type {ApplicationInfo, FullTrackData, TrackDataWithEventName} from './types'; |
| 12 | |
| 13 | import {Internal} from '../Internal'; |
| 14 | import {generateAnalyticsInfo} from './environment'; |
| 15 | import {Tracker} from './tracker'; |
| 16 | |
| 17 | export type ServerSideTracker = Tracker<ServerSideContext>; |
| 18 | |
| 19 | class ServerSideContext { |
| 20 | constructor( |
| 21 | public logger: Logger, |
| 22 | public data: ApplicationInfo, |
| 23 | ) {} |
| 24 | |
| 25 | public setRepo(repo: Repository | undefined): void { |
| 26 | this.data.repo = repo?.codeReviewProvider?.getSummaryName(); |
| 27 | } |
| 28 | } |
| 29 | |
| 30 | const noOp = (_data: FullTrackData, _logger: Logger) => { |
| 31 | /* In open source builds, analytics tracking is completely disabled/removed. */ |
| 32 | }; |
| 33 | |
| 34 | /** |
| 35 | * Creates a Tracker which includes server-side-only cached application data like platform, username, etc, |
| 36 | * and sends data to the underlying analytics engine outside of ISL. |
| 37 | * This can not be global since two client connections may have different cached data. |
| 38 | */ |
| 39 | export function makeServerSideTracker( |
| 40 | logger: Logger, |
| 41 | platform: ServerPlatform, |
| 42 | version: string, |
| 43 | // prettier-ignore |
| 44 | writeToServer = |
| 45 | Internal.trackToScribe ?? |
| 46 | noOp, |
| 47 | ): ServerSideTracker { |
| 48 | const analyticsInfo = generateAnalyticsInfo(platform.platformName, version, platform.sessionId); |
| 49 | logger.info('Setup analytics, session: ', analyticsInfo.sessionId); |
| 50 | return new Tracker( |
| 51 | (data: TrackDataWithEventName, context: ServerSideContext) => { |
| 52 | const {logger} = context; |
| 53 | // log track event, since tracking events can be used as datapoints when reviewing logs |
| 54 | logger.log( |
| 55 | '[track]', |
| 56 | data.eventName, |
| 57 | data.errorName ?? '', |
| 58 | data.extras != null ? JSON.stringify(data.extras) : '', |
| 59 | ); |
| 60 | writeToServer({...data, ...context.data}, logger); |
| 61 | }, |
| 62 | new ServerSideContext(logger, analyticsInfo), |
| 63 | ); |
| 64 | } |
| 65 | |