From 52f102ec4e198d2d974f5b2503b8d16acc47e593 Mon Sep 17 00:00:00 2001 From: Abhilash <70062455+abhilash-sivan@users.noreply.github.com> Date: Fri, 17 Jan 2025 22:36:13 +0530 Subject: [PATCH] fix: resolved issue in setLogger function with winston logger (#1522) refs INSTA-24448 --- packages/collector/src/logger.js | 56 +++++++++------- .../app-instana-receives-winston-logger.js | 67 +++++++++++++++++++ .../tracing/logger/instana-logger/controls.js | 3 + .../tracing/logger/instana-logger/test.js | 12 ++++ 4 files changed, 114 insertions(+), 24 deletions(-) create mode 100644 packages/collector/test/tracing/logger/instana-logger/app-instana-receives-winston-logger.js diff --git a/packages/collector/src/logger.js b/packages/collector/src/logger.js index 8eafe9778a..39fd19a199 100644 --- a/packages/collector/src/logger.js +++ b/packages/collector/src/logger.js @@ -55,29 +55,33 @@ exports.init = function init(config, isReInit) { // This consoleStream creates a destination stream for the logger that writes log data to the standard output. // Since we are using multistream here, this needs to be specified explicitly - const consoleStream = uninstrumentedLogger.destination(parentLogger.destination); - - const multiStream = { - /** - * Custom write method to send logs to multiple destinations - * @param {string} chunk - */ - write(chunk) { - consoleStream.write(chunk); - - loggerToAgentStream.write(chunk); - } - }; - - parentLogger = uninstrumentedLogger( - { - ...parentLogger.levels, - level: parentLogger.level || 'info', - base: parentLogger.bindings(), - timestamp: () => `,"time":"${new Date().toISOString()}"` - }, - multiStream - ); + try { + const consoleStream = uninstrumentedLogger.destination(parentLogger.destination); + + const multiStream = { + /** + * Custom write method to send logs to multiple destinations + * @param {string} chunk + */ + write(chunk) { + consoleStream.write(chunk); + + loggerToAgentStream.write(chunk); + } + }; + + parentLogger = uninstrumentedLogger( + { + ...parentLogger.levels, + level: parentLogger.level || 'info', + base: parentLogger.bindings(), + timestamp: () => `,"time":"${new Date().toISOString()}"` + }, + multiStream + ); + } catch (error) { + parentLogger.debug(`An issue occurred while modifying the current logger: ${error.message}`); + } } else if (parentLogger && parentLogger.addStream) { // in case we are using a bunyan logger we also forward logs to the agent parentLogger.addStream({ @@ -174,6 +178,10 @@ function setLoggerLevel(_logger, level) { */ function isPinoLogger(_logger) { return ( - _logger && typeof _logger === 'object' && typeof _logger.child === 'function' && typeof _logger.level === 'string' + _logger && + typeof _logger === 'object' && + typeof _logger.child === 'function' && + typeof _logger.level === 'string' && + typeof _logger.bindings === 'function' ); } diff --git a/packages/collector/test/tracing/logger/instana-logger/app-instana-receives-winston-logger.js b/packages/collector/test/tracing/logger/instana-logger/app-instana-receives-winston-logger.js new file mode 100644 index 0000000000..67bc5aefda --- /dev/null +++ b/packages/collector/test/tracing/logger/instana-logger/app-instana-receives-winston-logger.js @@ -0,0 +1,67 @@ +/* + * (c) Copyright IBM Corp. 2025 + */ + +/* eslint-disable no-console */ + +'use strict'; + +// NOTE: c8 bug https://github.com/bcoe/c8/issues/166 +process.on('SIGTERM', () => { + process.disconnect(); + process.exit(0); +}); + +const agentPort = process.env.AGENT_PORT; +const winston = require('winston'); +const instana = require('../../../..')({ + agentPort, + level: 'warn', + tracing: { + enabled: process.env.TRACING_ENABLED !== 'false', + forceTransmissionStartingAt: 1 + } +}); + +instana.setLogger( + winston.createLogger({ + level: 'info' + }) +); + +let instanaLogger; +instanaLogger = require('../../../../src/logger').getLogger('test-module-name', newLogger => { + instanaLogger = newLogger; +}); + +const bodyParser = require('body-parser'); +const express = require('express'); +const morgan = require('morgan'); +const port = require('../../../test_util/app-port')(); +const app = express(); +const logPrefix = `winston App [Instana receives winston logger] (${process.pid}):\t`; + +if (process.env.WITH_STDOUT) { + app.use(morgan(`${logPrefix}:method :url :status`)); +} + +app.use(bodyParser.json()); + +app.get('/', (req, res) => { + res.sendStatus(200); +}); + +app.get('/trigger', (req, res) => { + instanaLogger.error('An error logged by Instana - this must not be traced'); + res.sendStatus(200); +}); + +app.listen(port, () => { + log(`Listening on port: ${port}`); +}); + +function log() { + const args = Array.prototype.slice.call(arguments); + args[0] = logPrefix + args[0]; + console.log.apply(console, args); +} diff --git a/packages/collector/test/tracing/logger/instana-logger/controls.js b/packages/collector/test/tracing/logger/instana-logger/controls.js index 8564a54153..ee30866ccd 100644 --- a/packages/collector/test/tracing/logger/instana-logger/controls.js +++ b/packages/collector/test/tracing/logger/instana-logger/controls.js @@ -34,6 +34,9 @@ exports.registerTestHooks = (opts = {}) => { case 'instana-receives-bunyan-logger': appName = 'app-instana-receives-bunyan-logger.js'; break; + case 'instana-receives-winston-logger': + appName = 'app-instana-receives-winston-logger.js'; + break; default: throw new Error(`Unknown instanaLoggingMode: ${opts.instanaLoggingMode}`); } diff --git a/packages/collector/test/tracing/logger/instana-logger/test.js b/packages/collector/test/tracing/logger/instana-logger/test.js index 52d07e55bc..cb8801e029 100644 --- a/packages/collector/test/tracing/logger/instana-logger/test.js +++ b/packages/collector/test/tracing/logger/instana-logger/test.js @@ -57,6 +57,14 @@ mochaSuiteFn('tracing/instana-logger', function () { it('log calls are not traced', () => verifyInstanaLoggingIsNotTraced()); }); + + describe('Instana receives a winston logger', () => { + appControls.registerTestHooks({ + instanaLoggingMode: 'instana-receives-winston-logger' + }); + + it('log calls are not traced', () => verifyInstanaLoggingIsNotTraced()); + }); }); function verifyInstanaLoggingIsNotTraced() { @@ -81,6 +89,10 @@ mochaSuiteFn('tracing/instana-logger', function () { // verify that nothing logged by Instana has been traced with bunyan const allBunyanSpans = testUtils.getSpansByName(spans, 'log.bunyan'); expect(allBunyanSpans).to.be.empty; + + // verify that nothing logged by Instana has been traced with winston + const allWinstonSpans = testUtils.getSpansByName(spans, 'log.winston'); + expect(allWinstonSpans).to.be.empty; }) ); });