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