@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.
Files changed (2) hide show
  1. package/dist/index.js +55 -89
  2. 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 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 {
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
- // In development, use pino-pretty for console but also send to OTLP
427
+ hooks: otelHooks,
428
+ // In development, use pino-pretty for console output
411
429
  ...NODE_ENV !== "production" && {
412
430
  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
- ]
431
+ target: "pino-pretty",
432
+ options: { colorize: true }
426
433
  }
427
434
  }
428
435
  },
429
- // In production, use the OTLP destination
430
- NODE_ENV === "production" ? createOtelDestination() : void 0
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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloops/observability",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",