Skip to content

Commit 27c06e3

Browse files
committed
move over wrapfetchwith hooks
1 parent 4d8c23d commit 27c06e3

File tree

9 files changed

+183
-92
lines changed

9 files changed

+183
-92
lines changed

packages/fusion-runtime/src/federation/supergraph.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import { LegacyLogger } from '@graphql-hive/logger';
1+
import { LegacyLogger, Logger } from '@graphql-hive/logger';
22
import type { YamlConfig } from '@graphql-mesh/types';
33
import {
44
getInContextSDK,
5-
requestIdByRequest,
65
resolveAdditionalResolversWithoutImport,
76
} from '@graphql-mesh/utils';
87
import type {
@@ -307,13 +306,7 @@ export const handleFederationSupergraph: UnifiedGraphHandler = function ({
307306
delegationPlanBuilder = newDelegationPlanBuilder;
308307
}
309308
const onDelegationPlanDoneHooks: OnDelegationPlanDoneHook[] = [];
310-
let requestId: string | undefined;
311-
if (context?.request) {
312-
requestId = requestIdByRequest.get(context.request);
313-
if (requestId) {
314-
log = log.child({ requestId });
315-
}
316-
}
309+
let log = context.log as Logger;
317310
if (sourceSubschema.name) {
318311
log = log.child({
319312
subgraph: sourceSubschema.name,

packages/fusion-runtime/src/utils.ts

Lines changed: 20 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { getInstrumented } from '@envelop/instrumentation';
2-
import { LegacyLogger, type Logger } from '@graphql-hive/logger';
2+
import type { Logger } from '@graphql-hive/logger';
3+
import { loggerForRequest } from '@graphql-hive/logger/request';
34
import {
45
defaultPrintFn,
56
type Transport,
@@ -8,12 +9,7 @@ import {
89
type TransportGetSubgraphExecutor,
910
type TransportGetSubgraphExecutorOptions,
1011
} from '@graphql-mesh/transport-common';
11-
import {
12-
isDisposable,
13-
iterateAsync,
14-
loggerForExecutionRequest,
15-
requestIdByRequest,
16-
} from '@graphql-mesh/utils';
12+
import { isDisposable, iterateAsync } from '@graphql-mesh/utils';
1713
import { getBatchingExecutor } from '@graphql-tools/batch-execute';
1814
import {
1915
DelegationPlanBuilder,
@@ -119,15 +115,8 @@ function getTransportExecutor({
119115
transports?: Transports;
120116
getDisposeReason?: () => GraphQLError | undefined;
121117
}): MaybePromise<Executor> {
122-
// TODO
123118
const kind = transportEntry?.kind || '';
124-
let log = transportContext.log;
125-
if (log) {
126-
if (subgraphName) {
127-
log = log.child({ subgraph: subgraphName });
128-
}
129-
log.debug(`Loading transport "${kind}"`);
130-
}
119+
transportContext.log.debug(`Loading transport "${kind}"`);
131120
return handleMaybePromise(
132121
() =>
133122
typeof transports === 'function' ? transports(kind) : transports[kind],
@@ -214,19 +203,18 @@ export function getOnSubgraphExecute({
214203
let executor: Executor | undefined = subgraphExecutorMap.get(subgraphName);
215204
// If the executor is not initialized yet, initialize it
216205
if (executor == null) {
217-
let log = transportContext.log;
218-
if (log) {
219-
const requestId = requestIdByRequest.get(
220-
executionRequest.context?.request,
221-
);
222-
if (requestId) {
223-
log = log.child({ requestId });
224-
}
225-
if (subgraphName) {
226-
log = log.child({ subgraph: subgraphName });
227-
}
228-
log.debug('Initializing executor');
206+
let log = executionRequest.context?.request
207+
? loggerForRequest(
208+
transportContext.log,
209+
executionRequest.context.request,
210+
)
211+
: transportContext.log;
212+
if (subgraphName) {
213+
log = log.child({ subgraph: subgraphName });
229214
}
215+
// overwrite the log in the transport context because now it contains more details
216+
transportContext.log = log;
217+
log.debug('Initializing executor');
230218
// Lazy executor that loads transport executor on demand
231219
executor = function lazyExecutor(subgraphExecReq: ExecutionRequest) {
232220
return handleMaybePromise(
@@ -312,20 +300,7 @@ export function wrapExecutorWithHooks({
312300
baseExecutionRequest.info =
313301
baseExecutionRequest.info || ({} as GraphQLResolveInfo);
314302
baseExecutionRequest.info.executionRequest = baseExecutionRequest;
315-
const requestId =
316-
baseExecutionRequest.context?.request &&
317-
requestIdByRequest.get(baseExecutionRequest.context.request);
318-
let execReqLogger = transportContext.log;
319-
if (execReqLogger) {
320-
if (requestId) {
321-
execReqLogger = execReqLogger.child({ requestId });
322-
}
323-
loggerForExecutionRequest.set(
324-
baseExecutionRequest,
325-
LegacyLogger.from(execReqLogger),
326-
);
327-
}
328-
execReqLogger = execReqLogger?.child({ subgraph: subgraphName });
303+
const log = transportContext.log.child({ subgraph: subgraphName });
329304
if (onSubgraphExecuteHooks.length === 0) {
330305
return baseExecutor(baseExecutionRequest);
331306
}
@@ -351,11 +326,10 @@ export function wrapExecutorWithHooks({
351326
},
352327
executor,
353328
setExecutor(newExecutor) {
354-
execReqLogger?.debug('executor has been updated');
329+
log?.debug('executor has been updated');
355330
executor = newExecutor;
356331
},
357-
requestId,
358-
log: execReqLogger,
332+
log: log,
359333
}),
360334
onSubgraphExecuteDoneHooks,
361335
),
@@ -375,10 +349,7 @@ export function wrapExecutorWithHooks({
375349
onSubgraphExecuteDoneHook({
376350
result: currentResult,
377351
setResult(newResult: ExecutionResult) {
378-
execReqLogger?.debug(
379-
'overriding result with: ',
380-
newResult,
381-
);
352+
log?.debug('overriding result with: ', newResult);
382353
currentResult = newResult;
383354
},
384355
}),
@@ -418,10 +389,7 @@ export function wrapExecutorWithHooks({
418389
onNext({
419390
result: currentResult,
420391
setResult: (res) => {
421-
execReqLogger?.debug(
422-
'overriding result with: ',
423-
res,
424-
);
392+
log?.debug('overriding result with: ', res);
425393

426394
currentResult = res;
427395
},
@@ -470,7 +438,6 @@ export interface OnSubgraphExecutePayload<TContext> {
470438
setExecutionRequest(executionRequest: ExecutionRequest): void;
471439
executor: Executor;
472440
setExecutor(executor: Executor): void;
473-
requestId?: string;
474441
log: Logger;
475442
}
476443

@@ -512,7 +479,6 @@ export interface OnDelegationPlanHookPayload<TContext> {
512479
fragments: Record<string, FragmentDefinitionNode>;
513480
fieldNodes: SelectionNode[];
514481
context: TContext;
515-
requestId?: string;
516482
log: Logger;
517483
info?: GraphQLResolveInfo;
518484
delegationPlanBuilder: DelegationPlanBuilder;
@@ -549,7 +515,6 @@ export interface OnDelegationStageExecutePayload<TContext> {
549515

550516
typeName: string;
551517

552-
requestId?: string;
553518
log: Logger;
554519
}
555520

@@ -600,13 +565,6 @@ export function wrapMergedTypeResolver<TContext extends Record<string, any>>(
600565
log: Logger,
601566
): MergedTypeResolver<TContext> {
602567
return (object, context, info, subschema, selectionSet, key, type) => {
603-
let requestId: string | undefined;
604-
if (log && context['request']) {
605-
requestId = requestIdByRequest.get(context['request']);
606-
if (requestId) {
607-
log = log.child({ requestId });
608-
}
609-
}
610568
if (subschema.name) {
611569
log = log.child({ subgraph: subschema.name });
612570
}
@@ -627,7 +585,6 @@ export function wrapMergedTypeResolver<TContext extends Record<string, any>>(
627585
key,
628586
typeName,
629587
type,
630-
requestId,
631588
log,
632589
resolver,
633590
setResolver,

packages/runtime/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"@envelop/core": "^5.2.3",
4848
"@envelop/disable-introspection": "^7.0.0",
4949
"@envelop/generic-auth": "^9.0.0",
50+
"@envelop/instrumentation": "^1.0.0",
5051
"@graphql-hive/core": "^0.10.0",
5152
"@graphql-hive/logger": "workspace:^",
5253
"@graphql-hive/logger-json": "workspace:^",

packages/runtime/src/createGatewayRuntime.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import {
3434
getInContextSDK,
3535
isDisposable,
3636
isUrl,
37-
wrapFetchWithHooks,
3837
} from '@graphql-mesh/utils';
3938
import { batchDelegateToSchema } from '@graphql-tools/batch-delegate';
4039
import {
@@ -122,6 +121,7 @@ import {
122121
getExecuteFnFromExecutor,
123122
wrapCacheWithHooks,
124123
} from './utils';
124+
import { wrapFetchWithHooks } from './wrapFetchWithHooks';
125125

126126
// TODO: this type export is not properly accessible from graphql-yoga
127127
// "graphql-yoga/typings/plugins/use-graphiql.js" is an illegal path
@@ -157,7 +157,6 @@ export function createGatewayRuntime<
157157
const wrappedFetchFn = wrapFetchWithHooks(
158158
onFetchHooks,
159159
() => instrumentation,
160-
LegacyLogger.from(log),
161160
);
162161
const wrappedCache: KeyValueCache | undefined = config.cache
163162
? wrapCacheWithHooks({

packages/runtime/src/plugins/useFetchDebug.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ export function useFetchDebug<
1515
log.debug(
1616
() => ({
1717
url,
18-
...(options || {}),
19-
body: options?.body,
18+
body: options?.body?.toString(),
2019
headers: options?.headers,
2120
signal: options?.signal?.aborted ? options?.signal?.reason : false,
2221
}),

packages/runtime/src/plugins/useRequestId.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { requestIdByRequest } from '@graphql-mesh/utils';
1+
import {
2+
loggerForRequest,
3+
requestIdByRequest,
4+
} from '@graphql-hive/logger/request';
25
import { FetchAPI } from '@whatwg-node/server';
36
import type { GatewayContext, GatewayPlugin } from '../types';
47

@@ -49,15 +52,17 @@ export function useRequestId<TContext extends Record<string, any>>(
4952
requestIdByRequest.set(request, requestId);
5053
},
5154
onContextBuilding({ context, extendContext }) {
52-
if (context?.request) {
53-
const requestId = requestIdByRequest.get(context.request);
54-
if (requestId) {
55-
extendContext(
56-
// @ts-expect-error TODO: typescript is acting up here
57-
{ log: context.log.child({ requestId }) },
58-
);
59-
}
60-
}
55+
extendContext(
56+
// @ts-expect-error TODO: typescript is acting up here
57+
{
58+
log: loggerForRequest(context.log, context.request, () => {
59+
throw new Error(
60+
"Request ID must've already been created but is not found",
61+
);
62+
// because we are using the logger's requestIdByRequest map
63+
}),
64+
},
65+
);
6166
},
6267
onFetch({ context, options, setOptions }) {
6368
if (context?.request) {

packages/runtime/src/plugins/useRetryOnSchemaReload.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Logger } from '@graphql-hive/logger';
2-
import { requestIdByRequest } from '@graphql-mesh/utils';
2+
import { loggerForRequest } from '@graphql-hive/logger/request';
33
import type { MaybeAsyncIterable } from '@graphql-tools/utils';
44
import {
55
handleMaybePromise,
@@ -41,11 +41,10 @@ export function useRetryOnSchemaReload<
4141
execHandler &&
4242
result?.errors?.some((e) => e.extensions?.['code'] === 'SCHEMA_RELOAD')
4343
) {
44-
let log = logForRequest.get(request)!; // must exist at this point
45-
const requestId = requestIdByRequest.get(request);
46-
if (requestId) {
47-
log = log.child({ requestId });
48-
}
44+
const log = loggerForRequest(
45+
logForRequest.get(request)!, // must exist at this point
46+
request,
47+
);
4948
log.info(
5049
'The operation has been aborted after the supergraph schema reloaded, retrying the operation...',
5150
);

0 commit comments

Comments
 (0)