@payloops/observability 0.0.7 → 0.0.9
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/dist/index.js +55 -89
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -364,40 +364,57 @@ var traceMixin = () => {
|
|
|
364
364
|
}
|
|
365
365
|
return mixinData;
|
|
366
366
|
};
|
|
367
|
-
function
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
try {
|
|
373
|
-
const logRecord = JSON.parse(msg);
|
|
374
|
-
const otelLogger = logs2.getLogger(SERVICE_NAME);
|
|
375
|
-
const span = trace.getActiveSpan();
|
|
376
|
-
const spanContext = span?.spanContext();
|
|
377
|
-
otelLogger.emit({
|
|
378
|
-
severityNumber: pinoLevelToOtelSeverity[logRecord.level] || SeverityNumber2.INFO,
|
|
379
|
-
severityText: pino.levels.labels[logRecord.level] || "INFO",
|
|
380
|
-
body: logRecord.msg,
|
|
381
|
-
attributes: {
|
|
382
|
-
...logRecord,
|
|
383
|
-
// Remove fields that are part of the log record structure
|
|
384
|
-
msg: void 0,
|
|
385
|
-
level: void 0,
|
|
386
|
-
time: void 0
|
|
387
|
-
},
|
|
388
|
-
timestamp: logRecord.time ? new Date(logRecord.time).getTime() * 1e6 : Date.now() * 1e6,
|
|
389
|
-
// nanoseconds
|
|
390
|
-
...spanContext && {
|
|
391
|
-
spanId: spanContext.spanId,
|
|
392
|
-
traceId: spanContext.traceId,
|
|
393
|
-
traceFlags: spanContext.traceFlags
|
|
394
|
-
}
|
|
395
|
-
});
|
|
396
|
-
} catch {
|
|
397
|
-
}
|
|
367
|
+
function emitToOtel(logRecord) {
|
|
368
|
+
try {
|
|
369
|
+
const provider = logs2.getLoggerProvider();
|
|
370
|
+
if (provider.constructor.name === "ProxyLoggerProvider") {
|
|
371
|
+
return;
|
|
398
372
|
}
|
|
399
|
-
|
|
373
|
+
const otelLogger = provider.getLogger(SERVICE_NAME);
|
|
374
|
+
const span = trace.getActiveSpan();
|
|
375
|
+
const spanContext = span?.spanContext();
|
|
376
|
+
otelLogger.emit({
|
|
377
|
+
severityNumber: pinoLevelToOtelSeverity[logRecord.level] || SeverityNumber2.INFO,
|
|
378
|
+
severityText: pino.levels.labels[logRecord.level] || "INFO",
|
|
379
|
+
body: logRecord.msg,
|
|
380
|
+
attributes: {
|
|
381
|
+
...logRecord,
|
|
382
|
+
// Remove fields that are part of the log record structure
|
|
383
|
+
msg: void 0,
|
|
384
|
+
level: void 0,
|
|
385
|
+
time: void 0
|
|
386
|
+
},
|
|
387
|
+
timestamp: logRecord.time ? new Date(logRecord.time).getTime() * 1e6 : Date.now() * 1e6,
|
|
388
|
+
// nanoseconds
|
|
389
|
+
...spanContext && {
|
|
390
|
+
spanId: spanContext.spanId,
|
|
391
|
+
traceId: spanContext.traceId,
|
|
392
|
+
traceFlags: spanContext.traceFlags
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
} catch {
|
|
396
|
+
}
|
|
400
397
|
}
|
|
398
|
+
var otelHooks = {
|
|
399
|
+
logMethod(inputArgs, method, level) {
|
|
400
|
+
method.apply(this, inputArgs);
|
|
401
|
+
const [objOrMsg, msgOrUndefined] = inputArgs;
|
|
402
|
+
const logRecord = {
|
|
403
|
+
level,
|
|
404
|
+
time: (/* @__PURE__ */ new Date()).toISOString(),
|
|
405
|
+
service: SERVICE_NAME,
|
|
406
|
+
env: NODE_ENV
|
|
407
|
+
};
|
|
408
|
+
if (typeof objOrMsg === "object" && objOrMsg !== null) {
|
|
409
|
+
Object.assign(logRecord, objOrMsg);
|
|
410
|
+
logRecord.msg = msgOrUndefined || "";
|
|
411
|
+
} else {
|
|
412
|
+
logRecord.msg = objOrMsg;
|
|
413
|
+
}
|
|
414
|
+
Object.assign(logRecord, traceMixin());
|
|
415
|
+
emitToOtel(logRecord);
|
|
416
|
+
}
|
|
417
|
+
};
|
|
401
418
|
var logger = pino(
|
|
402
419
|
{
|
|
403
420
|
level: NODE_ENV === "production" ? "info" : "debug",
|
|
@@ -407,69 +424,18 @@ var logger = pino(
|
|
|
407
424
|
env: NODE_ENV
|
|
408
425
|
},
|
|
409
426
|
timestamp: pino.stdTimeFunctions.isoTime,
|
|
410
|
-
|
|
427
|
+
hooks: otelHooks,
|
|
428
|
+
// In development, use pino-pretty for console output
|
|
411
429
|
...NODE_ENV !== "production" && {
|
|
412
430
|
transport: {
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
target: "pino-pretty",
|
|
416
|
-
options: { colorize: true },
|
|
417
|
-
level: "debug"
|
|
418
|
-
},
|
|
419
|
-
{
|
|
420
|
-
target: "pino/file",
|
|
421
|
-
options: { destination: 1 },
|
|
422
|
-
// stdout for OTLP bridge
|
|
423
|
-
level: "debug"
|
|
424
|
-
}
|
|
425
|
-
]
|
|
431
|
+
target: "pino-pretty",
|
|
432
|
+
options: { colorize: true }
|
|
426
433
|
}
|
|
427
434
|
}
|
|
428
435
|
},
|
|
429
|
-
// In production,
|
|
430
|
-
NODE_ENV === "production" ?
|
|
436
|
+
// In production, also write JSON to stdout (in addition to OTLP via hooks)
|
|
437
|
+
NODE_ENV === "production" ? pino.destination(1) : void 0
|
|
431
438
|
);
|
|
432
|
-
if (NODE_ENV !== "production") {
|
|
433
|
-
const originalWrite = process.stdout.write.bind(process.stdout);
|
|
434
|
-
let buffer = "";
|
|
435
|
-
process.stdout.write = function(chunk, encodingOrCallback, callback) {
|
|
436
|
-
const str = typeof chunk === "string" ? chunk : chunk.toString();
|
|
437
|
-
buffer += str;
|
|
438
|
-
const lines = buffer.split("\n");
|
|
439
|
-
buffer = lines.pop() || "";
|
|
440
|
-
for (const line of lines) {
|
|
441
|
-
if (line.startsWith("{") && line.includes('"level"')) {
|
|
442
|
-
try {
|
|
443
|
-
const logRecord = JSON.parse(line);
|
|
444
|
-
const otelLogger = logs2.getLogger(SERVICE_NAME);
|
|
445
|
-
otelLogger.emit({
|
|
446
|
-
severityNumber: pinoLevelToOtelSeverity[logRecord.level] || SeverityNumber2.INFO,
|
|
447
|
-
severityText: pino.levels.labels[logRecord.level] || "INFO",
|
|
448
|
-
body: logRecord.msg,
|
|
449
|
-
attributes: {
|
|
450
|
-
service: logRecord.service,
|
|
451
|
-
env: logRecord.env,
|
|
452
|
-
trace_id: logRecord.trace_id,
|
|
453
|
-
span_id: logRecord.span_id,
|
|
454
|
-
correlation_id: logRecord.correlation_id,
|
|
455
|
-
merchant_id: logRecord.merchant_id,
|
|
456
|
-
order_id: logRecord.order_id,
|
|
457
|
-
workflow_id: logRecord.workflow_id
|
|
458
|
-
},
|
|
459
|
-
timestamp: logRecord.time ? new Date(logRecord.time).getTime() * 1e6 : Date.now() * 1e6
|
|
460
|
-
});
|
|
461
|
-
} catch {
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
if (typeof encodingOrCallback === "function") {
|
|
466
|
-
return originalWrite(chunk, encodingOrCallback);
|
|
467
|
-
} else if (encodingOrCallback) {
|
|
468
|
-
return originalWrite(chunk, encodingOrCallback, callback);
|
|
469
|
-
}
|
|
470
|
-
return originalWrite(chunk);
|
|
471
|
-
};
|
|
472
|
-
}
|
|
473
439
|
function createActivityLogger(activityName, correlationId) {
|
|
474
440
|
return logger.child({
|
|
475
441
|
activity: activityName,
|