|
|
@@ -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;
|