@agentuity/runtime 0.0.51 → 0.0.53
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/_config.js +99 -0
- package/dist/_config.js.map +1 -0
- package/dist/_context.d.ts +11 -11
- package/dist/_context.d.ts.map +1 -1
- package/dist/_context.js +84 -0
- package/dist/_context.js.map +1 -0
- package/dist/_idle.js +24 -0
- package/dist/_idle.js.map +1 -0
- package/dist/_server.js +489 -0
- package/dist/_server.js.map +1 -0
- package/dist/_services.js +258 -0
- package/dist/_services.js.map +1 -0
- package/dist/_tokens.js +98 -0
- package/dist/_tokens.js.map +1 -0
- package/dist/_util.js +54 -0
- package/dist/_util.js.map +1 -0
- package/dist/_waituntil.js +87 -0
- package/dist/_waituntil.js.map +1 -0
- package/dist/agent.d.ts +24 -15
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +507 -0
- package/dist/agent.js.map +1 -0
- package/dist/app.d.ts +6 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +72 -0
- package/dist/app.js.map +1 -0
- package/dist/eval.d.ts +1 -1
- package/dist/eval.d.ts.map +1 -1
- package/dist/eval.js +2 -0
- package/dist/eval.js.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/io/email.js +154 -0
- package/dist/io/email.js.map +1 -0
- package/dist/logger/console.js +274 -0
- package/dist/logger/console.js.map +1 -0
- package/dist/logger/index.js +3 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/internal.js +133 -0
- package/dist/logger/internal.js.map +1 -0
- package/dist/logger/logger.js +2 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/user.js +7 -0
- package/dist/logger/user.js.map +1 -0
- package/dist/logger/util.js +77 -0
- package/dist/logger/util.js.map +1 -0
- package/dist/otel/config.js +23 -0
- package/dist/otel/config.js.map +1 -0
- package/dist/otel/console.js +52 -0
- package/dist/otel/console.js.map +1 -0
- package/dist/otel/exporters/index.js +4 -0
- package/dist/otel/exporters/index.js.map +1 -0
- package/dist/otel/exporters/jsonl-log-exporter.js +103 -0
- package/dist/otel/exporters/jsonl-log-exporter.js.map +1 -0
- package/dist/otel/exporters/jsonl-metric-exporter.js +104 -0
- package/dist/otel/exporters/jsonl-metric-exporter.js.map +1 -0
- package/dist/otel/exporters/jsonl-trace-exporter.js +111 -0
- package/dist/otel/exporters/jsonl-trace-exporter.js.map +1 -0
- package/dist/otel/fetch.js +81 -0
- package/dist/otel/fetch.js.map +1 -0
- package/dist/otel/http.js +44 -0
- package/dist/otel/http.js.map +1 -0
- package/dist/otel/logger.js +278 -0
- package/dist/otel/logger.js.map +1 -0
- package/dist/otel/otel.js +233 -0
- package/dist/otel/otel.js.map +1 -0
- package/dist/router.js +350 -0
- package/dist/router.js.map +1 -0
- package/dist/services/evalrun/composite.js +26 -0
- package/dist/services/evalrun/composite.js.map +1 -0
- package/dist/services/evalrun/http.js +74 -0
- package/dist/services/evalrun/http.js.map +1 -0
- package/dist/services/evalrun/index.js +5 -0
- package/dist/services/evalrun/index.js.map +1 -0
- package/dist/services/evalrun/json.js +38 -0
- package/dist/services/evalrun/json.js.map +1 -0
- package/dist/services/evalrun/local.js +22 -0
- package/dist/services/evalrun/local.js.map +1 -0
- package/dist/services/local/_db.js +144 -0
- package/dist/services/local/_db.js.map +1 -0
- package/dist/services/local/_router.js +60 -0
- package/dist/services/local/_router.js.map +1 -0
- package/dist/services/local/_util.js +42 -0
- package/dist/services/local/_util.js.map +1 -0
- package/dist/services/local/index.js +8 -0
- package/dist/services/local/index.js.map +1 -0
- package/dist/services/local/keyvalue.js +114 -0
- package/dist/services/local/keyvalue.js.map +1 -0
- package/dist/services/local/objectstore.js +117 -0
- package/dist/services/local/objectstore.js.map +1 -0
- package/dist/services/local/stream.js +218 -0
- package/dist/services/local/stream.js.map +1 -0
- package/dist/services/local/vector.js +183 -0
- package/dist/services/local/vector.js.map +1 -0
- package/dist/services/session/composite.js +26 -0
- package/dist/services/session/composite.js.map +1 -0
- package/dist/services/session/http.js +42 -0
- package/dist/services/session/http.js.map +1 -0
- package/dist/services/session/index.js +5 -0
- package/dist/services/session/index.js.map +1 -0
- package/dist/services/session/json.js +35 -0
- package/dist/services/session/json.js.map +1 -0
- package/dist/services/session/local.js +22 -0
- package/dist/services/session/local.js.map +1 -0
- package/dist/session.js +199 -0
- package/dist/session.js.map +1 -0
- package/dist/workbench.js +38 -0
- package/dist/workbench.js.map +1 -0
- package/package.json +5 -5
- package/src/_context.ts +34 -13
- package/src/agent.ts +76 -40
- package/src/app.ts +6 -1
- package/src/eval.ts +1 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { ExportResultCode } from '@opentelemetry/core';
|
|
2
|
+
import { existsSync, appendFileSync, mkdirSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
/**
|
|
6
|
+
* JSONL implementation of the SpanExporter interface
|
|
7
|
+
* Writes traces to a timestamped JSONL file
|
|
8
|
+
*/
|
|
9
|
+
export class JSONLTraceExporter {
|
|
10
|
+
currentFile = null;
|
|
11
|
+
basePath;
|
|
12
|
+
filePrefix;
|
|
13
|
+
/**
|
|
14
|
+
* Creates a new JSONL trace exporter
|
|
15
|
+
* @param basePath - Directory to store the JSONL files
|
|
16
|
+
*/
|
|
17
|
+
constructor(basePath) {
|
|
18
|
+
this.basePath = basePath;
|
|
19
|
+
this.filePrefix = 'otel-trace';
|
|
20
|
+
this.ensureDirectory();
|
|
21
|
+
}
|
|
22
|
+
ensureDirectory() {
|
|
23
|
+
if (!existsSync(this.basePath)) {
|
|
24
|
+
mkdirSync(this.basePath, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
getOrCreateFile() {
|
|
28
|
+
// If current file exists, use it
|
|
29
|
+
if (this.currentFile && existsSync(this.currentFile)) {
|
|
30
|
+
return this.currentFile;
|
|
31
|
+
}
|
|
32
|
+
this.currentFile = join(this.basePath, `${this.filePrefix}-${Date.now()}.${randomUUID()}.jsonl`);
|
|
33
|
+
return this.currentFile;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Exports spans to a JSONL file
|
|
37
|
+
*
|
|
38
|
+
* @param spans - The spans to export
|
|
39
|
+
* @param resultCallback - Callback function to report the export result
|
|
40
|
+
*/
|
|
41
|
+
export(spans, resultCallback) {
|
|
42
|
+
try {
|
|
43
|
+
if (spans.length === 0) {
|
|
44
|
+
resultCallback({ code: ExportResultCode.SUCCESS });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const file = this.getOrCreateFile();
|
|
48
|
+
const lines = [];
|
|
49
|
+
for (const span of spans) {
|
|
50
|
+
const record = {
|
|
51
|
+
traceId: span.spanContext().traceId,
|
|
52
|
+
spanId: span.spanContext().spanId,
|
|
53
|
+
traceState: span.spanContext().traceState?.serialize(),
|
|
54
|
+
name: span.name,
|
|
55
|
+
kind: span.kind,
|
|
56
|
+
startTime: span.startTime,
|
|
57
|
+
endTime: span.endTime,
|
|
58
|
+
attributes: span.attributes,
|
|
59
|
+
status: span.status,
|
|
60
|
+
events: span.events,
|
|
61
|
+
links: span.links,
|
|
62
|
+
resource: span.resource.attributes,
|
|
63
|
+
droppedAttributesCount: span.droppedAttributesCount,
|
|
64
|
+
droppedEventsCount: span.droppedEventsCount,
|
|
65
|
+
droppedLinksCount: span.droppedLinksCount,
|
|
66
|
+
duration: span.duration,
|
|
67
|
+
ended: span.ended,
|
|
68
|
+
};
|
|
69
|
+
lines.push(JSON.stringify(record));
|
|
70
|
+
}
|
|
71
|
+
const payload = `${lines.join('\n')}\n`;
|
|
72
|
+
try {
|
|
73
|
+
appendFileSync(file, payload, 'utf-8');
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
// File may have been deleted, reset and retry once
|
|
77
|
+
const code = err.code;
|
|
78
|
+
if (code === 'ENOENT') {
|
|
79
|
+
this.currentFile = null;
|
|
80
|
+
const newFile = this.getOrCreateFile();
|
|
81
|
+
appendFileSync(newFile, payload, 'utf-8');
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
throw err;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
resultCallback({ code: ExportResultCode.SUCCESS });
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
resultCallback({
|
|
91
|
+
code: ExportResultCode.FAILED,
|
|
92
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Shuts down the exporter
|
|
98
|
+
*
|
|
99
|
+
* @returns A promise that resolves when shutdown is complete
|
|
100
|
+
*/
|
|
101
|
+
async shutdown() {
|
|
102
|
+
this.currentFile = null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Forces a flush of any pending data
|
|
106
|
+
*/
|
|
107
|
+
async forceFlush() {
|
|
108
|
+
// No-op for file-based exporter as writes are synchronous
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=jsonl-trace-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl-trace-exporter.js","sourceRoot":"","sources":["../../../src/otel/exporters/jsonl-trace-exporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { context, propagation, SpanStatusCode, trace } from '@opentelemetry/api';
|
|
2
|
+
/**
|
|
3
|
+
* Reference to the original fetch function before instrumentation
|
|
4
|
+
*/
|
|
5
|
+
export const __originalFetch = fetch; // save the original fetch before we patch it
|
|
6
|
+
/**
|
|
7
|
+
* Instruments the global fetch function with OpenTelemetry tracing
|
|
8
|
+
*
|
|
9
|
+
* Replaces the global fetch with an instrumented version that creates spans
|
|
10
|
+
* for each HTTP request and propagates trace context in headers
|
|
11
|
+
*/
|
|
12
|
+
export function instrumentFetch() {
|
|
13
|
+
const patch = async (input, init) => {
|
|
14
|
+
const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;
|
|
15
|
+
const method = init?.method ||
|
|
16
|
+
(typeof input !== 'string' && !(input instanceof URL) ? input.method || 'GET' : 'GET');
|
|
17
|
+
// Get the active span if it exists
|
|
18
|
+
const activeSpan = trace.getActiveSpan();
|
|
19
|
+
// If there's no active span, just call the original fetch
|
|
20
|
+
if (!activeSpan) {
|
|
21
|
+
return __originalFetch(input, init);
|
|
22
|
+
}
|
|
23
|
+
// Get the current active context
|
|
24
|
+
const currentContext = context.active();
|
|
25
|
+
const _url = new URL(url);
|
|
26
|
+
// Create a child span using the current context
|
|
27
|
+
const childSpan = trace.getTracer('fetch').startSpan(`HTTP ${method}`, {
|
|
28
|
+
attributes: {
|
|
29
|
+
'http.url': url,
|
|
30
|
+
'http.path': _url.pathname,
|
|
31
|
+
'http.method': method,
|
|
32
|
+
host: _url.host,
|
|
33
|
+
},
|
|
34
|
+
}, currentContext);
|
|
35
|
+
try {
|
|
36
|
+
// Add trace context to headers
|
|
37
|
+
// Add trace context to headers; preserve headers from Request input
|
|
38
|
+
const baseHeaders = typeof input !== 'string' && !(input instanceof URL) && input instanceof Request
|
|
39
|
+
? input.headers
|
|
40
|
+
: undefined;
|
|
41
|
+
const headers = new Headers(baseHeaders ?? init?.headers ?? {});
|
|
42
|
+
const carrier = {};
|
|
43
|
+
// Create a new context with the child span
|
|
44
|
+
const newContext = trace.setSpan(currentContext, childSpan);
|
|
45
|
+
// Use the new context for propagation
|
|
46
|
+
propagation.inject(newContext, carrier);
|
|
47
|
+
// Copy the carrier properties to headers
|
|
48
|
+
for (const [key, value] of Object.entries(carrier)) {
|
|
49
|
+
headers.set(key, value);
|
|
50
|
+
}
|
|
51
|
+
// Create new init object with updated headers
|
|
52
|
+
const newInit = {
|
|
53
|
+
...init,
|
|
54
|
+
headers,
|
|
55
|
+
};
|
|
56
|
+
const response = await __originalFetch(input, newInit);
|
|
57
|
+
// Add response attributes to span
|
|
58
|
+
childSpan.setAttributes({
|
|
59
|
+
'http.status_code': response.status,
|
|
60
|
+
'http.user_agent': response.headers.get('user-agent') || '',
|
|
61
|
+
});
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
childSpan.setStatus({ code: SpanStatusCode.ERROR });
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
childSpan.setStatus({ code: SpanStatusCode.OK });
|
|
67
|
+
}
|
|
68
|
+
return response;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
childSpan.recordException(error);
|
|
72
|
+
childSpan.setStatus({ code: SpanStatusCode.ERROR });
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
childSpan.end();
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
globalThis.fetch = patch;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/otel/fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { context, propagation } from '@opentelemetry/api';
|
|
2
|
+
/**
|
|
3
|
+
* Injects trace context into response headers using the OpenTelemetry propagation API
|
|
4
|
+
*
|
|
5
|
+
* @param headers - Optional existing headers to include
|
|
6
|
+
* @returns A record of headers with trace context injected
|
|
7
|
+
*/
|
|
8
|
+
export function injectTraceContextToHeaders(headers = {}) {
|
|
9
|
+
let _headers;
|
|
10
|
+
if (headers instanceof Headers) {
|
|
11
|
+
_headers = {};
|
|
12
|
+
headers.forEach((v, k) => {
|
|
13
|
+
_headers[k] = v;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
_headers = { ...headers };
|
|
18
|
+
}
|
|
19
|
+
// Create a carrier object for the headers
|
|
20
|
+
const carrier = { ..._headers };
|
|
21
|
+
// Get the current context
|
|
22
|
+
const currentContext = context.active();
|
|
23
|
+
// Inject trace context into the carrier
|
|
24
|
+
propagation.inject(currentContext, carrier);
|
|
25
|
+
return carrier;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Extracts trace context from Bun Request headers
|
|
29
|
+
*
|
|
30
|
+
* @param req - The Bun Request object
|
|
31
|
+
* @returns The context with trace information
|
|
32
|
+
*/
|
|
33
|
+
export function extractTraceContextFromRequest(req) {
|
|
34
|
+
// Create a carrier object from the headers
|
|
35
|
+
const carrier = {};
|
|
36
|
+
// Convert headers to the format expected by the propagator
|
|
37
|
+
req.headers.forEach((value, key) => {
|
|
38
|
+
carrier[key.toLowerCase()] = value;
|
|
39
|
+
});
|
|
40
|
+
// Extract the context using the global propagator
|
|
41
|
+
const activeContext = context.active();
|
|
42
|
+
return propagation.extract(activeContext, carrier);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/otel/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAC1C,UAA4C,EAAE;IAE9C,IAAI,QAAgC,CAAC;IACrC,IAAI,OAAO,YAAY,OAAO,EAAE,CAAC;QAChC,QAAQ,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACJ,CAAC;SAAM,CAAC;QACP,QAAQ,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,0CAA0C;IAC1C,MAAM,OAAO,GAA2B,EAAE,GAAG,QAAQ,EAA4B,CAAC;IAElF,0BAA0B;IAC1B,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAExC,wCAAwC;IACxC,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAE5C,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,8BAA8B,CAC7C,GAAY;IAEZ,2CAA2C;IAC3C,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,2DAA2D;IAC3D,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAClC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IACvC,OAAO,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { format } from 'node:util';
|
|
2
|
+
import { safeStringify } from '@agentuity/core';
|
|
3
|
+
import * as LogsAPI from '@opentelemetry/api-logs';
|
|
4
|
+
import ConsoleLogger from '../logger/console';
|
|
5
|
+
import { getAgentContext } from '../_context';
|
|
6
|
+
/**
|
|
7
|
+
* Reference to the original console object before patching
|
|
8
|
+
*/
|
|
9
|
+
export const __originalConsole = Object.create(console); // save the original console before we patch it
|
|
10
|
+
export class OtelLogger {
|
|
11
|
+
delegate;
|
|
12
|
+
context;
|
|
13
|
+
logger;
|
|
14
|
+
logLevel;
|
|
15
|
+
constructor(useConsole, delegate, context, logLevel) {
|
|
16
|
+
this.delegate = delegate;
|
|
17
|
+
this.context = context;
|
|
18
|
+
this.logLevel = logLevel ?? 'info';
|
|
19
|
+
this.logger = useConsole ? new ConsoleLogger(context, false, this.logLevel) : undefined;
|
|
20
|
+
}
|
|
21
|
+
formatMessage(message) {
|
|
22
|
+
if (typeof message === 'string') {
|
|
23
|
+
return message;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
return safeStringify(message);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Handle circular references or other unknown stringification errors
|
|
30
|
+
return String(message);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
getAttributes() {
|
|
34
|
+
try {
|
|
35
|
+
const actx = getAgentContext();
|
|
36
|
+
const current = actx.current?.metadata;
|
|
37
|
+
if (current) {
|
|
38
|
+
const result = {
|
|
39
|
+
...(this.context ?? {}),
|
|
40
|
+
};
|
|
41
|
+
for (const [key, value] of Object.entries(current)) {
|
|
42
|
+
if (value !== null && value !== undefined) {
|
|
43
|
+
result[`@agentuity/${key}`] = value;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
/* fall through */
|
|
51
|
+
}
|
|
52
|
+
return this.context;
|
|
53
|
+
}
|
|
54
|
+
emit(severityNumber, severityText, body) {
|
|
55
|
+
const attributes = this.getAttributes();
|
|
56
|
+
try {
|
|
57
|
+
this.delegate.emit({
|
|
58
|
+
severityNumber,
|
|
59
|
+
severityText,
|
|
60
|
+
body,
|
|
61
|
+
attributes: attributes,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
// Log error to console if available, but don't fail the entire operation
|
|
66
|
+
this.logger?.error('Failed to emit log to OTLP instance:', error);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
shouldLog(level) {
|
|
70
|
+
switch (this.logLevel) {
|
|
71
|
+
case 'trace':
|
|
72
|
+
return true;
|
|
73
|
+
case 'debug':
|
|
74
|
+
return (level === LogsAPI.SeverityNumber.DEBUG ||
|
|
75
|
+
level == LogsAPI.SeverityNumber.INFO ||
|
|
76
|
+
level == LogsAPI.SeverityNumber.WARN ||
|
|
77
|
+
level == LogsAPI.SeverityNumber.ERROR);
|
|
78
|
+
case 'info':
|
|
79
|
+
return (level == LogsAPI.SeverityNumber.INFO ||
|
|
80
|
+
level == LogsAPI.SeverityNumber.WARN ||
|
|
81
|
+
level == LogsAPI.SeverityNumber.ERROR);
|
|
82
|
+
case 'warn':
|
|
83
|
+
return level == LogsAPI.SeverityNumber.WARN || level == LogsAPI.SeverityNumber.ERROR;
|
|
84
|
+
case 'error':
|
|
85
|
+
return level == LogsAPI.SeverityNumber.ERROR;
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
trace(message, ...args) {
|
|
90
|
+
if (!this.shouldLog(LogsAPI.SeverityNumber.TRACE)) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.logger?.trace(message, ...args);
|
|
94
|
+
let body;
|
|
95
|
+
try {
|
|
96
|
+
body = format(this.formatMessage(message), ...args);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Fallback if format causes recursion
|
|
100
|
+
body = `${this.formatMessage(message)} ${args.map((arg) => String(arg)).join(' ')}`;
|
|
101
|
+
}
|
|
102
|
+
this.emit(LogsAPI.SeverityNumber.TRACE, 'TRACE', body);
|
|
103
|
+
}
|
|
104
|
+
debug(message, ...args) {
|
|
105
|
+
if (!this.shouldLog(LogsAPI.SeverityNumber.DEBUG)) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
this.logger?.debug(message, ...args);
|
|
109
|
+
let body;
|
|
110
|
+
try {
|
|
111
|
+
body = format(this.formatMessage(message), ...args);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Fallback if format causes recursion
|
|
115
|
+
body = `${this.formatMessage(message)} ${args.map((arg) => String(arg)).join(' ')}`;
|
|
116
|
+
}
|
|
117
|
+
this.emit(LogsAPI.SeverityNumber.DEBUG, 'DEBUG', body);
|
|
118
|
+
}
|
|
119
|
+
info(message, ...args) {
|
|
120
|
+
if (!this.shouldLog(LogsAPI.SeverityNumber.INFO)) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
this.logger?.info(message, ...args);
|
|
124
|
+
let body;
|
|
125
|
+
try {
|
|
126
|
+
body = format(this.formatMessage(message), ...args);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Fallback if format causes recursion
|
|
130
|
+
body = `${this.formatMessage(message)} ${args.map((arg) => String(arg)).join(' ')}`;
|
|
131
|
+
}
|
|
132
|
+
this.emit(LogsAPI.SeverityNumber.INFO, 'INFO', body);
|
|
133
|
+
}
|
|
134
|
+
warn(message, ...args) {
|
|
135
|
+
if (!this.shouldLog(LogsAPI.SeverityNumber.WARN)) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
this.logger?.warn(message, ...args);
|
|
139
|
+
let body;
|
|
140
|
+
try {
|
|
141
|
+
body = format(this.formatMessage(message), ...args);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Fallback if format causes recursion
|
|
145
|
+
body = `${this.formatMessage(message)} ${args.map((arg) => String(arg)).join(' ')}`;
|
|
146
|
+
}
|
|
147
|
+
this.emit(LogsAPI.SeverityNumber.WARN, 'WARN', body);
|
|
148
|
+
}
|
|
149
|
+
error(message, ...args) {
|
|
150
|
+
if (!this.shouldLog(LogsAPI.SeverityNumber.ERROR)) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
this.logger?.error(message, ...args);
|
|
154
|
+
let body;
|
|
155
|
+
try {
|
|
156
|
+
body = format(this.formatMessage(message), ...args);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Fallback if format causes recursion
|
|
160
|
+
body = `${this.formatMessage(message)} ${args.map((arg) => String(arg)).join(' ')}`;
|
|
161
|
+
}
|
|
162
|
+
this.emit(LogsAPI.SeverityNumber.ERROR, 'ERROR', body);
|
|
163
|
+
}
|
|
164
|
+
fatal(message, ...args) {
|
|
165
|
+
this.error(message, ...args);
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
child(opts) {
|
|
169
|
+
return new OtelLogger(!!this.logger, this.delegate, {
|
|
170
|
+
...(this.context ?? {}),
|
|
171
|
+
...opts,
|
|
172
|
+
}, this.logLevel);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Creates a logger that integrates with OpenTelemetry
|
|
177
|
+
*
|
|
178
|
+
* @param useConsole - Whether to also log to the console
|
|
179
|
+
* @param context - Additional context to include with log records
|
|
180
|
+
* @returns A logger instance
|
|
181
|
+
*/
|
|
182
|
+
export function createLogger(useConsole, context, logLevel) {
|
|
183
|
+
const delegate = LogsAPI.logs.getLogger('default', undefined, {
|
|
184
|
+
scopeAttributes: context,
|
|
185
|
+
});
|
|
186
|
+
return new OtelLogger(useConsole, delegate, context, logLevel);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Patches the global console object to integrate with OpenTelemetry logging
|
|
190
|
+
*
|
|
191
|
+
* @param attributes - Attributes to include with all console log records
|
|
192
|
+
*/
|
|
193
|
+
export function patchConsole(enabled, attributes, logLevel) {
|
|
194
|
+
if (!enabled) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const _patch = { ...__originalConsole };
|
|
198
|
+
const delegate = createLogger(true, attributes, logLevel);
|
|
199
|
+
// Patch individual console methods instead of reassigning the whole object
|
|
200
|
+
_patch.log = (...args) => {
|
|
201
|
+
delegate.info(args[0], ...args.slice(1));
|
|
202
|
+
};
|
|
203
|
+
_patch.error = (...args) => {
|
|
204
|
+
delegate.error(args[0], ...args.slice(1));
|
|
205
|
+
};
|
|
206
|
+
_patch.warn = (...args) => {
|
|
207
|
+
delegate.warn(args[0], ...args.slice(1));
|
|
208
|
+
};
|
|
209
|
+
_patch.debug = (...args) => {
|
|
210
|
+
delegate.debug(args[0], ...args.slice(1));
|
|
211
|
+
};
|
|
212
|
+
_patch.info = (...args) => {
|
|
213
|
+
delegate.info(args[0], ...args.slice(1));
|
|
214
|
+
};
|
|
215
|
+
_patch.dir = (...args) => {
|
|
216
|
+
let msg = '';
|
|
217
|
+
if (args.length === 1) {
|
|
218
|
+
msg = format(args[0]);
|
|
219
|
+
}
|
|
220
|
+
else if (args.length >= 2) {
|
|
221
|
+
msg = format(args[0], args[1]);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
msg = safeStringify(args);
|
|
225
|
+
}
|
|
226
|
+
delegate.debug(msg);
|
|
227
|
+
};
|
|
228
|
+
_patch.dirxml = (...args) => {
|
|
229
|
+
delegate.debug('dirxml:', ...args);
|
|
230
|
+
};
|
|
231
|
+
_patch.table = (...args) => {
|
|
232
|
+
delegate.debug('table:', ...args);
|
|
233
|
+
};
|
|
234
|
+
_patch.trace = (...args) => {
|
|
235
|
+
delegate.debug(args[0], ...args.slice(1));
|
|
236
|
+
};
|
|
237
|
+
_patch.group = (...args) => {
|
|
238
|
+
delegate.debug('group:', ...args);
|
|
239
|
+
};
|
|
240
|
+
_patch.groupCollapsed = (...args) => {
|
|
241
|
+
delegate.debug('groupCollapsed:', ...args);
|
|
242
|
+
};
|
|
243
|
+
_patch.groupEnd = () => {
|
|
244
|
+
delegate.debug('groupEnd');
|
|
245
|
+
};
|
|
246
|
+
_patch.clear = () => {
|
|
247
|
+
/* no-op */
|
|
248
|
+
};
|
|
249
|
+
_patch.count = (...args) => {
|
|
250
|
+
delegate.debug('count:', ...args);
|
|
251
|
+
};
|
|
252
|
+
_patch.countReset = (...args) => {
|
|
253
|
+
delegate.debug('countReset:', ...args);
|
|
254
|
+
};
|
|
255
|
+
_patch.assert = (condition, ...args) => {
|
|
256
|
+
if (!condition) {
|
|
257
|
+
delegate.error('assertion failed:', ...args);
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
_patch.time = (...args) => {
|
|
261
|
+
delegate.debug('time:', ...args);
|
|
262
|
+
};
|
|
263
|
+
_patch.timeLog = (...args) => {
|
|
264
|
+
delegate.debug('timeLog:', ...args);
|
|
265
|
+
};
|
|
266
|
+
_patch.timeEnd = (...args) => {
|
|
267
|
+
delegate.debug('timeEnd:', ...args);
|
|
268
|
+
};
|
|
269
|
+
_patch.profile = (...args) => {
|
|
270
|
+
delegate.debug('profile:', ...args);
|
|
271
|
+
};
|
|
272
|
+
_patch.profileEnd = (...args) => {
|
|
273
|
+
delegate.debug('profileEnd:', ...args);
|
|
274
|
+
};
|
|
275
|
+
// eslint-disable-next-line no-global-assign
|
|
276
|
+
console = globalThis.console = _patch;
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/otel/logger.ts"],"names":[],"mappings":"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"}
|