diff --git a/apps/event-worker/package.json b/apps/event-worker/package.json index 6bc31888b..445b38ff5 100644 --- a/apps/event-worker/package.json +++ b/apps/event-worker/package.json @@ -29,6 +29,14 @@ "@kubernetes/client-node": "^0.22.0", "@octokit/auth-app": "catalog:", "@octokit/rest": "catalog:", + "@opentelemetry/auto-instrumentations-node": "^0.52.1", + "@opentelemetry/exporter-logs-otlp-http": "^0.54.2", + "@opentelemetry/exporter-trace-otlp-http": "^0.54.2", + "@opentelemetry/resources": "^1.27.0", + "@opentelemetry/sdk-logs": "^0.54.2", + "@opentelemetry/sdk-node": "^0.54.2", + "@opentelemetry/sdk-trace-base": "^1.27.0", + "@opentelemetry/semantic-conventions": "^1.27.0", "@smithy/types": "^3.7.1", "@t3-oss/env-core": "catalog:", "bullmq": "catalog:", diff --git a/apps/event-worker/src/index.ts b/apps/event-worker/src/index.ts index 6a01c448a..2b781409b 100644 --- a/apps/event-worker/src/index.ts +++ b/apps/event-worker/src/index.ts @@ -1,5 +1,6 @@ import { logger } from "@ctrlplane/logger"; +import { register } from "./instrumentation.js"; import { createDispatchExecutionJobWorker } from "./job-dispatch/index.js"; import { redis } from "./redis.js"; import { createReleaseNewVersionWorker } from "./releases/new-version/index.js"; @@ -7,6 +8,8 @@ import { createReleaseVariableChangeWorker } from "./releases/variable-change/in import { createResourceScanWorker } from "./resource-scan/index.js"; import { workers } from "./workers/index.js"; +await register(); + const allWorkers = [ createResourceScanWorker(), createDispatchExecutionJobWorker(), diff --git a/apps/event-worker/src/instrumentation-node.ts b/apps/event-worker/src/instrumentation-node.ts new file mode 100644 index 000000000..9684684d1 --- /dev/null +++ b/apps/event-worker/src/instrumentation-node.ts @@ -0,0 +1,57 @@ +import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node"; +import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http"; +import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; +import { Resource } from "@opentelemetry/resources"; +import { BatchLogRecordProcessor } from "@opentelemetry/sdk-logs"; +import { NodeSDK } from "@opentelemetry/sdk-node"; +import { + AlwaysOnSampler, + BatchSpanProcessor, +} from "@opentelemetry/sdk-trace-base"; +import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions"; + +const sdk = new NodeSDK({ + resource: new Resource({ + [ATTR_SERVICE_NAME]: "ctrlplane/event-worker", + }), + spanProcessors: [new BatchSpanProcessor(new OTLPTraceExporter())], + logRecordProcessors: [new BatchLogRecordProcessor(new OTLPLogExporter())], + instrumentations: [ + getNodeAutoInstrumentations({ + "@opentelemetry/instrumentation-fs": { + enabled: false, + }, + "@opentelemetry/instrumentation-net": { + enabled: false, + }, + "@opentelemetry/instrumentation-dns": { + enabled: false, + }, + "@opentelemetry/instrumentation-http": { + enabled: true, + }, + "@opentelemetry/instrumentation-pg": { + enabled: true, + enhancedDatabaseReporting: true, + addSqlCommenterCommentToQueries: true, + }, + "@opentelemetry/instrumentation-ioredis": { + enabled: true, + }, + "@opentelemetry/instrumentation-winston": { + enabled: true, + logHook: (span, record) => { + record["resource.service.name"] = "ctrlplane/event-worker"; + }, + }, + }), + ], + sampler: new AlwaysOnSampler(), +}); + +try { + sdk.start(); + console.log("Tracing initialized"); +} catch (error) { + console.error("Error initializing tracing", error); +} diff --git a/apps/event-worker/src/instrumentation.ts b/apps/event-worker/src/instrumentation.ts new file mode 100644 index 000000000..c44c1c4ea --- /dev/null +++ b/apps/event-worker/src/instrumentation.ts @@ -0,0 +1,4 @@ +export async function register() { + if (process.env.NEXT_RUNTIME === "nodejs") + await import("./instrumentation-node.js"); +} diff --git a/apps/webservice/package.json b/apps/webservice/package.json index 40f22a015..367955b5a 100644 --- a/apps/webservice/package.json +++ b/apps/webservice/package.json @@ -34,7 +34,13 @@ "@octokit/webhooks-types": "^7.5.1", "@openreplay/tracker": "^14.0.14", "@opentelemetry/auto-instrumentations-node": "^0.52.1", + "@opentelemetry/exporter-logs-otlp-http": "^0.54.2", + "@opentelemetry/exporter-trace-otlp-http": "^0.54.2", + "@opentelemetry/resources": "^1.27.0", + "@opentelemetry/sdk-logs": "^0.54.2", "@opentelemetry/sdk-node": "^0.54.2", + "@opentelemetry/sdk-trace-base": "^1.27.0", + "@opentelemetry/semantic-conventions": "^1.27.0", "@t3-oss/env-nextjs": "catalog:", "@tabler/icons-react": "catalog:", "@tailwindcss/typography": "^0.5.16", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4884b49cc..03a641294 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -175,6 +175,30 @@ importers: '@octokit/rest': specifier: 'catalog:' version: 20.1.1 + '@opentelemetry/auto-instrumentations-node': + specifier: ^0.52.1 + version: 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-http': + specifier: ^0.54.2 + version: 0.54.2(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': + specifier: ^0.54.2 + version: 0.54.2(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': + specifier: ^1.27.0 + version: 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': + specifier: ^0.54.2 + version: 0.54.2(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': + specifier: ^0.54.2 + version: 0.54.2(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': + specifier: ^1.27.0 + version: 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': + specifier: ^1.27.0 + version: 1.27.0 '@smithy/types': specifier: ^3.7.1 version: 3.7.1 @@ -469,9 +493,27 @@ importers: '@opentelemetry/auto-instrumentations-node': specifier: ^0.52.1 version: 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-http': + specifier: ^0.54.2 + version: 0.54.2(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': + specifier: ^0.54.2 + version: 0.54.2(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': + specifier: ^1.27.0 + version: 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': + specifier: ^0.54.2 + version: 0.54.2(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-node': specifier: ^0.54.2 version: 0.54.2(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': + specifier: ^1.27.0 + version: 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': + specifier: ^1.27.0 + version: 1.27.0 '@t3-oss/env-nextjs': specifier: 'catalog:' version: 0.11.1(typescript@5.8.2)(zod@3.24.2)