From 28cf18e6176869dc6613517992f3959be7929d28 Mon Sep 17 00:00:00 2001 From: GerA Date: Fri, 7 Sep 2018 18:07:37 +0200 Subject: [PATCH 1/4] Add errorFilter option --- docs/source/api/apollo-server.md | 6 ++++++ packages/apollo-engine-reporting/src/agent.ts | 4 ++++ packages/apollo-engine-reporting/src/extension.ts | 5 ++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/source/api/apollo-server.md b/docs/source/api/apollo-server.md index 3b39fc456f6..d7988f6d490 100644 --- a/docs/source/api/apollo-server.md +++ b/docs/source/api/apollo-server.md @@ -365,3 +365,9 @@ addMockFunctionsToSchema({ * `maskErrorDetails`: boolean Set to true to remove error details from the traces sent to Apollo's servers. Defaults to false. + +* `errorFilter`: (err: Error) => boolean + + By default, all errors get reported to Engine servers. You can specify a + a filter function to exclude specific errors from being reported by + returning false. diff --git a/packages/apollo-engine-reporting/src/agent.ts b/packages/apollo-engine-reporting/src/agent.ts index 8d2587fe5be..2a71c077caf 100644 --- a/packages/apollo-engine-reporting/src/agent.ts +++ b/packages/apollo-engine-reporting/src/agent.ts @@ -88,6 +88,10 @@ export interface EngineReportingOptions { sendReportsImmediately?: boolean; // To remove the error message from traces, set this to true. Defaults to false maskErrorDetails?: boolean; + // By default, all errors get reported to Engine servers. You can specify a + // a filter function to exclude specific errors from being reported by + // returning false. + errorFilter?: (err: Error) => boolean; /** * (Experimental) Creates the client information for operation traces. diff --git a/packages/apollo-engine-reporting/src/extension.ts b/packages/apollo-engine-reporting/src/extension.ts index 7f870ad1a6d..e8c67cb7f00 100644 --- a/packages/apollo-engine-reporting/src/extension.ts +++ b/packages/apollo-engine-reporting/src/extension.ts @@ -51,6 +51,7 @@ export class EngineReportingExtension ) { this.options = { maskErrorDetails: false, + errorFilter: () => true, ...options, }; this.addTrace = addTrace; @@ -272,7 +273,9 @@ export class EngineReportingExtension json: JSON.stringify(error), }; - node!.error!.push(new Trace.Error(errorInfo)); + if (!this.options.errorFilter || this.options.errorFilter(error)) { + node!.error!.push(new Trace.Error(errorInfo)); + } }); } } From 3a2520828ed8b637b4670ab42a4d1a9853561822 Mon Sep 17 00:00:00 2001 From: GerA Date: Mon, 10 Sep 2018 14:30:29 +0200 Subject: [PATCH 2/4] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d82ba35e11c..a3a546eaf70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Allow an optional function to resolve the `rootValue`, passing the `DocumentNode` AST to determine the value. [PR #1555](https://github.com/apollographql/apollo-server/pull/1555) - Follow-up on the work in [PR #1516](https://github.com/apollographql/apollo-server/pull/1516) to also fix missing insertion cursor/caret when a custom GraphQL configuration is specified which doesn't specify its own `cursorShape` property. [PR #1607](https://github.com/apollographql/apollo-server/pull/1607) +- Add option to filter errors from being reported [#1639](https://github.com/apollographql/apollo-server/pull/1639) ### v2.1.0 From 42171d4ddc85de6395fe06ac1ab75a78fe725f41 Mon Sep 17 00:00:00 2001 From: GerA Date: Thu, 13 Sep 2018 15:45:30 +0200 Subject: [PATCH 3/4] Rename errorFilter to filterErrors, return GraphQLError or null --- docs/source/api/apollo-server.md | 9 +++---- packages/apollo-engine-reporting/src/agent.ts | 9 +++---- .../apollo-engine-reporting/src/extension.ts | 26 +++++++++---------- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/docs/source/api/apollo-server.md b/docs/source/api/apollo-server.md index d7988f6d490..103e0970355 100644 --- a/docs/source/api/apollo-server.md +++ b/docs/source/api/apollo-server.md @@ -362,12 +362,9 @@ addMockFunctionsToSchema({ 'sendReport()' on other signals if you'd like. Note that 'sendReport()' does not run synchronously so it cannot work usefully in an 'exit' handler. -* `maskErrorDetails`: boolean - - Set to true to remove error details from the traces sent to Apollo's servers. Defaults to false. - -* `errorFilter`: (err: Error) => boolean +* `filterErrors`: (err: Error) => Error | null By default, all errors get reported to Engine servers. You can specify a a filter function to exclude specific errors from being reported by - returning false. + returning null, or you can mask certain details of the error and return the + error to be reported. diff --git a/packages/apollo-engine-reporting/src/agent.ts b/packages/apollo-engine-reporting/src/agent.ts index 2a71c077caf..a9d27f2a98c 100644 --- a/packages/apollo-engine-reporting/src/agent.ts +++ b/packages/apollo-engine-reporting/src/agent.ts @@ -1,6 +1,6 @@ import os from 'os'; import { gzip } from 'zlib'; -import { DocumentNode } from 'graphql'; +import { DocumentNode, GraphQLError } from 'graphql'; import { FullTracesReport, ReportHeader, @@ -86,12 +86,11 @@ export interface EngineReportingOptions { handleSignals?: boolean; // Sends the trace report immediately. This options is useful for stateless environments sendReportsImmediately?: boolean; - // To remove the error message from traces, set this to true. Defaults to false - maskErrorDetails?: boolean; // By default, all errors get reported to Engine servers. You can specify a // a filter function to exclude specific errors from being reported by - // returning false. - errorFilter?: (err: Error) => boolean; + // returning null, or you can mask certain details of the error and return the + // error to be reported. + filterErrors?: (err: GraphQLError) => GraphQLError | null; /** * (Experimental) Creates the client information for operation traces. diff --git a/packages/apollo-engine-reporting/src/extension.ts b/packages/apollo-engine-reporting/src/extension.ts index e8c67cb7f00..131bcb22271 100644 --- a/packages/apollo-engine-reporting/src/extension.ts +++ b/packages/apollo-engine-reporting/src/extension.ts @@ -50,8 +50,7 @@ export class EngineReportingExtension addTrace: (signature: string, operationName: string, trace: Trace) => void, ) { this.options = { - maskErrorDetails: false, - errorFilter: () => true, + filterErrors: error => error, ...options, }; this.addTrace = addTrace; @@ -262,18 +261,19 @@ export class EngineReportingExtension } } - // Always send the trace errors, so that the UI acknowledges that there is an error. - const errorInfo = this.options.maskErrorDetails - ? { message: '' } - : { - message: error.message, - location: (error.locations || []).map( - ({ line, column }) => new Trace.Location({ line, column }), - ), - json: JSON.stringify(error), - }; + const filteredError = this.options.filterErrors + ? this.options.filterErrors(error) + : error; + + if (filteredError) { + const errorInfo = { + message: filteredError.message, + location: (filteredError.locations || []).map( + ({ line, column }) => new Trace.Location({ line, column }), + ), + json: JSON.stringify(filteredError), + }; - if (!this.options.errorFilter || this.options.errorFilter(error)) { node!.error!.push(new Trace.Error(errorInfo)); } }); From 579842431e5979d327715f9198f410f0960ea935 Mon Sep 17 00:00:00 2001 From: GerA Date: Tue, 2 Oct 2018 14:03:53 +0200 Subject: [PATCH 4/4] allow filterErrors option to accept true --- packages/apollo-engine-reporting/src/agent.ts | 3 ++- packages/apollo-engine-reporting/src/extension.ts | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/apollo-engine-reporting/src/agent.ts b/packages/apollo-engine-reporting/src/agent.ts index a9d27f2a98c..d2fdb993dbd 100644 --- a/packages/apollo-engine-reporting/src/agent.ts +++ b/packages/apollo-engine-reporting/src/agent.ts @@ -90,7 +90,8 @@ export interface EngineReportingOptions { // a filter function to exclude specific errors from being reported by // returning null, or you can mask certain details of the error and return the // error to be reported. - filterErrors?: (err: GraphQLError) => GraphQLError | null; + // If set to 'true' instead of a function, it will mask the error details. + filterErrors?: ((err: GraphQLError) => GraphQLError | null) | boolean; /** * (Experimental) Creates the client information for operation traces. diff --git a/packages/apollo-engine-reporting/src/extension.ts b/packages/apollo-engine-reporting/src/extension.ts index 131bcb22271..1987adb948a 100644 --- a/packages/apollo-engine-reporting/src/extension.ts +++ b/packages/apollo-engine-reporting/src/extension.ts @@ -49,8 +49,18 @@ export class EngineReportingExtension options: EngineReportingOptions, addTrace: (signature: string, operationName: string, trace: Trace) => void, ) { + const filterErrors = (() => { + if (options.filterErrors === true) { + return (error: GraphQLError) => new GraphQLError('masked', error.nodes); + } else if (options.filterErrors) { + return options.filterErrors; + } else { + return (error: GraphQLError) => error; + } + })(); + this.options = { - filterErrors: error => error, + filterErrors, ...options, }; this.addTrace = addTrace;