@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.
Files changed (2) hide show
  1. package/dist/index.js +51 -89
  2. 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 createOtelDestination() {
368
- const stdout = pino.destination(1);
369
- return {
370
- write(msg) {
371
- stdout.write(msg);
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 {
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
- // In development, use pino-pretty for console but also send to OTLP
423
+ hooks: otelHooks,
424
+ // In development, use pino-pretty for console output
411
425
  ...NODE_ENV !== "production" && {
412
426
  transport: {
413
- targets: [
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, use the OTLP destination
430
- NODE_ENV === "production" ? createOtelDestination() : void 0
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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloops/observability",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",