sasai-common-utils 1.0.43 → 1.0.45

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sasai-common-utils",
3
- "version": "1.0.43",
3
+ "version": "1.0.45",
4
4
  "description": "Reusable utility library for common logging and other shared features.",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -16,9 +16,12 @@
16
16
  "@opentelemetry/exporter-logs-otlp-http": "^0.211.0",
17
17
  "@opentelemetry/resources": "^2.5.0",
18
18
  "@opentelemetry/sdk-logs": "^0.211.0",
19
+ "@opentelemetry/semantic-conventions": "^1.39.0",
19
20
  "jsonwebtoken": "^9.0.2",
21
+ "klona": "^2.0.6",
20
22
  "pino": "^9.6.0",
21
23
  "pino-pretty": "^13.0.0",
24
+ "traverse": "^0.6.11",
22
25
  "winston": "^3.17.0"
23
26
  },
24
27
  "devDependencies": {
@@ -5,7 +5,8 @@ const pino = require("pino");
5
5
  const { trace, context } = require("@opentelemetry/api");
6
6
  const { LoggerProvider, BatchLogRecordProcessor } = require("@opentelemetry/sdk-logs");
7
7
  const { OTLPLogExporter } = require("@opentelemetry/exporter-logs-otlp-http");
8
- const { Resource } = require("@opentelemetry/resources");
8
+ const { resourceFromAttributes } = require("@opentelemetry/resources");
9
+ const { ATTR_SERVICE_NAME, ATTR_DEPLOYMENT_ENVIRONMENT } = require("@opentelemetry/semantic-conventions");
9
10
  const { SeverityNumber } = require("@opentelemetry/api-logs");
10
11
 
11
12
  let contextProvider = () => ({});
@@ -48,9 +49,10 @@ function initOTEL() {
48
49
  }
49
50
 
50
51
  try {
51
- const resource = new Resource({
52
- "service.name": globalConfig.SERVICE_NAME || "unknown-service",
53
- "deployment.environment": globalConfig.NODE_ENV || "unknown",
52
+ // Create resource with proper attributes
53
+ const resource = resourceFromAttributes({
54
+ [ATTR_SERVICE_NAME]: globalConfig.SERVICE_NAME,
55
+ [ATTR_DEPLOYMENT_ENVIRONMENT]: globalConfig.NODE_ENV,
54
56
  });
55
57
 
56
58
  const logExporter = new OTLPLogExporter({
@@ -105,23 +107,36 @@ function sendLog(level, data) {
105
107
  const activeSpan = trace.getSpan(context.active());
106
108
  const spanContext = activeSpan?.spanContext();
107
109
 
110
+ // Use trace/span from data if available, otherwise try to get from active span
111
+ let traceId = data.trace || spanContext?.traceId || "";
112
+ let spanId = data.span || spanContext?.spanId || "";
113
+
108
114
  const logRecord = {
109
115
  severityNumber: getSeverityNumber(level),
110
116
  severityText: level.toUpperCase(),
111
117
  body: typeof data === "string" ? data : JSON.stringify(data),
112
118
  attributes: {
113
119
  "log.level": level,
114
- ...(data.trace && { "trace.id": data.trace }),
115
- ...(data.span && { "span.id": data.span }),
120
+ "service.name": globalConfig.SERVICE_NAME,
121
+ ...(traceId && { "trace.id": traceId }),
122
+ ...(spanId && { "span.id": spanId }),
116
123
  ...data,
117
124
  },
118
- ...(spanContext?.traceId && { traceId: spanContext.traceId }),
119
- ...(spanContext?.spanId && { spanId: spanContext.spanId }),
120
- ...(spanContext?.traceFlags !== undefined && {
121
- traceFlags: spanContext.traceFlags,
122
- }),
123
125
  };
124
126
 
127
+ // Add trace context to log record if available
128
+ if (traceId) {
129
+ logRecord.traceId = traceId;
130
+ }
131
+ if (spanId) {
132
+ logRecord.spanId = spanId;
133
+ }
134
+ if (spanContext?.traceFlags !== undefined) {
135
+ logRecord.traceFlags = spanContext.traceFlags;
136
+ } else if (traceId) {
137
+ logRecord.traceFlags = 1; // Default to SAMPLED if we have a traceId
138
+ }
139
+
125
140
  otelLogger.emit(logRecord);
126
141
  } catch (error) {
127
142
  console.error("[Logger] Failed to send OTLP log:", error);