override fun instrumentDataFetcher()

in graphql-dgs-spring-boot-micrometer/src/main/kotlin/com/netflix/graphql/dgs/metrics/micrometer/DgsGraphQLMetricsInstrumentation.kt [145:194]


    override fun instrumentDataFetcher(
        dataFetcher: DataFetcher<*>,
        parameters: InstrumentationFieldFetchParameters,
        state: InstrumentationState,
    ): DataFetcher<*> {
        require(state is MetricsInstrumentationState)
        val gqlField = TagUtils.resolveDataFetcherTagValue(parameters)

        if (parameters.isTrivialDataFetcher ||
            state.isIntrospectionQuery ||
            TagUtils.shouldIgnoreTag(gqlField) ||
            !schemaProvider.isFieldMetricsInstrumentationEnabled(gqlField) ||
            !properties.resolver.enabled
        ) {
            return dataFetcher
        }

        return DataFetcher { environment ->
            val registry = registrySupplier.get()
            val baseTags =
                buildList {
                    add(Tag.of(GqlTag.FIELD.key, gqlField))
                    addAll(tagsProvider.getContextualTags())
                    addAll(state.tags())
                }

            val sampler = Timer.start(registry)
            try {
                val result = dataFetcher.get(environment)
                if (result is CompletionStage<*>) {
                    result.whenComplete { _, error ->
                        recordDataFetcherMetrics(
                            registry,
                            sampler,
                            state,
                            parameters,
                            error,
                            baseTags,
                        )
                    }
                } else {
                    recordDataFetcherMetrics(registry, sampler, state, parameters, null, baseTags)
                }
                result
            } catch (exc: Exception) {
                recordDataFetcherMetrics(registry, sampler, state, parameters, exc, baseTags)
                throw exc
            }
        }
    }