Search code examples
node.jsgraphqlapollo-servertypegraphqlapollo-federation

How to differentiate between a resolver call from federation and from client?


I am working in a GraphQL project using node + typegraphql + apollo-server. My goal is to have specific metrics for regular queries, and separately, from federations. Is it possible to differentiate it in the server that is being requested and resolves the data?

By regular query I mean:

Client asks for User -> Apollo Gateway Server -> User Apollo Server resolves the User

And by a federated one I mean:

Client asks for Profile (which contains external User) -> Apollo Gateway Server -> User Apollo Server resolves the User

Apparently, this is possible using the DGS framework, @DgsQuery is for regular resolvers and @DgsEntityFetcher(name = "User") would work for the federation resolver.

The project related dependencies are:

"dependencies": {
    "@apollo/federation": "^0.30.0",
    "apollo-datasource-rest": "^3.1.1",
    "apollo-graphql": "^0.9.3",
    "apollo-server": "^3.1.2",
    "apollo-server-express": "^3.1.2",
    "graphql": "^15.5.1",
    "graphql-tag": "^2.12.5",
    "graphql-tools": "^8.1.0",
    "type-graphql": "^1.1.1"
  }

Solution

  • I ended up adding metrics inside the reference resolver, which is configured in the schema like the following:

    import { addResolversToSchema } from 'apollo-graphql';
    
    function resolveUserReference() {
      // Resolve User + metrics
    }
    const referenceResolvers = {
      User: { __resolveReference: resolveUserReference },
    };
    
    addResolversToSchema(yourFederatedSchema, referenceResolvers);