我最近一直在努力在我们的GraphQL网关中添加监视指标。
我们正在使用graphql-spring-boot入门作为网关。
阅读以下文档后,我设法将基本graphql.timer.query。*度量标准发送到Datadog
到目前为止,我已经实现了,当我发送GraphQL查询/变异时,我将相应地收集请求计数和时间。例如在下面发送查询]
query HelloWorldQuery {
greeting(
name: "Bob"
) {
message
}
}
我将看到带有标签graphql.timer.query.count
的指标graphql.timer.query.sum
/ operationName=HelloWorldQuery
它的工作原理非常完美,直到我要测试有错误的查询。我意识到没有与失败查询相关的指标/标签。例如,如果我上面的查询返回空数据和一些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回购中的MetricsInstrumentation实现,我有一个想法,可以通过在其中添加错误度量来扩展MetricsInstrumentation类。
2020-01-02我尝试摄取我的CustomMetricsInstrumentation类,但是没有运气。内部有自动配置布线,我无法在中间插入自动配置。
您可以使用自己的实现覆盖默认的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
希望对您有帮助。