From b4c40a2affad9d0f431a3b8f9167bea7e787f255 Mon Sep 17 00:00:00 2001 From: rowanwins Date: Tue, 17 Mar 2020 11:49:10 +1100 Subject: [PATCH 1/4] initial commit of rollbar error provider --- lib/Models/RollbarErrorProvider.ts | 30 +++++++++++++++++++++++++++ lib/Models/Terria.ts | 4 +++- lib/ReactViewModels/ViewState.ts | 6 ++++++ package.json | 1 + test/ReactViewModels/ViewStateSpec.ts | 6 ++++++ 5 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 lib/Models/RollbarErrorProvider.ts diff --git a/lib/Models/RollbarErrorProvider.ts b/lib/Models/RollbarErrorProvider.ts new file mode 100644 index 00000000000..52538701291 --- /dev/null +++ b/lib/Models/RollbarErrorProvider.ts @@ -0,0 +1,30 @@ +import isDefined from "../Core/isDefined"; +import ErrorProvider from "./ErrorProvider"; +import Terria from "./Terria"; +import Rollbar from "rollbar"; + +interface RollbarErrorProviderOptions { + terria: Terria; +} + +export default class RollbarErrorProvider { + terria: Terria; + errorProvider: any; + + constructor(options: RollbarErrorProviderOptions) { + this.terria = options.terria; + + if (!isDefined(this.terria.configParameters.rollbarAccessToken)) { + console.log( + "A rollbarAccessToken must be configured in the config.json to use the rollbar error provider" + ); + return; + } + this.errorProvider = new Rollbar({ + accessToken: this.terria.configParameters.rollbarAccessToken, + captureUncaught: true, + captureUnhandledRejections: true + // enabled: process.env.NODE_ENV === 'production' + }); + } +} diff --git a/lib/Models/Terria.ts b/lib/Models/Terria.ts index c8f13dd9340..95d72ea5af5 100644 --- a/lib/Models/Terria.ts +++ b/lib/Models/Terria.ts @@ -85,6 +85,7 @@ interface ConfigParameters { magdaReferenceHeaders?: MagdaReferenceHeaders; locationSearchBoundingBox?: number[]; googleAnalyticsKey?: string; + rollbarAccessToken?: string; } interface StartOptions { @@ -190,7 +191,8 @@ export default class Terria { experimentalFeatures: undefined, magdaReferenceHeaders: undefined, locationSearchBoundingBox: undefined, - googleAnalyticsKey: undefined + googleAnalyticsKey: undefined, + rollbarAccessToken: undefined }; @observable diff --git a/lib/ReactViewModels/ViewState.ts b/lib/ReactViewModels/ViewState.ts index a3da6319fc0..a5734435636 100644 --- a/lib/ReactViewModels/ViewState.ts +++ b/lib/ReactViewModels/ViewState.ts @@ -23,6 +23,7 @@ interface ViewStateOptions { terria: Terria; catalogSearchProvider: any; locationSearchProviders: any[]; + errorHandlingProvider?: any; } /** @@ -65,6 +66,8 @@ export default class ViewState { @observable workbenchWithOpenControls: string | undefined = undefined; + errorProvider: any | null = null; + // default value is null, because user has not made decision to show or // not show story // will be explicitly set to false when user 1. dismiss story @@ -128,6 +131,9 @@ export default class ViewState { locationSearchProviders: options.locationSearchProviders }); + this.errorProvider = options.errorHandlingProvider + ? options.errorHandlingProvider + : null; this.terria = terria; // Show errors to the user as notifications. diff --git a/package.json b/package.json index 1ffd805e2e4..fb634dfda7a 100644 --- a/package.json +++ b/package.json @@ -119,6 +119,7 @@ "react-transition-group": "^4.3.0", "resolve-url-loader": "^3.0.1", "retry": "^0.12.0", + "rollbar": "^2.15.0", "sass-loader": "^7.1.0", "simple-statistics": "^7.0.1", "string-replace-loader": "^2.1.1", diff --git a/test/ReactViewModels/ViewStateSpec.ts b/test/ReactViewModels/ViewStateSpec.ts index b38679d7518..912255ce1fa 100644 --- a/test/ReactViewModels/ViewStateSpec.ts +++ b/test/ReactViewModels/ViewStateSpec.ts @@ -30,4 +30,10 @@ describe("ViewState", function() { expect(viewState.userDataPreviewedItem).toBeUndefined(); }); }); + + describe("error provider", function() { + it("creates an empty error provider by default", function() { + viewState.errorProvider = null; + }); + }); }); From 2d79511b0f8436e178475a8aaf6e87ed1362af45 Mon Sep 17 00:00:00 2001 From: rowanwins Date: Tue, 17 Mar 2020 12:10:14 +1100 Subject: [PATCH 2/4] add changes.md and tests. --- CHANGES.md | 1 + lib/Models/RollbarErrorProvider.ts | 1 - test/ReactViewModels/ViewStateSpec.ts | 12 +++++++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index b6ae4d26ec9..947b346b0c8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -83,6 +83,7 @@ Change Log * Provide a fallback name for an `ArcGisServerCatalogItem` * Ensure `CesiumTileLayer.getTileUrl` returns a string. * Adds methods `removeModelReferences` to Terria & ViewState for unregistering and removing models from different parts of the UI. +* Add basic support for various error provider services, implementing support for Rollbar. ### Next Release * Fix draggable workbench/story items with translation HOC diff --git a/lib/Models/RollbarErrorProvider.ts b/lib/Models/RollbarErrorProvider.ts index 52538701291..182db9a8438 100644 --- a/lib/Models/RollbarErrorProvider.ts +++ b/lib/Models/RollbarErrorProvider.ts @@ -1,5 +1,4 @@ import isDefined from "../Core/isDefined"; -import ErrorProvider from "./ErrorProvider"; import Terria from "./Terria"; import Rollbar from "rollbar"; diff --git a/test/ReactViewModels/ViewStateSpec.ts b/test/ReactViewModels/ViewStateSpec.ts index 912255ce1fa..9fb5155d82a 100644 --- a/test/ReactViewModels/ViewStateSpec.ts +++ b/test/ReactViewModels/ViewStateSpec.ts @@ -1,5 +1,6 @@ import Terria from "../../lib/Models/Terria"; import ViewState from "../../lib/ReactViewModels/ViewState"; +import RollbarErrorProvider from "../../lib/Models/RollbarErrorProvider"; import SimpleCatalogItem from "../Helpers/SimpleCatalogItem"; describe("ViewState", function() { @@ -33,7 +34,16 @@ describe("ViewState", function() { describe("error provider", function() { it("creates an empty error provider by default", function() { - viewState.errorProvider = null; + expect(viewState.errorProvider).toBeNull(); + }); + + it("can create an error provider with rollbar", function() { + terria.configParameters.rollbarAccessToken = "123"; + viewState.errorProvider = new RollbarErrorProvider({ + terria: viewState.terria + }); + expect(viewState.errorProvider).toBeDefined(); + expect(viewState.errorProvider.errorProvider).toBeDefined(); }); }); }); From 6e9b09faefbf8b1f878917e4ca19ad9aa30d2e3d Mon Sep 17 00:00:00 2001 From: rowanwins Date: Tue, 17 Mar 2020 12:12:19 +1100 Subject: [PATCH 3/4] enable rollbar in production only --- lib/Models/RollbarErrorProvider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Models/RollbarErrorProvider.ts b/lib/Models/RollbarErrorProvider.ts index 182db9a8438..ccbf2f49f52 100644 --- a/lib/Models/RollbarErrorProvider.ts +++ b/lib/Models/RollbarErrorProvider.ts @@ -22,8 +22,8 @@ export default class RollbarErrorProvider { this.errorProvider = new Rollbar({ accessToken: this.terria.configParameters.rollbarAccessToken, captureUncaught: true, - captureUnhandledRejections: true - // enabled: process.env.NODE_ENV === 'production' + captureUnhandledRejections: true, + enabled: process.env.NODE_ENV === 'production' }); } } From b2e5c05f55aa1a47e5ba31cb830a3fa2c2eeed23 Mon Sep 17 00:00:00 2001 From: rowanwins Date: Tue, 17 Mar 2020 12:50:03 +1100 Subject: [PATCH 4/4] prettier again --- lib/Models/RollbarErrorProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Models/RollbarErrorProvider.ts b/lib/Models/RollbarErrorProvider.ts index ccbf2f49f52..82f1caaa821 100644 --- a/lib/Models/RollbarErrorProvider.ts +++ b/lib/Models/RollbarErrorProvider.ts @@ -23,7 +23,7 @@ export default class RollbarErrorProvider { accessToken: this.terria.configParameters.rollbarAccessToken, captureUncaught: true, captureUnhandledRejections: true, - enabled: process.env.NODE_ENV === 'production' + enabled: process.env.NODE_ENV === "production" }); } }