Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/@graphql-hive_gateway-runtime-1360-dependencies.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@graphql-hive/gateway-runtime': patch
---

dependencies updates:

- Added dependency [`@opentelemetry/api@^1.9.0` ↗︎](https://www.npmjs.com/package/@opentelemetry/api/v/1.9.0) (to `dependencies`)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@graphql-mesh/plugin-opentelemetry': patch
---

dependencies updates:

- Updated dependency [`@opentelemetry/auto-instrumentations-node@^0.62.1` ↗︎](https://www.npmjs.com/package/@opentelemetry/auto-instrumentations-node/v/0.62.1) (from `^0.62.0`, in `dependencies`)
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
diff --git a/build/esnext/transport/http-exporter-transport.js b/build/esnext/transport/http-exporter-transport.js
index 7977489487a2236fbd0e4c2273ef53fd3c7b93a8..93e9701d10f6aea530f38330daea87199e514452 100644
index e63fda75feb67686bad9b692a046ebb1af2bd8a0..93e9701d10f6aea530f38330daea87199e514452 100644
--- a/build/esnext/transport/http-exporter-transport.js
+++ b/build/esnext/transport/http-exporter-transport.js
@@ -20,7 +20,7 @@ class HttpExporterTransport {
Expand All @@ -21,7 +21,7 @@ index 7977489487a2236fbd0e4c2273ef53fd3c7b93a8..93e9701d10f6aea530f38330daea8719
if (utils === null) {
// Lazy require to ensure that http/https is not required before instrumentations can wrap it.
- const { sendWithHttp, createHttpAgent,
- // eslint-disable-next-line @typescript-eslint/no-var-requires
- // eslint-disable-next-line @typescript-eslint/no-require-imports
- } = require('./http-transport-utils');
+ const { sendWithHttp, createHttpAgent } = await import('./http-transport-utils');
utils = this._utils = {
Expand Down
2 changes: 1 addition & 1 deletion e2e/opentelemetry/opentelemetry.e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
};

describe('OpenTelemetry', () => {
(['grpc', 'http'] as const).forEach((OTLP_EXPORTER_TYPE) => {
(['http'] as const).forEach((OTLP_EXPORTER_TYPE) => {
describe(`exporter > ${OTLP_EXPORTER_TYPE}`, () => {
let jaeger: Container;
beforeAll(async () => {
Expand Down Expand Up @@ -620,10 +620,10 @@
const relevantTraces = traces.data.filter((trace) =>
trace.spans.some((span) => span.operationName === 'POST /graphql'),
);
expect(relevantTraces.length).toBe(1);

Check failure on line 623 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 24 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger

AssertionError: expected 4 to be 1 // Object.is equality - Expected + Received - 1 + 4 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:623:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:619:9

Check failure on line 623 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 24 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger

AssertionError: expected 3 to be 1 // Object.is equality - Expected + Received - 1 + 3 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:623:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:619:9

Check failure on line 623 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 24 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger

AssertionError: expected 2 to be 1 // Object.is equality - Expected + Received - 1 + 2 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:623:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:619:9

Check failure on line 623 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 22 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger

AssertionError: expected 4 to be 1 // Object.is equality - Expected + Received - 1 + 4 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:623:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:619:9

Check failure on line 623 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 22 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger

AssertionError: expected 3 to be 1 // Object.is equality - Expected + Received - 1 + 3 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:623:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:619:9

Check failure on line 623 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 22 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger

AssertionError: expected 2 to be 1 // Object.is equality - Expected + Received - 1 + 2 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:623:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:619:9

Check failure on line 623 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 20 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger

AssertionError: expected 4 to be 1 // Object.is equality - Expected + Received - 1 + 4 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:623:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:619:9

Check failure on line 623 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 20 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger

AssertionError: expected 3 to be 1 // Object.is equality - Expected + Received - 1 + 3 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:623:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:619:9

Check failure on line 623 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 20 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger

AssertionError: expected 2 to be 1 // Object.is equality - Expected + Received - 1 + 2 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:623:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:619:9
const relevantTrace = relevantTraces[0];
expect(relevantTrace).toBeDefined();
expect(relevantTrace!.spans.length).toBe(20);

Check failure on line 626 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 24 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger

AssertionError: expected 28 to be 20 // Object.is equality - Expected + Received - 20 + 28 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:626:47 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:619:9

Check failure on line 626 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 22 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger

AssertionError: expected 28 to be 20 // Object.is equality - Expected + Received - 20 + 28 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:626:47 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:619:9

Check failure on line 626 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 20 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger

AssertionError: expected 28 to be 20 // Object.is equality - Expected + Received - 20 + 28 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:626:47 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:619:9

const resource = relevantTrace!.processes['p1'];
expect(resource).toBeDefined();
Expand Down Expand Up @@ -740,7 +740,7 @@
const relevantTraces = traces.data.filter((trace) =>
trace.spans.some((span) => span.operationName === 'POST /graphql'),
);
expect(relevantTraces.length).toBe(1);

Check failure on line 743 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 24 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger using cli options

AssertionError: expected 8 to be 1 // Object.is equality - Expected + Received - 1 + 8 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:743:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:739:9

Check failure on line 743 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 24 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger using cli options

AssertionError: expected 7 to be 1 // Object.is equality - Expected + Received - 1 + 7 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:743:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:739:9

Check failure on line 743 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 24 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger using cli options

AssertionError: expected 6 to be 1 // Object.is equality - Expected + Received - 1 + 6 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:743:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:739:9

Check failure on line 743 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 24 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger using cli options

AssertionError: expected 5 to be 1 // Object.is equality - Expected + Received - 1 + 5 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:743:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:739:9

Check failure on line 743 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 22 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger using cli options

AssertionError: expected 8 to be 1 // Object.is equality - Expected + Received - 1 + 8 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:743:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:739:9

Check failure on line 743 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 22 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger using cli options

AssertionError: expected 7 to be 1 // Object.is equality - Expected + Received - 1 + 7 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:743:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:739:9

Check failure on line 743 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 22 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger using cli options

AssertionError: expected 6 to be 1 // Object.is equality - Expected + Received - 1 + 6 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:743:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:739:9

Check failure on line 743 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 22 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger using cli options

AssertionError: expected 5 to be 1 // Object.is equality - Expected + Received - 1 + 5 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:743:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:739:9

Check failure on line 743 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 20 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger using cli options

AssertionError: expected 8 to be 1 // Object.is equality - Expected + Received - 1 + 8 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:743:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:739:9

Check failure on line 743 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 20 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger using cli options

AssertionError: expected 7 to be 1 // Object.is equality - Expected + Received - 1 + 7 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:743:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:739:9

Check failure on line 743 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 20 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger using cli options

AssertionError: expected 6 to be 1 // Object.is equality - Expected + Received - 1 + 6 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:743:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:739:9

Check failure on line 743 in e2e/opentelemetry/opentelemetry.e2e.ts

View workflow job for this annotation

GitHub Actions / E2E / Node 20 on Ubuntu

e2e/opentelemetry/opentelemetry.e2e.ts > OpenTelemetry > exporter > http > should report telemetry metrics correctly to jaeger using cli options

AssertionError: expected 5 to be 1 // Object.is equality - Expected + Received - 1 + 5 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:743:41 ❯ expectJaegerTraces e2e/opentelemetry/opentelemetry.e2e.ts:108:19 ❯ e2e/opentelemetry/opentelemetry.e2e.ts:739:9
const relevantTrace = relevantTraces[0];
expect(relevantTrace).toBeDefined();
expect(relevantTrace!.spans.length).toBe(20);
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
"@graphql-mesh/utils": "0.104.6",
"@graphql-tools/delegate": "workspace:^",
"@graphql-tools/utils": "10.9.0-alpha-20250710200000-fde1c74a0c2fa4f651cbeed5b2091aeda7afb162",
"@opentelemetry/otlp-exporter-base@npm:0.202.0": "patch:@opentelemetry/otlp-exporter-base@npm%3A0.202.0#~/.yarn/patches/@opentelemetry-otlp-exporter-base-npm-0.202.0-f6f29c2eeb.patch",
"@opentelemetry/otlp-exporter-base@npm:0.203.0": "patch:@opentelemetry/otlp-exporter-base@npm%3A0.203.0#~/.yarn/patches/@opentelemetry-otlp-exporter-base-npm-0.203.0-183dcac0e6.patch",
"@rollup/plugin-node-resolve@npm:^15.2.3": "patch:@rollup/plugin-node-resolve@npm%3A16.0.1#~/.yarn/patches/@rollup-plugin-node-resolve-npm-16.0.1-2936474bab.patch",
"@vitest/snapshot": "patch:@vitest/snapshot@npm:3.1.2#~/.yarn/patches/@vitest-snapshot-npm-3.1.1-4d18cf86dc.patch",
"ansi-color@npm:^0.2.1": "patch:ansi-color@npm%3A0.2.1#~/.yarn/patches/ansi-color-npm-0.2.1-f7243d10a4.patch",
Expand Down
2 changes: 1 addition & 1 deletion packages/plugins/opentelemetry/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
"@graphql-tools/utils": "^10.9.1",
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/api-logs": "^0.203.0",
"@opentelemetry/auto-instrumentations-node": "^0.62.0",
"@opentelemetry/auto-instrumentations-node": "^0.62.1",
"@opentelemetry/context-async-hooks": "^2.0.1",
"@opentelemetry/core": "^2.0.1",
"@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0",
Expand Down
2 changes: 2 additions & 0 deletions packages/plugins/opentelemetry/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
useOpenTelemetry,
type OpenTelemetryGatewayPluginOptions,
type OpenTelemetryPlugin,
type OpenTelemetryPluginUtils,
} from './plugin';

export * from './attributes';
Expand All @@ -13,4 +14,5 @@ export {
useOpenTelemetry,
OpenTelemetryPlugin,
OpenTelemetryGatewayPluginOptions,
OpenTelemetryPluginUtils,
};
17 changes: 12 additions & 5 deletions packages/plugins/opentelemetry/src/plugin-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,16 @@ export function withState<

function addStateGetters(src: any) {
const result: any = {};
for (const [hookName, hook] of Object.entries(src) as any) {
// Use the property descriptors to keep potential getters and setters, or not enumerable props
const properties = Object.entries(Object.getOwnPropertyDescriptors(src));
for (const [hookName, descriptor] of properties) {
const hook = descriptor.value;
if (typeof hook !== 'function') {
result[hookName] = hook;
descriptor.get &&= () => src[hookName];
descriptor.set &&= (value) => {
src[hookName] = value;
};
Object.defineProperty(result, hookName, descriptor);
} else {
result[hookName] = {
[hook.name](payload: any, ...args: any[]) {
Expand All @@ -77,10 +84,10 @@ export function withState<
return result;
}

const { instrumentation, ...hooks } = pluginFactory(getState as any);
const plugin = pluginFactory(getState as any);

const pluginWithState = addStateGetters(hooks);
pluginWithState.instrumentation = addStateGetters(instrumentation);
const pluginWithState = addStateGetters(plugin);
pluginWithState.instrumentation = addStateGetters(plugin.instrumentation);

return pluginWithState as P;
}
Expand Down
120 changes: 85 additions & 35 deletions packages/plugins/opentelemetry/src/plugin.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {
Attributes,
GatewayConfigContext,
getRetryInfo,
isRetryExecutionRequest,
Logger,
Expand Down Expand Up @@ -214,10 +215,31 @@ const HeadersTextMapGetter: TextMapGetter<Headers> = {
},
};

export type ContextMatcher = {
request?: Request;
context?: any;
executionRequest?: ExecutionRequest;
};

export type OpenTelemetryPluginUtils = {
tracer?: Tracer;
getActiveContext: (payload: ContextMatcher) => Context;
getHttpContext: (request: Request) => Context | undefined;
getOperationContext: (context: any) => Context | undefined;
getExecutionRequestContext: (
ExecutionRequest: ExecutionRequest,
) => Context | undefined;
};

export type OpenTelemetryContextExtension = {
openTelemetry: {
tracer: Tracer;
activeContext: () => Context;
getActiveContext: (payload?: ContextMatcher) => Context;
getHttpContext: (request?: Request) => Context | undefined;
getOperationContext: (context?: any) => Context | undefined;
getExecutionRequestContext: (
ExecutionRequest: ExecutionRequest,
) => Context | undefined;
};
};

Expand All @@ -229,30 +251,26 @@ type State = Partial<
HttpState<OtelState> & GraphQLState<OtelState> & GatewayState<OtelState>
>;

export type OpenTelemetryPlugin =
GatewayPlugin<OpenTelemetryContextExtension> & {
getOtelContext: (payload: {
request?: Request;
context?: any;
executionRequest?: ExecutionRequest;
}) => Context;
getTracer(): Tracer;
};
export type OpenTelemetryPlugin = GatewayPlugin<OpenTelemetryContextExtension> &
OpenTelemetryPluginUtils;

export function useOpenTelemetry(
options: OpenTelemetryGatewayPluginOptions & {
log: Logger;
},
options: OpenTelemetryGatewayPluginOptions &
// We ask for a Partial context to still allow the usage as a Yoga plugin
Partial<GatewayConfigContext>,
): OpenTelemetryPlugin {
const inheritContext = options.inheritContext ?? true;
const propagateContext = options.propagateContext ?? true;
let useContextManager: boolean;
const traces = typeof options.traces === 'object' ? options.traces : {};

let tracer: Tracer;
let pluginLogger: Logger;
let initSpan: Context | null;

// TODO: Make it const once Yoga has the Hive Logger
let pluginLogger: Logger | undefined =
options.log && options.log.child('[OpenTelemetry] ');

function isParentEnabled(state: State): boolean {
const parentState = getMostSpecificState(state);
return !parentState || !!parentState.otel;
Expand Down Expand Up @@ -304,7 +322,7 @@ export function useOpenTelemetry(

if (!useContextManager) {
if (traces.spans?.schema) {
pluginLogger.warn(
pluginLogger?.warn(
'Schema loading spans are disabled because no context manager is available',
);
}
Expand All @@ -314,14 +332,25 @@ export function useOpenTelemetry(
}
}

return withState<
const plugin = withState<
OpenTelemetryPlugin,
OtelState,
OtelState & { skipExecuteSpan?: true; subgraphNames: string[] },
OtelState
>((getState) => ({
getTracer: () => tracer,
getOtelContext: ({ state }) => getContext(state),
get tracer() {
return tracer;
},
getActiveContext: ({ state }) => getContext(state),
getHttpContext: (request) => {
return getState({ request }).forRequest.otel?.root;
},
getOperationContext: (context) => {
return getState({ context }).forOperation.otel?.root;
},
getExecutionRequestContext: (executionRequest) => {
return getState({ executionRequest }).forSubgraphExecution.otel?.root;
},
instrumentation: {
request({ state: { forRequest }, request }, wrapped) {
if (!shouldTrace(traces.spans?.http, { request })) {
Expand Down Expand Up @@ -648,21 +677,17 @@ export function useOpenTelemetry(
},

onYogaInit({ yoga }) {
const log =
options.log ??
//TODO remove this when Yoga will also use the new Logger API
new Logger({
writers: [
{
write(level, attrs, msg) {
level = level === 'trace' ? 'debug' : level;
yoga.logger[level](msg, attrs);
},
//TODO remove this when Yoga will also use the new Logger API
pluginLogger ??= new Logger({
writers: [
{
write(level, attrs, msg) {
level = level === 'trace' ? 'debug' : level;
yoga.logger[level](msg, attrs);
},
],
});

pluginLogger = log.child('[OpenTelemetry] ');
},
],
}).child('[OpenTelemetry] ');

if (options.configureDiagLogger !== false) {
const logLevel = diagLogLevelFromEnv(); // We enable the diag only if it is explicitly enabled, as NodeSDK does
Expand All @@ -685,7 +710,9 @@ export function useOpenTelemetry(
try {
const requestId = requestIdByRequest.get(request);
if (requestId) {
loggerForRequest(options.log.child({ requestId }), request);
if (options.log) {
loggerForRequest(options.log.child({ requestId }), request);
}

// When running in a runtime without a context manager, we have to keep track of the
// span correlated to a log manually. For now, we just link all logs for a request to
Expand All @@ -695,7 +722,7 @@ export function useOpenTelemetry(
}
}
} catch (error) {
pluginLogger.error(
pluginLogger!.error(
{ error },
'Error while setting up logger for request',
);
Expand All @@ -706,7 +733,20 @@ export function useOpenTelemetry(
extendContext({
openTelemetry: {
tracer,
activeContext: () => getContext(state),
getHttpContext: (request) => {
const { forRequest } = request ? getState({ request }) : state;
return forRequest.otel?.root;
},
getOperationContext: (context) => {
const { forOperation } = context ? getState({ context }) : state;
return forOperation.otel?.root;
},
getExecutionRequestContext: (executionRequest) => {
return getState({ executionRequest }).forSubgraphExecution.otel
?.root;
},
getActiveContext: (contextMatcher?: Parameters<typeof getState>[0]) =>
getContext(contextMatcher ? getState(contextMatcher) : state),
},
});
},
Expand Down Expand Up @@ -903,6 +943,16 @@ export function useOpenTelemetry(
}
},
}));

if (options.openTelemetry) {
if (options.openTelemetry.register) {
options.openTelemetry?.register?.(plugin);
} else {
options.log?.warn('An OpenTelemetry plugin is already registered');
}
}

return plugin;
}

function shouldTrace<Args>(
Expand Down
Loading
Loading