Просмотр исходного кода

add global logger for opentelemetry

Yuki Takei 1 год назад
Родитель
Сommit
d7b878b3e0
1 измененных файлов с 77 добавлено и 1 удалено
  1. 77 1
      apps/app/src/server/crowi/opentelemetry.ts

+ 77 - 1
apps/app/src/server/crowi/opentelemetry.ts

@@ -1,3 +1,4 @@
+import { diag, type DiagLogger } from '@opentelemetry/api';
 import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
 import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc';
 import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';
@@ -5,7 +6,6 @@ import { Resource } from '@opentelemetry/resources';
 import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
 import type { NodeSDKConfiguration } from '@opentelemetry/sdk-node';
 import { NodeSDK } from '@opentelemetry/sdk-node';
-import { TraceIdRatioBasedSampler } from '@opentelemetry/sdk-trace-node';
 import { SEMRESATTRS_SERVICE_NAME, SEMRESATTRS_SERVICE_INSTANCE_ID, SEMRESATTRS_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
 
 import loggerFactory from '~/utils/logger';
@@ -14,6 +14,82 @@ import { configManager } from '../service/config-manager';
 
 const logger = loggerFactory('growi:opentelemetry');
 
+const loggerForDiag = loggerFactory('growi:opentelemetry:diag');
+
+class BunyanOTelLogger implements DiagLogger {
+
+  private parseMessage(message: string, args: unknown[]): { logMessage: string, data: object } {
+    let logMessage = message;
+    let data = {};
+
+    // check whether the message is a JSON string
+    try {
+      const parsedMessage = JSON.parse(message);
+      if (typeof parsedMessage === 'object' && parsedMessage !== null) {
+        data = parsedMessage;
+        // if parsed successfully, use 'message' property as log message
+        logMessage = 'message' in data && typeof data.message === 'string'
+          ? data.message
+          : message;
+      }
+    }
+    catch (e) {
+      // do nothing if the message is not a JSON string
+    }
+
+    // merge additional data
+    if (args.length > 0) {
+      // eslint-disable-next-line @typescript-eslint/no-explicit-any
+      const argsData = (args as any).reduce((acc, arg) => {
+        if (typeof arg === 'string') {
+          try {
+            const parsed = JSON.parse(arg);
+            return { ...acc, ...parsed };
+          }
+          catch (e) {
+            return { ...acc, additionalInfo: arg };
+          }
+        }
+        return { ...acc, ...arg };
+      }, {});
+      data = { ...data, ...argsData };
+    }
+
+    return { logMessage, data };
+  }
+
+  error(message: string, ...args): void {
+    const { logMessage, data } = this.parseMessage(message, args);
+    loggerForDiag.error(logMessage, data);
+  }
+
+  warn(message: string, ...args): void {
+    const { logMessage, data } = this.parseMessage(message, args);
+    loggerForDiag.error(logMessage, data);
+  }
+
+  info(message: string, ...args): void {
+    const { logMessage, data } = this.parseMessage(message, args);
+    loggerForDiag.error(logMessage, data);
+  }
+
+  debug(message: string, ...args): void {
+    const { logMessage, data } = this.parseMessage(message, args);
+    loggerForDiag.error(logMessage, data);
+  }
+
+  verbose(message: string, ...args): void {
+    const { logMessage, data } = this.parseMessage(message, args);
+    loggerForDiag.error(logMessage, data);
+  }
+
+}
+
+
+// Enable global logger for OpenTelemetry
+diag.setLogger(new BunyanOTelLogger());
+
+
 export class OpenTelemetry {
 
   name: string;