open-telemetry / opentelemetry-js-contrib

OpenTelemetry instrumentation for JavaScript modules
https://opentelemetry.io
Apache License 2.0
635 stars 473 forks source link

Winston logging not working with node js #2280

Open tarunsinghh opened 2 weeks ago

tarunsinghh commented 2 weeks ago

This is package.json "dependencies": { "@opentelemetry/api": "1.4.1", "@opentelemetry/api-logs": "^0.52", "@opentelemetry/sdk-trace-node": "^1.25.0", "@opentelemetry/sdk-logs": "^0.52", "@opentelemetry/instrumentation-http": "^0.52.0", "@opentelemetry/instrumentation-express": "^0.40", "@opentelemetry/instrumentation-winston": "0.38", "@opentelemetry/core": "^1.25", "express": "^4.19", "axios": "^1.7", "winston": "^3.13" }

This is the real code in tracer.js

const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node'); const logsAPI = require('@opentelemetry/api-logs'); const { LoggerProvider, SimpleLogRecordProcessor, ConsoleLogRecordExporter, } = require('@opentelemetry/sdk-logs'); const { WinstonInstrumentation } = require('@opentelemetry/instrumentation-winston'); const { registerInstrumentations } = require('@opentelemetry/instrumentation');

const tracerProvider = new NodeTracerProvider(); tracerProvider.register();

// To start a logger, you first need to initialize the Logger provider. const loggerProvider = new LoggerProvider(); // Add a processor to export log record loggerProvider.addLogRecordProcessor( new SimpleLogRecordProcessor(new ConsoleLogRecordExporter()) ); logsAPI.logs.setGlobalLoggerProvider(loggerProvider);

registerInstrumentations({ instrumentations: [ new WinstonInstrumentation({ level:'info', logHook: (record, span) => { // Add custom attributes or context to log records record.attributes['trace_id'] = span.spanContext().traceId; record.attributes['span_id'] = span.spanContext().spanId; } // See below for Winston instrumentation options. }), ], });

const winston = require('winston'); const logger = winston.createLogger({ level: "info", format: winston.format.json(),

transports: [new winston.transports.Console()],

}) logger.info('foobar'); // prints {"level":"info","message":"foobar"} no traceid keys

No opentelemetry trace ids are getting printed, I required this in some other file in server.js there also its not printing trace id.

architgarg95 commented 1 week ago

You need to add the winston transport as well for this to work: https://www.npmjs.com/package/@opentelemetry/winston-transport

tarunsinghh commented 1 week ago

You need to add the winston transport as well for this to work: https://www.npmjs.com/package/@opentelemetry/winston-transport

Adding this giving more output but still spanId and traceId are not coming .

const { OpenTelemetryTransportV3 } = require('@opentelemetry/winston-transport'); transports: [new winston.transports.Console(), new OpenTelemetryTransportV3()

output : -

{"level":"info","message":"foobar"} { resource: { attributes: { 'service.name': 'unknown_service:C:\Program Files\nodejs\node.exe', 'telemetry.sdk.language': 'nodejs', 'telemetry.sdk.name': 'opentelemetry', 'telemetry.sdk.version': '1.25.0' } }, timestamp: 1718785914695000, traceId: undefined, spanId: undefined, traceFlags: undefined, severityText: 'info', severityNumber: 9, body: 'foobar', attributes: {} }

architgarg95 commented 1 week ago

can you try removing the hook use, I haven't used hooks then also its working fine for me

tarunsinghh commented 1 week ago

yeah removed it and posted then only

registerInstrumentations({ instrumentations: [ new WinstonInstrumentation({ level:'info', / logHook: (record, span) => { // Add custom attributes or context to log records record.attributes['trace_id'] = span.spanContext().traceId; record.attributes['span_id'] = span.spanContext().spanId; }/ // See below for Winston instrumentation options. }), ], });

architgarg95 commented 1 week ago

even mine isn't working wherein I have a library which uses opentelemetry and exposes a few things of it to the using application.

If I run tracing otherwise works fine for me.

In my tracing isn't working at all not sure why even though verbose logging shows express etc. all instrumented correctly. Also I am doing this in the library test file.

If anyone can help getting some console.error Trace { resource: {.....} }

at resource/detector.ts not sure why as all resources are showing correctly in the logs etc as well

juniorsdj commented 1 week ago

Try to install the the winston transport @opentelemetry/winston-transport.

It looks like an problem with dependecies for @opentelemetry/instrumentation-winston.