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}"
    }
}

Этот метод работает, но имеет большой недостаток, заключающийся в том, что он не работает, если сборщик данных обернут. К тому же он совсем не чистый. Мне интересно, есть ли способ сделать это лучше?

Спасибо!

0 ответов

Другие вопросы по тегам