当前位置: 首页 > 知识库问答 >
问题:

GraphQL+Spring Boot:如何收集(错误)度量?

空佐
2023-03-14

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

  • https://www.baeldung.com/spring-boot-actuators
  • https://docs.spring.io/spring-boot/docs/2.0.x/actuator-api/html/#metrics
  • https://github.com/graphql-java-kickstart/graphql-spring-boot#跟踪和度量

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

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

我将看到metricsgraphql.timer.query.count/graphql.timer.query.sum带有标记operationname=helloworldquery

它工作得很好,直到我想测试一个有错误的查询。我意识到没有与失败查询相关的度量/标记。例如,如果上面的查询返回null数据和一些GraphQL错误,我仍然会收集GraphQL.timer.query.count(operationname=helloworldquery),但是没有其他标记来告诉我该查询有错误。

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

我的问题是,如何解决上述问题?一般来说,收集GraphQL查询度量(包括错误)的最佳方式是什么?

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

2020-01-02我试图吸收我的CustomMetricsInstrumentation类,但没有成功。有内部自动配置布线,我不能在中间插入我的自动配置。

共有1个答案

岑驰
2023-03-14

您可以使用自己的实现重写默认的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);
    }
}

我的应用程序。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

 类似资料:
  • 注意:问题在于graphql-middleware-sentry没有转发错误。答案如下,并标记为正确答案。 我目前正在处理一个表单,在前端使用React和Apollo React钩子,在后端使用GraphQL-Yoga和Prisma的混合。变异工作很好,形式也可以。但是我不能在React中接收后端抛出的错误。 谁能给我一个指针,说明我应该如何将错误从后端传达到前端? 解析程序代码:

  • 我想向Web服务并行发送多个请求。结果应该由成功错误收集,然后可以由调用者进一步分析。 问题:我怎样才能收集所有响应,同时也收集在方法中抛出的异常? 我的目标不是返回两个列表:一个包含所有成功的响应,另一个包含错误。

  • 假设我的配置单元表包含以下值: 我正在使用。我在collect_list/collect_set或group_concat查询后出现此错误。 错误:org。阿帕奇。蜂箱服务cli。HiveSQLException:处理语句时出错:失败:执行错误,从组织返回代码2。阿帕奇。hadoop。蜂箱ql.exec。org的MapRedTask先生。阿帕奇。蜂箱服务cli。活动活动toSQLException

  • 有人能建议从节点集群收集指标的最佳模式吗(每个节点都是带有Java应用程序的Tomcat Docker容器)? 我们计划使用ELK堆栈(ElasticSearch、Logstash、Kibana)作为可视化工具,但我们的问题是如何将指标交付给Kibana? 我们使用DropWizard度量库,它提供每个实例的度量(量表、计时器、直方图)。 显然,应该收集每个实例的一些指标(例如,cpu、内存等..

  • 问题内容: 如何在视图中收集错误? 我不想使用HTML Helper验证摘要或验证消息。相反,我想检查是否有错误,是否有错误以特定格式显示。另外,在输入控件上,我想检查特定的属性错误并将类添加到输入中。 PS我正在使用Spark View Engine,但想法应该是相同的。 所以我想我可以做… 或类似的东西。 更新 我的最终解决方案如下所示: 如果此属性有错误,则仅添加错误CSS类。 问题答案:

  • 使用REST API和Spring启动Web测试客户端,我可以轻松地从返回的JSON中取回解析的对象,如下所示: 使用graphql,json被包装在如下数据属性中: 所以它不能和 因为JSON解析器以“数据”而不是“data.person”开头。 如何实现直接解析JSON结果并返回Person对象?