@sophonz/node-sdk 0.0.1

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.
Files changed (58) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +118 -0
  3. package/build/bin/opentelemetry-instrument.d.ts +3 -0
  4. package/build/bin/opentelemetry-instrument.d.ts.map +1 -0
  5. package/build/bin/opentelemetry-instrument.js +21 -0
  6. package/build/package.json +62 -0
  7. package/build/src/AbstractAsyncHooksContextManager.d.ts +18 -0
  8. package/build/src/AbstractAsyncHooksContextManager.d.ts.map +1 -0
  9. package/build/src/AbstractAsyncHooksContextManager.js +122 -0
  10. package/build/src/MutableAsyncLocalStorageContextManager.d.ts +14 -0
  11. package/build/src/MutableAsyncLocalStorageContextManager.d.ts.map +1 -0
  12. package/build/src/MutableAsyncLocalStorageContextManager.js +36 -0
  13. package/build/src/constants.d.ts +27 -0
  14. package/build/src/constants.d.ts.map +1 -0
  15. package/build/src/constants.js +41 -0
  16. package/build/src/gcp.d.ts +3 -0
  17. package/build/src/gcp.d.ts.map +1 -0
  18. package/build/src/gcp.js +60 -0
  19. package/build/src/index.d.ts +6 -0
  20. package/build/src/index.d.ts.map +1 -0
  21. package/build/src/index.js +11 -0
  22. package/build/src/instrumentations/console.d.ts +24 -0
  23. package/build/src/instrumentations/console.d.ts.map +1 -0
  24. package/build/src/instrumentations/console.js +146 -0
  25. package/build/src/instrumentations/http.d.ts +21 -0
  26. package/build/src/instrumentations/http.d.ts.map +1 -0
  27. package/build/src/instrumentations/http.js +285 -0
  28. package/build/src/logger.d.ts +26 -0
  29. package/build/src/logger.d.ts.map +1 -0
  30. package/build/src/logger.js +54 -0
  31. package/build/src/metrics.d.ts +3 -0
  32. package/build/src/metrics.d.ts.map +1 -0
  33. package/build/src/metrics.js +14 -0
  34. package/build/src/otel-logger/index.d.ts +36 -0
  35. package/build/src/otel-logger/index.d.ts.map +1 -0
  36. package/build/src/otel-logger/index.js +104 -0
  37. package/build/src/otel-logger/pino.d.ts +37 -0
  38. package/build/src/otel-logger/pino.d.ts.map +1 -0
  39. package/build/src/otel-logger/pino.js +91 -0
  40. package/build/src/otel-logger/winston.d.ts +29 -0
  41. package/build/src/otel-logger/winston.d.ts.map +1 -0
  42. package/build/src/otel-logger/winston.js +72 -0
  43. package/build/src/otel.d.ts +29 -0
  44. package/build/src/otel.d.ts.map +1 -0
  45. package/build/src/otel.js +482 -0
  46. package/build/src/spanProcessor.d.ts +17 -0
  47. package/build/src/spanProcessor.d.ts.map +1 -0
  48. package/build/src/spanProcessor.js +37 -0
  49. package/build/src/tracing.d.ts +2 -0
  50. package/build/src/tracing.d.ts.map +1 -0
  51. package/build/src/tracing.js +4 -0
  52. package/build/src/utils.d.ts +3 -0
  53. package/build/src/utils.d.ts.map +1 -0
  54. package/build/src/utils.js +32 -0
  55. package/build/src/version.d.ts +2 -0
  56. package/build/src/version.d.ts.map +1 -0
  57. package/build/src/version.js +4 -0
  58. package/package.json +62 -0
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports._parseConsoleArgs = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const api_1 = tslib_1.__importStar(require("@opentelemetry/api"));
6
+ const instrumentation_1 = require("@opentelemetry/instrumentation");
7
+ const lodash_isobject_1 = tslib_1.__importDefault(require("lodash.isobject"));
8
+ const lodash_isplainobject_1 = tslib_1.__importDefault(require("lodash.isplainobject"));
9
+ const otel_logger_1 = require("../otel-logger");
10
+ const winston_1 = require("../otel-logger/winston");
11
+ const PACKAGE_NAME = '@sophonz/instrumentation-console';
12
+ const PACKAGE_VERSION = '0.1.0';
13
+ const _parseConsoleArgs = (args) => {
14
+ const stringifiedArgs = [];
15
+ let firstJson;
16
+ for (const arg of args) {
17
+ if ((0, lodash_isobject_1.default)(arg)) {
18
+ if (firstJson == null && (0, lodash_isplainobject_1.default)(arg)) {
19
+ firstJson = arg;
20
+ }
21
+ try {
22
+ const stringifiedArg = JSON.stringify(arg);
23
+ if (stringifiedArg != null) {
24
+ stringifiedArgs.push(stringifiedArg);
25
+ }
26
+ }
27
+ catch (e) {
28
+ api_1.diag.error('Error stringifying console arg', e);
29
+ }
30
+ }
31
+ else {
32
+ stringifiedArgs.push(arg);
33
+ }
34
+ }
35
+ return firstJson
36
+ ? {
37
+ ...firstJson,
38
+ ...(args.length > 1 && { message: stringifiedArgs.join(' ') }),
39
+ }
40
+ : stringifiedArgs.join(' ');
41
+ };
42
+ exports._parseConsoleArgs = _parseConsoleArgs;
43
+ class SophonzConsoleInstrumentation extends instrumentation_1.InstrumentationBase {
44
+ _patchConsole(type, ...args) {
45
+ var _a, _b;
46
+ const instrumentation = this;
47
+ const config = instrumentation.getConfig();
48
+ let level = type;
49
+ if (type === 'log') {
50
+ level = 'info';
51
+ }
52
+ try {
53
+ const parsedLog = (0, winston_1.parseWinstonLog)({
54
+ message: (0, exports._parseConsoleArgs)(args),
55
+ level,
56
+ });
57
+ const currentActiveSpan = api_1.default.trace.getActiveSpan();
58
+ const traceId = currentActiveSpan === null || currentActiveSpan === void 0 ? void 0 : currentActiveSpan.spanContext().traceId;
59
+ let meta = {
60
+ ...parsedLog.meta,
61
+ trace_id: traceId,
62
+ span_id: currentActiveSpan === null || currentActiveSpan === void 0 ? void 0 : currentActiveSpan.spanContext().spanId,
63
+ };
64
+ if (config.betaMode) {
65
+ if (this._contextManager != null &&
66
+ typeof this._contextManager.getMutableContext === 'function') {
67
+ meta = {
68
+ ...meta,
69
+ ...Object.fromEntries((_b = (_a = this._contextManager.getMutableContext()) === null || _a === void 0 ? void 0 : _a.traceAttributes) !== null && _b !== void 0 ? _b : []),
70
+ };
71
+ }
72
+ }
73
+ instrumentation._hdxLogger.postMessage(parsedLog.level, parsedLog.message, meta);
74
+ }
75
+ catch (e) {
76
+ api_1.diag.error('Error processing console log', e);
77
+ }
78
+ }
79
+ _onPatch(moduleExports) {
80
+ this._wrap(moduleExports, 'debug', this._consoleDebugHandler);
81
+ this._wrap(moduleExports, 'log', this._consoleLogHandler);
82
+ this._wrap(moduleExports, 'info', this._consoleInfoHandler);
83
+ this._wrap(moduleExports, 'warn', this._consoleWarnHandler);
84
+ this._wrap(moduleExports, 'error', this._consoleErrorHandler);
85
+ return moduleExports;
86
+ }
87
+ _onUnPatch(moduleExports) {
88
+ this._unwrap(moduleExports, 'debug');
89
+ this._unwrap(moduleExports, 'log');
90
+ this._unwrap(moduleExports, 'info');
91
+ this._unwrap(moduleExports, 'warn');
92
+ this._unwrap(moduleExports, 'error');
93
+ }
94
+ constructor(config) {
95
+ super(PACKAGE_NAME, PACKAGE_VERSION, config);
96
+ this._consoleLogHandler = (original) => {
97
+ const instrumentation = this;
98
+ return (...args) => {
99
+ instrumentation._patchConsole('log', ...args);
100
+ return original.apply(this, args);
101
+ };
102
+ };
103
+ this._consoleInfoHandler = (original) => {
104
+ const instrumentation = this;
105
+ return (...args) => {
106
+ instrumentation._patchConsole('info', ...args);
107
+ return original.apply(this, args);
108
+ };
109
+ };
110
+ this._consoleWarnHandler = (original) => {
111
+ const instrumentation = this;
112
+ return (...args) => {
113
+ instrumentation._patchConsole('warn', ...args);
114
+ return original.apply(this, args);
115
+ };
116
+ };
117
+ this._consoleErrorHandler = (original) => {
118
+ const instrumentation = this;
119
+ return (...args) => {
120
+ instrumentation._patchConsole('error', ...args);
121
+ return original.apply(this, args);
122
+ };
123
+ };
124
+ this._consoleDebugHandler = (original) => {
125
+ const instrumentation = this;
126
+ return (...args) => {
127
+ instrumentation._patchConsole('debug', ...args);
128
+ return original.apply(this, args);
129
+ };
130
+ };
131
+ this._hdxLogger = new otel_logger_1.Logger(config.loggerOptions);
132
+ this._contextManager = config.contextManager;
133
+ }
134
+ init() {
135
+ return [
136
+ new instrumentation_1.InstrumentationNodeModuleDefinition('console', ['*'], (moduleExports) => {
137
+ this._onPatch(moduleExports);
138
+ return moduleExports;
139
+ }, (moduleExports) => {
140
+ this._onUnPatch(moduleExports);
141
+ return moduleExports;
142
+ }),
143
+ ];
144
+ }
145
+ }
146
+ exports.default = SophonzConsoleInstrumentation;
@@ -0,0 +1,21 @@
1
+ import { Span } from '@opentelemetry/api';
2
+ import * as http from 'http';
3
+ import { PassThrough, Readable } from 'stream';
4
+ export declare const splitCommaSeparatedStrings: (headers?: string) => string[];
5
+ export declare const getShouldRecordBody: (defaultFilter?: string) => (body: string) => boolean;
6
+ export declare const interceptReadableStream: (stream: Readable, pt: PassThrough) => Readable;
7
+ export declare const _handleHttpOutgoingClientRequest: (request: http.ClientRequest, span: Span, shouldRecordBody: (body: string) => boolean, httpCaptureHeadersClientRequest?: string) => void;
8
+ export declare const _handleHttpIncomingServerRequest: (request: http.IncomingMessage, span: Span, shouldRecordBody: (body: string) => boolean, httpCaptureHeadersServerRequest?: string) => void;
9
+ export declare const _handleHttpIncomingServerResponse: (response: http.ServerResponse, span: Span, shouldRecordBody: (body: string) => boolean, httpCaptureHeadersServerResponse?: string) => void;
10
+ export declare const _handleHttpOutgoingClientResponse: (response: http.IncomingMessage, span: Span, shouldRecordBody: (body: string) => boolean, httpCaptureHeadersClientResponse?: string) => void;
11
+ export declare const getSophonzHTTPInstrumentationConfig: ({ httpCaptureBodyKeywordsFilter, httpCaptureHeadersClientRequest, httpCaptureHeadersClientResponse, httpCaptureHeadersServerRequest, httpCaptureHeadersServerResponse, }: {
12
+ httpCaptureBodyKeywordsFilter?: string;
13
+ httpCaptureHeadersClientRequest?: string;
14
+ httpCaptureHeadersClientResponse?: string;
15
+ httpCaptureHeadersServerRequest?: string;
16
+ httpCaptureHeadersServerResponse?: string;
17
+ }) => {
18
+ requestHook: (span: Span, request: http.ClientRequest | http.IncomingMessage) => void;
19
+ responseHook: (span: Span, response: http.ServerResponse | http.IncomingMessage) => void;
20
+ };
21
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/instrumentations/http.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AA4C/C,eAAO,MAAM,0BAA0B,GAAI,UAAU,MAAM,aACP,CAAC;AAErD,eAAO,MAAM,mBAAmB,GAC7B,gBAAgB,MAAM,MAAM,MAAM,MAAM,YAWxC,CAAC;AAEJ,eAAO,MAAM,uBAAuB,GAAI,QAAQ,QAAQ,EAAE,IAAI,WAAW,aASxE,CAAC;AAEF,eAAO,MAAM,gCAAgC,GAC3C,SAAS,IAAI,CAAC,aAAa,EAC3B,MAAM,IAAI,EACV,kBAAkB,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,EAC3C,kCAAkC,MAAM,SAyDzC,CAAC;AAEF,eAAO,MAAM,gCAAgC,GAC3C,SAAS,IAAI,CAAC,eAAe,EAC7B,MAAM,IAAI,EACV,kBAAkB,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,EAC3C,kCAAkC,MAAM,SA+CzC,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,UAAU,IAAI,CAAC,cAAc,EAC7B,MAAM,IAAI,EACV,kBAAkB,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,EAC3C,mCAAmC,MAAM,SAgE1C,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,UAAU,IAAI,CAAC,eAAe,EAC9B,MAAM,IAAI,EACV,kBAAkB,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,EAC3C,mCAAmC,MAAM,SAoD1C,CAAC;AAEF,eAAO,MAAM,mCAAmC,GAAI,0KAMjD;IACD,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC,gCAAgC,CAAC,EAAE,MAAM,CAAC;IAC1C,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC,gCAAgC,CAAC,EAAE,MAAM,CAAC;CAC3C;wBAIW,IAAI,WACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe;yBAqB5C,IAAI,YACA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe;CAqBzD,CAAC"}
@@ -0,0 +1,285 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSophonzHTTPInstrumentationConfig = exports._handleHttpOutgoingClientResponse = exports._handleHttpIncomingServerResponse = exports._handleHttpIncomingServerRequest = exports._handleHttpOutgoingClientRequest = exports.interceptReadableStream = exports.getShouldRecordBody = exports.splitCommaSeparatedStrings = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const api_1 = require("@opentelemetry/api");
6
+ const utils_1 = require("@opentelemetry/instrumentation-http/build/src/utils");
7
+ const instrumentation_1 = require("@opentelemetry/instrumentation");
8
+ const http = tslib_1.__importStar(require("http"));
9
+ const stream_1 = require("stream");
10
+ const zlib_1 = tslib_1.__importDefault(require("zlib"));
11
+ const SENSITIVE_DATA_SUBSTITUTE = '[Filtered]';
12
+ const DEFAULT_DENYLIST = [
13
+ 'password',
14
+ 'passwd',
15
+ 'secret',
16
+ 'api_key',
17
+ 'apikey',
18
+ 'auth',
19
+ 'credentials',
20
+ 'mysql_pwd',
21
+ 'privatekey',
22
+ 'private_key',
23
+ 'token',
24
+ 'session',
25
+ 'csrftoken',
26
+ 'sessionid',
27
+ 'x_csrftoken',
28
+ 'set_cookie',
29
+ 'cookie',
30
+ 'authorization',
31
+ 'x_api_key',
32
+ 'aiohttp_session',
33
+ 'connect.sid',
34
+ 'csrf_token',
35
+ 'csrf',
36
+ '_csrf',
37
+ '_csrf_token',
38
+ 'PHPSESSID',
39
+ '_session',
40
+ 'symfony',
41
+ 'user_session',
42
+ '_xsrf',
43
+ 'XSRF-TOKEN',
44
+ ];
45
+ const splitCommaSeparatedStrings = (headers) => headers === null || headers === void 0 ? void 0 : headers.split(',').map((header) => header.trim());
46
+ exports.splitCommaSeparatedStrings = splitCommaSeparatedStrings;
47
+ const getShouldRecordBody = (defaultFilter) => (body) => {
48
+ var _a;
49
+ const lowerCaseBody = body.toLowerCase();
50
+ const keywords = (_a = (0, exports.splitCommaSeparatedStrings)(defaultFilter)) !== null && _a !== void 0 ? _a : DEFAULT_DENYLIST.map((keyword) => keyword.toLowerCase());
51
+ if (keywords === null || keywords === void 0 ? void 0 : keywords.some((keyword) => lowerCaseBody.includes(keyword))) {
52
+ return false;
53
+ }
54
+ return true;
55
+ };
56
+ exports.getShouldRecordBody = getShouldRecordBody;
57
+ const interceptReadableStream = (stream, pt) => {
58
+ const originalState = stream.readableFlowing;
59
+ stream.pipe(pt);
60
+ stream.readableFlowing = originalState;
61
+ return stream;
62
+ };
63
+ exports.interceptReadableStream = interceptReadableStream;
64
+ const _handleHttpOutgoingClientRequest = (request, span, shouldRecordBody, httpCaptureHeadersClientRequest) => {
65
+ var _a;
66
+ try {
67
+ const headers = (_a = (0, exports.splitCommaSeparatedStrings)(httpCaptureHeadersClientRequest)) !== null && _a !== void 0 ? _a : request.getRawHeaderNames();
68
+ span.setAttributes((0, utils_1.headerCapture)('request', headers, instrumentation_1.SemconvStability.OLD)((header) => request.getHeader(header)));
69
+ }
70
+ catch (e) {
71
+ api_1.diag.debug(`error parsing outgoing-request headers in requestHook: ${e}`);
72
+ }
73
+ const chunks = [];
74
+ const oldWrite = request.write.bind(request);
75
+ request.write = (data) => {
76
+ try {
77
+ if (typeof data === 'string') {
78
+ chunks.push(Buffer.from(data));
79
+ }
80
+ else {
81
+ chunks.push(data);
82
+ }
83
+ }
84
+ catch (e) {
85
+ api_1.diag.debug(`error in request.write: ${e}`);
86
+ }
87
+ return oldWrite(data);
88
+ };
89
+ const oldEnd = request.end.bind(request);
90
+ request.end = (data) => {
91
+ try {
92
+ if (data) {
93
+ if (typeof data === 'string') {
94
+ chunks.push(Buffer.from(data));
95
+ }
96
+ else {
97
+ chunks.push(data);
98
+ }
99
+ }
100
+ if (chunks.length > 0) {
101
+ const body = Buffer.concat(chunks).toString('utf8');
102
+ if (shouldRecordBody(body)) {
103
+ span.setAttribute('http.request.body', body);
104
+ }
105
+ else {
106
+ span.setAttribute('http.request.body', SENSITIVE_DATA_SUBSTITUTE);
107
+ }
108
+ }
109
+ }
110
+ catch (e) {
111
+ api_1.diag.debug(`error in request.end: ${e}`);
112
+ }
113
+ return oldEnd(data);
114
+ };
115
+ };
116
+ exports._handleHttpOutgoingClientRequest = _handleHttpOutgoingClientRequest;
117
+ const _handleHttpIncomingServerRequest = (request, span, shouldRecordBody, httpCaptureHeadersServerRequest) => {
118
+ var _a;
119
+ try {
120
+ const headers = (_a = (0, exports.splitCommaSeparatedStrings)(httpCaptureHeadersServerRequest)) !== null && _a !== void 0 ? _a : request.headers;
121
+ span.setAttributes((0, utils_1.headerCapture)('request', Object.keys(headers), instrumentation_1.SemconvStability.OLD)((header) => headers[header]));
122
+ }
123
+ catch (e) {
124
+ api_1.diag.debug(`error parsing incoming-request headers in requestHook: ${e}`);
125
+ }
126
+ const chunks = [];
127
+ const pt = new stream_1.PassThrough();
128
+ pt.on('data', (chunk) => {
129
+ try {
130
+ if (typeof chunk === 'string') {
131
+ chunks.push(Buffer.from(chunk));
132
+ }
133
+ else {
134
+ chunks.push(chunk);
135
+ }
136
+ }
137
+ catch (e) {
138
+ api_1.diag.debug(`error in request.on('data'): ${e}`);
139
+ }
140
+ }).on('end', () => {
141
+ try {
142
+ if (chunks.length > 0) {
143
+ const body = Buffer.concat(chunks).toString('utf8');
144
+ if (shouldRecordBody(body)) {
145
+ span.setAttribute('http.request.body', body);
146
+ }
147
+ else {
148
+ span.setAttribute('http.request.body', SENSITIVE_DATA_SUBSTITUTE);
149
+ }
150
+ }
151
+ }
152
+ catch (e) {
153
+ api_1.diag.debug(`error in request.on('end'): ${e}`);
154
+ }
155
+ });
156
+ (0, exports.interceptReadableStream)(request, pt);
157
+ };
158
+ exports._handleHttpIncomingServerRequest = _handleHttpIncomingServerRequest;
159
+ const _handleHttpIncomingServerResponse = (response, span, shouldRecordBody, httpCaptureHeadersServerResponse) => {
160
+ const chunks = [];
161
+ const oldWrite = response.write.bind(response);
162
+ response.write = (data) => {
163
+ try {
164
+ if (typeof data === 'string') {
165
+ chunks.push(Buffer.from(data));
166
+ }
167
+ else {
168
+ chunks.push(data);
169
+ }
170
+ }
171
+ catch (e) {
172
+ api_1.diag.debug(`error in response.write: ${e}`);
173
+ }
174
+ return oldWrite(data);
175
+ };
176
+ const oldEnd = response.end.bind(response);
177
+ response.end = (data) => {
178
+ var _a;
179
+ try {
180
+ if (data) {
181
+ if (typeof data === 'string') {
182
+ chunks.push(Buffer.from(data));
183
+ }
184
+ else {
185
+ chunks.push(data);
186
+ }
187
+ }
188
+ if (chunks.length > 0) {
189
+ const buffers = Buffer.concat(chunks);
190
+ let body = buffers.toString('utf8');
191
+ const isGzip = response.getHeader('content-encoding') === 'gzip';
192
+ if (isGzip) {
193
+ body = zlib_1.default.gunzipSync(buffers).toString('utf8');
194
+ }
195
+ if (shouldRecordBody(body)) {
196
+ span.setAttribute('http.response.body', body);
197
+ }
198
+ else {
199
+ span.setAttribute('http.response.body', SENSITIVE_DATA_SUBSTITUTE);
200
+ }
201
+ }
202
+ }
203
+ catch (e) {
204
+ api_1.diag.debug(`error in response.end: ${e}`);
205
+ }
206
+ try {
207
+ const headers = (_a = (0, exports.splitCommaSeparatedStrings)(httpCaptureHeadersServerResponse)) !== null && _a !== void 0 ? _a : response.getHeaderNames();
208
+ span.setAttributes((0, utils_1.headerCapture)('response', headers, instrumentation_1.SemconvStability.OLD)((header) => response.getHeader(header)));
209
+ }
210
+ catch (e) {
211
+ api_1.diag.debug(`error parsing incoming-response headers in responseHook: ${e}`);
212
+ }
213
+ return oldEnd(data);
214
+ };
215
+ };
216
+ exports._handleHttpIncomingServerResponse = _handleHttpIncomingServerResponse;
217
+ const _handleHttpOutgoingClientResponse = (response, span, shouldRecordBody, httpCaptureHeadersClientResponse) => {
218
+ var _a;
219
+ try {
220
+ const headers = (_a = (0, exports.splitCommaSeparatedStrings)(httpCaptureHeadersClientResponse)) !== null && _a !== void 0 ? _a : response.headers;
221
+ span.setAttributes((0, utils_1.headerCapture)('response', Object.keys(headers), instrumentation_1.SemconvStability.OLD)((header) => headers[header]));
222
+ }
223
+ catch (e) {
224
+ api_1.diag.debug(`error parsing outgoing-response headers in responseHook: ${e}`);
225
+ }
226
+ const chunks = [];
227
+ const pt = new stream_1.PassThrough();
228
+ pt.on('data', (chunk) => {
229
+ try {
230
+ if (typeof chunk === 'string') {
231
+ chunks.push(Buffer.from(chunk));
232
+ }
233
+ else {
234
+ chunks.push(chunk);
235
+ }
236
+ }
237
+ catch (e) {
238
+ api_1.diag.debug(`error in response.on('data'): ${e}`);
239
+ }
240
+ }).on('end', () => {
241
+ try {
242
+ if (chunks.length > 0) {
243
+ const buffers = Buffer.concat(chunks);
244
+ let body = buffers.toString('utf8');
245
+ const isGzip = response.headers['content-encoding'] === 'gzip';
246
+ if (isGzip) {
247
+ body = zlib_1.default.gunzipSync(buffers).toString('utf8');
248
+ }
249
+ if (shouldRecordBody(body)) {
250
+ span.setAttribute('http.response.body', body);
251
+ }
252
+ else {
253
+ span.setAttribute('http.response.body', SENSITIVE_DATA_SUBSTITUTE);
254
+ }
255
+ }
256
+ }
257
+ catch (e) {
258
+ api_1.diag.debug(`error in response.on('end'): ${e}`);
259
+ }
260
+ });
261
+ (0, exports.interceptReadableStream)(response, pt);
262
+ };
263
+ exports._handleHttpOutgoingClientResponse = _handleHttpOutgoingClientResponse;
264
+ const getSophonzHTTPInstrumentationConfig = ({ httpCaptureBodyKeywordsFilter, httpCaptureHeadersClientRequest, httpCaptureHeadersClientResponse, httpCaptureHeadersServerRequest, httpCaptureHeadersServerResponse, }) => {
265
+ const shouldRecordBody = (0, exports.getShouldRecordBody)(httpCaptureBodyKeywordsFilter);
266
+ return {
267
+ requestHook: (span, request) => {
268
+ if (request instanceof http.ClientRequest) {
269
+ (0, exports._handleHttpOutgoingClientRequest)(request, span, shouldRecordBody, httpCaptureHeadersClientRequest);
270
+ }
271
+ else {
272
+ (0, exports._handleHttpIncomingServerRequest)(request, span, shouldRecordBody, httpCaptureHeadersServerRequest);
273
+ }
274
+ },
275
+ responseHook: (span, response) => {
276
+ if (response instanceof http.ServerResponse) {
277
+ (0, exports._handleHttpIncomingServerResponse)(response, span, shouldRecordBody, httpCaptureHeadersServerResponse);
278
+ }
279
+ else {
280
+ (0, exports._handleHttpOutgoingClientResponse)(response, span, shouldRecordBody, httpCaptureHeadersClientResponse);
281
+ }
282
+ },
283
+ };
284
+ };
285
+ exports.getSophonzHTTPInstrumentationConfig = getSophonzHTTPInstrumentationConfig;
@@ -0,0 +1,26 @@
1
+ import type { SophonzPinoOptions } from './otel-logger/pino';
2
+ import type { SophonzWinstonOptions } from './otel-logger/winston';
3
+ import SophonzWinston from './otel-logger/winston';
4
+ type WinstonTransportOptions = Omit<SophonzWinstonOptions, 'apiKey' | 'getCustomMeta' | 'resourceAttributes'>;
5
+ type PinotTransportOptions = Omit<SophonzPinoOptions, 'apiKey' | 'getCustomMeta' | 'resourceAttributes'>;
6
+ export declare const getWinstonTransport: (maxLevel?: string, options?: WinstonTransportOptions) => SophonzWinston;
7
+ export declare const getWinsonTransport: (maxLevel?: string, options?: WinstonTransportOptions) => SophonzWinston;
8
+ export declare const getPinoMixinFunction: () => {
9
+ [x: string]: string;
10
+ };
11
+ export declare const getPinoTransport: (maxLevel?: string, options?: PinotTransportOptions) => {
12
+ target: string;
13
+ options: {
14
+ baseUrl?: string;
15
+ bufferSize?: number;
16
+ detectResource?: boolean;
17
+ headers: Record<string, string>;
18
+ queueSize?: number;
19
+ sendIntervalMs?: number;
20
+ service: string;
21
+ timeout?: number;
22
+ };
23
+ level: string;
24
+ };
25
+ export {};
26
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,cAAc,MAAM,uBAAuB,CAAC;AAEnD,KAAK,uBAAuB,GAAG,IAAI,CACjC,qBAAqB,EACrB,QAAQ,GAAG,eAAe,GAAG,oBAAoB,CAClD,CAAC;AAEF,KAAK,qBAAqB,GAAG,IAAI,CAC/B,kBAAkB,EAClB,QAAQ,GAAG,eAAe,GAAG,oBAAoB,CAClD,CAAC;AAeF,eAAO,MAAM,mBAAmB,GAC9B,iBAAiB,EACjB,UAAS,uBAA4B,mBAetC,CAAC;AAGF,eAAO,MAAM,kBAAkB,gCAlBpB,uBAAuB,mBAkBmB,CAAC;AAEtD,eAAO,MAAM,oBAAoB;;CAA+B,CAAC;AACjE,eAAO,MAAM,gBAAgB,GAC3B,iBAAiB,EACjB,UAAS,qBAA0B;;;;;;;;;;;;;CAoBpC,CAAC"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPinoTransport = exports.getPinoMixinFunction = exports.getWinsonTransport = exports.getWinstonTransport = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const api_1 = tslib_1.__importStar(require("@opentelemetry/api"));
6
+ const constants_1 = require("./constants");
7
+ const SophonzPino = tslib_1.__importStar(require("./otel-logger/pino"));
8
+ const winston_1 = tslib_1.__importDefault(require("./otel-logger/winston"));
9
+ const getCustomMeta = () => {
10
+ var _a;
11
+ const contextManager = (_a = api_1.default.context) === null || _a === void 0 ? void 0 : _a._getContextManager();
12
+ if (typeof (contextManager === null || contextManager === void 0 ? void 0 : contextManager.getMutableContext) === 'function') {
13
+ const mutableContext = contextManager.getMutableContext();
14
+ if ((mutableContext === null || mutableContext === void 0 ? void 0 : mutableContext.traceAttributes) != null) {
15
+ return Object.fromEntries(mutableContext.traceAttributes);
16
+ }
17
+ }
18
+ return {};
19
+ };
20
+ const getWinstonTransport = (maxLevel = 'info', options = {}) => {
21
+ api_1.diag.debug('Initializing winston transport');
22
+ const apiKey = (0, constants_1.DEFAULT_SOPHONZ_API_KEY)();
23
+ return new winston_1.default({
24
+ ...(apiKey && {
25
+ headers: {
26
+ Authorization: apiKey,
27
+ },
28
+ }),
29
+ maxLevel,
30
+ service: (0, constants_1.DEFAULT_SERVICE_NAME)(),
31
+ getCustomMeta: (0, constants_1.DEFAULT_SOPHONZ_NODE_BETA_MODE)() ? getCustomMeta : () => ({}),
32
+ ...options,
33
+ });
34
+ };
35
+ exports.getWinstonTransport = getWinstonTransport;
36
+ exports.getWinsonTransport = exports.getWinstonTransport;
37
+ exports.getPinoMixinFunction = SophonzPino.getMixinFunction;
38
+ const getPinoTransport = (maxLevel = 'info', options = {}) => {
39
+ const apiKey = (0, constants_1.DEFAULT_SOPHONZ_API_KEY)();
40
+ return {
41
+ target: '@sophonz/node-sdk/build/src/otel-logger/pino',
42
+ options: {
43
+ ...(apiKey && {
44
+ headers: {
45
+ Authorization: apiKey,
46
+ },
47
+ }),
48
+ service: (0, constants_1.DEFAULT_SERVICE_NAME)(),
49
+ ...options,
50
+ },
51
+ level: maxLevel,
52
+ };
53
+ };
54
+ exports.getPinoTransport = getPinoTransport;
@@ -0,0 +1,3 @@
1
+ import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
2
+ export declare const getSophonzMetricReader: () => PeriodicExportingMetricReader;
3
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/metrics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAQ3E,eAAO,MAAM,sBAAsB,qCAO/B,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSophonzMetricReader = void 0;
4
+ const exporter_metrics_otlp_proto_1 = require("@opentelemetry/exporter-metrics-otlp-proto");
5
+ const sdk_metrics_1 = require("@opentelemetry/sdk-metrics");
6
+ const constants_1 = require("./constants");
7
+ const getSophonzMetricReader = () => new sdk_metrics_1.PeriodicExportingMetricReader({
8
+ exporter: new exporter_metrics_otlp_proto_1.OTLPMetricExporter({
9
+ url: constants_1.DEFAULT_OTEL_METRICS_EXPORTER_URL,
10
+ }),
11
+ exportIntervalMillis: constants_1.DEFAULT_OTEL_METRIC_EXPORT_INTERVAL,
12
+ exportTimeoutMillis: constants_1.DEFAULT_OTEL_METRIC_EXPORT_TIMEOUT,
13
+ });
14
+ exports.getSophonzMetricReader = getSophonzMetricReader;
@@ -0,0 +1,36 @@
1
+ import { Attributes } from '@opentelemetry/api';
2
+ import { BatchLogRecordProcessor, LoggerProvider, LogRecordProcessor } from '@opentelemetry/sdk-logs';
3
+ declare class NoopLogRecordProcessor implements LogRecordProcessor {
4
+ onEmit(): void;
5
+ forceFlush(): Promise<void>;
6
+ shutdown(): Promise<void>;
7
+ }
8
+ export type LoggerOptions = {
9
+ baseUrl?: string;
10
+ bufferSize?: number;
11
+ detectResource?: boolean;
12
+ headers?: Record<string, string>;
13
+ queueSize?: number;
14
+ resourceAttributes?: Attributes;
15
+ sendIntervalMs?: number;
16
+ service?: string;
17
+ timeout?: number;
18
+ };
19
+ export declare class Logger {
20
+ private readonly _url;
21
+ private readonly logger;
22
+ private readonly processor;
23
+ private readonly provider;
24
+ constructor({ baseUrl, bufferSize, detectResource, headers, queueSize, resourceAttributes, sendIntervalMs, service, timeout, }: LoggerOptions);
25
+ private parseTimestamp;
26
+ isDisabled(): boolean;
27
+ setGlobalLoggerProvider(): void;
28
+ getExporterUrl(): string;
29
+ getProvider(): LoggerProvider;
30
+ getProcessor(): NoopLogRecordProcessor | BatchLogRecordProcessor;
31
+ shutdown(): Promise<void>;
32
+ forceFlush(): Promise<void>;
33
+ postMessage(level: string, body: string, attributes?: Attributes): void;
34
+ }
35
+ export {};
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/otel-logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,oBAAoB,CAAC;AAYtD,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAOjC,cAAM,sBAAuB,YAAW,kBAAkB;IACxD,MAAM,IAAI,IAAI;IAGd,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAG3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAG1B;AAcD,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,UAAU,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IAEpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmD;IAE7E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;gBAE9B,EACV,OAAO,EACP,UAAU,EACV,cAAqB,EACrB,OAAO,EACP,SAAS,EACT,kBAAkB,EAClB,cAAc,EACd,OAAO,EACP,OAAO,GACR,EAAE,aAAa;IAuDhB,OAAO,CAAC,cAAc;IAStB,UAAU;IAIV,uBAAuB;IAKvB,cAAc;IAId,WAAW;IAIX,YAAY;IAIZ,QAAQ;IAKR,UAAU;IAKV,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,UAAe,GAAG,IAAI;CAW5E"}