@payloops/observability 0.0.7 → 0.0.8
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 +51 -89
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -364,40 +364,53 @@ var traceMixin = () => {
|
|
|
364
364
|
}
|
|
365
365
|
return mixinData;
|
|
366
366
|
};
|
|
367
|
-
function
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
// nanoseconds
|
|
390
|
-
...spanContext && {
|
|
391
|
-
spanId: spanContext.spanId,
|
|
392
|
-
traceId: spanContext.traceId,
|
|
393
|
-
traceFlags: spanContext.traceFlags
|
|
394
|
-
}
|
|
395
|
-
});
|
|
396
|
-
} catch {
|
|
367
|
+
function emitToOtel(logRecord) {
|
|
368
|
+
try {
|
|
369
|
+
const otelLogger = logs2.getLogger(SERVICE_NAME);
|
|
370
|
+
const span = trace.getActiveSpan();
|
|
371
|
+
const spanContext = span?.spanContext();
|
|
372
|
+
otelLogger.emit({
|
|
373
|
+
severityNumber: pinoLevelToOtelSeverity[logRecord.level] || SeverityNumber2.INFO,
|
|
374
|
+
severityText: pino.levels.labels[logRecord.level] || "INFO",
|
|
375
|
+
body: logRecord.msg,
|
|
376
|
+
attributes: {
|
|
377
|
+
...logRecord,
|
|
378
|
+
// Remove fields that are part of the log record structure
|
|
379
|
+
msg: void 0,
|
|
380
|
+
level: void 0,
|
|
381
|
+
time: void 0
|
|
382
|
+
},
|
|
383
|
+
timestamp: logRecord.time ? new Date(logRecord.time).getTime() * 1e6 : Date.now() * 1e6,
|
|
384
|
+
// nanoseconds
|
|
385
|
+
...spanContext && {
|
|
386
|
+
spanId: spanContext.spanId,
|
|
387
|
+
traceId: spanContext.traceId,
|
|
388
|
+
traceFlags: spanContext.traceFlags
|
|
397
389
|
}
|
|
398
|
-
}
|
|
399
|
-
}
|
|
390
|
+
});
|
|
391
|
+
} catch {
|
|
392
|
+
}
|
|
400
393
|
}
|
|
394
|
+
var otelHooks = {
|
|
395
|
+
logMethod(inputArgs, method, level) {
|
|
396
|
+
method.apply(this, inputArgs);
|
|
397
|
+
const [objOrMsg, msgOrUndefined] = inputArgs;
|
|
398
|
+
const logRecord = {
|
|
399
|
+
level,
|
|
400
|
+
time: (/* @__PURE__ */ new Date()).toISOString(),
|
|
401
|
+
service: SERVICE_NAME,
|
|
402
|
+
env: NODE_ENV
|
|
403
|
+
};
|
|
404
|
+
if (typeof objOrMsg === "object" && objOrMsg !== null) {
|
|
405
|
+
Object.assign(logRecord, objOrMsg);
|
|
406
|
+
logRecord.msg = msgOrUndefined || "";
|
|
407
|
+
} else {
|
|
408
|
+
logRecord.msg = objOrMsg;
|
|
409
|
+
}
|
|
410
|
+
Object.assign(logRecord, traceMixin());
|
|
411
|
+
emitToOtel(logRecord);
|
|
412
|
+
}
|
|
413
|
+
};
|
|
401
414
|
var logger = pino(
|
|
402
415
|
{
|
|
403
416
|
level: NODE_ENV === "production" ? "info" : "debug",
|
|
@@ -407,69 +420,18 @@ var logger = pino(
|
|
|
407
420
|
env: NODE_ENV
|
|
408
421
|
},
|
|
409
422
|
timestamp: pino.stdTimeFunctions.isoTime,
|
|
410
|
-
|
|
423
|
+
hooks: otelHooks,
|
|
424
|
+
// In development, use pino-pretty for console output
|
|
411
425
|
...NODE_ENV !== "production" && {
|
|
412
426
|
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
|
-
]
|
|
427
|
+
target: "pino-pretty",
|
|
428
|
+
options: { colorize: true }
|
|
426
429
|
}
|
|
427
430
|
}
|
|
428
431
|
},
|
|
429
|
-
// In production,
|
|
430
|
-
NODE_ENV === "production" ?
|
|
432
|
+
// In production, also write JSON to stdout (in addition to OTLP via hooks)
|
|
433
|
+
NODE_ENV === "production" ? pino.destination(1) : void 0
|
|
431
434
|
);
|
|
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
435
|
function createActivityLogger(activityName, correlationId) {
|
|
474
436
|
return logger.child({
|
|
475
437
|
activity: activityName,
|