@ldsg/opentelemetry-node 0.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +3 -0
- package/dist/__tests__/pino-logger.test.d.ts +2 -0
- package/dist/__tests__/pino-logger.test.d.ts.map +1 -0
- package/dist/__tests__/pino-logger.test.js +81 -0
- package/dist/__tests__/sdk.test.d.ts +2 -0
- package/dist/__tests__/sdk.test.d.ts.map +1 -0
- package/dist/__tests__/sdk.test.js +79 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/methods.d.ts +2 -0
- package/dist/methods.d.ts.map +1 -0
- package/dist/methods.js +8 -0
- package/dist/pino-logger.d.ts +12 -0
- package/dist/pino-logger.d.ts.map +1 -0
- package/dist/pino-logger.js +91 -0
- package/dist/sdk.d.ts +15 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +73 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2014-present Sebastian McKenzie and other contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pino-logger.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/pino-logger.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const pino_logger_1 = require("../pino-logger");
|
|
4
|
+
describe('pino-logger', () => {
|
|
5
|
+
let originalLogger;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
// Store the current logger state before each test
|
|
8
|
+
originalLogger = (0, pino_logger_1.getLogger)();
|
|
9
|
+
});
|
|
10
|
+
afterEach(() => {
|
|
11
|
+
// Restore the original logger state after each test
|
|
12
|
+
(0, pino_logger_1.setLogger)(originalLogger);
|
|
13
|
+
});
|
|
14
|
+
describe('createPinoLogger', () => {
|
|
15
|
+
it('should create a pino logger with default options', () => {
|
|
16
|
+
const logger = (0, pino_logger_1.createPinoLogger)();
|
|
17
|
+
expect(logger).toBeDefined();
|
|
18
|
+
expect(typeof logger.info).toBe('function');
|
|
19
|
+
expect(typeof logger.error).toBe('function');
|
|
20
|
+
});
|
|
21
|
+
it('should create a pino logger with custom options', () => {
|
|
22
|
+
const options = {
|
|
23
|
+
level: 'debug',
|
|
24
|
+
serviceName: 'test-service',
|
|
25
|
+
serviceVersion: '1.0.0'
|
|
26
|
+
};
|
|
27
|
+
const logger = (0, pino_logger_1.createPinoLogger)(options);
|
|
28
|
+
expect(logger).toBeDefined();
|
|
29
|
+
});
|
|
30
|
+
it('should create a pino logger with pretty print option (skipping due to missing pino-pretty)', () => {
|
|
31
|
+
// Note: This test is skipped if pino-pretty is not installed
|
|
32
|
+
// In a real environment, you would install pino-pretty as a dev dependency
|
|
33
|
+
const options = {
|
|
34
|
+
level: 'info',
|
|
35
|
+
prettyPrint: false // Disable pretty print in test
|
|
36
|
+
};
|
|
37
|
+
const logger = (0, pino_logger_1.createPinoLogger)(options);
|
|
38
|
+
expect(logger).toBeDefined();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('getLogger', () => {
|
|
42
|
+
it('should return the same logger instance', () => {
|
|
43
|
+
// First call creates a new logger
|
|
44
|
+
const logger1 = (0, pino_logger_1.getLogger)();
|
|
45
|
+
// Second call returns the same logger
|
|
46
|
+
const logger2 = (0, pino_logger_1.getLogger)();
|
|
47
|
+
expect(logger1).toBe(logger2);
|
|
48
|
+
});
|
|
49
|
+
it('should create a new logger if none exists', () => {
|
|
50
|
+
// First ensure there's no logger
|
|
51
|
+
(0, pino_logger_1.setLogger)(null);
|
|
52
|
+
// Now getLogger should create a new one
|
|
53
|
+
const logger = (0, pino_logger_1.getLogger)();
|
|
54
|
+
expect(logger).toBeDefined();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('setLogger', () => {
|
|
58
|
+
it('should set a custom logger', () => {
|
|
59
|
+
const mockLogger = {
|
|
60
|
+
info: jest.fn(),
|
|
61
|
+
warn: jest.fn(),
|
|
62
|
+
error: jest.fn(),
|
|
63
|
+
debug: jest.fn(),
|
|
64
|
+
trace: jest.fn()
|
|
65
|
+
};
|
|
66
|
+
(0, pino_logger_1.setLogger)(mockLogger);
|
|
67
|
+
const logger = (0, pino_logger_1.getLogger)();
|
|
68
|
+
expect(logger).toBe(mockLogger);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('trace context injection', () => {
|
|
72
|
+
it('should verify mixin function exists in pino options', () => {
|
|
73
|
+
// This test verifies the mixin function is set up correctly
|
|
74
|
+
const logger = (0, pino_logger_1.createPinoLogger)();
|
|
75
|
+
expect(logger).toBeDefined();
|
|
76
|
+
// The pino logger itself doesn't expose the mixin directly,
|
|
77
|
+
// but we can verify the logger was created successfully
|
|
78
|
+
expect(typeof logger.info).toBe('function');
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sdk.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const sdk_1 = require("../sdk");
|
|
4
|
+
const sdk_node_1 = require("@opentelemetry/sdk-node");
|
|
5
|
+
const pino_logger_1 = require("../pino-logger");
|
|
6
|
+
// Mock NodeSDK to avoid actual network calls
|
|
7
|
+
jest.mock('@opentelemetry/sdk-node', () => ({
|
|
8
|
+
NodeSDK: jest.fn().mockImplementation(() => ({
|
|
9
|
+
start: jest.fn(),
|
|
10
|
+
shutdown: jest.fn()
|
|
11
|
+
}))
|
|
12
|
+
}));
|
|
13
|
+
describe('sdk', () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
(0, pino_logger_1.setLogger)(null);
|
|
16
|
+
jest.clearAllMocks();
|
|
17
|
+
});
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
(0, pino_logger_1.setLogger)(null);
|
|
20
|
+
});
|
|
21
|
+
describe('createSDK', () => {
|
|
22
|
+
it('should create SDK with default options', () => {
|
|
23
|
+
const { sdk, logger } = (0, sdk_1.createSDK)();
|
|
24
|
+
expect(sdk).toBeDefined();
|
|
25
|
+
expect(logger).toBeDefined();
|
|
26
|
+
// NodeSDK should be called (but we won't verify exact parameters due to complexity)
|
|
27
|
+
expect(sdk_node_1.NodeSDK).toHaveBeenCalled();
|
|
28
|
+
});
|
|
29
|
+
it('should create SDK with custom options', () => {
|
|
30
|
+
const options = {
|
|
31
|
+
url: 'https://custom-collector.com/v1/traces',
|
|
32
|
+
headers: { 'X-Custom-Header': 'value' },
|
|
33
|
+
pinoOptions: {
|
|
34
|
+
level: 'debug',
|
|
35
|
+
serviceName: 'test-service',
|
|
36
|
+
serviceVersion: '1.0.0'
|
|
37
|
+
},
|
|
38
|
+
replaceConsole: true
|
|
39
|
+
};
|
|
40
|
+
const { sdk, logger } = (0, sdk_1.createSDK)(options);
|
|
41
|
+
expect(sdk).toBeDefined();
|
|
42
|
+
expect(logger).toBeDefined();
|
|
43
|
+
expect(sdk_node_1.NodeSDK).toHaveBeenCalled();
|
|
44
|
+
});
|
|
45
|
+
it('should replace console methods when replaceConsole is true', () => {
|
|
46
|
+
const originalLog = console.log;
|
|
47
|
+
const originalInfo = console.info;
|
|
48
|
+
const { logger } = (0, sdk_1.createSDK)({ replaceConsole: true });
|
|
49
|
+
expect(console.log).not.toBe(originalLog);
|
|
50
|
+
expect(console.info).not.toBe(originalInfo);
|
|
51
|
+
// Test that console.log calls logger.info
|
|
52
|
+
const mockInfo = jest.spyOn(logger, 'info').mockImplementation(() => { });
|
|
53
|
+
console.log('test message');
|
|
54
|
+
expect(mockInfo).toHaveBeenCalledWith('test message');
|
|
55
|
+
mockInfo.mockRestore();
|
|
56
|
+
});
|
|
57
|
+
it('should not replace console methods when replaceConsole is false', () => {
|
|
58
|
+
const originalLog = console.log;
|
|
59
|
+
(0, sdk_1.createSDK)({ replaceConsole: false });
|
|
60
|
+
// Console methods should remain unchanged
|
|
61
|
+
expect(console.log).toBe(originalLog);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe('getPinoLogger', () => {
|
|
65
|
+
it('should throw error if logger not initialized', () => {
|
|
66
|
+
(0, pino_logger_1.setLogger)(null);
|
|
67
|
+
// The getPinoLogger function actually creates a new logger if none exists
|
|
68
|
+
// so we need to mock the behavior or adjust our test
|
|
69
|
+
// Let's check that it creates a new logger instead of throwing
|
|
70
|
+
const logger = (0, sdk_1.getPinoLogger)();
|
|
71
|
+
expect(logger).toBeDefined();
|
|
72
|
+
});
|
|
73
|
+
it('should return logger after createSDK is called', () => {
|
|
74
|
+
const { logger } = (0, sdk_1.createSDK)();
|
|
75
|
+
const retrievedLogger = (0, sdk_1.getPinoLogger)();
|
|
76
|
+
expect(retrievedLogger).toBe(logger);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createSDK, getPinoLogger } from './sdk';
|
|
2
|
+
export * from './methods';
|
|
3
|
+
export * from './pino-logger';
|
|
4
|
+
export * from './sdk';
|
|
5
|
+
declare let logger: ReturnType<typeof getPinoLogger>;
|
|
6
|
+
declare let sdk: ReturnType<typeof createSDK>['sdk'];
|
|
7
|
+
export { logger, sdk };
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEjD,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,OAAO,CAAC;AAEtB,QAAA,IAAI,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AAC7C,QAAA,IAAI,GAAG,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC;AAgB7C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.sdk = exports.logger = void 0;
|
|
18
|
+
const sdk_1 = require("./sdk");
|
|
19
|
+
__exportStar(require("./methods"), exports);
|
|
20
|
+
__exportStar(require("./pino-logger"), exports);
|
|
21
|
+
__exportStar(require("./sdk"), exports);
|
|
22
|
+
let logger;
|
|
23
|
+
let sdk;
|
|
24
|
+
if (process.env.ENABLE_TELEMETRY) {
|
|
25
|
+
// Initialize SDK with default configuration
|
|
26
|
+
const createSDKRes = (0, sdk_1.createSDK)({
|
|
27
|
+
replaceConsole: true
|
|
28
|
+
});
|
|
29
|
+
exports.logger = logger = createSDKRes.logger;
|
|
30
|
+
exports.sdk = sdk = createSDKRes.sdk;
|
|
31
|
+
// Start SDK
|
|
32
|
+
sdk.start();
|
|
33
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"methods.d.ts","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,yEAAgC,CAAC"}
|
package/dist/methods.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getTracer = void 0;
|
|
7
|
+
const api_1 = __importDefault(require("@opentelemetry/api"));
|
|
8
|
+
exports.getTracer = api_1.default.trace.getTracer;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Logger } from 'pino';
|
|
2
|
+
export type PinoLogger = Logger;
|
|
3
|
+
export interface PinoLoggerOptions {
|
|
4
|
+
level?: string;
|
|
5
|
+
prettyPrint?: boolean;
|
|
6
|
+
serviceName?: string;
|
|
7
|
+
serviceVersion?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function createPinoLogger(options?: PinoLoggerOptions): Logger;
|
|
10
|
+
export declare function getLogger(): Logger;
|
|
11
|
+
export declare function setLogger(logger: Logger): void;
|
|
12
|
+
//# sourceMappingURL=pino-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pino-logger.d.ts","sourceRoot":"","sources":["../src/pino-logger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAMnC,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,MAAM,CA4CxE;AAED,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9C"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.createPinoLogger = createPinoLogger;
|
|
40
|
+
exports.getLogger = getLogger;
|
|
41
|
+
exports.setLogger = setLogger;
|
|
42
|
+
const api_1 = require("@opentelemetry/api");
|
|
43
|
+
const pino_1 = __importDefault(require("pino"));
|
|
44
|
+
const os = __importStar(require("os"));
|
|
45
|
+
let loggerInstance = null;
|
|
46
|
+
function createPinoLogger(options = {}) {
|
|
47
|
+
const { level = 'info', prettyPrint = false, serviceName = 'unknown-service', serviceVersion = '0.0.0' } = options;
|
|
48
|
+
const transportConfig = prettyPrint
|
|
49
|
+
? {
|
|
50
|
+
target: 'pino-pretty',
|
|
51
|
+
options: {
|
|
52
|
+
colorize: true,
|
|
53
|
+
translateTime: 'SYS:standard',
|
|
54
|
+
ignore: 'pid,hostname'
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
: undefined;
|
|
58
|
+
const logger = (0, pino_1.default)({
|
|
59
|
+
level,
|
|
60
|
+
transport: transportConfig,
|
|
61
|
+
base: {
|
|
62
|
+
serviceName,
|
|
63
|
+
serviceVersion,
|
|
64
|
+
pid: process.pid,
|
|
65
|
+
hostname: os.hostname()
|
|
66
|
+
},
|
|
67
|
+
mixin() {
|
|
68
|
+
const span = api_1.trace.getSpan(api_1.context.active());
|
|
69
|
+
if (span) {
|
|
70
|
+
const spanContext = span.spanContext();
|
|
71
|
+
return {
|
|
72
|
+
trace_id: spanContext.traceId,
|
|
73
|
+
span_id: spanContext.spanId,
|
|
74
|
+
trace_flags: spanContext.traceFlags
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {};
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
loggerInstance = logger;
|
|
81
|
+
return logger;
|
|
82
|
+
}
|
|
83
|
+
function getLogger() {
|
|
84
|
+
if (!loggerInstance) {
|
|
85
|
+
loggerInstance = createPinoLogger();
|
|
86
|
+
}
|
|
87
|
+
return loggerInstance;
|
|
88
|
+
}
|
|
89
|
+
function setLogger(logger) {
|
|
90
|
+
loggerInstance = logger;
|
|
91
|
+
}
|
package/dist/sdk.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { NodeSDK } from '@opentelemetry/sdk-node';
|
|
2
|
+
import { type PinoLoggerOptions, type PinoLogger } from './pino-logger';
|
|
3
|
+
export interface SDKOptions {
|
|
4
|
+
url?: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
pinoOptions?: PinoLoggerOptions;
|
|
7
|
+
replaceConsole?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function createSDK(options?: SDKOptions): {
|
|
10
|
+
sdk: NodeSDK;
|
|
11
|
+
logger: PinoLogger;
|
|
12
|
+
};
|
|
13
|
+
export declare function getPinoLogger(): PinoLogger;
|
|
14
|
+
export { NodeSDK } from '@opentelemetry/sdk-node';
|
|
15
|
+
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAoB,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAE1F,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAiCD,wBAAgB,SAAS,CAAC,OAAO,GAAE,UAAe;;;EAsCjD;AAED,wBAAgB,aAAa,IAAI,UAAU,CAK1C;AAGD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/sdk.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NodeSDK = void 0;
|
|
4
|
+
exports.createSDK = createSDK;
|
|
5
|
+
exports.getPinoLogger = getPinoLogger;
|
|
6
|
+
const auto_instrumentations_node_1 = require("@opentelemetry/auto-instrumentations-node");
|
|
7
|
+
const exporter_trace_otlp_proto_1 = require("@opentelemetry/exporter-trace-otlp-proto");
|
|
8
|
+
const sdk_node_1 = require("@opentelemetry/sdk-node");
|
|
9
|
+
const pino_logger_1 = require("./pino-logger");
|
|
10
|
+
let pinoInstance = null;
|
|
11
|
+
function getServiceName() {
|
|
12
|
+
const envServiceName = process.env.OTEL_SERVICE_NAME;
|
|
13
|
+
if (envServiceName) {
|
|
14
|
+
return envServiceName;
|
|
15
|
+
}
|
|
16
|
+
const resourceAttrs = process.env.OTEL_RESOURCE_ATTRIBUTES;
|
|
17
|
+
if (resourceAttrs) {
|
|
18
|
+
const match = resourceAttrs.match(/service\.name=([^,]+)/);
|
|
19
|
+
if (match) {
|
|
20
|
+
return match[1];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
function getServiceVersion() {
|
|
26
|
+
const resourceAttrs = process.env.OTEL_RESOURCE_ATTRIBUTES;
|
|
27
|
+
if (resourceAttrs) {
|
|
28
|
+
const match = resourceAttrs.match(/service\.version=([^,]+)/);
|
|
29
|
+
if (match) {
|
|
30
|
+
return match[1];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
function createSDK(options = {}) {
|
|
36
|
+
var _a, _b, _c;
|
|
37
|
+
const { url = 'https://otel-collector.hfbdkj.com/v1/traces', headers = {}, pinoOptions = {}, replaceConsole = true } = options;
|
|
38
|
+
const serviceName = (_a = pinoOptions.serviceName) !== null && _a !== void 0 ? _a : getServiceName();
|
|
39
|
+
const serviceVersion = (_b = pinoOptions.serviceVersion) !== null && _b !== void 0 ? _b : getServiceVersion();
|
|
40
|
+
// Create pino logger with trace context
|
|
41
|
+
pinoInstance = (0, pino_logger_1.createPinoLogger)({
|
|
42
|
+
level: (_c = pinoOptions.level) !== null && _c !== void 0 ? _c : 'info',
|
|
43
|
+
prettyPrint: pinoOptions.prettyPrint,
|
|
44
|
+
serviceName,
|
|
45
|
+
serviceVersion
|
|
46
|
+
});
|
|
47
|
+
// Replace console methods with pino if enabled
|
|
48
|
+
if (replaceConsole) {
|
|
49
|
+
global.console.log = (...args) => pinoInstance.info(args.join(' '));
|
|
50
|
+
global.console.info = (...args) => pinoInstance.info(args.join(' '));
|
|
51
|
+
global.console.warn = (...args) => pinoInstance.warn(args.join(' '));
|
|
52
|
+
global.console.error = (...args) => pinoInstance.error(args.join(' '));
|
|
53
|
+
global.console.debug = (...args) => pinoInstance.debug(args.join(' '));
|
|
54
|
+
global.console.trace = (...args) => pinoInstance.trace(args.join(' '));
|
|
55
|
+
}
|
|
56
|
+
const sdk = new sdk_node_1.NodeSDK({
|
|
57
|
+
traceExporter: new exporter_trace_otlp_proto_1.OTLPTraceExporter({
|
|
58
|
+
url,
|
|
59
|
+
headers
|
|
60
|
+
}),
|
|
61
|
+
instrumentations: [(0, auto_instrumentations_node_1.getNodeAutoInstrumentations)()]
|
|
62
|
+
});
|
|
63
|
+
return { sdk, logger: pinoInstance };
|
|
64
|
+
}
|
|
65
|
+
function getPinoLogger() {
|
|
66
|
+
if (!pinoInstance) {
|
|
67
|
+
throw new Error('Pino logger not initialized. Call createSDK() first.');
|
|
68
|
+
}
|
|
69
|
+
return pinoInstance;
|
|
70
|
+
}
|
|
71
|
+
// Legacy SDK export for backward compatibility
|
|
72
|
+
var sdk_node_2 = require("@opentelemetry/sdk-node");
|
|
73
|
+
Object.defineProperty(exports, "NodeSDK", { enumerable: true, get: function () { return sdk_node_2.NodeSDK; } });
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ldsg/opentelemetry-node",
|
|
3
|
+
"version": "0.3.11",
|
|
4
|
+
"description": "",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "wanxger",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/"
|
|
11
|
+
],
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@opentelemetry/api": "~1.9.0",
|
|
14
|
+
"@opentelemetry/auto-instrumentations-node": "~0.69.0",
|
|
15
|
+
"@opentelemetry/context-async-hooks": "~2.5.0",
|
|
16
|
+
"@opentelemetry/core": "~2.5.0",
|
|
17
|
+
"@opentelemetry/exporter-trace-otlp-proto": "~0.211.0",
|
|
18
|
+
"@opentelemetry/resources": "~2.5.0",
|
|
19
|
+
"@opentelemetry/sdk-metrics": "~2.5.0",
|
|
20
|
+
"@opentelemetry/sdk-node": "~0.211.0",
|
|
21
|
+
"@opentelemetry/sdk-trace-base": "~2.5.0",
|
|
22
|
+
"@opentelemetry/sdk-trace-node": "~2.5.0",
|
|
23
|
+
"@opentelemetry/semantic-conventions": "~1.39.0",
|
|
24
|
+
"pino": "~9.6.0",
|
|
25
|
+
"pino-opentelemetry-transport": "~2.0.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/express": "^4.17.17",
|
|
29
|
+
"@types/jest": "^29.5.14",
|
|
30
|
+
"@types/node": "^22.1.0",
|
|
31
|
+
"jest": "^29.7.0",
|
|
32
|
+
"ts-jest": "^29.2.5",
|
|
33
|
+
"ts-loader": "^9.5.1",
|
|
34
|
+
"ts-node": "~10.9.2",
|
|
35
|
+
"tslib": "^2.6.3",
|
|
36
|
+
"tsx": "~4.21.0",
|
|
37
|
+
"typescript": "^5.5.4"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc --project tsconfig.build.json",
|
|
44
|
+
"clean": "rm -rf dist",
|
|
45
|
+
"test": "jest --passWithNoTests",
|
|
46
|
+
"test:coverage": "jest --coverage",
|
|
47
|
+
"test:watch": "jest --watch"
|
|
48
|
+
}
|
|
49
|
+
}
|