GraphQL + Spring Boot:如何收集(错误)指标?

最近我一直在努力在GraphQL网关中添加监视指标。

我们正在使用graphql-spring-boot入门作为网关。

阅读以下文档后,我设法将基本graphql.timer.query。*指标发送到Datadog

到目前为止,我已经实现的是,当我发送GraphQL查询/突变时,我将相应地收集请求计数和时间。例如在下面发送查询

C:\Users\iivoo\PycharmProjects\TEST\venv\Scripts>pip install auto-py-to-exe
Collecting auto-py-to-exe...

distutils.errors.DistutilsError: Setup script exited with error: command 'C:\\Program Files (x86)\\microsoft Visual Studio 14.0\\VC\\BIN\\cl.exe' failed with exit status 2

----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in C:\Users\iivoo\AppData\Local\Temp\pip-install-gf4x4k83\gevent\

我将看到带有标签query HelloWorldQuery { greeting( name: "Bob" ) { message } } 的指标graphql.timer.query.count / graphql.timer.query.sum

它工作得非常完美,直到我想测试一个有错误的查询。我意识到没有与失败查询相关的指标/标签。例如,如果上面的查询返回空数据和一些GraphQL错误,我仍然会收集operationName=HelloWorldQuery,但是没有其他标签可以告诉我该查询有错误。

在网关中,我实现了一个自定义graphql.timer.query.count (operationName=HelloWorldQuery),所以我在想也许应该在该类中添加错误计数器(通过MeterRegistry),但是我无法从中获取GraphQLErrorHandler GraphQLError类型。我能得到的最好的结果是error.getPath(),它给出方法名称(例如operationName)而不是自定义查询名称(greeting-与HelloWorldQuery提供的名称一致)。

我的问题是,如何解决以上问题? 通常,收集GraphQL查询指标(包括错误)的最佳方法是什么?

------------------- 更新 -------------------

2019-12-31 我阅读了有关GraphQL Instrumentation here的更多信息,并检查了graphql-spring-boot回购中的MetricsInstrumentation实现,我有一个想法,可以通过在其中添加错误度量来扩展MetricsInstrumentation类。

2020-01-02 我试图摄取CustomMetricsInstrumentation类,但是没有运气。内部有自动配置布线,我无法在中间插入自动配置。

yinghuochong512 回答:GraphQL + Spring Boot:如何收集(错误)指标?

您可以使用自己的实现覆盖默认的TracingInstrumentation。由于GraphQLInstrumentationAutoConfiguration类中的@ConditionalOnMissingBean批注,将自动选择它。这是一个简单的示例,其中添加了两个自定义指标: graphql.counter.query.success graphql.counter.query.error

@Component
public class CustomMetricsInstrumentation extends TracingInstrumentation {

    private static final String QUERY_STATUS_COUNTER_METRIC_NAME = "graphql.counter.query";
    private static final String OPERATION_NAME_TAG = "operationName";
    private static final String UNKNOWN_OPERATION_NAME = "unknown";

    private MeterRegistry meterRegistry;

    public CustomMetricsInstrumentation(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
    }

    @Override
    public CompletableFuture<ExecutionResult> instrumentExecutionResult(ExecutionResult executionResult,InstrumentationExecutionParameters parameters) {

        String status = CollectionUtils.isEmpty(executionResult.getErrors()) ? "success" : "error";
        String operation = parameters.getOperation() != null ? parameters.getOperation() : UNKNOWN_OPERATION_NAME;
        Collection<Tag> tags = Arrays.asList(Tag.of(OPERATION_NAME_TAG,operation));

        meterRegistry.counter(QUERY_STATUS_COUNTER_METRIC_NAME + "." + status,tags).increment();

        return super.instrumentExecutionResult(executionResult,parameters);
    }
}

我的application.yaml,以防万一:

graphql:
  servlet:
    tracing-enabled: true
    actuator-metrics: true
management:
  endpoint:
  metrics:
    enabled: true
  endpoints:
    web:
      exposure:
        include: health,metrics

我正在使用spring-boot-starter-parent:2.2.2.RELEASE,graphql-spring-boot-starter:6.0.0

我希望这会有所帮助。

本文链接:https://www.f2er.com/2835481.html

大家都在问