@superblocksteam/telemetry 2.0.83-next.1
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/LICENSE.txt +87 -0
- package/README.md +155 -0
- package/dist/browser/index.d.ts +8 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +19 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/init.d.ts +75 -0
- package/dist/browser/init.d.ts.map +1 -0
- package/dist/browser/init.js +169 -0
- package/dist/browser/init.js.map +1 -0
- package/dist/browser/resilient-exporter.d.ts +43 -0
- package/dist/browser/resilient-exporter.d.ts.map +1 -0
- package/dist/browser/resilient-exporter.js +88 -0
- package/dist/browser/resilient-exporter.js.map +1 -0
- package/dist/common/contracts/tier2-traces.d.ts +75 -0
- package/dist/common/contracts/tier2-traces.d.ts.map +1 -0
- package/dist/common/contracts/tier2-traces.js +186 -0
- package/dist/common/contracts/tier2-traces.js.map +1 -0
- package/dist/common/deployment-type.d.ts +18 -0
- package/dist/common/deployment-type.d.ts.map +1 -0
- package/dist/common/deployment-type.js +30 -0
- package/dist/common/deployment-type.js.map +1 -0
- package/dist/common/guardrails.d.ts +116 -0
- package/dist/common/guardrails.d.ts.map +1 -0
- package/dist/common/guardrails.js +189 -0
- package/dist/common/guardrails.js.map +1 -0
- package/dist/common/index.d.ts +16 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +32 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/log-sanitizer.d.ts +78 -0
- package/dist/common/log-sanitizer.d.ts.map +1 -0
- package/dist/common/log-sanitizer.js +340 -0
- package/dist/common/log-sanitizer.js.map +1 -0
- package/dist/common/policy-evaluator.d.ts +103 -0
- package/dist/common/policy-evaluator.d.ts.map +1 -0
- package/dist/common/policy-evaluator.js +200 -0
- package/dist/common/policy-evaluator.js.map +1 -0
- package/dist/common/resource.d.ts +62 -0
- package/dist/common/resource.d.ts.map +1 -0
- package/dist/common/resource.js +106 -0
- package/dist/common/resource.js.map +1 -0
- package/dist/common/tier-hints.d.ts +182 -0
- package/dist/common/tier-hints.d.ts.map +1 -0
- package/dist/common/tier-hints.js +209 -0
- package/dist/common/tier-hints.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/lint/forbidden-attributes.d.ts +149 -0
- package/dist/lint/forbidden-attributes.d.ts.map +1 -0
- package/dist/lint/forbidden-attributes.js +214 -0
- package/dist/lint/forbidden-attributes.js.map +1 -0
- package/dist/lint/index.d.ts +9 -0
- package/dist/lint/index.d.ts.map +1 -0
- package/dist/lint/index.js +16 -0
- package/dist/lint/index.js.map +1 -0
- package/dist/llmobs/index.d.ts +22 -0
- package/dist/llmobs/index.d.ts.map +1 -0
- package/dist/llmobs/index.js +29 -0
- package/dist/llmobs/index.js.map +1 -0
- package/dist/llmobs/tier1-exporter.d.ts +146 -0
- package/dist/llmobs/tier1-exporter.d.ts.map +1 -0
- package/dist/llmobs/tier1-exporter.js +196 -0
- package/dist/llmobs/tier1-exporter.js.map +1 -0
- package/dist/llmobs/tier2-summarizer.d.ts +268 -0
- package/dist/llmobs/tier2-summarizer.d.ts.map +1 -0
- package/dist/llmobs/tier2-summarizer.js +650 -0
- package/dist/llmobs/tier2-summarizer.js.map +1 -0
- package/dist/node/exporters/resilient-exporter.d.ts +77 -0
- package/dist/node/exporters/resilient-exporter.d.ts.map +1 -0
- package/dist/node/exporters/resilient-exporter.js +129 -0
- package/dist/node/exporters/resilient-exporter.js.map +1 -0
- package/dist/node/index.d.ts +11 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +24 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/init.d.ts +75 -0
- package/dist/node/init.d.ts.map +1 -0
- package/dist/node/init.js +245 -0
- package/dist/node/init.js.map +1 -0
- package/dist/node/log-processor.d.ts +83 -0
- package/dist/node/log-processor.d.ts.map +1 -0
- package/dist/node/log-processor.js +266 -0
- package/dist/node/log-processor.js.map +1 -0
- package/dist/node/metrics-client.d.ts +66 -0
- package/dist/node/metrics-client.d.ts.map +1 -0
- package/dist/node/metrics-client.js +193 -0
- package/dist/node/metrics-client.js.map +1 -0
- package/dist/node/traced-socket.d.ts +76 -0
- package/dist/node/traced-socket.d.ts.map +1 -0
- package/dist/node/traced-socket.js +261 -0
- package/dist/node/traced-socket.js.map +1 -0
- package/dist/testing/in-memory-exporter.d.ts +179 -0
- package/dist/testing/in-memory-exporter.d.ts.map +1 -0
- package/dist/testing/in-memory-exporter.js +254 -0
- package/dist/testing/in-memory-exporter.js.map +1 -0
- package/dist/testing/index.d.ts +8 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +19 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/test-init.d.ts +80 -0
- package/dist/testing/test-init.d.ts.map +1 -0
- package/dist/testing/test-init.js +144 -0
- package/dist/testing/test-init.js.map +1 -0
- package/dist/types/index.d.ts +40 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/policy.d.ts +92 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/policy.js +125 -0
- package/dist/types/policy.js.map +1 -0
- package/dist-esm/browser/index.d.ts +8 -0
- package/dist-esm/browser/index.d.ts.map +1 -0
- package/dist-esm/browser/index.js +9 -0
- package/dist-esm/browser/index.js.map +1 -0
- package/dist-esm/browser/init.d.ts +75 -0
- package/dist-esm/browser/init.d.ts.map +1 -0
- package/dist-esm/browser/init.js +162 -0
- package/dist-esm/browser/init.js.map +1 -0
- package/dist-esm/browser/resilient-exporter.d.ts +43 -0
- package/dist-esm/browser/resilient-exporter.d.ts.map +1 -0
- package/dist-esm/browser/resilient-exporter.js +84 -0
- package/dist-esm/browser/resilient-exporter.js.map +1 -0
- package/dist-esm/common/contracts/tier2-traces.d.ts +75 -0
- package/dist-esm/common/contracts/tier2-traces.d.ts.map +1 -0
- package/dist-esm/common/contracts/tier2-traces.js +178 -0
- package/dist-esm/common/contracts/tier2-traces.js.map +1 -0
- package/dist-esm/common/deployment-type.d.ts +18 -0
- package/dist-esm/common/deployment-type.d.ts.map +1 -0
- package/dist-esm/common/deployment-type.js +27 -0
- package/dist-esm/common/deployment-type.js.map +1 -0
- package/dist-esm/common/guardrails.d.ts +116 -0
- package/dist-esm/common/guardrails.d.ts.map +1 -0
- package/dist-esm/common/guardrails.js +179 -0
- package/dist-esm/common/guardrails.js.map +1 -0
- package/dist-esm/common/index.d.ts +16 -0
- package/dist-esm/common/index.d.ts.map +1 -0
- package/dist-esm/common/index.js +16 -0
- package/dist-esm/common/index.js.map +1 -0
- package/dist-esm/common/log-sanitizer.d.ts +78 -0
- package/dist-esm/common/log-sanitizer.d.ts.map +1 -0
- package/dist-esm/common/log-sanitizer.js +331 -0
- package/dist-esm/common/log-sanitizer.js.map +1 -0
- package/dist-esm/common/policy-evaluator.d.ts +103 -0
- package/dist-esm/common/policy-evaluator.d.ts.map +1 -0
- package/dist-esm/common/policy-evaluator.js +196 -0
- package/dist-esm/common/policy-evaluator.js.map +1 -0
- package/dist-esm/common/resource.d.ts +62 -0
- package/dist-esm/common/resource.d.ts.map +1 -0
- package/dist-esm/common/resource.js +100 -0
- package/dist-esm/common/resource.js.map +1 -0
- package/dist-esm/common/tier-hints.d.ts +182 -0
- package/dist-esm/common/tier-hints.d.ts.map +1 -0
- package/dist-esm/common/tier-hints.js +199 -0
- package/dist-esm/common/tier-hints.js.map +1 -0
- package/dist-esm/index.d.ts +43 -0
- package/dist-esm/index.d.ts.map +1 -0
- package/dist-esm/index.js +53 -0
- package/dist-esm/index.js.map +1 -0
- package/dist-esm/lint/forbidden-attributes.d.ts +149 -0
- package/dist-esm/lint/forbidden-attributes.d.ts.map +1 -0
- package/dist-esm/lint/forbidden-attributes.js +209 -0
- package/dist-esm/lint/forbidden-attributes.js.map +1 -0
- package/dist-esm/lint/index.d.ts +9 -0
- package/dist-esm/lint/index.d.ts.map +1 -0
- package/dist-esm/lint/index.js +9 -0
- package/dist-esm/lint/index.js.map +1 -0
- package/dist-esm/llmobs/index.d.ts +22 -0
- package/dist-esm/llmobs/index.d.ts.map +1 -0
- package/dist-esm/llmobs/index.js +22 -0
- package/dist-esm/llmobs/index.js.map +1 -0
- package/dist-esm/llmobs/tier1-exporter.d.ts +146 -0
- package/dist-esm/llmobs/tier1-exporter.d.ts.map +1 -0
- package/dist-esm/llmobs/tier1-exporter.js +190 -0
- package/dist-esm/llmobs/tier1-exporter.js.map +1 -0
- package/dist-esm/llmobs/tier2-summarizer.d.ts +268 -0
- package/dist-esm/llmobs/tier2-summarizer.d.ts.map +1 -0
- package/dist-esm/llmobs/tier2-summarizer.js +646 -0
- package/dist-esm/llmobs/tier2-summarizer.js.map +1 -0
- package/dist-esm/node/exporters/resilient-exporter.d.ts +77 -0
- package/dist-esm/node/exporters/resilient-exporter.d.ts.map +1 -0
- package/dist-esm/node/exporters/resilient-exporter.js +125 -0
- package/dist-esm/node/exporters/resilient-exporter.js.map +1 -0
- package/dist-esm/node/index.d.ts +11 -0
- package/dist-esm/node/index.d.ts.map +1 -0
- package/dist-esm/node/index.js +11 -0
- package/dist-esm/node/index.js.map +1 -0
- package/dist-esm/node/init.d.ts +75 -0
- package/dist-esm/node/init.d.ts.map +1 -0
- package/dist-esm/node/init.js +239 -0
- package/dist-esm/node/init.js.map +1 -0
- package/dist-esm/node/log-processor.d.ts +83 -0
- package/dist-esm/node/log-processor.d.ts.map +1 -0
- package/dist-esm/node/log-processor.js +261 -0
- package/dist-esm/node/log-processor.js.map +1 -0
- package/dist-esm/node/metrics-client.d.ts +66 -0
- package/dist-esm/node/metrics-client.d.ts.map +1 -0
- package/dist-esm/node/metrics-client.js +189 -0
- package/dist-esm/node/metrics-client.js.map +1 -0
- package/dist-esm/node/traced-socket.d.ts +76 -0
- package/dist-esm/node/traced-socket.d.ts.map +1 -0
- package/dist-esm/node/traced-socket.js +257 -0
- package/dist-esm/node/traced-socket.js.map +1 -0
- package/dist-esm/testing/in-memory-exporter.d.ts +179 -0
- package/dist-esm/testing/in-memory-exporter.d.ts.map +1 -0
- package/dist-esm/testing/in-memory-exporter.js +248 -0
- package/dist-esm/testing/in-memory-exporter.js.map +1 -0
- package/dist-esm/testing/index.d.ts +8 -0
- package/dist-esm/testing/index.d.ts.map +1 -0
- package/dist-esm/testing/index.js +8 -0
- package/dist-esm/testing/index.js.map +1 -0
- package/dist-esm/testing/test-init.d.ts +80 -0
- package/dist-esm/testing/test-init.d.ts.map +1 -0
- package/dist-esm/testing/test-init.js +137 -0
- package/dist-esm/testing/test-init.js.map +1 -0
- package/dist-esm/types/index.d.ts +40 -0
- package/dist-esm/types/index.d.ts.map +1 -0
- package/dist-esm/types/index.js +7 -0
- package/dist-esm/types/index.js.map +1 -0
- package/dist-esm/types/policy.d.ts +92 -0
- package/dist-esm/types/policy.d.ts.map +1 -0
- package/dist-esm/types/policy.js +122 -0
- package/dist-esm/types/policy.js.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry ESLint Rules
|
|
3
|
+
*
|
|
4
|
+
* Lint rules for enforcing telemetry best practices:
|
|
5
|
+
* - no-forbidden-attributes: Prevents Tier 1 data in Tier 2 paths
|
|
6
|
+
* - no-direct-otel-sdk: Enforces use of telemetry bootstrap
|
|
7
|
+
*/
|
|
8
|
+
export { noForbiddenTelemetryAttributes, noDirectOtelSdk, telemetryRules, FORBIDDEN_ATTRIBUTE_PATTERNS, } from './forbidden-attributes.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lint/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,8BAA8B,EAC9B,eAAe,EACf,cAAc,EACd,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry ESLint Rules
|
|
3
|
+
*
|
|
4
|
+
* Lint rules for enforcing telemetry best practices:
|
|
5
|
+
* - no-forbidden-attributes: Prevents Tier 1 data in Tier 2 paths
|
|
6
|
+
* - no-direct-otel-sdk: Enforces use of telemetry bootstrap
|
|
7
|
+
*/
|
|
8
|
+
export { noForbiddenTelemetryAttributes, noDirectOtelSdk, telemetryRules, FORBIDDEN_ATTRIBUTE_PATTERNS, } from './forbidden-attributes.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lint/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,8BAA8B,EAC9B,eAAe,EACf,cAAc,EACd,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLMObs Tiered Telemetry
|
|
3
|
+
*
|
|
4
|
+
* This module provides tiered telemetry for LLMObs (LLM Observability) data:
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import {
|
|
9
|
+
* createTier1LLMObsExporter,
|
|
10
|
+
* LLMObsTier2Summarizer,
|
|
11
|
+
* } from '@superblocksteam/telemetry/llmobs';
|
|
12
|
+
*
|
|
13
|
+
* // Tier 1: Local storage
|
|
14
|
+
* const { exporter, store } = createTier1LLMObsExporter();
|
|
15
|
+
*
|
|
16
|
+
* // Tier 2: Summarize for OTEL-aligned metrics
|
|
17
|
+
* const summarizer = new LLMObsTier2Summarizer(metricsClient);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export { Tier1LLMObsExporter, InMemoryLLMObsStore, createTier1LLMObsExporter, type LLMObsLocalStore, } from './tier1-exporter.js';
|
|
21
|
+
export { LLMObsTier2Summarizer, type LLMSpanSummary, type ToolSpanSummary, type LLMErrorCategory, type LLMFinishReason, type LLMProvider, type LLMRequestMetricLabels, type TokenMetricLabels, type ToolCallMetricLabels, type Tier2MetricsClient, } from './tier2-summarizer.js';
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llmobs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,gBAAgB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACxB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLMObs Tiered Telemetry
|
|
3
|
+
*
|
|
4
|
+
* This module provides tiered telemetry for LLMObs (LLM Observability) data:
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import {
|
|
9
|
+
* createTier1LLMObsExporter,
|
|
10
|
+
* LLMObsTier2Summarizer,
|
|
11
|
+
* } from '@superblocksteam/telemetry/llmobs';
|
|
12
|
+
*
|
|
13
|
+
* // Tier 1: Local storage
|
|
14
|
+
* const { exporter, store } = createTier1LLMObsExporter();
|
|
15
|
+
*
|
|
16
|
+
* // Tier 2: Summarize for OTEL-aligned metrics
|
|
17
|
+
* const summarizer = new LLMObsTier2Summarizer(metricsClient);
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export { Tier1LLMObsExporter, InMemoryLLMObsStore, createTier1LLMObsExporter, } from './tier1-exporter.js';
|
|
21
|
+
export { LLMObsTier2Summarizer, } from './tier2-summarizer.js';
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llmobs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,GAE1B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,qBAAqB,GAUtB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier 1 LLMObs Exporter
|
|
3
|
+
*
|
|
4
|
+
* Stores full-fidelity LLMObs spans locally for debugging.
|
|
5
|
+
* These spans contain prompts, code, tool IO - NEVER exported for cloud-prem.
|
|
6
|
+
*
|
|
7
|
+
* For cloud deployments, Tier 1 data can be exported (same trust boundary).
|
|
8
|
+
* For cloud-prem deployments, Tier 1 data stays local only.
|
|
9
|
+
*/
|
|
10
|
+
import type { SpanExporter, ReadableSpan } from '@opentelemetry/sdk-trace-base';
|
|
11
|
+
import type { ExportResult } from '@opentelemetry/core';
|
|
12
|
+
/**
|
|
13
|
+
* Storage interface for Tier 1 LLMObs spans.
|
|
14
|
+
*
|
|
15
|
+
* Provides queryable access for local debugging.
|
|
16
|
+
* Implementation can be in-memory, filesystem, or local database.
|
|
17
|
+
*/
|
|
18
|
+
export interface LLMObsLocalStore {
|
|
19
|
+
/**
|
|
20
|
+
* Store a span for later retrieval.
|
|
21
|
+
*
|
|
22
|
+
* @param span - The span to store
|
|
23
|
+
*/
|
|
24
|
+
store(span: ReadableSpan): void;
|
|
25
|
+
/**
|
|
26
|
+
* Query spans by session ID.
|
|
27
|
+
*
|
|
28
|
+
* @param sessionId - Session ID to query
|
|
29
|
+
* @returns Matching spans
|
|
30
|
+
*/
|
|
31
|
+
query(sessionId: string): ReadableSpan[];
|
|
32
|
+
/**
|
|
33
|
+
* Clear all stored spans.
|
|
34
|
+
*/
|
|
35
|
+
clear(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Get the count of stored spans.
|
|
38
|
+
*/
|
|
39
|
+
size(): number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* In-memory implementation of LLMObsLocalStore.
|
|
43
|
+
*
|
|
44
|
+
* Suitable for development and short-lived processes.
|
|
45
|
+
* Spans are automatically evicted when limits are reached.
|
|
46
|
+
*/
|
|
47
|
+
export declare class InMemoryLLMObsStore implements LLMObsLocalStore {
|
|
48
|
+
private readonly spans;
|
|
49
|
+
private readonly maxSpansPerSession;
|
|
50
|
+
private readonly maxSessions;
|
|
51
|
+
private totalSpanCount;
|
|
52
|
+
/**
|
|
53
|
+
* Create an in-memory LLMObs store.
|
|
54
|
+
*
|
|
55
|
+
* @param options - Configuration options
|
|
56
|
+
* @param options.maxSpansPerSession - Maximum spans to retain per session (default: 1000)
|
|
57
|
+
* @param options.maxSessions - Maximum sessions to retain (default: 100)
|
|
58
|
+
*/
|
|
59
|
+
constructor(options?: {
|
|
60
|
+
maxSpansPerSession?: number;
|
|
61
|
+
maxSessions?: number;
|
|
62
|
+
});
|
|
63
|
+
store(span: ReadableSpan): void;
|
|
64
|
+
query(sessionId: string): ReadableSpan[];
|
|
65
|
+
clear(): void;
|
|
66
|
+
size(): number;
|
|
67
|
+
/**
|
|
68
|
+
* Get all session IDs.
|
|
69
|
+
*
|
|
70
|
+
* @returns Array of session IDs
|
|
71
|
+
*/
|
|
72
|
+
getSessions(): string[];
|
|
73
|
+
/**
|
|
74
|
+
* Extract session ID from span attributes.
|
|
75
|
+
*/
|
|
76
|
+
private getSessionId;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Tier 1 LLMObs Exporter.
|
|
80
|
+
*
|
|
81
|
+
* Exports LLMObs spans to local storage only.
|
|
82
|
+
* These spans contain full fidelity debugging data (prompts, code, tool IO).
|
|
83
|
+
* NEVER exported to external backends in cloud-prem deployments.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* const store = new InMemoryLLMObsStore();
|
|
88
|
+
* const exporter = new Tier1LLMObsExporter(store);
|
|
89
|
+
*
|
|
90
|
+
* // Later, query for debugging
|
|
91
|
+
* const spans = store.query(sessionId);
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export declare class Tier1LLMObsExporter implements SpanExporter {
|
|
95
|
+
private readonly localStore;
|
|
96
|
+
private readonly debugLogging;
|
|
97
|
+
private isShutdown;
|
|
98
|
+
/**
|
|
99
|
+
* Create a Tier 1 LLMObs exporter.
|
|
100
|
+
*
|
|
101
|
+
* @param localStore - Storage for local spans
|
|
102
|
+
* @param options - Configuration options
|
|
103
|
+
* @param options.debugLogging - Enable debug logging (default: false)
|
|
104
|
+
*/
|
|
105
|
+
constructor(localStore: LLMObsLocalStore, options?: {
|
|
106
|
+
debugLogging?: boolean;
|
|
107
|
+
});
|
|
108
|
+
/**
|
|
109
|
+
* Export spans to local storage.
|
|
110
|
+
*
|
|
111
|
+
* @param spans - Spans to export
|
|
112
|
+
* @param resultCallback - Callback with export result
|
|
113
|
+
*/
|
|
114
|
+
export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void;
|
|
115
|
+
/**
|
|
116
|
+
* Shutdown the exporter.
|
|
117
|
+
*/
|
|
118
|
+
shutdown(): Promise<void>;
|
|
119
|
+
/**
|
|
120
|
+
* Force flush (no-op for local storage).
|
|
121
|
+
*/
|
|
122
|
+
forceFlush(): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Check if a span is an LLMObs span.
|
|
125
|
+
*/
|
|
126
|
+
private isLLMObsSpan;
|
|
127
|
+
/**
|
|
128
|
+
* Get span duration in milliseconds.
|
|
129
|
+
*/
|
|
130
|
+
private getDurationMs;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Create a Tier 1 LLMObs exporter with in-memory storage.
|
|
134
|
+
*
|
|
135
|
+
* @param options - Configuration options
|
|
136
|
+
* @returns Exporter and store instances
|
|
137
|
+
*/
|
|
138
|
+
export declare function createTier1LLMObsExporter(options?: {
|
|
139
|
+
maxSpansPerSession?: number;
|
|
140
|
+
maxSessions?: number;
|
|
141
|
+
debugLogging?: boolean;
|
|
142
|
+
}): {
|
|
143
|
+
exporter: Tier1LLMObsExporter;
|
|
144
|
+
store: InMemoryLLMObsStore;
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=tier1-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier1-exporter.d.ts","sourceRoot":"","sources":["../../src/llmobs/tier1-exporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAEhC;;;;;OAKG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;IAEzC;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;OAEG;IACH,IAAI,IAAI,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,gBAAgB;IAC1D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,cAAc,CAAK;IAE3B;;;;;;OAMG;gBACS,OAAO,GAAE;QAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAK/E,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IA4B/B,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE;IAIxC,KAAK,IAAI,IAAI;IAKb,IAAI,IAAI,MAAM;IAId;;;;OAIG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;OAEG;IACH,OAAO,CAAC,YAAY;CAOrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,mBAAoB,YAAW,YAAY;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;OAMG;gBAED,UAAU,EAAE,gBAAgB,EAC5B,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO;IAM1C;;;;;OAKG;IACH,MAAM,CACJ,KAAK,EAAE,YAAY,EAAE,EACrB,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAC7C,IAAI;IAyBP;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACH,OAAO,CAAC,aAAa;CAKtB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE;IAClD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG;IAAE,QAAQ,EAAE,mBAAmB,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,CAShE"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier 1 LLMObs Exporter
|
|
3
|
+
*
|
|
4
|
+
* Stores full-fidelity LLMObs spans locally for debugging.
|
|
5
|
+
* These spans contain prompts, code, tool IO - NEVER exported for cloud-prem.
|
|
6
|
+
*
|
|
7
|
+
* For cloud deployments, Tier 1 data can be exported (same trust boundary).
|
|
8
|
+
* For cloud-prem deployments, Tier 1 data stays local only.
|
|
9
|
+
*/
|
|
10
|
+
import { ExportResultCode } from '@opentelemetry/core';
|
|
11
|
+
/**
|
|
12
|
+
* In-memory implementation of LLMObsLocalStore.
|
|
13
|
+
*
|
|
14
|
+
* Suitable for development and short-lived processes.
|
|
15
|
+
* Spans are automatically evicted when limits are reached.
|
|
16
|
+
*/
|
|
17
|
+
export class InMemoryLLMObsStore {
|
|
18
|
+
spans = new Map();
|
|
19
|
+
maxSpansPerSession;
|
|
20
|
+
maxSessions;
|
|
21
|
+
totalSpanCount = 0;
|
|
22
|
+
/**
|
|
23
|
+
* Create an in-memory LLMObs store.
|
|
24
|
+
*
|
|
25
|
+
* @param options - Configuration options
|
|
26
|
+
* @param options.maxSpansPerSession - Maximum spans to retain per session (default: 1000)
|
|
27
|
+
* @param options.maxSessions - Maximum sessions to retain (default: 100)
|
|
28
|
+
*/
|
|
29
|
+
constructor(options = {}) {
|
|
30
|
+
this.maxSpansPerSession = options.maxSpansPerSession ?? 1000;
|
|
31
|
+
this.maxSessions = options.maxSessions ?? 100;
|
|
32
|
+
}
|
|
33
|
+
store(span) {
|
|
34
|
+
const sessionId = this.getSessionId(span) || 'default';
|
|
35
|
+
// Create session if doesn't exist
|
|
36
|
+
if (!this.spans.has(sessionId)) {
|
|
37
|
+
// Evict oldest session if at capacity
|
|
38
|
+
if (this.spans.size >= this.maxSessions) {
|
|
39
|
+
const oldestSession = this.spans.keys().next().value;
|
|
40
|
+
if (oldestSession) {
|
|
41
|
+
const evictedSpans = this.spans.get(oldestSession)?.length ?? 0;
|
|
42
|
+
this.totalSpanCount -= evictedSpans;
|
|
43
|
+
this.spans.delete(oldestSession);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
this.spans.set(sessionId, []);
|
|
47
|
+
}
|
|
48
|
+
const sessionSpans = this.spans.get(sessionId);
|
|
49
|
+
sessionSpans.push(span);
|
|
50
|
+
this.totalSpanCount++;
|
|
51
|
+
// Evict oldest spans in session if at capacity
|
|
52
|
+
if (sessionSpans.length > this.maxSpansPerSession) {
|
|
53
|
+
sessionSpans.shift();
|
|
54
|
+
this.totalSpanCount--;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
query(sessionId) {
|
|
58
|
+
return this.spans.get(sessionId) ?? [];
|
|
59
|
+
}
|
|
60
|
+
clear() {
|
|
61
|
+
this.spans.clear();
|
|
62
|
+
this.totalSpanCount = 0;
|
|
63
|
+
}
|
|
64
|
+
size() {
|
|
65
|
+
return this.totalSpanCount;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get all session IDs.
|
|
69
|
+
*
|
|
70
|
+
* @returns Array of session IDs
|
|
71
|
+
*/
|
|
72
|
+
getSessions() {
|
|
73
|
+
return Array.from(this.spans.keys());
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Extract session ID from span attributes.
|
|
77
|
+
*/
|
|
78
|
+
getSessionId(span) {
|
|
79
|
+
return (span.attributes['llmobs.session_id'] ||
|
|
80
|
+
span.attributes['session.id'] ||
|
|
81
|
+
span.attributes['session_id']);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Tier 1 LLMObs Exporter.
|
|
86
|
+
*
|
|
87
|
+
* Exports LLMObs spans to local storage only.
|
|
88
|
+
* These spans contain full fidelity debugging data (prompts, code, tool IO).
|
|
89
|
+
* NEVER exported to external backends in cloud-prem deployments.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* const store = new InMemoryLLMObsStore();
|
|
94
|
+
* const exporter = new Tier1LLMObsExporter(store);
|
|
95
|
+
*
|
|
96
|
+
* // Later, query for debugging
|
|
97
|
+
* const spans = store.query(sessionId);
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
export class Tier1LLMObsExporter {
|
|
101
|
+
localStore;
|
|
102
|
+
debugLogging;
|
|
103
|
+
isShutdown = false;
|
|
104
|
+
/**
|
|
105
|
+
* Create a Tier 1 LLMObs exporter.
|
|
106
|
+
*
|
|
107
|
+
* @param localStore - Storage for local spans
|
|
108
|
+
* @param options - Configuration options
|
|
109
|
+
* @param options.debugLogging - Enable debug logging (default: false)
|
|
110
|
+
*/
|
|
111
|
+
constructor(localStore, options = {}) {
|
|
112
|
+
this.localStore = localStore;
|
|
113
|
+
this.debugLogging = options.debugLogging ?? false;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Export spans to local storage.
|
|
117
|
+
*
|
|
118
|
+
* @param spans - Spans to export
|
|
119
|
+
* @param resultCallback - Callback with export result
|
|
120
|
+
*/
|
|
121
|
+
export(spans, resultCallback) {
|
|
122
|
+
if (this.isShutdown) {
|
|
123
|
+
resultCallback({ code: ExportResultCode.FAILED, error: new Error('Exporter is shutdown') });
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
for (const span of spans) {
|
|
127
|
+
// Only store LLMObs-related spans
|
|
128
|
+
if (this.isLLMObsSpan(span)) {
|
|
129
|
+
this.localStore.store(span);
|
|
130
|
+
if (this.debugLogging) {
|
|
131
|
+
console.debug('[LLMObs Tier 1]', span.name, {
|
|
132
|
+
traceId: span.spanContext().traceId,
|
|
133
|
+
duration: this.getDurationMs(span),
|
|
134
|
+
hasInput: !!span.attributes['llmobs.input'],
|
|
135
|
+
hasOutput: !!span.attributes['llmobs.output'],
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
resultCallback({ code: ExportResultCode.SUCCESS });
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Shutdown the exporter.
|
|
144
|
+
*/
|
|
145
|
+
async shutdown() {
|
|
146
|
+
this.isShutdown = true;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Force flush (no-op for local storage).
|
|
150
|
+
*/
|
|
151
|
+
async forceFlush() {
|
|
152
|
+
// No-op for local storage
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Check if a span is an LLMObs span.
|
|
156
|
+
*/
|
|
157
|
+
isLLMObsSpan(span) {
|
|
158
|
+
return (span.name.startsWith('ai.') ||
|
|
159
|
+
span.name.startsWith('llmobs.') ||
|
|
160
|
+
span.name.startsWith('llm.') ||
|
|
161
|
+
span.name.startsWith('tool.') ||
|
|
162
|
+
span.name.startsWith('clark.') ||
|
|
163
|
+
!!span.attributes['llmobs.span_kind']);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get span duration in milliseconds.
|
|
167
|
+
*/
|
|
168
|
+
getDurationMs(span) {
|
|
169
|
+
const [startSecs, startNanos] = span.startTime;
|
|
170
|
+
const [endSecs, endNanos] = span.endTime;
|
|
171
|
+
return (endSecs - startSecs) * 1000 + (endNanos - startNanos) / 1e6;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Create a Tier 1 LLMObs exporter with in-memory storage.
|
|
176
|
+
*
|
|
177
|
+
* @param options - Configuration options
|
|
178
|
+
* @returns Exporter and store instances
|
|
179
|
+
*/
|
|
180
|
+
export function createTier1LLMObsExporter(options) {
|
|
181
|
+
const store = new InMemoryLLMObsStore({
|
|
182
|
+
maxSpansPerSession: options?.maxSpansPerSession,
|
|
183
|
+
maxSessions: options?.maxSessions,
|
|
184
|
+
});
|
|
185
|
+
const exporter = new Tier1LLMObsExporter(store, {
|
|
186
|
+
debugLogging: options?.debugLogging,
|
|
187
|
+
});
|
|
188
|
+
return { exporter, store };
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=tier1-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier1-exporter.js","sourceRoot":"","sources":["../../src/llmobs/tier1-exporter.ts"],"names":[],"mappings":"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"}
|