spring-boot - Springboot Kickstart GraphQL - 每个解析器请求数的指标
问题描述
我目前正在 SpringBoot GraphQL kickstart 中尝试跟踪每个解析器方法被调用的次数。更具体地说,我想知道 my 的方法被调用了多少次GraphQLResolver<T>
。这将有两个实用程序:
- 跟踪已弃用的解析器是否仍在使用
- 知道哪些字段是最常用的,以便优化这些字段的数据库查询
为此,我使用schema directive wiring
.
@Component
class ResolverUsageCountInstrumentation(
private val meterRegistry: MeterRegistry
) : SchemaDirectiveWiring {
private val callsRecordingMap = ConcurrentHashMap<String, Int>()
override fun onField(environment: SchemaDirectiveWiringEnvironment<GraphQLFieldDefinition>): GraphQLFieldDefinition {
val fieldContainer = environment.fieldsContainer
val fieldDefinition = environment.fieldDefinition
val currentDF = environment.codeRegistry.getDataFetcher(fieldContainer, fieldDefinition)
if (currentDF.javaClass.name != "graphql.kickstart.tools.resolver.MethodFieldResolverDataFetcher") {
return fieldDefinition
}
val signature = getMethodSignature(unwrappedDF)
callsRecordingMap[signature] = 0
val newDF = DataFetcherFactories.wrapDataFetcher(currentDF) { dfe: DataFetchingEnvironment, value: Any? ->
callsRecordingMap.computeIfPresent(signature) { _, current: Int -> current + 1 }
value
}
environment.codeRegistry.dataFetcher(fieldContainer, fieldDefinition, newDF)
return fieldDefinition
}
private fun getMethodSignature(currentDF: DataFetcher<*>): String {
val method = getFieldVal(currentDF, "resolverMethod", true) as Method // nonapi.io.github.classgraph.utils.ReflectionUtils
return "${method.declaringClass.name}#${method.name}"
}
}
这种技术可以完成工作,但如果数据获取器被包装,则有一个很大的缺点是无法工作。除此之外,它一点也不干净。我想知道,有没有更好的方法来做到这一点?
谢谢!
解决方案
推荐阅读
- html - 如何在 Powershell 的 body 标记中将文本插入 HTML 文件
- spring-boot - 部署时 Maven 没有运行我的模拟测试
- android - 为什么在连接到 Databse 后我没有被重定向到 Android Studio 中的另一个活动
- amazon-web-services - AWS MSK:如何暂停?
- c# - Sparx Enterprise Architect (EA 14) 从 C# 的类模型生成代码,但它一直默认为 Java
- reactjs - 使用返回 API 调用但我的状态返回承诺的函数设置状态
- websocket - Nestjs Gateways websocket 作为客户端
- cypress - React 测试库功能测试以启动另一个 Cypress 测试
- android - 为什么任务':app:externalNativeBuildClean的执行失败?
- python - Redis 按键对数据库值进行排序