@elsium-ai/observe 0.10.0 → 0.11.0
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/audit-sink-jsonl.d.ts +7 -0
- package/dist/audit-sink-jsonl.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +72 -9
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-sink-jsonl.d.ts","sourceRoot":"","sources":["../src/audit-sink-jsonl.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAI7C,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAwDlE"}
|
package/dist/index.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export { createSplunkSink } from './audit-sink-splunk';
|
|
|
16
16
|
export type { SplunkSinkConfig } from './audit-sink-splunk';
|
|
17
17
|
export { createDatadogSink } from './audit-sink-datadog';
|
|
18
18
|
export type { DatadogSinkConfig } from './audit-sink-datadog';
|
|
19
|
+
export { createJsonlSink } from './audit-sink-jsonl';
|
|
20
|
+
export type { JsonlSinkConfig } from './audit-sink-jsonl';
|
|
19
21
|
export { createProvenanceTracker } from './provenance';
|
|
20
22
|
export type { ProvenanceRecord, ProvenanceTracker } from './provenance';
|
|
21
23
|
export { createExperiment, createFileExperimentStore } from './experiment';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAG1F,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACnE,YAAY,EACX,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,sBAAsB,EACtB,eAAe,EACf,cAAc,GACd,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAG9F,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAG9D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAClF,YAAY,EACX,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,GACV,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1282,6 +1282,68 @@ function createDatadogSink(config) {
|
|
|
1282
1282
|
}
|
|
1283
1283
|
};
|
|
1284
1284
|
}
|
|
1285
|
+
// src/audit-sink-jsonl.ts
|
|
1286
|
+
import { mkdir, open } from "node:fs/promises";
|
|
1287
|
+
import { dirname } from "node:path";
|
|
1288
|
+
var log5 = createLogger();
|
|
1289
|
+
function createJsonlSink(config) {
|
|
1290
|
+
const { path, fsync = true } = config;
|
|
1291
|
+
let handle = null;
|
|
1292
|
+
let initPromise = null;
|
|
1293
|
+
let writeChain = Promise.resolve();
|
|
1294
|
+
async function getHandle() {
|
|
1295
|
+
if (handle)
|
|
1296
|
+
return handle;
|
|
1297
|
+
if (initPromise)
|
|
1298
|
+
return initPromise;
|
|
1299
|
+
initPromise = (async () => {
|
|
1300
|
+
await mkdir(dirname(path), { recursive: true });
|
|
1301
|
+
handle = await open(path, "a");
|
|
1302
|
+
return handle;
|
|
1303
|
+
})();
|
|
1304
|
+
return initPromise;
|
|
1305
|
+
}
|
|
1306
|
+
function withWriteLock(fn) {
|
|
1307
|
+
const previous = writeChain;
|
|
1308
|
+
const next = previous.catch(() => {}).then(fn);
|
|
1309
|
+
writeChain = next;
|
|
1310
|
+
return next;
|
|
1311
|
+
}
|
|
1312
|
+
return {
|
|
1313
|
+
name: "jsonl",
|
|
1314
|
+
async send(events) {
|
|
1315
|
+
if (events.length === 0)
|
|
1316
|
+
return;
|
|
1317
|
+
return withWriteLock(async () => {
|
|
1318
|
+
const fh = await getHandle();
|
|
1319
|
+
const payload = `${events.map((e) => JSON.stringify(e)).join(`
|
|
1320
|
+
`)}
|
|
1321
|
+
`;
|
|
1322
|
+
await fh.appendFile(payload, "utf8");
|
|
1323
|
+
if (fsync) {
|
|
1324
|
+
try {
|
|
1325
|
+
await fh.sync();
|
|
1326
|
+
} catch (err2) {
|
|
1327
|
+
log5.warn("jsonl sink fsync failed", { error: err2 });
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
});
|
|
1331
|
+
},
|
|
1332
|
+
async shutdown() {
|
|
1333
|
+
await withWriteLock(async () => {
|
|
1334
|
+
if (handle) {
|
|
1335
|
+
try {
|
|
1336
|
+
if (fsync)
|
|
1337
|
+
await handle.sync();
|
|
1338
|
+
} finally {
|
|
1339
|
+
await handle.close();
|
|
1340
|
+
handle = null;
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
});
|
|
1344
|
+
}
|
|
1345
|
+
};
|
|
1346
|
+
}
|
|
1285
1347
|
// src/provenance.ts
|
|
1286
1348
|
import { createHash as createHash2 } from "node:crypto";
|
|
1287
1349
|
function sha256(input) {
|
|
@@ -1343,7 +1405,7 @@ function createProvenanceTracker(options) {
|
|
|
1343
1405
|
import { createHash as createHash3 } from "node:crypto";
|
|
1344
1406
|
import { existsSync, mkdirSync, readFileSync, writeFileSync as writeFileSync2 } from "node:fs";
|
|
1345
1407
|
import { join } from "node:path";
|
|
1346
|
-
var
|
|
1408
|
+
var log6 = createLogger();
|
|
1347
1409
|
function createFileExperimentStore(dir) {
|
|
1348
1410
|
return {
|
|
1349
1411
|
save(name, data) {
|
|
@@ -1354,7 +1416,7 @@ function createFileExperimentStore(dir) {
|
|
|
1354
1416
|
const filePath = join(dir, `${name}.json`);
|
|
1355
1417
|
writeFileSync2(filePath, JSON.stringify(data, null, 2));
|
|
1356
1418
|
} catch (err2) {
|
|
1357
|
-
|
|
1419
|
+
log6.error("Failed to save experiment", {
|
|
1358
1420
|
name,
|
|
1359
1421
|
error: err2 instanceof Error ? err2.message : String(err2)
|
|
1360
1422
|
});
|
|
@@ -1385,7 +1447,7 @@ function loadFromStore(store, name, stats) {
|
|
|
1385
1447
|
stats[vName].metrics[key] = { sum: m.sum, count: m.count };
|
|
1386
1448
|
}
|
|
1387
1449
|
}
|
|
1388
|
-
|
|
1450
|
+
log6.debug("Loaded experiment state", { name, totalAssignments: saved.totalAssignments });
|
|
1389
1451
|
}
|
|
1390
1452
|
function recordMetrics(s, metrics) {
|
|
1391
1453
|
for (const [key, value] of Object.entries(metrics)) {
|
|
@@ -1453,7 +1515,7 @@ function createExperiment(config) {
|
|
|
1453
1515
|
const s = stats[variant.name];
|
|
1454
1516
|
if (s)
|
|
1455
1517
|
s.assignments++;
|
|
1456
|
-
|
|
1518
|
+
log6.debug("Experiment assignment", {
|
|
1457
1519
|
experiment: name,
|
|
1458
1520
|
variant: variant.name,
|
|
1459
1521
|
userId
|
|
@@ -1524,7 +1586,7 @@ function instrumentAgent(agent, tracer) {
|
|
|
1524
1586
|
// src/studio-exporter.ts
|
|
1525
1587
|
import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync3 } from "node:fs";
|
|
1526
1588
|
import { join as join2 } from "node:path";
|
|
1527
|
-
var
|
|
1589
|
+
var log7 = createLogger();
|
|
1528
1590
|
function ensureDir(dirPath) {
|
|
1529
1591
|
if (!existsSync2(dirPath)) {
|
|
1530
1592
|
mkdirSync2(dirPath, { recursive: true });
|
|
@@ -1534,7 +1596,7 @@ function safeWriteJSON(filePath, data) {
|
|
|
1534
1596
|
try {
|
|
1535
1597
|
writeFileSync3(filePath, JSON.stringify(data, null, 2));
|
|
1536
1598
|
} catch (err2) {
|
|
1537
|
-
|
|
1599
|
+
log7.error("Studio exporter write failed", {
|
|
1538
1600
|
file: filePath,
|
|
1539
1601
|
error: err2 instanceof Error ? err2.message : String(err2)
|
|
1540
1602
|
});
|
|
@@ -1919,7 +1981,7 @@ function formatComplianceReport(report) {
|
|
|
1919
1981
|
`);
|
|
1920
1982
|
}
|
|
1921
1983
|
// src/otel.ts
|
|
1922
|
-
var
|
|
1984
|
+
var log8 = createLogger();
|
|
1923
1985
|
var SPAN_KIND_MAP = {
|
|
1924
1986
|
llm: 3,
|
|
1925
1987
|
tool: 1,
|
|
@@ -2060,10 +2122,10 @@ function createOTLPExporter(config) {
|
|
|
2060
2122
|
body: JSON.stringify(payload)
|
|
2061
2123
|
});
|
|
2062
2124
|
if (!response.ok) {
|
|
2063
|
-
|
|
2125
|
+
log8.error(`OTLP export failed: ${response.status} ${response.statusText}`);
|
|
2064
2126
|
}
|
|
2065
2127
|
} catch (err2) {
|
|
2066
|
-
|
|
2128
|
+
log8.error("OTLP export error", { error: err2 instanceof Error ? err2.message : String(err2) });
|
|
2067
2129
|
}
|
|
2068
2130
|
}
|
|
2069
2131
|
function startAutoFlush() {
|
|
@@ -2120,6 +2182,7 @@ export {
|
|
|
2120
2182
|
createProvenanceTracker,
|
|
2121
2183
|
createOTLPExporter,
|
|
2122
2184
|
createMetrics,
|
|
2185
|
+
createJsonlSink,
|
|
2123
2186
|
createFileExperimentStore,
|
|
2124
2187
|
createExperiment,
|
|
2125
2188
|
createDatadogSink,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elsium-ai/observe",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Observability, tracing, and cost tracking for ElsiumAI",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Eric Utrera <ebutrera9103@gmail.com>",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"dev": "bun --watch src/index.ts"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@elsium-ai/core": "^0.
|
|
29
|
+
"@elsium-ai/core": "^0.11.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"typescript": "^5.7.0"
|