@frugalco/frugal-sdk-node 0.1.0 → 0.3.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 +52 -3
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +33 -4
- package/dist/config.js.map +1 -1
- package/dist/debug.d.ts +25 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +77 -0
- package/dist/debug.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/instrument.d.ts +4 -1
- package/dist/instrument.d.ts.map +1 -1
- package/dist/instrument.js +20 -5
- package/dist/instrument.js.map +1 -1
- package/dist/otel.d.ts +23 -1
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +93 -11
- package/dist/otel.js.map +1 -1
- package/dist/providers.d.ts +86 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +125 -0
- package/dist/providers.js.map +1 -0
- package/dist/semconv.d.ts +2 -0
- package/dist/semconv.d.ts.map +1 -1
- package/dist/semconv.js +10 -0
- package/dist/semconv.js.map +1 -1
- package/dist/shutdown.d.ts +28 -0
- package/dist/shutdown.d.ts.map +1 -0
- package/dist/shutdown.js +111 -0
- package/dist/shutdown.js.map +1 -0
- package/dist/track.d.ts +14 -4
- package/dist/track.d.ts.map +1 -1
- package/dist/track.js +5 -2
- package/dist/track.js.map +1 -1
- package/dist/wrappers/anthropic.d.ts.map +1 -1
- package/dist/wrappers/anthropic.js +6 -0
- package/dist/wrappers/anthropic.js.map +1 -1
- package/dist/wrappers/openai.d.ts.map +1 -1
- package/dist/wrappers/openai.js +6 -0
- package/dist/wrappers/openai.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ npm install @frugalco/frugal-sdk-node
|
|
|
11
11
|
npm install openai @anthropic-ai/sdk
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
Requires Node.js 18+.
|
|
14
|
+
Requires Node.js 18.19+ or 20.6+.
|
|
15
15
|
|
|
16
16
|
## Quick start
|
|
17
17
|
|
|
@@ -54,6 +54,7 @@ Set both or the wrapper silently returns the client unmodified:
|
|
|
54
54
|
| `FRUGAL_OTEL_EXPORTER_OTLP_ENDPOINT` | OTLP collector URL for Frugal metrics. Defaults to `https://metrics.frugal.co/opentelemetry/v1/metrics`. Falls back to `OTEL_EXPORTER_OTLP_ENDPOINT`. |
|
|
55
55
|
| `FRUGAL_OTEL_EXPORTER_OTLP_HEADERS` | Export auth headers (e.g. `Authorization=Bearer ...`). Overrides the header built from `FRUGAL_API_KEY`. Falls back to `OTEL_EXPORTER_OTLP_HEADERS`. |
|
|
56
56
|
| `FRUGAL_COMPONENTS` | Comma-separated logical components (e.g. `ai-handler,reco`). When set, each metric is ALSO emitted once per component (tagged `frugal.component`) on top of the base project series, so usage can be viewed for the whole project or split by component. |
|
|
57
|
+
| `FRUGAL_CUSTOM_PROVIDERS` | Comma-separated allowlist of provider names beyond the built-in registry (e.g. `together_ai,fireworks`) that should pass through verbatim on `gen_ai.system` / `gen_ai.provider.name` instead of being coerced to `custom`. Capped at 10 (extras are coerced) to keep label cardinality bounded. |
|
|
57
58
|
| `FRUGAL_PATH_BLOCK_LIST` | Comma-separated repo-relative paths to skip for caller attribution (see below). |
|
|
58
59
|
| `FRUGAL_METRIC_EXPORT_INTERVAL_MS` | Export cadence in milliseconds. Default `60000`. |
|
|
59
60
|
| `FRUGAL_MAX_CALL_SITES` | Cardinality cap — max distinct `(caller_file, caller_function)` pairs to attribute. Default `500`. Set to `0` to disable. |
|
|
@@ -89,9 +90,9 @@ Every metric carries this base attribute set:
|
|
|
89
90
|
|
|
90
91
|
- `frugal.project_id` — from your env vars (`frugal.customer_id` too when set); `frugal.component` is added on the per-component series when `FRUGAL_COMPONENTS` is set
|
|
91
92
|
- `frugal.caller_file`, `frugal.caller_function` — auto-detected from the call stack
|
|
92
|
-
- `gen_ai.system` — `openai`, `anthropic`, `aws.bedrock`, `vertex_ai`, or `custom`
|
|
93
|
+
- `gen_ai.system` + `gen_ai.provider.name` — the provider, dual-emitted under both the legacy and current OTel attribute (`openai`, `anthropic`, `aws.bedrock`, `vertex_ai`/`gcp.vertex_ai`, …, or `custom`). Override via the `provider` field; an unrecognized value is coerced to `custom` with a one-time warning. See [`docs/metrics-reference.md`](docs/metrics-reference.md#attributes).
|
|
93
94
|
- `gen_ai.request.model`, `gen_ai.response.model` — the model used
|
|
94
|
-
- `gen_ai.operation.name` — `chat`, `text_completion`, or `
|
|
95
|
+
- `gen_ai.operation.name` — `chat`, `text_completion`, `embeddings`, `generate_content`, `execute_tool`, `create_agent`, `invoke_agent`, or `other` (the sentinel an unrecognized operation coerces to)
|
|
95
96
|
- `frugal.batched` — `true` for batch-API submissions, `false` otherwise
|
|
96
97
|
|
|
97
98
|
The "Additional attributes" column above lists what each metric carries on top of the base set. See [`docs/metrics-reference.md`](docs/metrics-reference.md) for the values each attribute takes, sentinel values for caller fields, and the full internal-error-stage list.
|
|
@@ -208,6 +209,54 @@ FRUGAL_PATH_BLOCK_LIST="src/acme-ai-helpers,libs/llm-utils"
|
|
|
208
209
|
- If any part of our instrumentation fails at runtime (OTel init, stack walking, metric emission), the original SDK call executes normally. We never throw our own exceptions into your code.
|
|
209
210
|
- Wrapping is idempotent — calling `wrapOpenAI(client)` twice on the same client is safe.
|
|
210
211
|
|
|
212
|
+
## Debugging
|
|
213
|
+
|
|
214
|
+
The SDK is silent by design — when misconfigured it degrades to a no-op. To see *why* it is doing nothing (missing env var, instrument-build failure, cardinality-cap hit, a metric export that keeps failing), register a debug callback:
|
|
215
|
+
|
|
216
|
+
```js
|
|
217
|
+
import { setDebugCallback } from "@frugalco/frugal-sdk-node";
|
|
218
|
+
|
|
219
|
+
setDebugCallback((level, message, context) => {
|
|
220
|
+
// level: "info" | "warn" | "error"
|
|
221
|
+
// message: human-readable string
|
|
222
|
+
// context: optional structured detail, e.g. { stage: "setup_failed" }
|
|
223
|
+
myLogger[level](`[frugal-metrics] ${message}`, context);
|
|
224
|
+
});
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
This is a **structural-diagnostics hook, not a per-call trace**. It only fires for structural or persistent problems — missing/invalid configuration, setup failures, cardinality-cap hits, and *consecutive* export failures (one de-duped `error`, re-armed on the next success). Ordinary transient per-call API errors are never emitted — those are your own API errors and already visible to you.
|
|
228
|
+
|
|
229
|
+
Notes:
|
|
230
|
+
|
|
231
|
+
- **A throwing callback is swallowed.** If your callback throws, the exception never escapes into the SDK or your code.
|
|
232
|
+
- **Issues are replayed.** Configuration runs lazily and may happen before you register, so init/config diagnostics emitted beforehand are held in a small bounded buffer and replayed in order the moment you call `setDebugCallback`. Register once at startup to catch them all.
|
|
233
|
+
- Pass `null` to clear the callback.
|
|
234
|
+
|
|
235
|
+
## Flushing & graceful shutdown
|
|
236
|
+
|
|
237
|
+
Metrics export on a periodic interval (default 60s). A short-lived process — a CLI, a job, a serverless invocation, a test run — can exit before the next export, silently dropping its final window of metrics. Use `flush` / `shutdown` to avoid that:
|
|
238
|
+
|
|
239
|
+
```js
|
|
240
|
+
import { flush, shutdown } from "@frugalco/frugal-sdk-node";
|
|
241
|
+
|
|
242
|
+
await flush(); // force an immediate export; SDK keeps recording afterwards
|
|
243
|
+
await shutdown(); // flush + tear down the provider (rebuilt lazily on next wrap)
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Both are **safe no-ops when the SDK was never initialized** and never throw.
|
|
247
|
+
|
|
248
|
+
For processes that exit on their own, opt in to automatic flush-on-exit:
|
|
249
|
+
|
|
250
|
+
```js
|
|
251
|
+
import { enableAutoShutdown } from "@frugalco/frugal-sdk-node";
|
|
252
|
+
|
|
253
|
+
enableAutoShutdown(); // flush + shutdown on beforeExit / SIGTERM / SIGINT
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
`enableAutoShutdown` registers a `beforeExit` handler and SIGTERM/SIGINT handlers; on a signal it flushes and then exits with code 0 (pass `{ exitOnSignal: false }` to skip the exit). It is **idempotent** — repeat calls add no duplicate listeners.
|
|
257
|
+
|
|
258
|
+
It is **opt-in** because installing signal handlers is intrusive. If you run your own signal handling, do **not** call `enableAutoShutdown`; prefer awaiting `shutdown()` from inside your own handler instead.
|
|
259
|
+
|
|
211
260
|
## Verifying the setup
|
|
212
261
|
|
|
213
262
|
Set the OTLP endpoint to empty to print metrics to the console instead of exporting them:
|
package/dist/config.d.ts
CHANGED
|
@@ -5,6 +5,12 @@ export interface Config {
|
|
|
5
5
|
projectId: string;
|
|
6
6
|
/** Optional logical components this deployment serves; metrics fan out one extra series per entry. */
|
|
7
7
|
components: readonly string[];
|
|
8
|
+
/**
|
|
9
|
+
* Customer-registered provider names (beyond the built-in OTel registry) that
|
|
10
|
+
* should pass through verbatim instead of being coerced to `custom`. Capped to
|
|
11
|
+
* keep `gen_ai.system` / `gen_ai.provider.name` cardinality bounded.
|
|
12
|
+
*/
|
|
13
|
+
customProviders: readonly string[];
|
|
8
14
|
repoRoot: string;
|
|
9
15
|
pathBlockList: readonly string[];
|
|
10
16
|
otlpEndpoint: string;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAkCA,MAAM,WAAW,MAAM;IACrB,mGAAmG;IACnG,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;IAClB,sGAAsG;IACtG,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B;;;;OAIG;IACH,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,8FAA8F;IAC9F,YAAY,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,wBAAwB,EAAE,MAAM,CAAC;CAClC;AA6CD,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CA4I1C;AAED,qDAAqD;AACrD,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
|
package/dist/config.js
CHANGED
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
// the defaults so existing customers don't need to change anything.
|
|
29
29
|
import { realpathSync } from "node:fs";
|
|
30
30
|
import { resolve } from "node:path";
|
|
31
|
+
import { emitLog, emitLogOnce } from "./debug.js";
|
|
31
32
|
const ENV = {
|
|
32
33
|
CUSTOMER_ID: "FRUGAL_CUSTOMER_ID",
|
|
33
34
|
PROJECT_ID: "FRUGAL_PROJECT_ID",
|
|
@@ -37,6 +38,7 @@ const ENV = {
|
|
|
37
38
|
METRICS_PROJECT_ID: "FRUGAL_METRICS_PROJECT_ID",
|
|
38
39
|
METRICS_API_KEY: "FRUGAL_METRICS_API_KEY",
|
|
39
40
|
COMPONENTS: "FRUGAL_COMPONENTS",
|
|
41
|
+
CUSTOM_PROVIDERS: "FRUGAL_CUSTOM_PROVIDERS",
|
|
40
42
|
REPO_ROOT: "FRUGAL_REPO_ROOT",
|
|
41
43
|
PATH_BLOCK_LIST: "FRUGAL_PATH_BLOCK_LIST",
|
|
42
44
|
DISABLED: "FRUGAL_DISABLED",
|
|
@@ -52,6 +54,8 @@ const ENV = {
|
|
|
52
54
|
const DEFAULT_OTLP_ENDPOINT = "https://metrics.frugal.co/opentelemetry/v1/metrics";
|
|
53
55
|
const DEFAULT_MAX_CALL_SITES = 500;
|
|
54
56
|
const DEFAULT_PROMPT_ANALYSIS_SAMPLE_RATE = 0.1;
|
|
57
|
+
/** Upper bound on customer-registered provider names — keeps label cardinality bounded. */
|
|
58
|
+
const MAX_CUSTOM_PROVIDERS = 10;
|
|
55
59
|
let warnedOnce = false;
|
|
56
60
|
function truthy(value) {
|
|
57
61
|
if (!value)
|
|
@@ -63,8 +67,7 @@ function warnOnce(message) {
|
|
|
63
67
|
if (warnedOnce)
|
|
64
68
|
return;
|
|
65
69
|
warnedOnce = true;
|
|
66
|
-
|
|
67
|
-
console.warn(`[frugal-metrics] disabled: ${message}`);
|
|
70
|
+
emitLog("warn", `disabled: ${message}`);
|
|
68
71
|
}
|
|
69
72
|
export function loadConfig() {
|
|
70
73
|
if (truthy(process.env[ENV.DISABLED]))
|
|
@@ -120,6 +123,20 @@ export function loadConfig() {
|
|
|
120
123
|
.split(",")
|
|
121
124
|
.map((e) => e.trim())
|
|
122
125
|
.filter((e) => e.length > 0);
|
|
126
|
+
// Optional comma-separated allowlist of custom provider names that pass through
|
|
127
|
+
// verbatim (e.g. "together_ai,fireworks"). Deduped and capped at
|
|
128
|
+
// MAX_CUSTOM_PROVIDERS so a misconfigured value can't blow up label cardinality.
|
|
129
|
+
const customProvidersRaw = process.env[ENV.CUSTOM_PROVIDERS] ?? "";
|
|
130
|
+
const customProvidersAll = [
|
|
131
|
+
...new Set(customProvidersRaw
|
|
132
|
+
.split(",")
|
|
133
|
+
.map((e) => e.trim())
|
|
134
|
+
.filter((e) => e.length > 0)),
|
|
135
|
+
];
|
|
136
|
+
const customProviders = customProvidersAll.slice(0, MAX_CUSTOM_PROVIDERS);
|
|
137
|
+
if (customProvidersAll.length > MAX_CUSTOM_PROVIDERS) {
|
|
138
|
+
emitLogOnce("custom_providers_truncated", "warn", `${ENV.CUSTOM_PROVIDERS} lists ${customProvidersAll.length} entries; only the first ${MAX_CUSTOM_PROVIDERS} are honored, the rest are coerced to "custom".`);
|
|
139
|
+
}
|
|
123
140
|
const otlpEndpoint = process.env[ENV.FRUGAL_OTLP_ENDPOINT] ??
|
|
124
141
|
process.env[ENV.OTLP_ENDPOINT] ??
|
|
125
142
|
DEFAULT_OTLP_ENDPOINT;
|
|
@@ -127,15 +144,23 @@ export function loadConfig() {
|
|
|
127
144
|
let exportIntervalMs = 60_000;
|
|
128
145
|
if (intervalRaw && intervalRaw.trim()) {
|
|
129
146
|
const parsed = Number.parseInt(intervalRaw, 10);
|
|
130
|
-
if (Number.isFinite(parsed))
|
|
147
|
+
if (Number.isFinite(parsed)) {
|
|
131
148
|
exportIntervalMs = parsed;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
emitLog("warn", `could not parse ${ENV.EXPORT_INTERVAL_MS}=${intervalRaw}; using default ${exportIntervalMs}`);
|
|
152
|
+
}
|
|
132
153
|
}
|
|
133
154
|
const maxCallSitesRaw = process.env[ENV.MAX_CALL_SITES];
|
|
134
155
|
let maxCallSites = DEFAULT_MAX_CALL_SITES;
|
|
135
156
|
if (maxCallSitesRaw && maxCallSitesRaw.trim()) {
|
|
136
157
|
const parsed = Number.parseInt(maxCallSitesRaw, 10);
|
|
137
|
-
if (Number.isFinite(parsed) && parsed >= 0)
|
|
158
|
+
if (Number.isFinite(parsed) && parsed >= 0) {
|
|
138
159
|
maxCallSites = parsed;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
emitLog("warn", `could not parse ${ENV.MAX_CALL_SITES}=${maxCallSitesRaw}; using default ${maxCallSites}`);
|
|
163
|
+
}
|
|
139
164
|
}
|
|
140
165
|
const sampleRateRaw = process.env[ENV.PROMPT_ANALYSIS_SAMPLE_RATE];
|
|
141
166
|
let promptAnalysisSampleRate = DEFAULT_PROMPT_ANALYSIS_SAMPLE_RATE;
|
|
@@ -144,11 +169,15 @@ export function loadConfig() {
|
|
|
144
169
|
if (Number.isFinite(parsed) && parsed >= 0 && parsed <= 1) {
|
|
145
170
|
promptAnalysisSampleRate = parsed;
|
|
146
171
|
}
|
|
172
|
+
else {
|
|
173
|
+
emitLog("warn", `could not parse ${ENV.PROMPT_ANALYSIS_SAMPLE_RATE}=${sampleRateRaw}; using default ${promptAnalysisSampleRate}`);
|
|
174
|
+
}
|
|
147
175
|
}
|
|
148
176
|
return {
|
|
149
177
|
customerId,
|
|
150
178
|
projectId: projectId,
|
|
151
179
|
components,
|
|
180
|
+
customProviders,
|
|
152
181
|
repoRoot: repoRootAbs,
|
|
153
182
|
pathBlockList,
|
|
154
183
|
otlpEndpoint,
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,EAAE;AACF,yEAAyE;AACzE,2EAA2E;AAC3E,+CAA+C;AAC/C,EAAE;AACF,qDAAqD;AACrD,mFAAmF;AACnF,kFAAkF;AAClF,kFAAkF;AAClF,kFAAkF;AAClF,gFAAgF;AAChF,EAAE;AACF,yCAAyC;AACzC,8EAA8E;AAC9E,6EAA6E;AAC7E,2EAA2E;AAC3E,6EAA6E;AAC7E,8DAA8D;AAC9D,+EAA+E;AAC/E,6EAA6E;AAC7E,iFAAiF;AACjF,6EAA6E;AAC7E,EAAE;AACF,0DAA0D;AAC1D,2EAA2E;AAC3E,yEAAyE;AACzE,oEAAoE;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/debug.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type LogLevel = "info" | "warn" | "error";
|
|
2
|
+
export type DebugCallback = (level: LogLevel, message: string, context?: Record<string, unknown>) => void;
|
|
3
|
+
/**
|
|
4
|
+
* Register (or clear, with `null`) the debug callback. On registration of a
|
|
5
|
+
* non-null callback, the bounded replay buffer of diagnostics emitted before
|
|
6
|
+
* registration is replayed through the callback in order, then cleared.
|
|
7
|
+
*/
|
|
8
|
+
export declare function setDebugCallback(cb: DebugCallback | null): void;
|
|
9
|
+
/**
|
|
10
|
+
* Emit a structural diagnostic. Invokes the registered callback (inside a
|
|
11
|
+
* try/catch so a throwing callback never escapes); if none is registered yet,
|
|
12
|
+
* the entry is held in the bounded replay buffer.
|
|
13
|
+
*/
|
|
14
|
+
export declare function emitLog(level: LogLevel, message: string, context?: Record<string, unknown>): void;
|
|
15
|
+
/**
|
|
16
|
+
* Emit a diagnostic at most once per `key`. The de-dupe set persists for the
|
|
17
|
+
* process lifetime — use this for steady-state conditions that would otherwise
|
|
18
|
+
* spam (cardinality-cap hits, repeated setup failures). For the consecutive
|
|
19
|
+
* export-failure signal, which needs to re-arm, use the explicit reset in the
|
|
20
|
+
* export-health wrapper instead, NOT emitLogOnce.
|
|
21
|
+
*/
|
|
22
|
+
export declare function emitLogOnce(key: string, level: LogLevel, message: string, context?: Record<string, unknown>): void;
|
|
23
|
+
/** Test-only hook — clear callback, replay buffer, and once-keys. */
|
|
24
|
+
export declare function resetDebugForTests(): void;
|
|
25
|
+
//# sourceMappingURL=debug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B,IAAI,CAAC;AAsCV;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAQ/D;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CACrB,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI,CAMN;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI,CAIN;AAED,qEAAqE;AACrE,wBAAgB,kBAAkB,IAAI,IAAI,CAIzC"}
|
package/dist/debug.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// Debug / log callback.
|
|
2
|
+
//
|
|
3
|
+
// Lets a customer observe the SDK's own structural diagnostics — missing/invalid
|
|
4
|
+
// configuration, instrument-build failures, cardinality-cap hits, persistent
|
|
5
|
+
// export failures — via a single registered callback. This is NOT a per-call
|
|
6
|
+
// trace: only structural/persistent problems are emitted, never ordinary
|
|
7
|
+
// transient per-call API errors (those are the customer's own API errors).
|
|
8
|
+
//
|
|
9
|
+
// Safe by construction: a throwing customer callback can never escape (every
|
|
10
|
+
// invocation is wrapped in try/catch), and emissions made before a callback is
|
|
11
|
+
// registered are held in a small bounded buffer and replayed on registration.
|
|
12
|
+
// Cap the replay buffer so an app that never registers a callback can't grow
|
|
13
|
+
// memory unbounded. Oldest entries are dropped when full.
|
|
14
|
+
const MAX_BUFFER = 50;
|
|
15
|
+
let callback = null;
|
|
16
|
+
let buffer = [];
|
|
17
|
+
const onceKeys = new Set();
|
|
18
|
+
function invoke(cb, level, message, context) {
|
|
19
|
+
try {
|
|
20
|
+
cb(level, message, context);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// A throwing customer callback must never escape into SDK / customer code.
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function record(level, message, context) {
|
|
27
|
+
buffer.push({ level, message, context });
|
|
28
|
+
if (buffer.length > MAX_BUFFER)
|
|
29
|
+
buffer.shift();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Register (or clear, with `null`) the debug callback. On registration of a
|
|
33
|
+
* non-null callback, the bounded replay buffer of diagnostics emitted before
|
|
34
|
+
* registration is replayed through the callback in order, then cleared.
|
|
35
|
+
*/
|
|
36
|
+
export function setDebugCallback(cb) {
|
|
37
|
+
callback = cb;
|
|
38
|
+
if (cb === null)
|
|
39
|
+
return;
|
|
40
|
+
const pending = buffer;
|
|
41
|
+
buffer = [];
|
|
42
|
+
for (const entry of pending) {
|
|
43
|
+
invoke(cb, entry.level, entry.message, entry.context);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Emit a structural diagnostic. Invokes the registered callback (inside a
|
|
48
|
+
* try/catch so a throwing callback never escapes); if none is registered yet,
|
|
49
|
+
* the entry is held in the bounded replay buffer.
|
|
50
|
+
*/
|
|
51
|
+
export function emitLog(level, message, context) {
|
|
52
|
+
if (callback !== null) {
|
|
53
|
+
invoke(callback, level, message, context);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
record(level, message, context);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Emit a diagnostic at most once per `key`. The de-dupe set persists for the
|
|
60
|
+
* process lifetime — use this for steady-state conditions that would otherwise
|
|
61
|
+
* spam (cardinality-cap hits, repeated setup failures). For the consecutive
|
|
62
|
+
* export-failure signal, which needs to re-arm, use the explicit reset in the
|
|
63
|
+
* export-health wrapper instead, NOT emitLogOnce.
|
|
64
|
+
*/
|
|
65
|
+
export function emitLogOnce(key, level, message, context) {
|
|
66
|
+
if (onceKeys.has(key))
|
|
67
|
+
return;
|
|
68
|
+
onceKeys.add(key);
|
|
69
|
+
emitLog(level, message, context);
|
|
70
|
+
}
|
|
71
|
+
/** Test-only hook — clear callback, replay buffer, and once-keys. */
|
|
72
|
+
export function resetDebugForTests() {
|
|
73
|
+
callback = null;
|
|
74
|
+
buffer = [];
|
|
75
|
+
onceKeys.clear();
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,EAAE;AACF,iFAAiF;AACjF,6EAA6E;AAC7E,6EAA6E;AAC7E,yEAAyE;AACzE,2EAA2E;AAC3E,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAgB9E,6EAA6E;AAC7E,0DAA0D;AAC1D,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,IAAI,QAAQ,GAAyB,IAAI,CAAC;AAC1C,IAAI,MAAM,GAAoB,EAAE,CAAC;AACjC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;AAEnC,SAAS,MAAM,CACb,EAAiB,EACjB,KAAe,EACf,OAAe,EACf,OAAiC;IAEjC,IAAI,CAAC;QACH,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;IAC7E,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CACb,KAAe,EACf,OAAe,EACf,OAAiC;IAEjC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU;QAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAwB;IACvD,QAAQ,GAAG,EAAE,CAAC;IACd,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO;IACxB,MAAM,OAAO,GAAG,MAAM,CAAC;IACvB,MAAM,GAAG,EAAE,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CACrB,KAAe,EACf,OAAe,EACf,OAAiC;IAEjC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IACD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,GAAW,EACX,KAAe,EACf,OAAe,EACf,OAAiC;IAEjC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IAC9B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,kBAAkB;IAChC,QAAQ,GAAG,IAAI,CAAC;IAChB,MAAM,GAAG,EAAE,CAAC;IACZ,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,4 +3,9 @@ export { wrapAnthropic } from "./wrappers/anthropic.js";
|
|
|
3
3
|
export { wrapBedrock } from "./wrappers/bedrock.js";
|
|
4
4
|
export { startAICall, trackAICall } from "./track.js";
|
|
5
5
|
export type { AICallInfo, AIUsage, AICallHandle } from "./track.js";
|
|
6
|
+
export { PROVIDERS, normalizeProvider, normalizeOperation } from "./providers.js";
|
|
7
|
+
export type { GenAiSystem, GenAiOperation, ProviderEntry } from "./providers.js";
|
|
8
|
+
export { setDebugCallback } from "./debug.js";
|
|
9
|
+
export type { DebugCallback, LogLevel } from "./debug.js";
|
|
10
|
+
export { flush, shutdown, enableAutoShutdown } from "./shutdown.js";
|
|
6
11
|
//# 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,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAClF,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,4 +2,7 @@ export { wrapOpenAI } from "./wrappers/openai.js";
|
|
|
2
2
|
export { wrapAnthropic } from "./wrappers/anthropic.js";
|
|
3
3
|
export { wrapBedrock } from "./wrappers/bedrock.js";
|
|
4
4
|
export { startAICall, trackAICall } from "./track.js";
|
|
5
|
+
export { PROVIDERS, normalizeProvider, normalizeOperation } from "./providers.js";
|
|
6
|
+
export { setDebugCallback } from "./debug.js";
|
|
7
|
+
export { flush, shutdown, enableAutoShutdown } from "./shutdown.js";
|
|
5
8
|
//# 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,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAElF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/instrument.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type CallerInfo } from "./caller.js";
|
|
2
2
|
import type { Config } from "./config.js";
|
|
3
3
|
import { type Instruments } from "./otel.js";
|
|
4
|
+
import { type ProviderEntry } from "./providers.js";
|
|
4
5
|
import { type RequestPayload } from "./prompt-analyzer.js";
|
|
5
6
|
export interface CallContext {
|
|
6
7
|
system: string;
|
|
@@ -37,8 +38,10 @@ export declare class CallEmitter {
|
|
|
37
38
|
readonly caller: CallerInfo;
|
|
38
39
|
private readonly instruments;
|
|
39
40
|
private readonly startSec;
|
|
41
|
+
private readonly provider;
|
|
42
|
+
private readonly operation;
|
|
40
43
|
private finalized;
|
|
41
|
-
constructor(config: Config, ctx: CallContext, caller: CallerInfo, instruments: Instruments, startSec: number);
|
|
44
|
+
constructor(config: Config, ctx: CallContext, caller: CallerInfo, instruments: Instruments, startSec: number, provider: ProviderEntry, operation: string);
|
|
42
45
|
success(usage: UsageReport): void;
|
|
43
46
|
private recordCapUtilization;
|
|
44
47
|
private maybeAnalyze;
|
package/dist/instrument.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../src/instrument.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../src/instrument.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7D,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAyB9B,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,sFAAsF;IACtF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qEAAqE;IACrE,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,WAAW,EAChB,IAAI,GAAE,gBAAqB,GAC1B,WAAW,CAyCb;AAOD,qBAAa,WAAW;IAIpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,QAAQ,CAAC,MAAM,EAAE,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAEzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAV5B,OAAO,CAAC,SAAS,CAAS;gBAGP,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,WAAW,EACxB,MAAM,EAAE,UAAU,EACV,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,MAAM,EAEhB,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,MAAM;IAGpC,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAqCjC,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,YAAY;IAyCpB,OAAO,CAAC,YAAY;IAgBpB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAWzB,OAAO,CAAC,SAAS;CAgBlB"}
|
package/dist/instrument.js
CHANGED
|
@@ -6,10 +6,12 @@
|
|
|
6
6
|
// synchronously from its own frame — don't interpose helper functions between
|
|
7
7
|
// the wrapper frame and resolveCaller, or the caller attribution will be wrong.
|
|
8
8
|
import { consumeCapHitEvent, resolveCaller, } from "./caller.js";
|
|
9
|
+
import { emitLogOnce } from "./debug.js";
|
|
9
10
|
import { getInstruments } from "./otel.js";
|
|
10
11
|
import { getSharedBlockHashLRU } from "./block-hash-lru.js";
|
|
12
|
+
import { normalizeOperation, normalizeProvider, } from "./providers.js";
|
|
11
13
|
import { analyzeRequest, shouldSample, structuredOutputMode, } from "./prompt-analyzer.js";
|
|
12
|
-
import { BLOCK_SCHEMA, BLOCK_SYSTEM, BLOCK_TOOLS, BLOCK_USER, FRUGAL_BATCHED, FRUGAL_BLOCK, FRUGAL_CALLER_FILE, FRUGAL_CALLER_FUNCTION, FRUGAL_CUSTOMER_ID, FRUGAL_ERROR_TYPE, FRUGAL_PROJECT_ID, FRUGAL_STABLE, FRUGAL_STRUCTURED_OUTPUT_MODE, GEN_AI_OPERATION_NAME, GEN_AI_REQUEST_MODEL, GEN_AI_RESPONSE_MODEL, GEN_AI_SYSTEM, GEN_AI_TOKEN_TYPE, TOKEN_INPUT, TOKEN_OUTPUT, } from "./semconv.js";
|
|
14
|
+
import { BLOCK_SCHEMA, BLOCK_SYSTEM, BLOCK_TOOLS, BLOCK_USER, FRUGAL_BATCHED, FRUGAL_BLOCK, FRUGAL_CALLER_FILE, FRUGAL_CALLER_FUNCTION, FRUGAL_CUSTOMER_ID, FRUGAL_ERROR_TYPE, FRUGAL_PROJECT_ID, FRUGAL_STABLE, FRUGAL_STRUCTURED_OUTPUT_MODE, GEN_AI_OPERATION_NAME, GEN_AI_PROVIDER_NAME, GEN_AI_REQUEST_MODEL, GEN_AI_RESPONSE_MODEL, GEN_AI_SYSTEM, GEN_AI_TOKEN_TYPE, TOKEN_INPUT, TOKEN_OUTPUT, } from "./semconv.js";
|
|
13
15
|
export function startCall(config, ctx, opts = {}) {
|
|
14
16
|
const instruments = getInstruments(config);
|
|
15
17
|
const caller = opts.caller ??
|
|
@@ -21,6 +23,7 @@ export function startCall(config, ctx, opts = {}) {
|
|
|
21
23
|
skipFrames: opts.skipFrames ?? 2,
|
|
22
24
|
});
|
|
23
25
|
if (consumeCapHitEvent()) {
|
|
26
|
+
emitLogOnce("cardinality_cap", "warn", "call-site cardinality cap hit; further distinct (file, function) call sites are attributed to an overflow bucket. Raise FRUGAL_MAX_CALL_SITES if this is unexpected.");
|
|
24
27
|
try {
|
|
25
28
|
instruments.internalErrors.add(1, {
|
|
26
29
|
...(config.customerId ? { [FRUGAL_CUSTOMER_ID]: config.customerId } : {}),
|
|
@@ -32,7 +35,12 @@ export function startCall(config, ctx, opts = {}) {
|
|
|
32
35
|
// never let our own metric emission break a customer call
|
|
33
36
|
}
|
|
34
37
|
}
|
|
35
|
-
|
|
38
|
+
// Normalize the constrained-vocabulary labels once, here, so every path
|
|
39
|
+
// (manual track API + per-provider wrappers) coerces typos and dual-emits.
|
|
40
|
+
// Customer-registered providers (FRUGAL_CUSTOM_PROVIDERS) pass through verbatim.
|
|
41
|
+
const provider = normalizeProvider(ctx.system, config.customProviders);
|
|
42
|
+
const operation = normalizeOperation(ctx.operation);
|
|
43
|
+
return new CallEmitter(config, ctx, caller, instruments, nowSeconds(), provider, operation);
|
|
36
44
|
}
|
|
37
45
|
function nowSeconds() {
|
|
38
46
|
// performance.now() returns ms with sub-ms resolution.
|
|
@@ -44,13 +52,19 @@ export class CallEmitter {
|
|
|
44
52
|
caller;
|
|
45
53
|
instruments;
|
|
46
54
|
startSec;
|
|
55
|
+
provider;
|
|
56
|
+
operation;
|
|
47
57
|
finalized = false;
|
|
48
|
-
constructor(config, ctx, caller, instruments, startSec
|
|
58
|
+
constructor(config, ctx, caller, instruments, startSec,
|
|
59
|
+
// Normalized constrained labels — see startCall.
|
|
60
|
+
provider, operation) {
|
|
49
61
|
this.config = config;
|
|
50
62
|
this.ctx = ctx;
|
|
51
63
|
this.caller = caller;
|
|
52
64
|
this.instruments = instruments;
|
|
53
65
|
this.startSec = startSec;
|
|
66
|
+
this.provider = provider;
|
|
67
|
+
this.operation = operation;
|
|
54
68
|
}
|
|
55
69
|
success(usage) {
|
|
56
70
|
if (this.finalized)
|
|
@@ -166,8 +180,9 @@ export class CallEmitter {
|
|
|
166
180
|
}
|
|
167
181
|
baseAttrs() {
|
|
168
182
|
const attrs = {
|
|
169
|
-
[GEN_AI_SYSTEM]: this.
|
|
170
|
-
[
|
|
183
|
+
[GEN_AI_SYSTEM]: this.provider.system,
|
|
184
|
+
[GEN_AI_PROVIDER_NAME]: this.provider.providerName,
|
|
185
|
+
[GEN_AI_OPERATION_NAME]: this.operation,
|
|
171
186
|
[GEN_AI_REQUEST_MODEL]: this.ctx.requestModel,
|
|
172
187
|
[FRUGAL_PROJECT_ID]: this.config.projectId,
|
|
173
188
|
[FRUGAL_CALLER_FILE]: this.caller.file,
|
package/dist/instrument.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../src/instrument.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,EAAE;AACF,yEAAyE;AACzE,wEAAwE;AACxE,sEAAsE;AACtE,8EAA8E;AAC9E,gFAAgF;AAIhF,OAAO,EACL,kBAAkB,EAClB,aAAa,GAEd,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAoB,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,cAAc,EACd,YAAY,EACZ,oBAAoB,GAErB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,6BAA6B,EAC7B,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,YAAY,GACb,MAAM,cAAc,CAAC;AAiCtB,MAAM,UAAU,SAAS,CACvB,MAAc,EACd,GAAgB,EAChB,OAAyB,EAAE;IAE3B,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,MAAM,GACV,IAAI,CAAC,MAAM;QACX,aAAa,CAAC;YACZ,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,SAAS,EAAE,MAAM,CAAC,aAAa;YAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;SACjC,CAAC,CAAC;IACL,IAAI,kBAAkB,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE;gBAChC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzE,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,SAAS;gBACrC,6BAA6B,EAAE,qBAAqB;aACrD,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,IAAI,WAAW,
|
|
1
|
+
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../src/instrument.ts"],"names":[],"mappings":"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"}
|
package/dist/otel.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Counter, Histogram } from "@opentelemetry/api";
|
|
2
|
-
import { MeterProvider, type MetricReader } from "@opentelemetry/sdk-metrics";
|
|
2
|
+
import { MeterProvider, type MetricReader, type PushMetricExporter } from "@opentelemetry/sdk-metrics";
|
|
3
3
|
import type { Config } from "./config.js";
|
|
4
4
|
export interface Instruments {
|
|
5
5
|
meterProvider: MeterProvider;
|
|
6
|
+
reader: MetricReader;
|
|
6
7
|
operationDuration: Histogram;
|
|
7
8
|
tokenUsage: Histogram;
|
|
8
9
|
calls: Counter;
|
|
@@ -20,6 +21,27 @@ export interface Instruments {
|
|
|
20
21
|
}
|
|
21
22
|
export declare function getInstruments(config: Config): Instruments;
|
|
22
23
|
export declare function buildFromReader(config: Config, reader: MetricReader): Instruments;
|
|
24
|
+
/**
|
|
25
|
+
* Wrap an OTLP exporter so persistent export failures surface as a single
|
|
26
|
+
* de-duped `error` debug callback. The periodic reader retries silently
|
|
27
|
+
* forever; without this, a wrong endpoint / bad token / down backend is
|
|
28
|
+
* invisible to the customer. We emit on the FIRST failure after a success
|
|
29
|
+
* (0→1 edge) and re-arm on the next success, so a flapping backend produces
|
|
30
|
+
* one alert per failure run, not one per export tick.
|
|
31
|
+
*
|
|
32
|
+
* Delegates every other exporter method so behavior is otherwise unchanged.
|
|
33
|
+
*/
|
|
34
|
+
export declare function wrapExporterForHealth(exporter: PushMetricExporter): PushMetricExporter;
|
|
35
|
+
/**
|
|
36
|
+
* Force an immediate export of buffered metrics. No-op when uninitialized.
|
|
37
|
+
* Never throws on uninit (callers in shutdown.ts also guard).
|
|
38
|
+
*/
|
|
39
|
+
export declare function flushMetrics(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Shut down the provider (which flushes + stops the reader) and drop the
|
|
42
|
+
* cache so a later wrap call lazily rebuilds. No-op when uninitialized.
|
|
43
|
+
*/
|
|
44
|
+
export declare function shutdownMetrics(): Promise<void>;
|
|
23
45
|
/** Test-only hook — wipe the cached instruments between tests. */
|
|
24
46
|
export declare function resetInstrumentsForTests(): void;
|
|
25
47
|
/** Test-only hook — install pre-built instruments (e.g. with InMemory reader). */
|
package/dist/otel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAuB,OAAO,EAAE,SAAS,EAAS,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAuB,OAAO,EAAE,SAAS,EAAS,MAAM,oBAAoB,CAAC;AAQzF,OAAO,EAGL,aAAa,EAEb,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAyB1C,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,SAAS,CAAC;IAC3B,gBAAgB,EAAE,SAAS,CAAC;IAC5B,eAAe,EAAE,SAAS,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,SAAS,CAAC;IAChC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,SAAS,CAAC;IACxB,YAAY,EAAE,SAAS,CAAC;IACxB,UAAU,EAAE,SAAS,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAS1D;AAYD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CAgHjF;AA+DD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,kBAAkB,GAC3B,kBAAkB,CA8BpB;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlD;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAKrD;AAeD,kEAAkE;AAClE,wBAAgB,wBAAwB,IAAI,IAAI,CAO/C;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAErE"}
|