【问题标题】:GraphQL + Spring Boot: how to collect (error) metrics?GraphQL + Spring Boot:如何收集(错误)指标?
【发布时间】:2020-04-20 06:42:51
【问题描述】:

我最近一直致力于在我们的 GraphQL 网关中添加监控指标。

我们正在为网关使用graphql-spring-boot starter。

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

到目前为止,我所取得的成就是,当我发送 GraphQL 查询/突变时,我会相应地收集请求计数和时间。例如发送下面的查询

query HelloWorldQuery {
  greeting(
    name: "Bob"
  ) {
    message
  }
}

我会看到带有标签operationName=HelloWorldQuery 的指标graphql.timer.query.count / graphql.timer.query.sum

在我想测试有错误的查询之前,它工作得非常好。我意识到没有与失败查询相关的指标/标签。例如,如果我上面的查询返回空数据和一些 GraphQL 错误,我仍然会收集 graphql.timer.query.count (operationName=HelloWorldQuery),但没有额外的标签告诉我该查询有错误。

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

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

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

2019-12-31 我阅读了更多关于 GraphQL Instrumentation here 并检查了 graphql-spring-boot repo 中的 MetricsInstrumentation 实现,我有一个想法,通过在其中添加错误指标来扩展 MetricsInstrumentation 类。

2020-01-02 我试图摄取我的 CustomMetricsInstrumentation 类,但没有运气。有内部自动配置接线,我不能在中间插入我的自动配置。

【问题讨论】:

    标签: spring-boot graphql spring-boot-actuator datadog spring-micrometer


    【解决方案1】:

    您可以使用自己的实现覆盖默认的TracingInstrumentation。由于GraphQLInstrumentationAutoConfiguration 类中的@ConditionalOnMissingBean 注释,它将被自动选择。这是一个添加两个自定义指标的简单示例:graphql.counter.query.successgraphql.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

    希望对你有帮助。

    【讨论】:

    猜你喜欢
    • 2019-05-15
    • 2019-11-21
    • 2020-09-16
    • 2022-06-30
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多