@alumnium/core 0.24.0-alpha.1 → 0.24.0-alpha.2

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": "@alumnium/core",
3
- "version": "0.24.0-alpha.1",
3
+ "version": "0.24.0-alpha.2",
4
4
  "description": "Alumnium core: Alumni, agents, environment, telemetry, storage, accessibility trees, tools and driver contracts",
5
5
  "license": "MIT",
6
6
  "author": "Alex Rodionov <p0deje@gmail.com>",
@@ -47,12 +47,7 @@
47
47
  "@js-fns/xxhash": "^0.1.0",
48
48
  "@logtape/file": "^2.0.2",
49
49
  "@logtape/logtape": "^2.0.2",
50
- "@logtape/otel": "^2.0.5",
51
50
  "@opentelemetry/api": "^1.9.1",
52
- "@opentelemetry/exporter-trace-otlp-http": "^0.215.0",
53
- "@opentelemetry/resources": "^2.7.0",
54
- "@opentelemetry/sdk-trace-base": "^2.7.0",
55
- "@opentelemetry/sdk-trace-node": "^2.7.0",
56
51
  "alwaysly": "^0.4.0",
57
52
  "cac": "^7.0.0",
58
53
  "case-anything": "^3.1.2",
@@ -68,9 +63,13 @@
68
63
  "zod": "^4.4.1"
69
64
  },
70
65
  "peerDependencies": {
66
+ "@alumnium/telemetry": "0.24.0-alpha.2",
71
67
  "ai": "^7.0.78"
72
68
  },
73
69
  "peerDependenciesMeta": {
70
+ "@alumnium/telemetry": {
71
+ "optional": true
72
+ },
74
73
  "ai": {
75
74
  "optional": true
76
75
  }
package/src/internal.cjs CHANGED
@@ -1186,7 +1186,6 @@ var import_node_path3 = __toESM(require("node:path"), 1);
1186
1186
  var import_node_util = require("node:util");
1187
1187
  var import_file = require("@logtape/file");
1188
1188
  var import_logtape = require("@logtape/logtape");
1189
- var import_otel = require("@logtape/otel");
1190
1189
 
1191
1190
  // core/src/utils/fs.ts
1192
1191
  var import_node_fs = require("node:fs");
@@ -1244,12 +1243,22 @@ class Instrumentation {
1244
1243
  }
1245
1244
  }
1246
1245
 
1246
+ // core/src/telemetry/loadTelemetry.ts
1247
+ var telemetryPromise;
1248
+ function loadTelemetry() {
1249
+ return (telemetryPromise ??= import("@alumnium/telemetry").then(
1250
+ (module2) => module2,
1251
+ () => {
1252
+ console.warn(
1253
+ 'ALUMNIUM_TRACE is enabled, but traces and logs aren\'t exported without the "@alumnium/telemetry" package. Install it, e.g. `npm install @alumnium/telemetry`.',
1254
+ );
1255
+ return;
1256
+ },
1257
+ ));
1258
+ }
1259
+
1247
1260
  // core/src/telemetry/Tracer.ts
1248
1261
  var import_api = require("@opentelemetry/api");
1249
- var import_exporter_trace_otlp_http = require("@opentelemetry/exporter-trace-otlp-http");
1250
- var import_resources = require("@opentelemetry/resources");
1251
- var import_sdk_trace_base = require("@opentelemetry/sdk-trace-base");
1252
- var import_sdk_trace_node = require("@opentelemetry/sdk-trace-node");
1253
1262
  var import_nanoid = require("nanoid");
1254
1263
 
1255
1264
  // core/src/typeUtils.ts
@@ -1273,47 +1282,40 @@ class Tracer {
1273
1282
  }
1274
1283
  const spanMethod = (spanName, ...args) => {
1275
1284
  const [attrs, bodyFnOrKey] = this.#normalizeSpanArgs(args);
1276
- const provider = this.#configure();
1285
+ const tracer = this.#configure();
1277
1286
  if (typeof bodyFnOrKey === "string" || !bodyFnOrKey) {
1278
1287
  const key = bodyFnOrKey || import_nanoid.nanoid();
1279
- if (!provider) {
1288
+ if (!tracer) {
1280
1289
  const span = this.#dummySpan;
1281
1290
  this.#spans.set(key, span);
1282
1291
  return span;
1283
1292
  }
1284
- const otelSpan = this.#tracer(provider).startSpan(
1285
- spanName,
1286
- traceAttrs(attrs),
1287
- );
1293
+ const otelSpan = tracer.startSpan(spanName, traceAttrs(attrs));
1288
1294
  return this.#span(otelSpan, key);
1289
1295
  }
1290
1296
  const bodyFn = bodyFnOrKey;
1291
- if (!provider) return bodyFn(this.#dummySpan);
1292
- return this.#tracer(provider).startActiveSpan(
1293
- spanName,
1294
- traceAttrs(attrs),
1295
- (otelSpan) => {
1296
- const span = this.#span(otelSpan);
1297
- try {
1298
- const result = bodyFn(span);
1299
- if (result instanceof Promise)
1300
- return result
1301
- .then((res) => {
1302
- span.succeed();
1303
- return res;
1304
- })
1305
- .catch((error) => {
1306
- span.fail(error);
1307
- throw error;
1308
- });
1309
- span.succeed();
1310
- return result;
1311
- } catch (error) {
1312
- span.fail(error);
1313
- throw error;
1314
- }
1315
- },
1316
- );
1297
+ if (!tracer) return bodyFn(this.#dummySpan);
1298
+ return tracer.startActiveSpan(spanName, traceAttrs(attrs), (otelSpan) => {
1299
+ const span = this.#span(otelSpan);
1300
+ try {
1301
+ const result = bodyFn(span);
1302
+ if (result instanceof Promise)
1303
+ return result
1304
+ .then((res) => {
1305
+ span.succeed();
1306
+ return res;
1307
+ })
1308
+ .catch((error) => {
1309
+ span.fail(error);
1310
+ throw error;
1311
+ });
1312
+ span.succeed();
1313
+ return result;
1314
+ } catch (error) {
1315
+ span.fail(error);
1316
+ throw error;
1317
+ }
1318
+ });
1317
1319
  };
1318
1320
  return {
1319
1321
  span: spanMethod,
@@ -1325,8 +1327,8 @@ class Tracer {
1325
1327
  }
1326
1328
  },
1327
1329
  event: (eventName, ...args) => {
1328
- const provider = this.#configure();
1329
- if (!provider) return;
1330
+ const tracer = this.#configure();
1331
+ if (!tracer) return;
1330
1332
  const attrs = args[0] || {};
1331
1333
  const fullEventName = `${moduleName}.${eventName}`;
1332
1334
  const eventAttrs = Tracer.#compactAttrs(attrs);
@@ -1337,7 +1339,7 @@ class Tracer {
1337
1339
  activeSpan.addEvent(fullEventName, eventAttrs);
1338
1340
  return;
1339
1341
  }
1340
- const span = this.#tracer(provider).startSpan(fullEventName, {
1342
+ const span = tracer.startSpan(fullEventName, {
1341
1343
  attributes: eventAttrs,
1342
1344
  });
1343
1345
  span.addEvent(fullEventName, eventAttrs);
@@ -1378,9 +1380,6 @@ class Tracer {
1378
1380
  }),
1379
1381
  };
1380
1382
  }
1381
- static #tracer(provider) {
1382
- return provider.getTracer(this.serviceName);
1383
- }
1384
1383
  static #compactAttrs(attrs) {
1385
1384
  return Object.fromEntries(
1386
1385
  Object.entries(attrs).filter(([, value]) => value != null),
@@ -1406,10 +1405,14 @@ class Tracer {
1406
1405
  }
1407
1406
  }
1408
1407
  }
1408
+ static async init() {
1409
+ this.#configure();
1410
+ await this.#tracing;
1411
+ }
1409
1412
  static async flush() {
1410
- const provider = this.#configure();
1411
- if (!provider) return;
1412
- return this.#flush(provider);
1413
+ this.#configure();
1414
+ const tracing = await this.#tracing;
1415
+ if (tracing) return this.#flush(tracing);
1413
1416
  }
1414
1417
  static #spans = new Map();
1415
1418
  static #dummySpan = {
@@ -1485,33 +1488,25 @@ class Tracer {
1485
1488
  );
1486
1489
  otelSpan.setStatus(otelStatus);
1487
1490
  }
1488
- static async #flush(provider) {
1491
+ static async #flush(tracing) {
1489
1492
  this.#spans.forEach((span) => {
1490
1493
  span.fail("Span not ended before flush");
1491
1494
  });
1492
- await provider.forceFlush().catch(() => {});
1495
+ await tracing.flush().catch(() => {});
1493
1496
  }
1494
- static #provider;
1497
+ static #tracing;
1495
1498
  static #configure() {
1496
- if (this.#provider !== undefined) return this.#provider;
1497
- if (this.enabled) {
1498
- const provider = new import_sdk_trace_node.NodeTracerProvider({
1499
- resource: import_resources.resourceFromAttributes({
1500
- "service.name": Tracer.serviceName,
1501
- }),
1502
- spanProcessors: [
1503
- new import_sdk_trace_base.BatchSpanProcessor(
1504
- new import_exporter_trace_otlp_http.OTLPTraceExporter(),
1505
- ),
1506
- ],
1507
- });
1508
- provider.register();
1509
- process.once("beforeExit", () => void this.#flush(provider));
1510
- this.#provider = provider;
1511
- } else {
1512
- this.#provider = null;
1499
+ if (this.#tracing === undefined) {
1500
+ this.#tracing = this.enabled
1501
+ ? loadTelemetry().then((telemetry) => {
1502
+ const tracing = telemetry?.startTracing(this.serviceName);
1503
+ if (tracing)
1504
+ process.once("beforeExit", () => void this.#flush(tracing));
1505
+ return tracing;
1506
+ })
1507
+ : null;
1513
1508
  }
1514
- return this.#provider;
1509
+ return this.#tracing ? import_api.trace.getTracer(this.serviceName) : null;
1515
1510
  }
1516
1511
  }
1517
1512
 
@@ -1564,6 +1559,7 @@ class Logger {
1564
1559
  await this.#flush();
1565
1560
  process.exit(1);
1566
1561
  }
1562
+ await Tracer.init();
1567
1563
  }
1568
1564
  static #level;
1569
1565
  static set level(newLevel) {
@@ -1641,11 +1637,10 @@ class Logger {
1641
1637
  this.#flush();
1642
1638
  });
1643
1639
  }
1644
- if (Tracer.enabled) {
1640
+ const telemetry = Tracer.enabled ? await loadTelemetry() : undefined;
1641
+ if (telemetry) {
1645
1642
  mainSinks.push("otel");
1646
- sinks.otel = import_otel.getOpenTelemetrySink({
1647
- serviceName: Instrumentation.serviceName,
1648
- });
1643
+ sinks.otel = telemetry.getLogSink(Instrumentation.serviceName);
1649
1644
  }
1650
1645
  return {
1651
1646
  sinks,
@@ -9229,7 +9224,7 @@ function usesAdaptiveThinking(modelName) {
9229
9224
  // core/package.json
9230
9225
  var package_default = {
9231
9226
  name: "@alumnium/core",
9232
- version: "0.24.0-alpha.1",
9227
+ version: "0.24.0-alpha.2",
9233
9228
  description:
9234
9229
  "Alumnium core: Alumni, agents, environment, telemetry, storage, accessibility trees, tools and driver contracts",
9235
9230
  license: "MIT",
@@ -9245,12 +9240,7 @@ var package_default = {
9245
9240
  "@js-fns/xxhash": "^0.1.0",
9246
9241
  "@logtape/file": "^2.0.2",
9247
9242
  "@logtape/logtape": "^2.0.2",
9248
- "@logtape/otel": "^2.0.5",
9249
9243
  "@opentelemetry/api": "^1.9.1",
9250
- "@opentelemetry/exporter-trace-otlp-http": "^0.215.0",
9251
- "@opentelemetry/resources": "^2.7.0",
9252
- "@opentelemetry/sdk-trace-base": "^2.7.0",
9253
- "@opentelemetry/sdk-trace-node": "^2.7.0",
9254
9244
  alwaysly: "^0.4.0",
9255
9245
  cac: "^7.0.0",
9256
9246
  "case-anything": "^3.1.2",
@@ -9266,13 +9256,18 @@ var package_default = {
9266
9256
  zod: "^4.4.1",
9267
9257
  },
9268
9258
  devDependencies: {
9259
+ "@alumnium/telemetry": "workspace:*",
9269
9260
  ai: "^7.0.78",
9270
9261
  oxfmt: "^0.65.0",
9271
9262
  },
9272
9263
  peerDependencies: {
9264
+ "@alumnium/telemetry": "workspace:*",
9273
9265
  ai: "^7.0.78",
9274
9266
  },
9275
9267
  peerDependenciesMeta: {
9268
+ "@alumnium/telemetry": {
9269
+ optional: true,
9270
+ },
9276
9271
  ai: {
9277
9272
  optional: true,
9278
9273
  },
@@ -9291,5 +9286,5 @@ function sleep(ms) {
9291
9286
  return new Promise((resolve) => setTimeout(resolve, ms));
9292
9287
  }
9293
9288
 
9294
- //# debugId=45517550D8B9A0D364756E2164756E21
9289
+ //# debugId=7F39F76FB547C9B864756E2164756E21
9295
9290
  //# sourceMappingURL=internal.cjs.map