Springboot Kickstart GraphQL - метрики количества запросов на преобразователь
В настоящее время я пытаюсь в кикстарте SpringBoot GraphQL отслеживать количество вызовов каждого метода преобразователя. Чтобы быть более конкретным, я хочу точно знать, сколько раз методы моего
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}"
}
}
Этот метод работает, но имеет большой недостаток, заключающийся в том, что он не работает, если сборщик данных обернут. К тому же он совсем не чистый. Мне интересно, есть ли способ сделать это лучше?
Спасибо!