diff --git a/package-lock.json b/package-lock.json index 7b83de9b06c..e958786947a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ ], "devDependencies": { "@apollo/client": "3.7.1", - "@apollo/gateway": "2.1.4", + "@apollo/gateway": "https://output.circle-artifacts.com/output/job/3ea84c49-ca22-4dba-be5d-31004cf8d66a/artifacts/0/storage/@apollo/gateway/gateway-2.1.4.tgz", "@apollo/server-plugin-landing-page-graphql-playground": "4.0.0", "@apollo/subgraph": "2.1.4", "@apollo/utils.createhash": "1.1.0", @@ -181,14 +181,15 @@ }, "node_modules/@apollo/gateway": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@apollo/gateway/-/gateway-2.1.4.tgz", - "integrity": "sha512-EIKHZFdaaNEzySs48b7r6BEXVTiS4pi/yI2OVPWkEUbkVnk7NPlQNIhDXtxSeIgEY1l79PEZ9Jw09QqtjTFoTg==", + "resolved": "https://output.circle-artifacts.com/output/job/3ea84c49-ca22-4dba-be5d-31004cf8d66a/artifacts/0/storage/@apollo/gateway/gateway-2.1.4.tgz", + "integrity": "sha512-zKtJ4VBCLc8uCXIwrCw/B6OF90INhkDsxh2s1eXEPnnMZp8FgZ6HWRhQLcHCNZpJBR8bCivIsCwXv0aqxJoppA==", "dev": true, + "license": "SEE LICENSE IN ./LICENSE", "dependencies": { "@apollo/composition": "^2.1.4", "@apollo/federation-internals": "^2.1.4", "@apollo/query-planner": "^2.1.4", - "@apollo/server-gateway-interface": "^1.0.2", + "@apollo/server-gateway-interface": "https://pkg.csb.dev/apollographql/apollo-server/commit/515ae7f7/@apollo/server-gateway-interface", "@apollo/usage-reporting-protobuf": "^4.0.0", "@apollo/utils.createhash": "^1.1.0", "@apollo/utils.fetcher": "^1.1.0", @@ -211,6 +212,35 @@ "graphql": "^16.5.0" } }, + "node_modules/@apollo/gateway/node_modules/@apollo/server-gateway-interface": { + "version": "1.0.5", + "resolved": "https://pkg.csb.dev/apollographql/apollo-server/commit/515ae7f7/@apollo/server-gateway-interface", + "integrity": "sha512-6mT2rOpjsWcoeEEMIWl6MhQ6cXY8cnqekCmLlJs5yoxY30fMWFOFkjiPN4euP3qYS21HN3JIkzd5bnmtdNKOog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@apollo/usage-reporting-protobuf": "https://pkg.csb.dev/apollographql/apollo-server/commit/515ae7f7/@apollo/usage-reporting-protobuf", + "@apollo/utils.fetcher": "^1.0.0", + "@apollo/utils.keyvaluecache": "^1.0.1", + "@apollo/utils.logger": "^1.0.0" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "graphql": "14.x || 15.x || 16.x" + } + }, + "node_modules/@apollo/gateway/node_modules/@apollo/usage-reporting-protobuf": { + "version": "4.0.2", + "resolved": "https://pkg.csb.dev/apollographql/apollo-server/commit/515ae7f7/@apollo/usage-reporting-protobuf", + "integrity": "sha512-uY+dQY+ZgvgIec8LaE92uJ9BZJv01ahg1OktjpWX3tUT0F9/x0mcUjvnyb73+fvho1qS9NHbjK18h6zR4zKYZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@apollo/protobufjs": "1.2.7" + } + }, "node_modules/@apollo/gateway/node_modules/lru-cache": { "version": "7.14.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", @@ -14071,15 +14101,14 @@ } }, "@apollo/gateway": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@apollo/gateway/-/gateway-2.1.4.tgz", - "integrity": "sha512-EIKHZFdaaNEzySs48b7r6BEXVTiS4pi/yI2OVPWkEUbkVnk7NPlQNIhDXtxSeIgEY1l79PEZ9Jw09QqtjTFoTg==", + "version": "https://output.circle-artifacts.com/output/job/3ea84c49-ca22-4dba-be5d-31004cf8d66a/artifacts/0/storage/@apollo/gateway/gateway-2.1.4.tgz", + "integrity": "sha512-zKtJ4VBCLc8uCXIwrCw/B6OF90INhkDsxh2s1eXEPnnMZp8FgZ6HWRhQLcHCNZpJBR8bCivIsCwXv0aqxJoppA==", "dev": true, "requires": { "@apollo/composition": "^2.1.4", "@apollo/federation-internals": "^2.1.4", "@apollo/query-planner": "^2.1.4", - "@apollo/server-gateway-interface": "^1.0.2", + "@apollo/server-gateway-interface": "https://pkg.csb.dev/apollographql/apollo-server/commit/515ae7f7/@apollo/server-gateway-interface", "@apollo/usage-reporting-protobuf": "^4.0.0", "@apollo/utils.createhash": "^1.1.0", "@apollo/utils.fetcher": "^1.1.0", @@ -14096,6 +14125,26 @@ "node-fetch": "^2.6.7" }, "dependencies": { + "@apollo/server-gateway-interface": { + "version": "https://pkg.csb.dev/apollographql/apollo-server/commit/515ae7f7/@apollo/server-gateway-interface", + "integrity": "sha512-6mT2rOpjsWcoeEEMIWl6MhQ6cXY8cnqekCmLlJs5yoxY30fMWFOFkjiPN4euP3qYS21HN3JIkzd5bnmtdNKOog==", + "dev": true, + "requires": { + "@apollo/usage-reporting-protobuf": "https://pkg.csb.dev/apollographql/apollo-server/commit/515ae7f7/@apollo/usage-reporting-protobuf", + "@apollo/utils.fetcher": "^1.0.0", + "@apollo/utils.keyvaluecache": "^1.0.1", + "@apollo/utils.logger": "^1.0.0" + } + }, + "@apollo/usage-reporting-protobuf": { + "version": "4.0.2", + "resolved": "https://pkg.csb.dev/apollographql/apollo-server/commit/515ae7f7/@apollo/usage-reporting-protobuf", + "integrity": "sha512-uY+dQY+ZgvgIec8LaE92uJ9BZJv01ahg1OktjpWX3tUT0F9/x0mcUjvnyb73+fvho1qS9NHbjK18h6zR4zKYZA==", + "dev": true, + "requires": { + "@apollo/protobufjs": "1.2.7" + } + }, "lru-cache": { "version": "7.14.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", diff --git a/package.json b/package.json index 60bba23ab59..c1a2f234dab 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ }, "devDependencies": { "@apollo/client": "3.7.1", - "@apollo/gateway": "2.1.4", + "@apollo/gateway": "https://output.circle-artifacts.com/output/job/3ea84c49-ca22-4dba-be5d-31004cf8d66a/artifacts/0/storage/@apollo/gateway/gateway-2.1.4.tgz", "@apollo/server-plugin-landing-page-graphql-playground": "4.0.0", "@apollo/subgraph": "2.1.4", "@apollo/utils.createhash": "1.1.0", diff --git a/packages/server/src/__tests__/plugin/usageReporting/statsErrors.test.ts b/packages/server/src/__tests__/plugin/usageReporting/statsErrors.test.ts index b701bf4343d..9c693535485 100644 --- a/packages/server/src/__tests__/plugin/usageReporting/statsErrors.test.ts +++ b/packages/server/src/__tests__/plugin/usageReporting/statsErrors.test.ts @@ -75,12 +75,12 @@ describe('TODO', () => { "publicCacheTtlCount": [], "registeredOperationCount": 0, "requestCount": 1, - "requestsWithErrorsCount": 0, + "requestsWithErrorsCount": 1, "requestsWithoutFieldInstrumentation": 1, "rootErrorStats": { "children": {}, - "errorsCount": 0, - "requestsWithErrorsCount": 0, + "errorsCount": 2, + "requestsWithErrorsCount": 1, }, } `); @@ -173,8 +173,8 @@ describe('TODO', () => { "requestsWithErrorsCount": 0, }, }, - "errorsCount": 0, - "requestsWithErrorsCount": 0, + "errorsCount": 1, + "requestsWithErrorsCount": 1, }, } `); diff --git a/packages/server/src/plugin/inlineTrace/index.ts b/packages/server/src/plugin/inlineTrace/index.ts index fa2de0215b8..2f001ed8ac1 100644 --- a/packages/server/src/plugin/inlineTrace/index.ts +++ b/packages/server/src/plugin/inlineTrace/index.ts @@ -105,6 +105,7 @@ export function ApolloServerPluginInlineTrace( }, async didEncounterErrors({ errors }) { + // FIXME: do I need to filter out errors that have a `serviceName` here as well? treeBuilder.didEncounterErrors(errors); }, diff --git a/packages/server/src/plugin/traceTreeBuilder.ts b/packages/server/src/plugin/traceTreeBuilder.ts index 4d796cbc0e0..62baaac03ed 100644 --- a/packages/server/src/plugin/traceTreeBuilder.ts +++ b/packages/server/src/plugin/traceTreeBuilder.ts @@ -105,16 +105,6 @@ export class TraceTreeBuilder { public didEncounterErrors(errors: readonly GraphQLError[]) { errors.forEach((err) => { - // This is an error from a federated service. We will already be reporting - // it in the nested Trace in the query plan. - // - // XXX This probably shouldn't skip query or validation errors, which are - // not in nested Traces because format() isn't called in this case! Or - // maybe format() should be called in that case? - if (err.extensions?.serviceName) { - return; - } - // In terms of reporting, errors can be re-written by the user by // utilizing the `transformError` parameter. This allows changing // the message or stack to remove potentially sensitive information. diff --git a/packages/server/src/plugin/usageReporting/plugin.ts b/packages/server/src/plugin/usageReporting/plugin.ts index 1461b16d0a0..79e3b1bc9eb 100644 --- a/packages/server/src/plugin/usageReporting/plugin.ts +++ b/packages/server/src/plugin/usageReporting/plugin.ts @@ -551,6 +551,7 @@ export function ApolloServerPluginUsageReporting( }, async didEncounterSubsequentErrors(_requestContext, errors) { + // FIXME: do I need to filter out errors that have a `serviceName` here as well? treeBuilder.didEncounterErrors(errors); }, @@ -564,8 +565,19 @@ export function ApolloServerPluginUsageReporting( // Search above for a comment about "didResolveSource" to see which // of the pre-source-resolution errors we are intentionally avoiding. if (!didResolveSource) return; - if (requestContext.errors) { - treeBuilder.didEncounterErrors(requestContext.errors); + + if (requestContext.metrics.nonFtv1Errors) { + treeBuilder.didEncounterErrors(requestContext.metrics.nonFtv1Errors); + } else if (requestContext.errors) { + treeBuilder.didEncounterErrors(requestContext.errors.filter(error => { + // This is an error from a federated service. We will already be reporting + // it in the nested Trace in the query plan. + // + // XXX This probably shouldn't skip query or validation errors, which are + // not in nested Traces because format() isn't called in this case! Or + // maybe format() should be called in that case? + return !error.extensions?.serviceName; + })); } // If there isn't any defer/stream coming later, we're done. @@ -708,7 +720,8 @@ export function ApolloServerPluginUsageReporting( asTrace: sendTraces && (!isExecutable || !!metrics.captureTraces) && - sendOperationAsTrace(trace, statsReportKey), + sendOperationAsTrace(trace, statsReportKey) && + !metrics.nonFtv1Errors?.length, referencedFieldsByType, });