Как я могу записать название и продолжительность резолвера / операции в HotChocolate?

Я пытаюсь записать некоторые основные сведения о методе gql - имя и продолжительность резолвера / операции. I've started looking at using .AddHttpRequestInterceptor((context, executor, builder, ct) и получаю информацию от построителя, но даже несмотря на то, что я вижу это в отладчике, имя метода скрыто в закрытых членах, например: ((HotChocolate.Execution.QueryRequestBuilder)builder)._query.Document.Definitions[0].SelectionSet.Selections[0].Name.Value

Я уверен, что есть более простой и лучший способ подключиться к конвейеру, чтобы получить имя метода и зарегистрировать его с продолжительностью вызова.

Я нашел статью о GraphQL.Net, в которой используется DefaultGraphQLExecuter - public class GraphQLExecutorWithDiagnostics<TSchema> : DefaultGraphQLExecuter<TSchema>, который предоставляет параметр operationName в Task<ExecutionResult> ExecuteAsync(, что выглядит идеально.

Я буду регистрироваться в AppInsights, но пока это не актуально, я просто хочу сначала получить информацию. Я использую v11.0.8


person Pascal Senn    schedule 19.01.2021    source источник


Ответы (1)


Вы ищете DiagnosticEventListener

Вы можете просто расширить этот базовый класс и переопределить методы, необходимые для ведения журнала.

public class CustomDiagnosticListener : DiagnosticEventListener
{
    public override IActivityScope ExecuteRequest(IRequestContext context)
    {
        return EmptyScope;
    }

    public virtual IActivityScope ResolveFieldValue(IMiddlewareContext context)
    {
        return EmptyScope;
    }
}

Чтобы использовать этот диагностический приемник, вы должны добавить его в схему

services.AddGraphQLServer()
    ...
   .AddDiagnosticEventListener<CustomDiagnosticListener>()

Если у вас есть зависимости, которые ваш слушатель должен повторно полюбить, вам нужно восстановить их вручную:

services.AddGraphQLServer()
    ...
   .AddDiagnosticEventListener<CustomDiagnosticListener>(
         sp => new CustomDiagnosticListener(
                sp.GetApplicationService<MyDependency>()))
person Pascal Senn    schedule 19.01.2021