Skip to content

Commit e824841

Browse files
jamowardpeet
andauthored
feat(gatsby-telemetry): adjust how we capture plugins for telemetry (#27835)
* Simplify interval math * Capture installed gatsby dependencies * Update packages/gatsby-telemetry/src/get-dependencies.ts Co-authored-by: Ward Peeters <[email protected]> * Add missing returntype * Fix how we disable telemetry in tests Co-authored-by: Ward Peeters <[email protected]>
1 parent 3817174 commit e824841

File tree

4 files changed

+67
-3
lines changed

4 files changed

+67
-3
lines changed

packages/gatsby-telemetry/src/__tests__/telemetry.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ describe(`Telemetry`, () => {
1414
expect(EventStorage).toHaveBeenCalledTimes(1)
1515
expect(
1616
(EventStorage as jest.Mock).mock.instances[0].addEvent
17-
).toHaveBeenCalledTimes(1)
17+
).toHaveBeenCalledTimes(2)
1818
})
1919

2020
it(`Doesn't add event to store if telemetry tracking is turned off`, () => {
21-
telemetry.trackingEnabled = false
21+
;(EventStorage as jest.Mock).mockReset()
22+
telemetry = new AnalyticsTracker({ trackingEnabled: false })
2223
telemetry.trackActivity(`demo`)
2324
expect(
2425
(EventStorage as jest.Mock).mock.instances[0].addEvent
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { readFileSync } from "fs-extra"
2+
3+
export function getDependencies(): {
4+
dependencies: Array<string> | undefined
5+
devDependencies: Array<string> | undefined
6+
} {
7+
const data = parsePackageJson()
8+
9+
return {
10+
dependencies: mapData(data?.dependencies),
11+
devDependencies: mapData(data?.devDependencies),
12+
}
13+
}
14+
15+
function mapData(deps: object): Array<string> | undefined {
16+
if (!deps) {
17+
return undefined
18+
}
19+
return Object.entries(deps)
20+
.map(([name, version]) => {
21+
return {
22+
name,
23+
version,
24+
}
25+
})
26+
.map(({ name, version }) => `${name}@${version}`)
27+
}
28+
29+
function parsePackageJson(): { dependencies: object; devDependencies: object } {
30+
try {
31+
const packageJson = readFileSync(`./package.json`, `utf8`)
32+
if (!packageJson) {
33+
return { dependencies: {}, devDependencies: {} }
34+
}
35+
return JSON.parse(packageJson)
36+
} catch (e) {
37+
return { dependencies: {}, devDependencies: {} }
38+
}
39+
}

packages/gatsby-telemetry/src/index.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
} from "./telemetry"
88
import { Request, Response } from "express"
99
import { createFlush } from "./create-flush"
10+
import time, { TimeUnit } from "@turist/time"
1011

1112
const instance = new AnalyticsTracker()
1213

@@ -22,7 +23,7 @@ const intervalDuration = process.env.TELEMETRY_BUFFER_INTERVAL
2223
const interval =
2324
intervalDuration && Number.isFinite(+intervalDuration)
2425
? Math.max(Number(intervalDuration), 1000)
25-
: 10 * 60 * 1000 // 10 min
26+
: time(10, TimeUnit.Minute)
2627

2728
function tick(): void {
2829
flush()
@@ -33,6 +34,7 @@ function tick(): void {
3334
export function trackFeatureIsUsed(name: string): void {
3435
instance.trackFeatureIsUsed(name)
3536
}
37+
3638
export function trackCli(
3739
input: string | Array<string>,
3840
tags?: ITelemetryTagsPayload,

packages/gatsby-telemetry/src/telemetry.ts

+22
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { createFlush } from "./create-flush"
1414
import { EventStorage } from "./event-storage"
1515
import { showAnalyticsNotification } from "./show-analytics-notification"
1616
import { cleanPaths } from "./error-helpers"
17+
import { getDependencies } from "./get-dependencies"
1718

1819
import { join, sep } from "path"
1920
import isDocker from "is-docker"
@@ -53,6 +54,7 @@ export interface IAggregateStats {
5354
interface IAnalyticsTrackerConstructorParameters {
5455
componentId?: SemVer
5556
gatsbyCliVersion?: SemVer
57+
trackingEnabled?: boolean
5658
}
5759

5860
export interface IStructuredError {
@@ -92,6 +94,8 @@ export interface ITelemetryTagsPayload {
9294
error?: IStructuredError | Array<IStructuredError>
9395
cacheStatus?: string
9496
pluginCachePurged?: string
97+
dependencies?: Array<string>
98+
devDependencies?: Array<string>
9599
siteMeasurements?: {
96100
pagesCount?: number
97101
clientsCount?: number
@@ -132,12 +136,16 @@ export class AnalyticsTracker {
132136
constructor({
133137
componentId,
134138
gatsbyCliVersion,
139+
trackingEnabled,
135140
}: IAnalyticsTrackerConstructorParameters = {}) {
136141
this.componentId = componentId || `gatsby-cli`
137142
try {
138143
if (this.store.isTrackingDisabled()) {
139144
this.trackingEnabled = false
140145
}
146+
if (trackingEnabled !== undefined) {
147+
this.trackingEnabled = trackingEnabled
148+
}
141149

142150
this.defaultTags = this.getTagsFromEnv()
143151

@@ -149,6 +157,7 @@ export class AnalyticsTracker {
149157
// ignore
150158
}
151159
this.machineId = this.getMachineId()
160+
this.captureMetadataEvent()
152161
}
153162

154163
// We might have two instances of this lib loaded, one from globally installed gatsby-cli and one from local gatsby.
@@ -463,6 +472,19 @@ export class AnalyticsTracker {
463472
}
464473
}
465474

475+
captureMetadataEvent(): void {
476+
if (!this.isTrackingEnabled()) {
477+
return
478+
}
479+
const deps = getDependencies()
480+
const evt = {
481+
dependencies: deps?.dependencies,
482+
devDependencies: deps?.devDependencies,
483+
}
484+
485+
this.captureEvent(`METADATA`, evt)
486+
}
487+
466488
async sendEvents(): Promise<boolean> {
467489
if (!this.isTrackingEnabled()) {
468490
return true

0 commit comments

Comments
 (0)