Как добавить инструментарий в GraphQL Java с graphql-spring-boot? - PullRequest
0 голосов
/ 30 января 2020

Кто-нибудь знает, как я могу добавить инструментарий для выполнения GraphQL при использовании graphql-spring-boot (https://github.com/graphql-java-kickstart/graphql-spring-boot)? Я знаю, как это возможно с plain-vanilla graphql- java: https://www.graphql-java.com/documentation/v13/instrumentation/

Однако я не знаю, как это сделать, когда используется graphql-spring-boot и берет на себя контроль над исполнением. Из-за отсутствия документации я попробовал это просто так:

@Service
public class GraphQLInstrumentationProvider implements InstrumentationProvider {
    @Override
    public Instrumentation getInstrumentation() {
        return SimpleInstrumentation.INSTANCE;
    }
}

Но метод getInstrumentation в моем компоненте InstrumentationProvider (как и ожидалось) никогда не вызывался. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 04 февраля 2020

Отвечая на мой собственный вопрос. Тем временем мне удалось сделать это следующим образом:

final class RequestLoggingInstrumentation extends SimpleInstrumentation {

    private static final Logger logger = LoggerFactory.getLogger(RequestLoggingInstrumentation.class);

    @Override
    public InstrumentationContext<ExecutionResult> beginExecution(InstrumentationExecutionParameters parameters) {
        long startMillis = System.currentTimeMillis();
        var executionId = parameters.getExecutionInput().getExecutionId();

        if (logger.isInfoEnabled()) {
            logger.info("GraphQL execution {} started", executionId);

            var query = parameters.getQuery();
            logger.info("[{}] query: {}", executionId, query);
            if (parameters.getVariables() != null && !parameters.getVariables().isEmpty()) {
                logger.info("[{}] variables: {}", executionId, parameters.getVariables());
            }
        }

        return new SimpleInstrumentationContext<>() {
            @Override
            public void onCompleted(ExecutionResult executionResult, Throwable t) {
                if (logger.isInfoEnabled()) {
                    long endMillis = System.currentTimeMillis();

                    if (t != null) {
                        logger.info("GraphQL execution {} failed: {}", executionId, t.getMessage(), t);
                    } else {
                        var resultMap = executionResult.toSpecification();
                        var resultJSON = ObjectMapper.pojoToJSON(resultMap).replace("\n", "\\n");
                        logger.info("[{}] completed in {}ms", executionId, endMillis - startMillis);
                        logger.info("[{}] result: {}", executionId, resultJSON);
                    }
                }
            }
        };
    }
}

@Service
class InstrumentationService {

    private final ContextFactory contextFactory;

    InstrumentationService(ContextFactory contextFactory) {
        this.contextFactory = contextFactory;
    }

    /**
     * Return all instrumentations as a bean.
     * The result will be used in class {@link com.oembedler.moon.graphql.boot.GraphQLWebAutoConfiguration}.
     */
    @Bean
    List<Instrumentation> instrumentations() {
        // Note: Due to a bug in GraphQLWebAutoConfiguration, the returned list has to be modifiable (it will be sorted)
        return new ArrayList<>(
                List.of(new RequestLoggingInstrumentation()));
    }
}

Это помогло мне взглянуть на класс GraphQLWebAutoConfiguration. Там я обнаружил, что фреймворк ожидает bean-компонент типа List<Instrumentation>, который содержит все инструментарии, которые будут добавлены к выполнению GraphQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...