瀏覽代碼

feat: Integrate OtelLogger with Grafana and Loki for enhanced logging and monitoring

David Höck 8 月之前
父節點
當前提交
4f08d4c2f6

+ 42 - 0
docker-compose.yml

@@ -113,6 +113,48 @@ services:
         volumes:
             - jaeger_data:/badger
 
+    loki:
+        image: grafana/loki:3.4
+        ports:
+            - '3100:3100'
+        networks:
+            - loki
+
+    grafana:
+        environment:
+            - GF_PATHS_PROVISIONING=/etc/grafana/provisioning
+            - GF_AUTH_ANONYMOUS_ENABLED=true
+            - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
+            - GF_FEATURE_TOGGLES_ENABLE=alertingSimplifiedRouting,alertingQueryAndExpressionsStepMode
+        entrypoint:
+            - sh
+            - -euc
+            - |
+                mkdir -p /etc/grafana/provisioning/datasources
+                cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
+                apiVersion: 1
+                datasources:
+                - name: Loki
+                type: loki
+                access: proxy 
+                orgId: 1
+                url: http://loki:3100
+                basicAuth: false
+                isDefault: true
+                version: 1
+                editable: false
+                EOF
+                /run.sh
+        image: grafana/grafana:latest
+        ports:
+            - '3200:3000'
+        networks:
+            - loki
+
+networks:
+    loki:
+        driver: bridge
+
 volumes:
     postgres_16_data:
         driver: local

+ 3 - 0
package-lock.json

@@ -48880,6 +48880,7 @@
         "typescript": "5.8.2"
       },
       "devDependencies": {
+        "@opentelemetry/exporter-logs-otlp-proto": "^0.200.0",
         "@vendure/testing": "3.2.2",
         "@vendure/ui-devkit": "3.2.2",
         "commander": "^12.0.0",
@@ -49058,7 +49059,9 @@
         "@opentelemetry/api": "^1.9.0",
         "@opentelemetry/auto-instrumentations-node": "^0.58.0",
         "@opentelemetry/context-async-hooks": "^2.0.0",
+        "@opentelemetry/exporter-logs-otlp-proto": "^0.200.0",
         "@opentelemetry/resources": "^2.0.0",
+        "@opentelemetry/sdk-logs": "^0.200.0",
         "@opentelemetry/sdk-node": "^0.200.0",
         "@vendure/common": "3.2.2"
       },

+ 8 - 7
packages/core/src/config/index.ts

@@ -23,20 +23,20 @@ export * from './catalog/product-variant-price-selection-strategy';
 export * from './catalog/product-variant-price-update-strategy';
 export * from './catalog/stock-display-strategy';
 export * from './catalog/stock-location-strategy';
+export * from './config-helpers';
 export * from './config.module';
 export * from './config.service';
-export * from './config-helpers';
 export * from './custom-field/custom-field-types';
 export * from './default-config';
+export * from './entity-metadata/entity-metadata-modifier';
 export * from './entity/auto-increment-id-strategy';
+export * from './entity/bigint-money-strategy';
 export * from './entity/default-money-strategy';
 export * from './entity/entity-duplicator';
 export * from './entity/entity-duplicators/index';
-export * from './entity/bigint-money-strategy';
 export * from './entity/entity-id-strategy';
 export * from './entity/money-strategy';
 export * from './entity/uuid-id-strategy';
-export * from './entity-metadata/entity-metadata-modifier';
 export * from './fulfillment/default-fulfillment-process';
 export * from './fulfillment/fulfillment-handler';
 export * from './fulfillment/fulfillment-process';
@@ -45,17 +45,18 @@ export * from './job-queue/inspectable-job-queue-strategy';
 export * from './job-queue/job-queue-strategy';
 export * from './logger/default-logger';
 export * from './logger/noop-logger';
+export * from './logger/otel-logger';
 export * from './logger/vendure-logger';
 export * from './merge-config';
 export * from './order/active-order-strategy';
 export * from './order/changed-price-handling-strategy';
 export * from './order/default-active-order-strategy';
 export * from './order/default-changed-price-handling-strategy';
+export * from './order/default-guest-checkout-strategy';
 export * from './order/default-order-placed-strategy';
 export * from './order/default-order-process';
 export * from './order/default-order-seller-strategy';
 export * from './order/default-stock-allocation-strategy';
-export * from './order/default-guest-checkout-strategy';
 export * from './order/guest-checkout-strategy';
 export * from './order/merge-orders-strategy';
 export * from './order/order-by-code-access-strategy';
@@ -77,6 +78,7 @@ export * from './payment/payment-method-eligibility-checker';
 export * from './payment/payment-method-handler';
 export * from './payment/payment-process';
 export * from './promotion';
+export * from './refund/default-refund-process';
 export * from './session-cache/default-session-cache-strategy';
 export * from './session-cache/in-memory-session-cache-strategy';
 export * from './session-cache/noop-session-cache-strategy';
@@ -87,12 +89,11 @@ export * from './shipping-method/default-shipping-line-assignment-strategy';
 export * from './shipping-method/shipping-calculator';
 export * from './shipping-method/shipping-eligibility-checker';
 export * from './shipping-method/shipping-line-assignment-strategy';
-export * from './system/health-check-strategy';
 export * from './system/error-handler-strategy';
+export * from './system/health-check-strategy';
+export * from './tax/address-based-tax-zone-strategy';
 export * from './tax/default-tax-line-calculation-strategy';
 export * from './tax/default-tax-zone-strategy';
-export * from './tax/address-based-tax-zone-strategy';
 export * from './tax/tax-line-calculation-strategy';
 export * from './tax/tax-zone-strategy';
 export * from './vendure-config';
-export * from './refund/default-refund-process';

+ 39 - 0
packages/core/src/config/logger/otel-logger.ts

@@ -0,0 +1,39 @@
+import { SeverityNumber } from '@opentelemetry/api-logs';
+
+import { otelLogger } from '../../instrumentation';
+
+import { VendureLogger } from './vendure-logger';
+
+export class OtelLogger implements VendureLogger {
+    debug(message: string, context?: string): void {
+        this.emitLog(SeverityNumber.DEBUG, message, context);
+    }
+
+    warn(message: string, context?: string): void {
+        this.emitLog(SeverityNumber.WARN, message, context);
+    }
+
+    info(message: string, context?: string): void {
+        this.emitLog(SeverityNumber.INFO, message, context);
+    }
+
+    error(message: string, context?: string): void {
+        this.emitLog(SeverityNumber.ERROR, message, context);
+    }
+
+    verbose(message: string, context?: string): void {
+        this.emitLog(SeverityNumber.DEBUG, message, context);
+    }
+
+    private emitLog(severityNumber: SeverityNumber, message: string, context?: string, label?: string): void {
+        otelLogger.emit({
+            severityNumber,
+            body: message,
+            attributes: {
+                context,
+                service_name: 'vendure',
+                ...(label ? { label } : {}),
+            },
+        });
+    }
+}

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

@@ -1,8 +1,11 @@
 import { trace } from '@opentelemetry/api';
+import { logs } from '@opentelemetry/api-logs';
 import { createSpanDecorator } from '@vendure/telemetry';
 
 import { VENDURE_VERSION } from './version';
 
 export const tracer = trace.getTracer('@vendure/core', VENDURE_VERSION);
 
+export const otelLogger = logs.getLogger('@vendure/core', VENDURE_VERSION);
+
 export const Span = createSpanDecorator(tracer);

+ 2 - 3
packages/dev-server/dev-config.ts

@@ -3,11 +3,10 @@ import { AdminUiPlugin } from '@vendure/admin-ui-plugin';
 import { AssetServerPlugin } from '@vendure/asset-server-plugin';
 import { ADMIN_API_PATH, API_PORT, SHOP_API_PATH } from '@vendure/common/lib/shared-constants';
 import {
-    DefaultLogger,
     DefaultSearchPlugin,
     dummyPaymentHandler,
     LanguageCode,
-    LogLevel,
+    OtelLogger,
     VendureConfig,
 } from '@vendure/core';
 import { defaultEmailHandlers, EmailPlugin, FileBasedTemplateLoader } from '@vendure/email-plugin';
@@ -84,7 +83,7 @@ export const devConfig: VendureConfig = {
             },
         ],
     },
-    logger: new DefaultLogger({ level: LogLevel.Info }),
+    logger: new OtelLogger(),
     importExportOptions: {
         importAssetsDir: path.join(__dirname, 'import-assets'),
     },

+ 8 - 0
packages/dev-server/instrumentation.ts

@@ -1,5 +1,7 @@
+import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-proto';
 import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
 import { resourceFromAttributes } from '@opentelemetry/resources';
+import { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';
 import { NodeSDK } from '@opentelemetry/sdk-node';
 import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';
 import { getSdkConfiguration } from '@vendure/telemetry';
@@ -8,8 +10,14 @@ const traceExporter = new OTLPTraceExporter({
     url: 'http://localhost:4318/v1/traces',
 });
 
+process.env.OTEL_EXPORTER_OTLP_ENDPOINT = 'http://localhost:3100/otlp';
+process.env.OTEL_LOGS_EXPORTER = 'otlp';
+
+const logExporter = new OTLPLogExporter();
+
 const config = getSdkConfiguration(false, {
     spanProcessors: [new BatchSpanProcessor(traceExporter)],
+    logRecordProcessor: new BatchLogRecordProcessor(logExporter),
     resource: resourceFromAttributes({
         'service.name': 'vendure-dev-server',
     }),

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

@@ -32,6 +32,7 @@
         "csv-stringify": "^6.4.6",
         "dayjs": "^1.11.10",
         "jsdom": "^26.0.0",
-        "progress": "^2.0.3"
+        "progress": "^2.0.3",
+        "@opentelemetry/exporter-logs-otlp-proto": "^0.200.0"
     }
 }

+ 3 - 1
packages/telemetry/package.json

@@ -29,7 +29,9 @@
         "@opentelemetry/resources": "^2.0.0",
         "@opentelemetry/sdk-node": "^0.200.0",
         "@opentelemetry/context-async-hooks": "^2.0.0",
-        "@vendure/common": "3.2.2"
+        "@vendure/common": "3.2.2",
+        "@opentelemetry/exporter-logs-otlp-proto": "^0.200.0",
+        "@opentelemetry/sdk-logs": "^0.200.0"
     },
     "devDependencies": {
         "typescript": "5.8.2"