Skip to content

Commit 7ff39bc

Browse files
committed
integrate and useOnResolve
1 parent 2482099 commit 7ff39bc

File tree

16 files changed

+143
-445
lines changed

16 files changed

+143
-445
lines changed

packages/plugins/apollo-tracing/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"definition": "dist/typings/index.d.ts"
4848
},
4949
"dependencies": {
50+
"@envelop/on-resolve": "^1.0.0",
5051
"apollo-tracing": "^0.15.0"
5152
},
5253
"devDependencies": {

packages/plugins/apollo-tracing/src/index.ts

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Plugin, handleStreamOrSingleExecutionResult } from '@envelop/core';
2+
import { useOnResolve } from '@envelop/on-resolve';
23
import { TracingFormat } from 'apollo-tracing';
34
import { GraphQLType, ResponsePath, responsePathAsArray } from 'graphql';
4-
import { prepareTracedSchema } from './traced-schema.js';
55

66
const HR_TO_NS = 1e9;
77
const NS_TO_MS = 1e6;
@@ -43,23 +43,22 @@ type TracingContextObject = {
4343
export const useApolloTracing = (): Plugin => {
4444
return {
4545
onSchemaChange: ({ schema }) => {
46-
prepareTracedSchema(schema);
47-
},
48-
onResolverCalled: ({ info, context }) => {
49-
const ctx = context[apolloTracingSymbol] as TracingContextObject;
50-
// Taken from https://github.com/apollographql/apollo-server/blob/main/packages/apollo-tracing/src/index.ts
51-
const resolverCall: ResolverCall = {
52-
path: info.path,
53-
fieldName: info.fieldName,
54-
parentType: info.parentType,
55-
returnType: info.returnType,
56-
startOffset: process.hrtime(ctx.hrtime),
57-
};
46+
useOnResolve<TracingContextObject>(schema, ({ info, context }) => {
47+
const ctx = context[apolloTracingSymbol] as TracingContextObject;
48+
// Taken from https://github.com/apollographql/apollo-server/blob/main/packages/apollo-tracing/src/index.ts
49+
const resolverCall: ResolverCall = {
50+
path: info.path,
51+
fieldName: info.fieldName,
52+
parentType: info.parentType,
53+
returnType: info.returnType,
54+
startOffset: process.hrtime(ctx.hrtime),
55+
};
5856

59-
return () => {
60-
resolverCall.endOffset = process.hrtime(ctx.hrtime);
61-
ctx.resolversTiming.push(resolverCall);
62-
};
57+
return () => {
58+
resolverCall.endOffset = process.hrtime(ctx.hrtime);
59+
ctx.resolversTiming.push(resolverCall);
60+
};
61+
});
6362
},
6463
onExecute(onExecuteContext) {
6564
const ctx: TracingContextObject = {

packages/plugins/apollo-tracing/src/traced-schema.ts

Lines changed: 0 additions & 75 deletions
This file was deleted.

packages/plugins/newrelic/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@
4646
"typescript": {
4747
"definition": "dist/typings/index.d.ts"
4848
},
49-
"dependencies": {},
49+
"dependencies": {
50+
"@envelop/on-resolve": "^1.0.0"
51+
},
5052
"devDependencies": {
5153
"@types/newrelic": "7.0.3",
5254
"graphql": "16.3.0",

packages/plugins/newrelic/src/index.ts

Lines changed: 41 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { Plugin, OnResolverCalledHook, Path, isAsyncIterable, DefaultContext } from '@envelop/core';
1+
import { Plugin, Path, isAsyncIterable, DefaultContext } from '@envelop/core';
2+
// import { OnResolve, useOnResolve } from '@envelop/on-resolve';
23
import { print, FieldNode, Kind, OperationDefinitionNode, ExecutionResult, GraphQLError } from 'graphql';
34

45
enum AttributeName {
@@ -125,56 +126,47 @@ export const useNewRelic = (rawOptions?: UseNewRelicOptions): Plugin => {
125126

126127
const operationSegment = instrumentationApi.getActiveSegment();
127128

128-
const onResolverCalled: OnResolverCalledHook | undefined = options.trackResolvers
129-
? async ({ args: resolversArgs, info }) => {
130-
const logger = await logger$;
131-
const { returnType, path, parentType } = info;
132-
const formattedPath = flattenPath(path, delimiter);
133-
const currentSegment = instrumentationApi.getActiveSegment();
134-
135-
if (!currentSegment) {
136-
logger.trace('No active segment found at resolver call. Not recording resolver (%s).', formattedPath);
137-
return () => {};
138-
}
139-
140-
const resolverSegment = instrumentationApi.createSegment(
141-
`resolver${delimiter}${formattedPath}`,
142-
null,
143-
operationSegment
144-
);
145-
146-
if (!resolverSegment) {
147-
logger.trace('Resolver segment was not created (%s).', formattedPath);
148-
return () => {};
149-
}
150-
151-
resolverSegment.start();
152-
153-
resolverSegment.addAttribute(AttributeName.RESOLVER_FIELD_PATH, formattedPath);
154-
resolverSegment.addAttribute(AttributeName.RESOLVER_TYPE_NAME, parentType.toString());
155-
resolverSegment.addAttribute(AttributeName.RESOLVER_RESULT_TYPE, returnType.toString());
156-
157-
if (options.includeResolverArgs) {
158-
const rawArgs = resolversArgs || {};
159-
const resolverArgsToTrack = options.isResolverArgsRegex
160-
? filterPropertiesByRegex(rawArgs, options.includeResolverArgs as RegExp)
161-
: rawArgs;
162-
163-
resolverSegment.addAttribute(AttributeName.RESOLVER_ARGS, JSON.stringify(resolverArgsToTrack));
164-
}
165-
166-
return ({ result }) => {
167-
if (options.includeRawResult) {
168-
resolverSegment.addAttribute(AttributeName.RESOLVER_RESULT, JSON.stringify(result));
169-
}
170-
171-
resolverSegment.end();
172-
};
173-
}
174-
: undefined;
129+
if (options.trackResolvers) {
130+
// TODO: cant rewrap, figure out better approach
131+
// useOnResolve(args.schema, async ({ args: resolversArgs, info }) => {
132+
// const logger = await logger$;
133+
// const { returnType, path, parentType } = info;
134+
// const formattedPath = flattenPath(path, delimiter);
135+
// const currentSegment = instrumentationApi.getActiveSegment();
136+
// if (!currentSegment) {
137+
// logger.trace('No active segment found at resolver call. Not recording resolver (%s).', formattedPath);
138+
// return () => {};
139+
// }
140+
// const resolverSegment = instrumentationApi.createSegment(
141+
// `resolver${delimiter}${formattedPath}`,
142+
// null,
143+
// operationSegment
144+
// );
145+
// if (!resolverSegment) {
146+
// logger.trace('Resolver segment was not created (%s).', formattedPath);
147+
// return () => {};
148+
// }
149+
// resolverSegment.start();
150+
// resolverSegment.addAttribute(AttributeName.RESOLVER_FIELD_PATH, formattedPath);
151+
// resolverSegment.addAttribute(AttributeName.RESOLVER_TYPE_NAME, parentType.toString());
152+
// resolverSegment.addAttribute(AttributeName.RESOLVER_RESULT_TYPE, returnType.toString());
153+
// if (options.includeResolverArgs) {
154+
// const rawArgs = resolversArgs || {};
155+
// const resolverArgsToTrack = options.isResolverArgsRegex
156+
// ? filterPropertiesByRegex(rawArgs, options.includeResolverArgs as RegExp)
157+
// : rawArgs;
158+
// resolverSegment.addAttribute(AttributeName.RESOLVER_ARGS, JSON.stringify(resolverArgsToTrack));
159+
// }
160+
// return ({ result }) => {
161+
// if (options.includeRawResult) {
162+
// resolverSegment.addAttribute(AttributeName.RESOLVER_RESULT, JSON.stringify(result));
163+
// }
164+
// resolverSegment.end();
165+
// };
166+
// });
167+
}
175168

176169
return {
177-
onResolverCalled,
178170
onExecuteDone({ result }) {
179171
const sendResult = (singularResult: ExecutionResult) => {
180172
if (singularResult.data && options.includeRawResult) {

packages/plugins/opentelemetry/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"definition": "dist/typings/index.d.ts"
4848
},
4949
"dependencies": {
50+
"@envelop/on-resolve": "^1.0.0",
5051
"@opentelemetry/api": "^1.0.0",
5152
"@opentelemetry/tracing": "^0.24.0"
5253
},

packages/plugins/opentelemetry/src/index.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Plugin, OnExecuteHookResult, isAsyncIterable } from '@envelop/core';
2+
import { useOnResolve } from '@envelop/on-resolve';
23
import { SpanAttributes, SpanKind } from '@opentelemetry/api';
34
import * as opentelemetry from '@opentelemetry/api';
45
import { BasicTracerProvider, ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing';
56
import { print } from 'graphql';
6-
import { prepareTracedSchema } from './traced-schema.js';
77

88
export enum AttributeName {
99
EXECUTION_ERROR = 'graphql.execute.error',
@@ -47,10 +47,8 @@ export const useOpenTelemetry = (
4747

4848
return {
4949
onSchemaChange: async ({ schema }) => {
50-
prepareTracedSchema(schema);
51-
},
52-
onResolverCalled: options.resolvers
53-
? ({ info, context, args }) => {
50+
if (options.resolvers) {
51+
useOnResolve(schema, ({ info, context, args }) => {
5452
if (context && typeof context === 'object' && context[tracingSpanSymbol]) {
5553
tracer.getActiveSpanProcessor();
5654
const ctx = opentelemetry.trace.setSpan(opentelemetry.context.active(), context[tracingSpanSymbol]);
@@ -82,8 +80,9 @@ export const useOpenTelemetry = (
8280
}
8381

8482
return () => {};
85-
}
86-
: undefined,
83+
});
84+
}
85+
},
8786
onExecute({ args, extendContext }) {
8887
const executionSpan = tracer.startSpan(`${args.operationName || 'Anonymous Operation'}`, {
8988
kind: spanKind,

packages/plugins/opentelemetry/src/traced-schema.ts

Lines changed: 0 additions & 75 deletions
This file was deleted.

packages/plugins/prometheus/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@
4646
"typescript": {
4747
"definition": "dist/typings/index.d.ts"
4848
},
49+
"dependencies": {
50+
"@envelop/on-resolve": "^1.0.0"
51+
},
4952
"devDependencies": {
5053
"prom-client": "14.0.1",
5154
"@graphql-tools/schema": "8.5.0",

0 commit comments

Comments
 (0)