Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error propagation, missing field response #1686

Closed
o0Ignition0o opened this issue Sep 2, 2022 · 2 comments
Closed

Error propagation, missing field response #1686

o0Ignition0o opened this issue Sep 2, 2022 · 2 comments

Comments

@o0Ignition0o
Copy link
Contributor

I just tried to compare the router and the gateway's behavior if a subgraph returns an error:

CURL command:

curl --request POST \
    --header 'content-type: application/json' \
    --url http://localhost:<ROUTER_OR_GATEWAY_PORT> \
    --data '{"query":"query Me {\n  me {\n    name\n    username\n  }\n}"}' | jq

gateway response:

{
  "errors": [
    {
      "message": "400: Bad Request",
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "response": {
          "url": "http://localhost:8000/",
          "status": 400,
          "statusText": "Bad Request",
          "body": {
            "errors": [
              {
                "message": "Cannot query field \"me\" on type \"Query\".",
                "extensions": {
                  "code": "GRAPHQL_VALIDATION_FAILED",
                  "exception": {
                    "stacktrace": [
                      "GraphQLError: Cannot query field \"me\" on type \"Query\".",
                      "    at Object.Field (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js:51:13)",
                      "    at Object.enter (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/language/visitor.js:301:32)",
                      "    at Object.enter (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/utilities/TypeInfo.js:391:27)",
                      "    at visit (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/language/visitor.js:197:21)",
                      "    at validate (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/validation/validate.js:91:24)",
                      "    at validate (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/apollo-server-core/dist/requestPipeline.js:186:39)",
                      "    at processGraphQLRequest (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/apollo-server-core/dist/requestPipeline.js:98:34)",
                      "    at processTicksAndRejections (node:internal/process/task_queues:96:5)",
                      "    at async processHTTPRequest (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/apollo-server-core/dist/runHttpQuery.js:220:30)"
                    ]
                  }
                }
              }
            ]
          }
        },
        "exception": {
          "stacktrace": [
            "Error: 400: Bad Request",
            "    at RemoteGraphQLDataSource.errorFromResponse (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/datasources/RemoteGraphQLDataSource.js:158:21)",
            "    at RemoteGraphQLDataSource.sendRequest (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/datasources/RemoteGraphQLDataSource.js:98:34)",
            "    at processTicksAndRejections (node:internal/process/task_queues:96:5)",
            "    at async RemoteGraphQLDataSource.process (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/datasources/RemoteGraphQLDataSource.js:73:26)",
            "    at async sendOperation (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/executeQueryPlan.js:225:26)",
            "    at async /Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/executeQueryPlan.js:166:49",
            "    at async executeNode (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/executeQueryPlan.js:129:17)",
            "    at async /Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/executeQueryPlan.js:29:35",
            "    at async /Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/@apollo/gateway/dist/index.js:124:38",
            "    at async execute (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/gateway/node_modules/apollo-server-core/dist/requestPipeline.js:202:20)"
          ]
        }
      }
    }
  ],
  "data": {
    "me": null
  }
}

router response:

{
  "data": null,
  "errors": [
    {
      "message": "Cannot query field \"me\" on type \"Query\".",
      "locations": [],
      "path": null,
      "extensions": {
        "code": "GRAPHQL_VALIDATION_FAILED",
        "exception": {
          "stacktrace": [
            "GraphQLError: Cannot query field \"me\" on type \"Query\".",
            "    at Object.Field (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.js:51:13)",
            "    at Object.enter (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/language/visitor.js:301:32)",
            "    at Object.enter (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/utilities/TypeInfo.js:391:27)",
            "    at visit (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/language/visitor.js:197:21)",
            "    at validate (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/graphql/validation/validate.js:91:24)",
            "    at validate (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/apollo-server-core/dist/requestPipeline.js:186:39)",
            "    at processGraphQLRequest (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/apollo-server-core/dist/requestPipeline.js:98:34)",
            "    at processTicksAndRejections (node:internal/process/task_queues:96:5)",
            "    at async processHTTPRequest (/Users/ignition/projects/apollo/router/dockerfiles/federation2-demo/subgraphs/users/node_modules/apollo-server-core/dist/runHttpQuery.js:220:30)"
          ]
        }
      }
    }
  ]
}

The "response" field is missing in the router, I suspect it's because of the way we deal with errors in the include_subgraph_errors plugin.

Originally posted by @o0Ignition0o in #1664 (comment)

@abernix
Copy link
Member

abernix commented Oct 17, 2022

I think we need to decide if we want response to be returned or not?

@abernix
Copy link
Member

abernix commented Oct 25, 2022

I'm going to close this because I think the router behavior seems correct and I'm not convinced we actually want to return the response from subgraphs in the way that the Gateway was doing it. In the future, we may want to consider exposing the HTTP-related details more specifically, but that always seemed like a bit of a leaky abstraction anyway.

Happy to-reconsider!

@abernix abernix closed this as not planned Won't fix, can't repro, duplicate, stale Oct 25, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants