diff --git a/src/plugins/graphql.js b/src/plugins/graphql.js index 6fe39d6c22d..72e5e11eedd 100644 --- a/src/plugins/graphql.js +++ b/src/plugins/graphql.js @@ -56,7 +56,7 @@ function wrapFields (fields, tracer, config, responsePathAsArray) { Object.keys(fields).forEach(key => { const field = fields[key] - if (typeof field.resolve === 'function') { + if (typeof field.resolve === 'function' && !field.resolve._datadog_patched) { field.resolve = wrapResolve(field.resolve, tracer, config, responsePathAsArray) } @@ -67,26 +67,34 @@ function wrapFields (fields, tracer, config, responsePathAsArray) { } function wrapResolve (resolve, tracer, config, responsePathAsArray) { - return function resolveWithTrace (source, args, contextValue, info) { - const path = responsePathAsArray(info.path) - const fieldParent = getFieldParent(contextValue, path) - const childOf = createSpan('graphql.field', tracer, config, fieldParent, path) - const deferred = defer(tracer) + if (resolve._datadog_patched) { + return resolve + } else { + const resolveWithTrace = function resolveWithTrace (source, args, contextValue, info) { + const path = responsePathAsArray(info.path) + const fieldParent = getFieldParent(contextValue, path) + const childOf = createSpan('graphql.field', tracer, config, fieldParent, path) + const deferred = defer(tracer) + + let result + + contextValue._datadog_fields[path.join('.')] = { + span: childOf, + parent: fieldParent + } - let result + tracer.trace('graphql.resolve', { childOf }, span => { + addTags(span, tracer, config, path) - contextValue._datadog_fields[path.join('.')] = { - span: childOf, - parent: fieldParent - } + result = call(resolve, this, arguments, deferred, err => finish(span, contextValue, path, err)) + }) - tracer.trace('graphql.resolve', { childOf }, span => { - addTags(span, tracer, config, path) + return result + } - result = call(resolve, this, arguments, deferred, err => finish(span, contextValue, path, err)) - }) + resolveWithTrace._datadog_patched = true - return result + return resolveWithTrace } } diff --git a/test/plugins/graphql.spec.js b/test/plugins/graphql.spec.js index c283cb79e75..5977d5885d5 100644 --- a/test/plugins/graphql.spec.js +++ b/test/plugins/graphql.spec.js @@ -63,6 +63,9 @@ describe('Plugin', () => { return Promise.resolve({}) } }, + person: { + type: Human + }, friends: { type: new graphql.GraphQLList(Human), resolve () {