From b9426944f024c5ce2cf3add13bb63a0fa781ccab Mon Sep 17 00:00:00 2001 From: Zeeshan Akram <97m.zeeshan@gmail.com> Date: Fri, 15 Mar 2024 23:23:13 +0500 Subject: [PATCH] add opentelemetry instrumentation for QueryNode graphql-server --- opentelemetry/index.ts | 9 ++++-- .../instrumentations/graphql-server.ts | 28 +++++++++++++++++++ opentelemetry/instrumentations/index.ts | 1 + 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 opentelemetry/instrumentations/graphql-server.ts diff --git a/opentelemetry/index.ts b/opentelemetry/index.ts index 0e41b2d7ac..af9583fa30 100644 --- a/opentelemetry/index.ts +++ b/opentelemetry/index.ts @@ -1,7 +1,12 @@ import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api' import { NodeSDK } from '@opentelemetry/sdk-node' import 'dotenv/config' -import { DefaultInstrumentation, DistributorNodeInstrumentation, StorageNodeInstrumentation } from './instrumentations' +import { + DefaultInstrumentation, + DistributorNodeInstrumentation, + GraphqlServerInstrumentation, + StorageNodeInstrumentation, +} from './instrumentations' // For troubleshooting, set the log level to DiagLogLevel.DEBUG diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO) @@ -18,7 +23,7 @@ function addInstrumentation() { instrumentation = StorageNodeInstrumentation diag.info(`Loaded Application Instrumentation: "Storage Node"`) } else if (applicationName === 'query-node') { - instrumentation = DefaultInstrumentation + instrumentation = GraphqlServerInstrumentation diag.info(`Loaded Application Instrumentation: "Query Node"`) } else { instrumentation = DefaultInstrumentation diff --git a/opentelemetry/instrumentations/graphql-server.ts b/opentelemetry/instrumentations/graphql-server.ts new file mode 100644 index 0000000000..d4a7a5e83c --- /dev/null +++ b/opentelemetry/instrumentations/graphql-server.ts @@ -0,0 +1,28 @@ +import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node' +import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto' +import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto' +import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics' +import { NodeSDK } from '@opentelemetry/sdk-node' +import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-node' + +/** Opentelemetry Instrumentation for Query Node's graphql-server */ + +export const GraphqlServerInstrumentation = new NodeSDK({ + spanProcessor: new BatchSpanProcessor(new OTLPTraceExporter(), { + maxQueueSize: parseInt(process.env.OTEL_MAX_QUEUE_SIZE || '8192'), + maxExportBatchSize: parseInt(process.env.OTEL_MAX_EXPORT_BATCH_SIZE || '1024'), + }), + metricReader: new PeriodicExportingMetricReader({ + exporter: new OTLPMetricExporter(), + }), + instrumentations: [ + // Disable DNS instrumentation, because the instrumentation does not correctly patches `dns.lookup` function + // if the function is converted to a promise-based method using `utils.promisify(dns.lookup)` + // See: https://github.com/Joystream/joystream/pull/4779#discussion_r1262515887 + getNodeAutoInstrumentations({ + '@opentelemetry/instrumentation-dns': { enabled: false }, + '@opentelemetry/instrumentation-pg': { enhancedDatabaseReporting: true }, + '@opentelemetry/instrumentation-graphql': { allowValues: true }, + }), + ], +}) diff --git a/opentelemetry/instrumentations/index.ts b/opentelemetry/instrumentations/index.ts index b9c3aeb756..d37cfe308b 100644 --- a/opentelemetry/instrumentations/index.ts +++ b/opentelemetry/instrumentations/index.ts @@ -1,3 +1,4 @@ export * from './default' export * from './distributor-node' +export * from './graphql-server' export * from './storage-node'