@uselemma/tracing 2.0.0 → 2.1.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/README.md +20 -1
- package/dist/experiment-mode.d.ts +4 -0
- package/dist/experiment-mode.d.ts.map +1 -0
- package/dist/experiment-mode.js +16 -0
- package/dist/experiment-mode.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/register.d.ts +2 -2
- package/dist/register.d.ts.map +1 -1
- package/dist/register.js +2 -2
- package/dist/register.js.map +1 -1
- package/dist/run-batch-span-processor.d.ts +20 -0
- package/dist/run-batch-span-processor.d.ts.map +1 -0
- package/dist/run-batch-span-processor.js +101 -0
- package/dist/run-batch-span-processor.js.map +1 -0
- package/dist/trace-wrapper.d.ts +3 -3
- package/dist/trace-wrapper.d.ts.map +1 -1
- package/dist/trace-wrapper.js +13 -11
- package/dist/trace-wrapper.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,9 +20,21 @@ import { registerOTel } from "@uselemma/tracing";
|
|
|
20
20
|
registerOTel();
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
+
You can also enable experiment mode globally for the process:
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { enableExperimentMode } from "@uselemma/tracing";
|
|
27
|
+
|
|
28
|
+
enableExperimentMode();
|
|
29
|
+
```
|
|
30
|
+
|
|
23
31
|
### 2. Wrap your agent
|
|
24
32
|
|
|
25
|
-
`wrapAgent` creates
|
|
33
|
+
`wrapAgent` creates a root OpenTelemetry span named `ai.agent.run` and records:
|
|
34
|
+
- `ai.agent.name`
|
|
35
|
+
- `ai.agent.run_id`
|
|
36
|
+
- `ai.agent.input`
|
|
37
|
+
- `lemma.is_experiment`
|
|
26
38
|
|
|
27
39
|
```typescript
|
|
28
40
|
import { wrapAgent } from "@uselemma/tracing";
|
|
@@ -40,6 +52,13 @@ const wrappedFn = wrapAgent(
|
|
|
40
52
|
const { result, runId } = await wrappedFn();
|
|
41
53
|
```
|
|
42
54
|
|
|
55
|
+
## Export Behavior
|
|
56
|
+
|
|
57
|
+
- Spans are exported in run-specific batches keyed by `ai.agent.run_id`.
|
|
58
|
+
- A run batch is exported when its top-level `ai.agent.run` span ends.
|
|
59
|
+
- `forceFlush()` exports remaining runs in separate batches per run.
|
|
60
|
+
- Spans with `instrumentationScope.name === "next.js"` are excluded from export.
|
|
61
|
+
|
|
43
62
|
## Environment Variables
|
|
44
63
|
|
|
45
64
|
| Variable | Description |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experiment-mode.d.ts","sourceRoot":"","sources":["../src/experiment-mode.ts"],"names":[],"mappings":"AAEA,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.enableExperimentMode = enableExperimentMode;
|
|
4
|
+
exports.disableExperimentMode = disableExperimentMode;
|
|
5
|
+
exports.isExperimentModeEnabled = isExperimentModeEnabled;
|
|
6
|
+
let experimentModeEnabled = false;
|
|
7
|
+
function enableExperimentMode() {
|
|
8
|
+
experimentModeEnabled = true;
|
|
9
|
+
}
|
|
10
|
+
function disableExperimentMode() {
|
|
11
|
+
experimentModeEnabled = false;
|
|
12
|
+
}
|
|
13
|
+
function isExperimentModeEnabled() {
|
|
14
|
+
return experimentModeEnabled;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=experiment-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experiment-mode.js","sourceRoot":"","sources":["../src/experiment-mode.ts"],"names":[],"mappings":";;AAEA,oDAEC;AAED,sDAEC;AAED,0DAEC;AAZD,IAAI,qBAAqB,GAAG,KAAK,CAAC;AAElC,SAAgB,oBAAoB;IAClC,qBAAqB,GAAG,IAAI,CAAC;AAC/B,CAAC;AAED,SAAgB,qBAAqB;IACnC,qBAAqB,GAAG,KAAK,CAAC;AAChC,CAAC;AAED,SAAgB,uBAAuB;IACrC,OAAO,qBAAqB,CAAC;AAC/B,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { registerOTel, createLemmaSpanProcessor, type LemmaOTelOptions, type RegisterOTelOptions, type CreateLemmaSpanProcessorOptions, } from "./register";
|
|
2
|
+
export { enableExperimentMode, disableExperimentMode, isExperimentModeEnabled, } from "./experiment-mode";
|
|
2
3
|
export { wrapAgent, type TraceContext } from "./trace-wrapper";
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,+BAA+B,GACrC,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,+BAA+B,GACrC,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.wrapAgent = exports.createLemmaSpanProcessor = exports.registerOTel = void 0;
|
|
3
|
+
exports.wrapAgent = exports.isExperimentModeEnabled = exports.disableExperimentMode = exports.enableExperimentMode = exports.createLemmaSpanProcessor = exports.registerOTel = void 0;
|
|
4
4
|
var register_1 = require("./register");
|
|
5
5
|
Object.defineProperty(exports, "registerOTel", { enumerable: true, get: function () { return register_1.registerOTel; } });
|
|
6
6
|
Object.defineProperty(exports, "createLemmaSpanProcessor", { enumerable: true, get: function () { return register_1.createLemmaSpanProcessor; } });
|
|
7
|
+
var experiment_mode_1 = require("./experiment-mode");
|
|
8
|
+
Object.defineProperty(exports, "enableExperimentMode", { enumerable: true, get: function () { return experiment_mode_1.enableExperimentMode; } });
|
|
9
|
+
Object.defineProperty(exports, "disableExperimentMode", { enumerable: true, get: function () { return experiment_mode_1.disableExperimentMode; } });
|
|
10
|
+
Object.defineProperty(exports, "isExperimentModeEnabled", { enumerable: true, get: function () { return experiment_mode_1.isExperimentModeEnabled; } });
|
|
7
11
|
var trace_wrapper_1 = require("./trace-wrapper");
|
|
8
12
|
Object.defineProperty(exports, "wrapAgent", { enumerable: true, get: function () { return trace_wrapper_1.wrapAgent; } });
|
|
9
13
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAMoB;AALlB,wGAAA,YAAY,OAAA;AACZ,oHAAA,wBAAwB,OAAA;AAK1B,iDAA+D;AAAtD,0GAAA,SAAS,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAMoB;AALlB,wGAAA,YAAY,OAAA;AACZ,oHAAA,wBAAwB,OAAA;AAK1B,qDAI2B;AAHzB,uHAAA,oBAAoB,OAAA;AACpB,wHAAA,qBAAqB,OAAA;AACrB,0HAAA,uBAAuB,OAAA;AAEzB,iDAA+D;AAAtD,0GAAA,SAAS,OAAA"}
|
package/dist/register.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
|
|
2
|
-
import {
|
|
2
|
+
import { type SpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
3
3
|
export type LemmaOTelOptions = {
|
|
4
4
|
/** Lemma API key. Defaults to LEMMA_API_KEY environment variable. */
|
|
5
5
|
apiKey?: string;
|
|
@@ -34,7 +34,7 @@ export type CreateLemmaSpanProcessorOptions = LemmaOTelOptions;
|
|
|
34
34
|
* });
|
|
35
35
|
* provider.register();
|
|
36
36
|
*/
|
|
37
|
-
export declare function createLemmaSpanProcessor(options?: LemmaOTelOptions):
|
|
37
|
+
export declare function createLemmaSpanProcessor(options?: LemmaOTelOptions): SpanProcessor;
|
|
38
38
|
/**
|
|
39
39
|
* Registers an OpenTelemetry tracer provider configured to send traces to Lemma.
|
|
40
40
|
*
|
package/dist/register.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAInE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,+CAA+C;AAC/C,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AACnD,+CAA+C;AAC/C,MAAM,MAAM,+BAA+B,GAAG,gBAAgB,CAAC;AAG/D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,gBAAqB,GAC7B,aAAa,CAoBf;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,gBAAqB,sBAU1D"}
|
package/dist/register.js
CHANGED
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createLemmaSpanProcessor = createLemmaSpanProcessor;
|
|
4
4
|
exports.registerOTel = registerOTel;
|
|
5
5
|
const sdk_trace_node_1 = require("@opentelemetry/sdk-trace-node");
|
|
6
|
-
const sdk_trace_base_1 = require("@opentelemetry/sdk-trace-base");
|
|
7
6
|
const exporter_trace_otlp_proto_1 = require("@opentelemetry/exporter-trace-otlp-proto");
|
|
7
|
+
const run_batch_span_processor_1 = require("./run-batch-span-processor");
|
|
8
8
|
/**
|
|
9
9
|
* Creates a `BatchSpanProcessor` pre-configured to export traces to Lemma.
|
|
10
10
|
*
|
|
@@ -34,7 +34,7 @@ function createLemmaSpanProcessor(options = {}) {
|
|
|
34
34
|
if (!apiKey || !projectId) {
|
|
35
35
|
throw new Error("@uselemma/tracing: Missing API key and/or project ID. Set the LEMMA_API_KEY and LEMMA_PROJECT_ID environment variables or pass them to createLemmaSpanProcessor().");
|
|
36
36
|
}
|
|
37
|
-
return new
|
|
37
|
+
return new run_batch_span_processor_1.RunBatchSpanProcessor(new exporter_trace_otlp_proto_1.OTLPTraceExporter({
|
|
38
38
|
url: `${baseUrl}/otel/v1/traces`,
|
|
39
39
|
headers: {
|
|
40
40
|
Authorization: `Bearer ${apiKey}`,
|
package/dist/register.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":";;AA0CA,4DAsBC;AAwBD,oCAUC;AAlGD,kEAAmE;AAEnE,wFAA6E;AAC7E,yEAAmE;AAiBnE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAgB,wBAAwB,CACtC,UAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACpE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,yBAAyB,CAAC;IAE7D,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,oKAAoK,CACrK,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,gDAAqB,CAC9B,IAAI,6CAAiB,CAAC;QACpB,GAAG,EAAE,GAAG,OAAO,iBAAiB;QAChC,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,oBAAoB,EAAE,SAAS;SAChC;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAgB,YAAY,CAAC,UAA4B,EAAE;IACzD,MAAM,cAAc,GAAG,IAAI,mCAAkB,CAAC;QAC5C,cAAc,EAAE,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;KACpD,CAAC,CAAC;IAEH,8DAA8D;IAC9D,8CAA8C;IAC9C,cAAc,CAAC,QAAQ,EAAE,CAAC;IAE1B,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Context } from "@opentelemetry/api";
|
|
2
|
+
import { type ReadableSpan, type Span, type SpanExporter, type SpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
3
|
+
export declare class RunBatchSpanProcessor implements SpanProcessor {
|
|
4
|
+
private isShutdown;
|
|
5
|
+
private spanIdToRunId;
|
|
6
|
+
private batches;
|
|
7
|
+
private endedRuns;
|
|
8
|
+
private readonly exporter;
|
|
9
|
+
constructor(exporter: SpanExporter);
|
|
10
|
+
onStart(span: Span, _parentContext: Context): void;
|
|
11
|
+
onEnd(span: ReadableSpan): void;
|
|
12
|
+
forceFlush(): Promise<void>;
|
|
13
|
+
shutdown(): Promise<void>;
|
|
14
|
+
private isTopLevelRun;
|
|
15
|
+
private getRunIdFromSpan;
|
|
16
|
+
private getInstrumentationScopeName;
|
|
17
|
+
private exportRunBatch;
|
|
18
|
+
private clearRunMapping;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=run-batch-span-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-batch-span-processor.d.ts","sourceRoot":"","sources":["../src/run-batch-span-processor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,IAAI,EACT,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,+BAA+B,CAAC;AAKvC,qBAAa,qBAAsB,YAAW,aAAa;IACzD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;gBAE5B,QAAQ,EAAE,YAAY;IAIlC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,GAAG,IAAI;IAoBlD,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAyBzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ/B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,2BAA2B;YAQrB,cAAc;IAgB5B,OAAO,CAAC,eAAe;CAOxB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RunBatchSpanProcessor = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
class RunBatchSpanProcessor {
|
|
6
|
+
isShutdown = false;
|
|
7
|
+
spanIdToRunId = new Map();
|
|
8
|
+
batches = new Map();
|
|
9
|
+
endedRuns = new Set();
|
|
10
|
+
exporter;
|
|
11
|
+
constructor(exporter) {
|
|
12
|
+
this.exporter = exporter;
|
|
13
|
+
}
|
|
14
|
+
onStart(span, _parentContext) {
|
|
15
|
+
const spanId = span.spanContext().spanId;
|
|
16
|
+
if (this.isTopLevelRun(span)) {
|
|
17
|
+
const runId = this.getRunIdFromSpan(span) ?? (0, crypto_1.randomUUID)();
|
|
18
|
+
span.setAttribute("ai.agent.run_id", runId);
|
|
19
|
+
this.spanIdToRunId.set(spanId, runId);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const parentSpanId = span.parentSpanContext?.spanId;
|
|
23
|
+
if (!parentSpanId)
|
|
24
|
+
return;
|
|
25
|
+
const runId = this.spanIdToRunId.get(parentSpanId);
|
|
26
|
+
if (!runId)
|
|
27
|
+
return;
|
|
28
|
+
this.spanIdToRunId.set(spanId, runId);
|
|
29
|
+
span.setAttribute("ai.agent.run_id", runId);
|
|
30
|
+
}
|
|
31
|
+
onEnd(span) {
|
|
32
|
+
const spanId = span.spanContext().spanId;
|
|
33
|
+
const runId = this.spanIdToRunId.get(spanId) ??
|
|
34
|
+
(span.parentSpanContext?.spanId
|
|
35
|
+
? this.spanIdToRunId.get(span.parentSpanContext.spanId)
|
|
36
|
+
: undefined);
|
|
37
|
+
if (!runId)
|
|
38
|
+
return;
|
|
39
|
+
const isTopLevelRun = this.isTopLevelRun(span);
|
|
40
|
+
const shouldSkipExport = this.getInstrumentationScopeName(span) === "next.js";
|
|
41
|
+
if (!shouldSkipExport) {
|
|
42
|
+
const batch = this.batches.get(runId);
|
|
43
|
+
if (batch)
|
|
44
|
+
batch.push(span);
|
|
45
|
+
else
|
|
46
|
+
this.batches.set(runId, [span]);
|
|
47
|
+
}
|
|
48
|
+
if (isTopLevelRun) {
|
|
49
|
+
this.endedRuns.add(runId);
|
|
50
|
+
void this.exportRunBatch(runId, false);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async forceFlush() {
|
|
54
|
+
const runIds = [...this.batches.keys()];
|
|
55
|
+
await Promise.all(runIds.map((runId) => this.exportRunBatch(runId, true)));
|
|
56
|
+
if (this.exporter.forceFlush) {
|
|
57
|
+
await this.exporter.forceFlush();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async shutdown() {
|
|
61
|
+
if (this.isShutdown)
|
|
62
|
+
return;
|
|
63
|
+
this.isShutdown = true;
|
|
64
|
+
await this.forceFlush();
|
|
65
|
+
this.exporter.shutdown();
|
|
66
|
+
}
|
|
67
|
+
isTopLevelRun(span) {
|
|
68
|
+
return span.name === "ai.agent.run" && !span.parentSpanContext;
|
|
69
|
+
}
|
|
70
|
+
getRunIdFromSpan(span) {
|
|
71
|
+
const attributes = span
|
|
72
|
+
.attributes;
|
|
73
|
+
const runId = attributes?.["ai.agent.run_id"];
|
|
74
|
+
return typeof runId === "string" && runId.length > 0 ? runId : undefined;
|
|
75
|
+
}
|
|
76
|
+
getInstrumentationScopeName(span) {
|
|
77
|
+
return span.instrumentationScope?.name;
|
|
78
|
+
}
|
|
79
|
+
async exportRunBatch(runId, force) {
|
|
80
|
+
if (!force && !this.endedRuns.has(runId))
|
|
81
|
+
return;
|
|
82
|
+
const batch = this.batches.get(runId);
|
|
83
|
+
this.batches.delete(runId);
|
|
84
|
+
this.endedRuns.delete(runId);
|
|
85
|
+
this.clearRunMapping(runId);
|
|
86
|
+
if (!batch || batch.length === 0)
|
|
87
|
+
return;
|
|
88
|
+
await new Promise((resolve) => {
|
|
89
|
+
this.exporter.export(batch, () => resolve());
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
clearRunMapping(runId) {
|
|
93
|
+
for (const [spanId, mappedRunId] of this.spanIdToRunId.entries()) {
|
|
94
|
+
if (mappedRunId === runId) {
|
|
95
|
+
this.spanIdToRunId.delete(spanId);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.RunBatchSpanProcessor = RunBatchSpanProcessor;
|
|
101
|
+
//# sourceMappingURL=run-batch-span-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-batch-span-processor.js","sourceRoot":"","sources":["../src/run-batch-span-processor.ts"],"names":[],"mappings":"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"}
|
package/dist/trace-wrapper.d.ts
CHANGED
|
@@ -15,8 +15,8 @@ export type TraceContext = {
|
|
|
15
15
|
* Wraps an agent function with OpenTelemetry tracing, automatically creating
|
|
16
16
|
* a span for the agent run and providing a `TraceContext` to the wrapped function.
|
|
17
17
|
*
|
|
18
|
-
* The returned function creates a new span on every invocation, attaches
|
|
19
|
-
* metadata (run ID, input, experiment flag), and handles error recording.
|
|
18
|
+
* The returned function creates a new root span on every invocation, attaches
|
|
19
|
+
* agent metadata (name, run ID, input, experiment flag), and handles error recording.
|
|
20
20
|
* The `input` passed to the returned function is recorded as the agent's initial
|
|
21
21
|
* state on the span.
|
|
22
22
|
*
|
|
@@ -41,7 +41,7 @@ export type TraceContext = {
|
|
|
41
41
|
* { endOnExit: false },
|
|
42
42
|
* );
|
|
43
43
|
*
|
|
44
|
-
* @param agentName - Human-readable name
|
|
44
|
+
* @param agentName - Human-readable agent name recorded as `ai.agent.name`.
|
|
45
45
|
* @param fn - The agent function to wrap. Receives a {@link TraceContext} as its first argument and the call-time input as its second.
|
|
46
46
|
* @param options - Configuration for the agent trace.
|
|
47
47
|
* @param options.isExperiment - Mark this run as an experiment in Lemma.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-wrapper.d.ts","sourceRoot":"","sources":["../src/trace-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"trace-wrapper.d.ts","sourceRoot":"","sources":["../src/trace-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAIxE,MAAM,MAAM,YAAY,GAAG;IACzB,wDAAwD;IACxD,IAAI,EAAE,IAAI,CAAC;IACX,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,2FAA2F;IAC3F,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,4EAA4E;IAC5E,uBAAuB,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;CACpE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,SAAS,CAAC,KAAK,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,EAAE,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,UAC9H,GAAG,SAAS,KAAK;;;;GA+DhE"}
|
package/dist/trace-wrapper.js
CHANGED
|
@@ -3,12 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.wrapAgent = wrapAgent;
|
|
4
4
|
const api_1 = require("@opentelemetry/api");
|
|
5
5
|
const uuid_1 = require("uuid");
|
|
6
|
+
const experiment_mode_1 = require("./experiment-mode");
|
|
6
7
|
/**
|
|
7
8
|
* Wraps an agent function with OpenTelemetry tracing, automatically creating
|
|
8
9
|
* a span for the agent run and providing a `TraceContext` to the wrapped function.
|
|
9
10
|
*
|
|
10
|
-
* The returned function creates a new span on every invocation, attaches
|
|
11
|
-
* metadata (run ID, input, experiment flag), and handles error recording.
|
|
11
|
+
* The returned function creates a new root span on every invocation, attaches
|
|
12
|
+
* agent metadata (name, run ID, input, experiment flag), and handles error recording.
|
|
12
13
|
* The `input` passed to the returned function is recorded as the agent's initial
|
|
13
14
|
* state on the span.
|
|
14
15
|
*
|
|
@@ -33,7 +34,7 @@ const uuid_1 = require("uuid");
|
|
|
33
34
|
* { endOnExit: false },
|
|
34
35
|
* );
|
|
35
36
|
*
|
|
36
|
-
* @param agentName - Human-readable name
|
|
37
|
+
* @param agentName - Human-readable agent name recorded as `ai.agent.name`.
|
|
37
38
|
* @param fn - The agent function to wrap. Receives a {@link TraceContext} as its first argument and the call-time input as its second.
|
|
38
39
|
* @param options - Configuration for the agent trace.
|
|
39
40
|
* @param options.isExperiment - Mark this run as an experiment in Lemma.
|
|
@@ -46,21 +47,22 @@ function wrapAgent(agentName, fn, options) {
|
|
|
46
47
|
const tracer = api_1.trace.getTracer("lemma");
|
|
47
48
|
// Generate a unique run ID and open a new span for this agent invocation
|
|
48
49
|
const runId = (0, uuid_1.v4)();
|
|
49
|
-
const span = tracer.startSpan(
|
|
50
|
+
const span = tracer.startSpan("ai.agent.run", {
|
|
50
51
|
attributes: {
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
52
|
+
"ai.agent.name": agentName,
|
|
53
|
+
"ai.agent.run_id": runId,
|
|
54
|
+
"ai.agent.input": JSON.stringify(input),
|
|
55
|
+
"lemma.is_experiment": (0, experiment_mode_1.isExperimentModeEnabled)() || options?.isExperiment === true,
|
|
54
56
|
},
|
|
55
|
-
});
|
|
57
|
+
}, api_1.ROOT_CONTEXT);
|
|
56
58
|
// Propagate the span as the active context so child spans are nested correctly
|
|
57
|
-
const ctx = api_1.trace.setSpan(api_1.
|
|
59
|
+
const ctx = api_1.trace.setSpan(api_1.ROOT_CONTEXT, span);
|
|
58
60
|
try {
|
|
59
61
|
return await api_1.context.with(ctx, async () => {
|
|
60
62
|
// Build the TraceContext callbacks that the agent function can use
|
|
61
63
|
// to manually signal completion, errors, or record generation results
|
|
62
64
|
const onComplete = (result) => {
|
|
63
|
-
span.setAttribute("
|
|
65
|
+
span.setAttribute("ai.agent.output", JSON.stringify(result));
|
|
64
66
|
span.end();
|
|
65
67
|
};
|
|
66
68
|
const onError = (error) => {
|
|
@@ -70,7 +72,7 @@ function wrapAgent(agentName, fn, options) {
|
|
|
70
72
|
span.end();
|
|
71
73
|
};
|
|
72
74
|
const recordGenerationResults = (results) => {
|
|
73
|
-
span.setAttribute("
|
|
75
|
+
span.setAttribute("ai.agent.generation_results", JSON.stringify(results));
|
|
74
76
|
};
|
|
75
77
|
// Invoke the wrapped agent function with the trace context and call-time input
|
|
76
78
|
const result = await fn.call(this, { span, runId, onComplete, onError, recordGenerationResults }, input);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-wrapper.js","sourceRoot":"","sources":["../src/trace-wrapper.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"trace-wrapper.js","sourceRoot":"","sources":["../src/trace-wrapper.ts"],"names":[],"mappings":"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"}
|