gpt4 book ai didi

spring-boot - GraphQL + Spring 启动 : how to collect (error) metrics?

转载 作者:行者123 更新时间:2023-12-05 02:57:54 25 4
gpt4 key购买 nike

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

我们正在使用 graphql-spring-boot网关的启动器。

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

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

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

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

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

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

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

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

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

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

最佳答案

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

希望对你有帮助。

关于spring-boot - GraphQL + Spring 启动 : how to collect (error) metrics?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59549130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com