Skip to content

Commit 617cc1d

Browse files
authoredSep 15, 2020
feat(gatsby-admin): track errors (#26903)
* feat(gatsby-admin): track errors * Fix stack containing the full URL and telemetry erroring * Fix eslint error * Fix eslint errors
1 parent f61b19b commit 617cc1d

File tree

7 files changed

+76
-1
lines changed

7 files changed

+76
-1
lines changed
 

‎packages/gatsby-admin/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"query-string": "^6.13.1",
3232
"react": "^16.12.0",
3333
"react-dom": "^16.12.0",
34+
"react-error-boundary": "^3.0.1",
3435
"react-helmet": "^6.1.0",
3536
"react-icons": "^3.10.0",
3637
"react-instantsearch-dom": "^5.7.0",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import React from "react"
2+
import { ErrorBoundary } from "react-error-boundary"
3+
import { useTelemetry } from "../utils/use-telemetry"
4+
5+
export function ErrorTracker({
6+
children,
7+
}: {
8+
children: React.ReactNode
9+
}): JSX.Element {
10+
const { trackError } = useTelemetry()
11+
12+
return (
13+
<ErrorBoundary
14+
fallbackRender={(): JSX.Element => (
15+
<div>
16+
<h1>Oops, something went wrong :(</h1>
17+
<p>Please refresh the page to try again.</p>
18+
</div>
19+
)}
20+
onError={(err): void =>
21+
trackError(`ERROR`, {
22+
error: err,
23+
})
24+
}
25+
>
26+
{children}
27+
</ErrorBoundary>
28+
)
29+
}

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { merge } from "theme-ui"
66
import { createUrqlClient } from "../urql-client"
77
import "normalize.css"
88
import { ServicesProvider, useServices } from "./services-provider"
9+
import { ErrorTracker } from "./error-tracker"
910

1011
const baseTheme = getTheme()
1112

@@ -162,7 +163,9 @@ const Providers: React.FC<{}> = ({ children }) => (
162163
<ThemeProvider theme={theme}>
163164
{/* NOTE(@mxstbr): The GraphQLProvider needs to be in the ServicesProvider */}
164165
<ServicesProvider>
165-
<GraphQLProvider>{children}</GraphQLProvider>
166+
<ErrorTracker>
167+
<GraphQLProvider>{children}</GraphQLProvider>
168+
</ErrorTracker>
166169
</ServicesProvider>
167170
</ThemeProvider>
168171
</StrictUIProvider>

‎packages/gatsby-admin/src/utils/use-telemetry.tsx

+31
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,28 @@ interface ITelemetry {
55
input: string | Array<string>,
66
tags?: { pluginName?: string; pathname?: string }
77
) => void
8+
trackError: (input: string | Array<string>, tags: { error: Error }) => void
89
}
910

1011
const noop = (): void => {}
1112

13+
const errorToJSON = (err): Record<string, any> => {
14+
const json = JSON.parse(JSON.stringify(err, Object.getOwnPropertyNames(err)))
15+
return {
16+
...json,
17+
stack: json.stack.replace(
18+
new RegExp(`${window.location.protocol}//${window.location.host}`, `g`),
19+
`$URL`
20+
),
21+
}
22+
}
23+
1224
export const useTelemetry = (): ITelemetry => {
1325
const services = useServices()
1426
if (!services.telemetryserver)
1527
return {
1628
trackEvent: noop,
29+
trackError: noop,
1730
}
1831

1932
const { port } = services.telemetryserver
@@ -29,7 +42,25 @@ export const useTelemetry = (): ITelemetry => {
2942
return
3043
}
3144

45+
const trackError: ITelemetry["trackError"] = (input, tags) => {
46+
fetch(`http://localhost:${port}/trackError`, {
47+
method: `POST`,
48+
body: JSON.stringify([
49+
input,
50+
{
51+
...tags,
52+
error: errorToJSON(tags.error),
53+
},
54+
]),
55+
headers: {
56+
"Content-Type": `application/json`,
57+
},
58+
}).catch(() => {})
59+
return
60+
}
61+
3262
return {
3363
trackEvent,
64+
trackError,
3465
}
3566
}

‎packages/gatsby-telemetry/src/error-helpers.ts

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ function regexpEscape(str: string): string {
1212
}
1313

1414
export function cleanPaths(str: string, separator: string = sep): string {
15+
if (!str) return str
16+
1517
const stack = process.cwd().split(separator)
1618

1719
while (stack.length > 1) {

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

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import cors from "cors"
1111
import {
1212
setDefaultComponentId,
1313
trackCli,
14+
trackError,
1415
startBackgroundUpdate,
1516
} from "gatsby-telemetry"
1617

@@ -20,6 +21,7 @@ setDefaultComponentId(`gatsby-admin`)
2021
// http://localhost:1234/trackEvent
2122
const ROUTES = {
2223
trackEvent: trackCli,
24+
trackError,
2325
}
2426

2527
const app = express()

‎yarn.lock

+7
Original file line numberDiff line numberDiff line change
@@ -19475,6 +19475,13 @@ react-dom@^16.12.0:
1947519475
prop-types "^15.6.2"
1947619476
scheduler "^0.18.0"
1947719477

19478+
react-error-boundary@^3.0.1:
19479+
version "3.0.1"
19480+
resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.0.1.tgz#ac2578ccdcfc513ce2a76befc61f1aa71da5cf7b"
19481+
integrity sha512-oY2868aEnNrGlVeQhP5faLRZp8dAN4fdPnRCUNhf6o6my/zmhGqrJ6yHtvK+hlJLzY96tGV0rtHU0YC7ZRMscw==
19482+
dependencies:
19483+
"@babel/runtime" "^7.11.2"
19484+
1947819485
react-error-overlay@^3.0.0:
1947919486
version "3.0.0"
1948019487
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-3.0.0.tgz#c2bc8f4d91f1375b3dad6d75265d51cd5eeaf655"

0 commit comments

Comments
 (0)
Please sign in to comment.