Explorar el Código

chore: Basic instrumentation setup working

David Höck hace 9 meses
padre
commit
bb1bf09889

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 686 - 102
package-lock.json


+ 9 - 0
packages/core/build/tsconfig.instrumentation.json

@@ -0,0 +1,9 @@
+{
+    "extends": "../tsconfig.json",
+    "compilerOptions": {
+        "removeComments": false,
+        "outDir": "../dist",
+        "rootDirs": ["../src"]
+    },
+    "files": ["../src/instrumentation.ts"]
+}

+ 8 - 1
packages/core/package.json

@@ -21,7 +21,7 @@
     "scripts": {
         "tsc:watch": "tsc -p ./build/tsconfig.build.json --watch",
         "copy:watch": "ts-node build/copy-static.ts watch",
-        "build": "rimraf dist && tsc -p ./build/tsconfig.build.json && tsc -p ./build/tsconfig.cli.json && ts-node build/copy-static.ts build",
+        "build": "rimraf dist && tsc -p ./build/tsconfig.build.json && tsc -p ./build/tsconfig.cli.json && tsc -p ./build/tsconfig.instrumentation.json && ts-node build/copy-static.ts build",
         "watch": "concurrently npm:tsc:watch npm:copy:watch",
         "lint": "eslint --fix .",
         "test": "vitest --config vitest.config.mts --run",
@@ -49,6 +49,12 @@
         "@nestjs/platform-express": "~11.0.12",
         "@nestjs/terminus": "~11.0.0",
         "@nestjs/typeorm": "~11.0.0",
+        "@opentelemetry/api": "^1.9.0",
+        "@opentelemetry/auto-instrumentations-node": "^0.57.1",
+        "@opentelemetry/exporter-trace-otlp-http": "^0.200.0",
+        "@opentelemetry/resources": "^2.0.0",
+        "@opentelemetry/sdk-node": "^0.200.0",
+        "@opentelemetry/semantic-conventions": "^1.32.0",
         "@vendure/common": "3.2.2",
         "bcrypt": "^5.1.1",
         "body-parser": "^1.20.2",
@@ -71,6 +77,7 @@
         "mime-types": "^2.1.35",
         "ms": "^2.1.3",
         "nanoid": "^3.3.8",
+        "nestjs-otel": "^6.2.0",
         "picocolors": "^1.1.1",
         "progress": "^2.0.3",
         "reflect-metadata": "^0.2.2",

+ 17 - 0
packages/core/src/app.module.ts

@@ -1,5 +1,6 @@
 import { MiddlewareConsumer, Module, NestModule, OnApplicationShutdown } from '@nestjs/common';
 import cookieSession from 'cookie-session';
+import { OpenTelemetryModule, Span, TraceService } from 'nestjs-otel';
 
 import { ApiModule } from './api/api.module';
 import { Middleware, MiddlewareHandler } from './common';
@@ -24,15 +25,26 @@ import { ServiceModule } from './service/service.module';
         HealthCheckModule,
         ServiceModule,
         ConnectionModule,
+        OpenTelemetryModule.forRoot({
+            metrics: {
+                hostMetrics: true, // Includes Host Metrics
+                apiMetrics: {
+                    enable: true, // Includes api metrics
+                },
+            },
+        }),
     ],
 })
 export class AppModule implements NestModule, OnApplicationShutdown {
     constructor(
         private configService: ConfigService,
         private i18nService: I18nService,
+        private traceService: TraceService,
     ) {}
 
+    @Span()
     configure(consumer: MiddlewareConsumer) {
+        const currentSpan = this.traceService.getSpan();
         const { adminApiPath, shopApiPath, middleware } = this.configService.apiOptions;
         const { cookieOptions } = this.configService.authOptions;
 
@@ -41,6 +53,10 @@ export class AppModule implements NestModule, OnApplicationShutdown {
             { handler: i18nextHandler, route: adminApiPath },
             { handler: i18nextHandler, route: shopApiPath },
         ];
+        currentSpan?.addEvent('setup_middleware', {
+            adminApiPath,
+            shopApiPath,
+        });
 
         const allMiddleware = defaultMiddleware.concat(middleware);
 
@@ -64,6 +80,7 @@ export class AppModule implements NestModule, OnApplicationShutdown {
         for (const [route, handlers] of Object.entries(middlewareByRoute)) {
             consumer.apply(...handlers).forRoutes(route);
         }
+        currentSpan?.end();
     }
 
     async onApplicationShutdown(signal?: string) {

+ 25 - 0
packages/core/src/instrumentation.ts

@@ -0,0 +1,25 @@
+import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
+import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
+import { resourceFromAttributes } from '@opentelemetry/resources';
+import { ConsoleMetricExporter, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
+import { NodeSDK } from '@opentelemetry/sdk-node';
+import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node';
+import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
+
+const traceExporter = new OTLPTraceExporter({
+    url: 'http://localhost:4318/v1/traces',
+});
+
+const sdk = new NodeSDK({
+    resource: resourceFromAttributes({
+        [ATTR_SERVICE_NAME]: 'vendure-dev-server',
+        [ATTR_SERVICE_VERSION]: '1.0',
+    }),
+    spanProcessors: [new SimpleSpanProcessor(traceExporter)],
+    metricReader: new PeriodicExportingMetricReader({
+        exporter: new ConsoleMetricExporter(),
+    }),
+    instrumentations: [getNodeAutoInstrumentations()],
+});
+
+sdk.start();

+ 1 - 1
packages/dev-server/package.json

@@ -6,7 +6,7 @@
     "private": true,
     "scripts": {
         "populate": "node -r ts-node/register -r dotenv/config populate-dev-server.ts",
-        "dev:server": "node -r ts-node/register -r dotenv/config index.ts",
+        "dev:server": "node -r ts-node/register -r dotenv/config -r @vendure/core/dist/instrumentation index.ts",
         "dev:worker": "node -r ts-node/register -r dotenv/config index-worker.ts",
         "dev": "concurrently npm:dev:*",
         "dashboard:dev": "vite dev",

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio