Skip to content

Commit bf61854

Browse files
authoredSep 14, 2020
feat(gatsby-admin): track plugin telemetry (#26885)
* Set up first service exposing gatsby-telemetry * Run background updates * Move telemetry server to gatsby package * Add body-parser dependency * Start telemetry server on gatsby develop (#26853) * Revert "Start telemetry server on gatsby develop (#26853)" This reverts commit 5febd35. * Revert "Revert "Start telemetry server on gatsby develop (#26853)"" This reverts commit 08bb027. * Track first telemetry from Admin * Update telemetry-server.ts
1 parent 8247d43 commit bf61854

File tree

7 files changed

+108
-21
lines changed

7 files changed

+108
-21
lines changed
 

‎packages/gatsby-admin/gatsby-config.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ module.exports = {
22
plugins: [
33
{
44
resolve: "gatsby-plugin-react-helmet",
5-
options: {},
5+
options: {
6+
test: true,
7+
bla: false,
8+
},
69
},
710
{
811
resolve: "gatsby-plugin-webfonts",

‎packages/gatsby-admin/src/components/providers.tsx

+16-16
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ import React from "react"
22
import { Provider, Client } from "urql"
33
import { ThemeProvider, getTheme } from "gatsby-interface"
44
import { ThemeProvider as StrictUIProvider } from "strict-ui"
5-
import { Spinner, merge } from "theme-ui"
5+
import { merge } from "theme-ui"
66
import { createUrqlClient } from "../urql-client"
77
import "normalize.css"
8+
import { ServicesProvider, useServices } from "./services-provider"
89

910
const baseTheme = getTheme()
1011

@@ -132,22 +133,18 @@ const theme = merge(recipesTheme, {
132133
})
133134

134135
const GraphQLProvider: React.FC<{}> = ({ children }) => {
135-
const [status, setStatus] = React.useState(`loading`)
136-
const [client, setClient] = React.useState<Client | null>(null)
136+
const services = useServices()
137+
const [client, setClient] = React.useState<Client | null>(() =>
138+
services
139+
? createUrqlClient({ port: services.recipesgraphqlserver.port })
140+
: null
141+
)
137142

138143
React.useEffect(() => {
139-
setStatus(`loading`)
140-
fetch(`/___services`)
141-
.then(res => res.json())
142-
.then(json => {
143-
setStatus(`idle`)
144-
if (json.recipesgraphqlserver) {
145-
setClient(createUrqlClient({ port: json.recipesgraphqlserver.port }))
146-
}
147-
})
148-
}, [])
149-
150-
if (status === `loading`) return <Spinner />
144+
if (services.recipesgraphqlserver) {
145+
setClient(createUrqlClient({ port: services.recipesgraphqlserver.port }))
146+
}
147+
}, [services])
151148

152149
if (client === null)
153150
return (
@@ -163,7 +160,10 @@ const GraphQLProvider: React.FC<{}> = ({ children }) => {
163160
const Providers: React.FC<{}> = ({ children }) => (
164161
<StrictUIProvider theme={theme}>
165162
<ThemeProvider theme={theme}>
166-
<GraphQLProvider>{children}</GraphQLProvider>
163+
{/* NOTE(@mxstbr): The GraphQLProvider needs to be in the ServicesProvider */}
164+
<ServicesProvider>
165+
<GraphQLProvider>{children}</GraphQLProvider>
166+
</ServicesProvider>
167167
</ThemeProvider>
168168
</StrictUIProvider>
169169
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import React, { createContext, useContext, useState, useEffect } from "react"
2+
import { Spinner } from "theme-ui"
3+
4+
type Services = Record<string, any>
5+
6+
const ServicesContext = createContext<Services>({})
7+
8+
export function ServicesProvider({
9+
children,
10+
}: {
11+
children: React.ReactNode
12+
}): JSX.Element {
13+
const [status, setStatus] = useState<"loading" | "idle">(`loading`)
14+
const [services, setServices] = useState<Services>({})
15+
16+
useEffect(() => {
17+
setStatus(`loading`)
18+
fetch(`/___services`)
19+
.then(res => res.json())
20+
.then((json: Services) => {
21+
setServices(json)
22+
setStatus(`idle`)
23+
})
24+
}, [])
25+
26+
if (status === `loading`) return <Spinner />
27+
28+
return (
29+
<ServicesContext.Provider value={services}>
30+
{children}
31+
</ServicesContext.Provider>
32+
)
33+
}
34+
35+
export const useServices = (): Services => useContext(ServicesContext)

‎packages/gatsby-admin/src/pages/plugins.tsx

+12
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import prismThemeCss from "../prism-theme"
2525
import gitHubIcon from "../github.svg"
2626
import isOfficialPackage from "../../../../www/src/utils/is-official-package"
2727
import GatsbyIcon from "../../../../www/src/components/gatsby-monogram"
28+
import { useTelemetry } from "../utils/use-telemetry"
2829

2930
const markdownRenderers = {
3031
paragraph: (props: any): JSX.Element => (
@@ -185,6 +186,8 @@ export default function PluginView(
185186
)
186187
}, [fetching])
187188

189+
const telemetry = useTelemetry()
190+
188191
if (error) {
189192
const errMsg =
190193
(error.networkError && error.networkError.message) ||
@@ -265,6 +268,9 @@ export default function PluginView(
265268
`Are you sure you want to uninstall ${pluginName}?`
266269
)
267270
) {
271+
telemetry.trackEvent(`PLUGIN_UNINSTALL`, {
272+
pluginName,
273+
})
268274
deleteGatsbyPlugin({ name: pluginName }).then(() =>
269275
navigate(`/`)
270276
)
@@ -280,6 +286,9 @@ export default function PluginView(
280286
onClick={(evt): void => {
281287
evt.preventDefault()
282288
installGatsbyPlugin({ name: pluginName })
289+
telemetry.trackEvent(`PLUGIN_INSTALL`, {
290+
pluginName,
291+
})
283292
}}
284293
>
285294
Install
@@ -324,6 +333,9 @@ export default function PluginView(
324333
setValidationError(err)
325334
return
326335
}
336+
telemetry.trackEvent(`PLUGIN_CONFIGURE`, {
337+
pluginName,
338+
})
327339
updateGatsbyPlugin({
328340
name: props[`*`],
329341
options: json,

‎packages/gatsby-admin/src/urql-client.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { SubscriptionClient } from "subscriptions-transport-ws"
99

1010
interface ICreateUrqlClientOptions {
1111
port: number
12-
connectionCallback: any
12+
connectionCallback?: any
1313
}
1414

1515
export const createUrqlClient = ({
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { useServices } from "../components/services-provider"
2+
3+
interface ITelemetry {
4+
trackEvent: (
5+
input: string | Array<string>,
6+
tags?: { pluginName?: string }
7+
) => void
8+
}
9+
10+
const noop = (): void => {}
11+
12+
export const useTelemetry = (): ITelemetry => {
13+
const services = useServices()
14+
if (!services.telemetryserver)
15+
return {
16+
trackEvent: noop,
17+
}
18+
19+
const { port } = services.telemetryserver
20+
21+
const trackEvent: ITelemetry["trackEvent"] = input => {
22+
fetch(`http://localhost:${port}/trackEvent`, {
23+
method: `POST`,
24+
body: JSON.stringify([input]),
25+
headers: {
26+
"Content-Type": `application/json`,
27+
},
28+
}).catch(() => {})
29+
return
30+
}
31+
32+
return {
33+
trackEvent,
34+
}
35+
}

‎packages/gatsby/src/utils/telemetry-server.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,25 @@
77
*/
88
import express from "express"
99
import bodyParser from "body-parser"
10+
import cors from "cors"
1011
import {
11-
setGatsbyCliVersion,
1212
setDefaultComponentId,
1313
trackCli,
1414
startBackgroundUpdate,
1515
} from "gatsby-telemetry"
1616

17+
setDefaultComponentId(`gatsby-admin`)
18+
1719
// These routes will exist in the API at the keys, e.g.
1820
// http://localhost:1234/trackEvent
1921
const ROUTES = {
20-
setVersion: setGatsbyCliVersion,
21-
setDefaultComponentId: setDefaultComponentId,
2222
trackEvent: trackCli,
2323
}
2424

2525
const app = express()
2626

27+
app.use(cors())
28+
2729
// Overview over all possible routes at /
2830
app.get(`/`, (req, res) => {
2931
res.set(`Content-Type`, `text/html`)

0 commit comments

Comments
 (0)
Please sign in to comment.