@damngamerz/pi-otel 0.1.0-bootstrap.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/ACKNOWLEDGEMENTS.md +7 -0
- package/CHANGELOG.md +10 -0
- package/LICENSE +21 -0
- package/LICENSES/Apache-2.0.txt +202 -0
- package/NOTICE +15 -0
- package/README.md +120 -0
- package/SECURITY.md +24 -0
- package/dist/commands/flush.d.ts +4 -0
- package/dist/commands/flush.d.ts.map +1 -0
- package/dist/commands/flush.js +20 -0
- package/dist/commands/flush.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +47 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config.d.ts +41 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +260 -0
- package/dist/config.js.map +1 -0
- package/dist/evaluation/evaluator.d.ts +11 -0
- package/dist/evaluation/evaluator.d.ts.map +1 -0
- package/dist/evaluation/evaluator.js +55 -0
- package/dist/evaluation/evaluator.js.map +1 -0
- package/dist/evaluation/parser.d.ts +3 -0
- package/dist/evaluation/parser.d.ts.map +1 -0
- package/dist/evaluation/parser.js +42 -0
- package/dist/evaluation/parser.js.map +1 -0
- package/dist/evaluation/prompt.d.ts +2 -0
- package/dist/evaluation/prompt.d.ts.map +1 -0
- package/dist/evaluation/prompt.js +16 -0
- package/dist/evaluation/prompt.js.map +1 -0
- package/dist/evaluation/sampling.d.ts +9 -0
- package/dist/evaluation/sampling.d.ts.map +1 -0
- package/dist/evaluation/sampling.js +25 -0
- package/dist/evaluation/sampling.js.map +1 -0
- package/dist/evaluation/types.d.ts +19 -0
- package/dist/evaluation/types.d.ts.map +1 -0
- package/dist/evaluation/types.js +2 -0
- package/dist/evaluation/types.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +151 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle.d.ts +3 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +15 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/privacy/content-policy.d.ts +8 -0
- package/dist/privacy/content-policy.d.ts.map +1 -0
- package/dist/privacy/content-policy.js +48 -0
- package/dist/privacy/content-policy.js.map +1 -0
- package/dist/privacy/sanitization.d.ts +5 -0
- package/dist/privacy/sanitization.d.ts.map +1 -0
- package/dist/privacy/sanitization.js +42 -0
- package/dist/privacy/sanitization.js.map +1 -0
- package/dist/privacy/secret-detector.d.ts +2 -0
- package/dist/privacy/secret-detector.d.ts.map +1 -0
- package/dist/privacy/secret-detector.js +14 -0
- package/dist/privacy/secret-detector.js.map +1 -0
- package/dist/telemetry/attributes.d.ts +11 -0
- package/dist/telemetry/attributes.d.ts.map +1 -0
- package/dist/telemetry/attributes.js +13 -0
- package/dist/telemetry/attributes.js.map +1 -0
- package/dist/telemetry/instruments.d.ts +17 -0
- package/dist/telemetry/instruments.d.ts.map +1 -0
- package/dist/telemetry/instruments.js +54 -0
- package/dist/telemetry/instruments.js.map +1 -0
- package/dist/telemetry/providers.d.ts +21 -0
- package/dist/telemetry/providers.d.ts.map +1 -0
- package/dist/telemetry/providers.js +88 -0
- package/dist/telemetry/providers.js.map +1 -0
- package/dist/telemetry/traces.d.ts +44 -0
- package/dist/telemetry/traces.d.ts.map +1 -0
- package/dist/telemetry/traces.js +265 -0
- package/dist/telemetry/traces.js.map +1 -0
- package/dist/telemetry/usage.d.ts +11 -0
- package/dist/telemetry/usage.d.ts.map +1 -0
- package/dist/telemetry/usage.js +25 -0
- package/dist/telemetry/usage.js.map +1 -0
- package/docs/configuration.md +61 -0
- package/docs/evaluation.md +38 -0
- package/docs/metrics.md +27 -0
- package/docs/operations.md +41 -0
- package/docs/privacy.md +38 -0
- package/examples/grafana-lgtm/LICENSE +6 -0
- package/examples/grafana-lgtm/README.md +47 -0
- package/examples/grafana-lgtm/compose.yaml +16 -0
- package/examples/grafana-lgtm/dashboard.json +616 -0
- package/examples/grafana-lgtm/provisioning.yaml +9 -0
- package/package.json +87 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { registerFlushCommand } from "./commands/flush.js";
|
|
2
|
+
import { registerStatusCommand } from "./commands/status.js";
|
|
3
|
+
import { ConfigError, resolveConfig } from "./config.js";
|
|
4
|
+
import { runRemoteEvaluation } from "./evaluation/evaluator.js";
|
|
5
|
+
import { EvaluationDeduplicator, shouldEvaluate } from "./evaluation/sampling.js";
|
|
6
|
+
import { isAssistantStreamUpdate } from "./lifecycle.js";
|
|
7
|
+
import { isAssistantMessage, latestEvaluationPair } from "./privacy/content-policy.js";
|
|
8
|
+
import { anonymize } from "./privacy/sanitization.js";
|
|
9
|
+
import { containsLikelySecret } from "./privacy/secret-detector.js";
|
|
10
|
+
import { TelemetryProviders } from "./telemetry/providers.js";
|
|
11
|
+
import { TelemetryRuntime } from "./telemetry/traces.js";
|
|
12
|
+
export const VERSION = "0.1.0";
|
|
13
|
+
const STATUS_ID = "damngamerz-pi-otel";
|
|
14
|
+
const JUDGE_STATUS_ID = "damngamerz-pi-otel-judge";
|
|
15
|
+
export default function piOtel(pi) {
|
|
16
|
+
let config;
|
|
17
|
+
let providers;
|
|
18
|
+
let runtime;
|
|
19
|
+
const evaluatedExchangeHashes = new EvaluationDeduplicator();
|
|
20
|
+
let evaluationInFlight = false;
|
|
21
|
+
registerStatusCommand(pi, () => config, () => runtime);
|
|
22
|
+
registerFlushCommand(pi, () => runtime);
|
|
23
|
+
const evaluateLatest = async (ctx, force) => {
|
|
24
|
+
if (!config || !runtime || evaluationInFlight)
|
|
25
|
+
return;
|
|
26
|
+
if (config.evaluation.mode === "off") {
|
|
27
|
+
if (force) {
|
|
28
|
+
ctx.ui.notify("Remote evaluation is disabled. Set piOtel.evaluation.mode to manual, sample, or always.", "warning");
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const pair = latestEvaluationPair(ctx.sessionManager.getBranch());
|
|
33
|
+
if (!pair) {
|
|
34
|
+
if (force)
|
|
35
|
+
ctx.ui.notify("No completed user/assistant pair is available to evaluate.", "warning");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const exchangeHash = anonymize(`${pair.userRequest}\0${pair.assistantResponse}`);
|
|
39
|
+
if (!shouldEvaluate(config.evaluation.mode, config.evaluation.sampleRate, exchangeHash, force))
|
|
40
|
+
return;
|
|
41
|
+
if (evaluatedExchangeHashes.has(exchangeHash)) {
|
|
42
|
+
if (force)
|
|
43
|
+
ctx.ui.notify("The latest exchange has already been evaluated.", "info");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (config.evaluation.blockLikelySecrets &&
|
|
47
|
+
(containsLikelySecret(pair.userRequest) || containsLikelySecret(pair.assistantResponse))) {
|
|
48
|
+
ctx.ui.notify("Remote evaluation skipped: the latest exchange appears to contain a credential or private key.", "warning");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
evaluatedExchangeHashes.mark(exchangeHash);
|
|
52
|
+
evaluationInFlight = true;
|
|
53
|
+
ctx.ui.setStatus(JUDGE_STATUS_ID, ctx.ui.theme.fg("warning", `Evaluating with ${config.evaluation.provider}/${config.evaluation.model}`));
|
|
54
|
+
try {
|
|
55
|
+
const evaluation = await runRemoteEvaluation(ctx, pair, config.evaluation);
|
|
56
|
+
runtime.recordEvaluation(evaluation.batch);
|
|
57
|
+
await runtime.forceFlush();
|
|
58
|
+
ctx.ui.notify([
|
|
59
|
+
`Evaluation (${config.evaluation.provider}/${config.evaluation.model}):`,
|
|
60
|
+
...evaluation.result.scores.map((score) => ` ${score.name}: ${score.score.toFixed(2)} (${score.label})`),
|
|
61
|
+
evaluation.result.summary ? `Summary: ${evaluation.result.summary}` : "",
|
|
62
|
+
...evaluation.result.issues.map((issue) => `- ${issue}`),
|
|
63
|
+
evaluation.truncated
|
|
64
|
+
? `Note: input was limited to ${config.evaluation.maxCharsPerField} characters per field.`
|
|
65
|
+
: "",
|
|
66
|
+
]
|
|
67
|
+
.filter(Boolean)
|
|
68
|
+
.join("\n"), "info");
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
ctx.ui.notify(`Remote evaluation failed: ${error instanceof Error ? error.message : String(error)}`, "error");
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
evaluationInFlight = false;
|
|
75
|
+
ctx.ui.setStatus(JUDGE_STATUS_ID, undefined);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
pi.registerCommand("otel-eval-last", {
|
|
79
|
+
description: "Evaluate the latest Pi response when remote evaluation is enabled",
|
|
80
|
+
handler: async (_args, ctx) => {
|
|
81
|
+
await ctx.waitForIdle();
|
|
82
|
+
await evaluateLatest(ctx, true);
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
86
|
+
try {
|
|
87
|
+
config = resolveConfig(ctx.cwd, ctx.isProjectTrusted());
|
|
88
|
+
if (!config.enabled)
|
|
89
|
+
return;
|
|
90
|
+
providers = new TelemetryProviders(config, VERSION);
|
|
91
|
+
runtime = new TelemetryRuntime(providers);
|
|
92
|
+
runtime.startSession(anonymize(ctx.sessionManager.getSessionId?.() ?? "ephemeral"));
|
|
93
|
+
evaluatedExchangeHashes.clear();
|
|
94
|
+
evaluationInFlight = false;
|
|
95
|
+
if (ctx.hasUI) {
|
|
96
|
+
ctx.ui.setStatus(STATUS_ID, ctx.ui.theme.fg("dim", `OTel · eval:${config.evaluation.mode}`));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
config = undefined;
|
|
101
|
+
providers = undefined;
|
|
102
|
+
runtime = undefined;
|
|
103
|
+
ctx.ui.notify(`Pi OTel disabled: ${error instanceof ConfigError ? error.message : String(error)}`, "error");
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
pi.on("agent_start", async () => runtime?.startAgent());
|
|
107
|
+
pi.on("turn_start", async (event) => runtime?.startTurn(event.turnIndex));
|
|
108
|
+
pi.on("before_provider_request", async (_event, ctx) => {
|
|
109
|
+
runtime?.startLlm(ctx.model?.provider ?? "unknown", ctx.model?.id ?? "unknown");
|
|
110
|
+
});
|
|
111
|
+
pi.on("after_provider_response", async (event) => runtime?.noteProviderResponse(event.status));
|
|
112
|
+
pi.on("message_update", async (event) => {
|
|
113
|
+
if (isAssistantStreamUpdate(event.message, event.assistantMessageEvent))
|
|
114
|
+
runtime?.noteFirstToken();
|
|
115
|
+
});
|
|
116
|
+
pi.on("message_end", async (event) => {
|
|
117
|
+
if (isAssistantMessage(event.message))
|
|
118
|
+
runtime?.finishLlm(event.message);
|
|
119
|
+
});
|
|
120
|
+
pi.on("tool_execution_start", async (event) => {
|
|
121
|
+
runtime?.startTool(event.toolCallId, event.toolName);
|
|
122
|
+
});
|
|
123
|
+
pi.on("tool_execution_end", async (event) => {
|
|
124
|
+
runtime?.finishTool(event.toolCallId, event.isError ?? false);
|
|
125
|
+
});
|
|
126
|
+
pi.on("turn_end", async (event) => {
|
|
127
|
+
runtime?.finishTurn(isAssistantMessage(event.message) ? event.message : undefined);
|
|
128
|
+
});
|
|
129
|
+
pi.on("agent_end", async () => runtime?.finishAgent());
|
|
130
|
+
pi.on("agent_settled", async (_event, ctx) => {
|
|
131
|
+
if (config?.evaluation.mode === "sample" || config?.evaluation.mode === "always") {
|
|
132
|
+
await evaluateLatest(ctx, false);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
pi.on("session_shutdown", async (_event, ctx) => {
|
|
136
|
+
try {
|
|
137
|
+
await runtime?.shutdown();
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
ctx.ui.notify(`Pi OpenTelemetry shutdown failed: ${error instanceof Error ? error.message : String(error)}`, "error");
|
|
141
|
+
}
|
|
142
|
+
if (ctx.hasUI) {
|
|
143
|
+
ctx.ui.setStatus(STATUS_ID, undefined);
|
|
144
|
+
ctx.ui.setStatus(JUDGE_STATUS_ID, undefined);
|
|
145
|
+
}
|
|
146
|
+
config = undefined;
|
|
147
|
+
providers = undefined;
|
|
148
|
+
runtime = undefined;
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAU3D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAEjF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { isAssistantMessage } from "./privacy/content-policy.js";
|
|
2
|
+
export function containsStreamDelta(event) {
|
|
3
|
+
if (!event || typeof event !== "object")
|
|
4
|
+
return false;
|
|
5
|
+
const candidate = event;
|
|
6
|
+
return ((candidate.type === "text_delta" ||
|
|
7
|
+
candidate.type === "thinking_delta" ||
|
|
8
|
+
candidate.type === "toolcall_delta") &&
|
|
9
|
+
typeof candidate.delta === "string" &&
|
|
10
|
+
candidate.delta.length > 0);
|
|
11
|
+
}
|
|
12
|
+
export function isAssistantStreamUpdate(message, event) {
|
|
13
|
+
return isAssistantMessage(message) && containsStreamDelta(event);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,UAAU,mBAAmB,CAAC,KAAc;IACjD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,SAAS,GAAG,KAA4C,CAAC;IAC/D,OAAO,CACN,CAAC,SAAS,CAAC,IAAI,KAAK,YAAY;QAC/B,SAAS,CAAC,IAAI,KAAK,gBAAgB;QACnC,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC;QACrC,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;QACnC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAC1B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAgB,EAAE,KAAc;IACvE,OAAO,kBAAkB,CAAC,OAAO,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface EvaluationPair {
|
|
2
|
+
userRequest: string;
|
|
3
|
+
assistantResponse: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function isAssistantMessage(message: unknown): boolean;
|
|
6
|
+
export declare function messageText(message: unknown): string;
|
|
7
|
+
export declare function latestEvaluationPair(entries: readonly unknown[]): EvaluationPair | undefined;
|
|
8
|
+
//# sourceMappingURL=content-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-policy.d.ts","sourceRoot":"","sources":["../../src/privacy/content-policy.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAE5D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAiBpD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG,cAAc,GAAG,SAAS,CAqB5F"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export function isAssistantMessage(message) {
|
|
2
|
+
return !!message && typeof message === "object" && message.role === "assistant";
|
|
3
|
+
}
|
|
4
|
+
export function messageText(message) {
|
|
5
|
+
if (!message || typeof message !== "object")
|
|
6
|
+
return "";
|
|
7
|
+
const content = message.content;
|
|
8
|
+
if (typeof content === "string")
|
|
9
|
+
return content.trim();
|
|
10
|
+
if (!Array.isArray(content))
|
|
11
|
+
return "";
|
|
12
|
+
return content
|
|
13
|
+
.filter((part) => {
|
|
14
|
+
return (!!part &&
|
|
15
|
+
typeof part === "object" &&
|
|
16
|
+
part.type === "text" &&
|
|
17
|
+
typeof part.text === "string");
|
|
18
|
+
})
|
|
19
|
+
.map((part) => part.text)
|
|
20
|
+
.join("\n")
|
|
21
|
+
.trim();
|
|
22
|
+
}
|
|
23
|
+
export function latestEvaluationPair(entries) {
|
|
24
|
+
let assistantIndex = -1;
|
|
25
|
+
let assistantResponse = "";
|
|
26
|
+
for (let index = entries.length - 1; index >= 0; index--) {
|
|
27
|
+
const entry = entries[index];
|
|
28
|
+
if (entry?.type !== "message" || !isAssistantMessage(entry.message))
|
|
29
|
+
continue;
|
|
30
|
+
assistantResponse = messageText(entry.message);
|
|
31
|
+
if (assistantResponse) {
|
|
32
|
+
assistantIndex = index;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (assistantIndex < 0)
|
|
37
|
+
return undefined;
|
|
38
|
+
for (let index = assistantIndex - 1; index >= 0; index--) {
|
|
39
|
+
const entry = entries[index];
|
|
40
|
+
if (entry?.type !== "message" || entry.message?.role !== "user")
|
|
41
|
+
continue;
|
|
42
|
+
const userRequest = messageText(entry.message);
|
|
43
|
+
if (userRequest)
|
|
44
|
+
return { userRequest, assistantResponse };
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=content-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-policy.js","sourceRoot":"","sources":["../../src/privacy/content-policy.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IAClD,OAAO,CAAC,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAK,OAA8B,CAAC,IAAI,KAAK,WAAW,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC3C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,OAAO,GAAI,OAAiC,CAAC,OAAO,CAAC;IAC3D,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,OAAO;SACZ,MAAM,CAAC,CAAC,IAAI,EAA0C,EAAE;QACxD,OAAO,CACN,CAAC,CAAC,IAAI;YACN,OAAO,IAAI,KAAK,QAAQ;YACvB,IAA2B,CAAC,IAAI,KAAK,MAAM;YAC5C,OAAQ,IAA2B,CAAC,IAAI,KAAK,QAAQ,CACrD,CAAC;IACH,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACxB,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;AACV,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAA2B;IAC/D,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC;IACxB,IAAI,iBAAiB,GAAG,EAAE,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAA0C,CAAC;QACtE,IAAI,KAAK,EAAE,IAAI,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC;YAAE,SAAS;QAC9E,iBAAiB,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,iBAAiB,EAAE,CAAC;YACvB,cAAc,GAAG,KAAK,CAAC;YACvB,MAAM;QACP,CAAC;IACF,CAAC;IACD,IAAI,cAAc,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAEzC,KAAK,IAAI,KAAK,GAAG,cAAc,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAqD,CAAC;QACjF,IAAI,KAAK,EAAE,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM;YAAE,SAAS;QAC1E,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,WAAW;YAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;IAC5D,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function finiteNumber(value: unknown): number;
|
|
2
|
+
export declare function safeDimension(value: unknown, fallback?: string, maxLength?: number): string;
|
|
3
|
+
export declare function safeTelemetryIdentifier(value: unknown, fallback?: string, maxLength?: number): string;
|
|
4
|
+
export declare function anonymize(value: string): string;
|
|
5
|
+
//# sourceMappingURL=sanitization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitization.d.ts","sourceRoot":"","sources":["../../src/privacy/sanitization.ts"],"names":[],"mappings":"AAYA,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAY,EAAE,SAAS,SAAM,GAAG,MAAM,CAK3F;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAa,EAAE,SAAS,SAAM,GAAG,MAAM,CAoBtG;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { containsLikelySecret } from "./secret-detector.js";
|
|
3
|
+
const IDENTIFIER_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._:+-";
|
|
4
|
+
function hasSafeIdentifierCharacters(value) {
|
|
5
|
+
return (/[A-Za-z0-9]/.test(value[0] ?? "") &&
|
|
6
|
+
[...value].every((character) => IDENTIFIER_CHARACTERS.includes(character)));
|
|
7
|
+
}
|
|
8
|
+
export function finiteNumber(value) {
|
|
9
|
+
return typeof value === "number" && Number.isFinite(value) ? value : 0;
|
|
10
|
+
}
|
|
11
|
+
export function safeDimension(value, fallback = "unknown", maxLength = 128) {
|
|
12
|
+
if (typeof value !== "string")
|
|
13
|
+
return fallback;
|
|
14
|
+
const normalized = value.trim().replace(/[\r\n\t]/g, " ");
|
|
15
|
+
if (!normalized)
|
|
16
|
+
return fallback;
|
|
17
|
+
return normalized.slice(0, maxLength);
|
|
18
|
+
}
|
|
19
|
+
export function safeTelemetryIdentifier(value, fallback = "redacted", maxLength = 128) {
|
|
20
|
+
if (typeof value !== "string")
|
|
21
|
+
return fallback;
|
|
22
|
+
const candidate = value.trim();
|
|
23
|
+
if (!candidate ||
|
|
24
|
+
candidate.length > maxLength ||
|
|
25
|
+
containsLikelySecret(candidate) ||
|
|
26
|
+
/\s/.test(candidate) ||
|
|
27
|
+
/@/.test(candidate) ||
|
|
28
|
+
candidate.startsWith("/") ||
|
|
29
|
+
candidate.startsWith("\\\\") ||
|
|
30
|
+
/^[A-Za-z]:[\\/]/.test(candidate) ||
|
|
31
|
+
candidate.includes("..") ||
|
|
32
|
+
candidate.includes("://") ||
|
|
33
|
+
candidate.includes("/") ||
|
|
34
|
+
!hasSafeIdentifierCharacters(candidate)) {
|
|
35
|
+
return fallback;
|
|
36
|
+
}
|
|
37
|
+
return candidate;
|
|
38
|
+
}
|
|
39
|
+
export function anonymize(value) {
|
|
40
|
+
return createHash("sha256").update(value).digest("hex").slice(0, 16);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=sanitization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitization.js","sourceRoot":"","sources":["../../src/privacy/sanitization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,qBAAqB,GAAG,qEAAqE,CAAC;AAEpG,SAAS,2BAA2B,CAAC,KAAa;IACjD,OAAO,CACN,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAC1E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,QAAQ,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG;IAClF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU;QAAE,OAAO,QAAQ,CAAC;IACjC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc,EAAE,QAAQ,GAAG,UAAU,EAAE,SAAS,GAAG,GAAG;IAC7F,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC/B,IACC,CAAC,SAAS;QACV,SAAS,CAAC,MAAM,GAAG,SAAS;QAC5B,oBAAoB,CAAC,SAAS,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;QACnB,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QACzB,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;QAC5B,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;QACjC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QACxB,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzB,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;QACvB,CAAC,2BAA2B,CAAC,SAAS,CAAC,EACtC,CAAC;QACF,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACtC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-detector.d.ts","sourceRoot":"","sources":["../../src/privacy/secret-detector.ts"],"names":[],"mappings":"AAWA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const SECRET_PATTERNS = [
|
|
2
|
+
/-----BEGIN (?:RSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/i,
|
|
3
|
+
/\b(?:sk|ghp|github_pat|xox[baprs])[-_][A-Za-z0-9_-]{16,}\b/,
|
|
4
|
+
/\bAKIA[0-9A-Z]{16}\b/,
|
|
5
|
+
/\bAIza[0-9A-Za-z_-]{30,}\b/,
|
|
6
|
+
/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/,
|
|
7
|
+
/\bauthorization\s*:\s*bearer\s+[A-Za-z0-9_./+=-]{16,}/i,
|
|
8
|
+
/\b(?:api[_-]?key|access[_-]?token|client[_-]?secret|secret|password|passwd|accountkey)\s*[:=]\s*["']?[^\s"']{8,}/i,
|
|
9
|
+
/\b(?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis):\/\/[^\s:@/]+:[^\s@/]+@/i,
|
|
10
|
+
];
|
|
11
|
+
export function containsLikelySecret(text) {
|
|
12
|
+
return SECRET_PATTERNS.some((pattern) => pattern.test(text));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=secret-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-detector.js","sourceRoot":"","sources":["../../src/privacy/secret-detector.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG;IACvB,yDAAyD;IACzD,4DAA4D;IAC5D,sBAAsB;IACtB,4BAA4B;IAC5B,uDAAuD;IACvD,wDAAwD;IACxD,mHAAmH;IACnH,8EAA8E;CAC9E,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAChD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const BASE_GEN_AI_ATTRIBUTES: {
|
|
2
|
+
readonly "gen_ai.system": "pi";
|
|
3
|
+
};
|
|
4
|
+
export declare function modelAttributes(provider: string, model: string, operation?: string): {
|
|
5
|
+
"gen_ai.operation.name": string;
|
|
6
|
+
"gen_ai.provider.name": string;
|
|
7
|
+
"gen_ai.request.model": string;
|
|
8
|
+
"gen_ai.response.model": string;
|
|
9
|
+
"gen_ai.system": "pi";
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=attributes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../../src/telemetry/attributes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB;;CAEzB,CAAC;AAEX,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,SAAS;;;;;;EAQlF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const BASE_GEN_AI_ATTRIBUTES = {
|
|
2
|
+
"gen_ai.system": "pi",
|
|
3
|
+
};
|
|
4
|
+
export function modelAttributes(provider, model, operation = "chat") {
|
|
5
|
+
return {
|
|
6
|
+
...BASE_GEN_AI_ATTRIBUTES,
|
|
7
|
+
"gen_ai.operation.name": operation,
|
|
8
|
+
"gen_ai.provider.name": provider,
|
|
9
|
+
"gen_ai.request.model": model,
|
|
10
|
+
"gen_ai.response.model": model,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=attributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../src/telemetry/attributes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,eAAe,EAAE,IAAI;CACZ,CAAC;AAEX,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,KAAa,EAAE,SAAS,GAAG,MAAM;IAClF,OAAO;QACN,GAAG,sBAAsB;QACzB,uBAAuB,EAAE,SAAS;QAClC,sBAAsB,EAAE,QAAQ;QAChC,sBAAsB,EAAE,KAAK;QAC7B,uBAAuB,EAAE,KAAK;KAC9B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Counter, Histogram, Meter } from "@opentelemetry/api";
|
|
2
|
+
export interface Instruments {
|
|
3
|
+
operationDuration: Histogram;
|
|
4
|
+
tokenUsage: Histogram;
|
|
5
|
+
toolCallsPerOperation: Histogram;
|
|
6
|
+
toolCalls: Counter;
|
|
7
|
+
toolErrors: Counter;
|
|
8
|
+
toolDuration: Histogram;
|
|
9
|
+
promptCount: Counter;
|
|
10
|
+
turnCount: Counter;
|
|
11
|
+
sessionDuration: Histogram;
|
|
12
|
+
costUsd: Counter;
|
|
13
|
+
timeToFirstToken: Histogram;
|
|
14
|
+
evaluationScore: Histogram;
|
|
15
|
+
}
|
|
16
|
+
export declare function createInstruments(meter: Meter): Instruments;
|
|
17
|
+
//# sourceMappingURL=instruments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruments.d.ts","sourceRoot":"","sources":["../../src/telemetry/instruments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC3B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,UAAU,EAAE,SAAS,CAAC;IACtB,qBAAqB,EAAE,SAAS,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,SAAS,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,SAAS,CAAC;IAC5B,eAAe,EAAE,SAAS,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAoD3D"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function createInstruments(meter) {
|
|
2
|
+
return {
|
|
3
|
+
operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
|
|
4
|
+
description: "Duration of GenAI client operations",
|
|
5
|
+
unit: "s",
|
|
6
|
+
}),
|
|
7
|
+
tokenUsage: meter.createHistogram("gen_ai.client.token.usage", {
|
|
8
|
+
description: "Tokens used by GenAI client operations",
|
|
9
|
+
unit: "{token}",
|
|
10
|
+
}),
|
|
11
|
+
toolCallsPerOperation: meter.createHistogram("gen_ai.client.tool_calls_per_operation", {
|
|
12
|
+
description: "Tool calls made during one agent operation",
|
|
13
|
+
unit: "{call}",
|
|
14
|
+
advice: { explicitBucketBoundaries: Array.from({ length: 33 }, (_, index) => index) },
|
|
15
|
+
}),
|
|
16
|
+
toolCalls: meter.createCounter("gen_ai.client.tool.calls", {
|
|
17
|
+
description: "Tool calls made by Pi",
|
|
18
|
+
unit: "{call}",
|
|
19
|
+
}),
|
|
20
|
+
toolErrors: meter.createCounter("pi.agent.tool.errors", {
|
|
21
|
+
description: "Failed Pi tool executions",
|
|
22
|
+
unit: "{error}",
|
|
23
|
+
}),
|
|
24
|
+
toolDuration: meter.createHistogram("pi.agent.tool.duration", {
|
|
25
|
+
description: "Pi tool execution duration",
|
|
26
|
+
unit: "s",
|
|
27
|
+
}),
|
|
28
|
+
promptCount: meter.createCounter("pi.agent.prompts", {
|
|
29
|
+
description: "Pi agent prompts",
|
|
30
|
+
unit: "{prompt}",
|
|
31
|
+
}),
|
|
32
|
+
turnCount: meter.createCounter("pi.agent.turns", {
|
|
33
|
+
description: "Pi LLM turns",
|
|
34
|
+
unit: "{turn}",
|
|
35
|
+
}),
|
|
36
|
+
sessionDuration: meter.createHistogram("pi.agent.session.duration", {
|
|
37
|
+
description: "Pi session duration",
|
|
38
|
+
unit: "s",
|
|
39
|
+
}),
|
|
40
|
+
costUsd: meter.createCounter("pi.agent.cost", {
|
|
41
|
+
description: "Cost reported by Pi",
|
|
42
|
+
unit: "USD",
|
|
43
|
+
}),
|
|
44
|
+
timeToFirstToken: meter.createHistogram("pi.agent.time_to_first_token", {
|
|
45
|
+
description: "Time from provider request to first streamed delta",
|
|
46
|
+
unit: "s",
|
|
47
|
+
}),
|
|
48
|
+
evaluationScore: meter.createHistogram("gen_ai.evaluation.score", {
|
|
49
|
+
description: "Validated LLM evaluation score",
|
|
50
|
+
unit: "1",
|
|
51
|
+
}),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=instruments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruments.js","sourceRoot":"","sources":["../../src/telemetry/instruments.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,iBAAiB,CAAC,KAAY;IAC7C,OAAO;QACN,iBAAiB,EAAE,KAAK,CAAC,eAAe,CAAC,kCAAkC,EAAE;YAC5E,WAAW,EAAE,qCAAqC;YAClD,IAAI,EAAE,GAAG;SACT,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,eAAe,CAAC,2BAA2B,EAAE;YAC9D,WAAW,EAAE,wCAAwC;YACrD,IAAI,EAAE,SAAS;SACf,CAAC;QACF,qBAAqB,EAAE,KAAK,CAAC,eAAe,CAAC,wCAAwC,EAAE;YACtF,WAAW,EAAE,4CAA4C;YACzD,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,EAAE,wBAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE;SACrF,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,EAAE;YAC1D,WAAW,EAAE,uBAAuB;YACpC,IAAI,EAAE,QAAQ;SACd,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,sBAAsB,EAAE;YACvD,WAAW,EAAE,2BAA2B;YACxC,IAAI,EAAE,SAAS;SACf,CAAC;QACF,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC,wBAAwB,EAAE;YAC7D,WAAW,EAAE,4BAA4B;YACzC,IAAI,EAAE,GAAG;SACT,CAAC;QACF,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,kBAAkB,EAAE;YACpD,WAAW,EAAE,kBAAkB;YAC/B,IAAI,EAAE,UAAU;SAChB,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,EAAE;YAChD,WAAW,EAAE,cAAc;YAC3B,IAAI,EAAE,QAAQ;SACd,CAAC;QACF,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,2BAA2B,EAAE;YACnE,WAAW,EAAE,qBAAqB;YAClC,IAAI,EAAE,GAAG;SACT,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE;YAC7C,WAAW,EAAE,qBAAqB;YAClC,IAAI,EAAE,KAAK;SACX,CAAC;QACF,gBAAgB,EAAE,KAAK,CAAC,eAAe,CAAC,8BAA8B,EAAE;YACvE,WAAW,EAAE,oDAAoD;YACjE,IAAI,EAAE,GAAG;SACT,CAAC;QACF,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,yBAAyB,EAAE;YACjE,WAAW,EAAE,gCAAgC;YAC7C,IAAI,EAAE,GAAG;SACT,CAAC;KACF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Tracer } from "@opentelemetry/api";
|
|
2
|
+
import { MeterProvider, type PushMetricExporter } from "@opentelemetry/sdk-metrics";
|
|
3
|
+
import { type SpanExporter } from "@opentelemetry/sdk-trace-base";
|
|
4
|
+
import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
|
|
5
|
+
import type { PiOtelConfig } from "../config.js";
|
|
6
|
+
import { type Instruments } from "./instruments.js";
|
|
7
|
+
export interface ProviderOverrides {
|
|
8
|
+
traceExporter?: SpanExporter;
|
|
9
|
+
metricExporter?: PushMetricExporter;
|
|
10
|
+
metricIntervalMs?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class TelemetryProviders {
|
|
13
|
+
readonly tracerProvider: NodeTracerProvider;
|
|
14
|
+
readonly meterProvider: MeterProvider;
|
|
15
|
+
readonly tracer: Tracer;
|
|
16
|
+
readonly instruments: Instruments;
|
|
17
|
+
constructor(config: PiOtelConfig, version: string, overrides?: ProviderOverrides);
|
|
18
|
+
forceFlush(): Promise<void>;
|
|
19
|
+
shutdown(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/telemetry/providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAIjD,OAAO,EACN,aAAa,EAEb,KAAK,kBAAkB,EACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,+BAA+B,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IACjC,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,kBAAkB;IAC9B,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;gBAEtB,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,iBAAsB;IAiD9E,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAa/B"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
|
|
2
|
+
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
|
|
3
|
+
import { resourceFromAttributes } from "@opentelemetry/resources";
|
|
4
|
+
import { MeterProvider, PeriodicExportingMetricReader, } from "@opentelemetry/sdk-metrics";
|
|
5
|
+
import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
6
|
+
import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
|
|
7
|
+
import { safeTelemetryIdentifier } from "../privacy/sanitization.js";
|
|
8
|
+
import { createInstruments } from "./instruments.js";
|
|
9
|
+
export class TelemetryProviders {
|
|
10
|
+
tracerProvider;
|
|
11
|
+
meterProvider;
|
|
12
|
+
tracer;
|
|
13
|
+
instruments;
|
|
14
|
+
constructor(config, version, overrides = {}) {
|
|
15
|
+
const resource = resourceFromAttributes({
|
|
16
|
+
"service.name": safeTelemetryIdentifier(config.serviceName, "pi"),
|
|
17
|
+
"service.version": version,
|
|
18
|
+
"deployment.environment.name": "local",
|
|
19
|
+
});
|
|
20
|
+
const traceExporter = overrides.traceExporter ??
|
|
21
|
+
new OTLPTraceExporter({
|
|
22
|
+
url: `${config.endpoint}/v1/traces`,
|
|
23
|
+
headers: config.headers,
|
|
24
|
+
timeoutMillis: 5_000,
|
|
25
|
+
});
|
|
26
|
+
const metricExporter = overrides.metricExporter ??
|
|
27
|
+
new OTLPMetricExporter({
|
|
28
|
+
url: `${config.endpoint}/v1/metrics`,
|
|
29
|
+
headers: config.headers,
|
|
30
|
+
timeoutMillis: 5_000,
|
|
31
|
+
});
|
|
32
|
+
this.tracerProvider = new NodeTracerProvider({
|
|
33
|
+
resource,
|
|
34
|
+
spanProcessors: config.signals.traces
|
|
35
|
+
? [
|
|
36
|
+
new BatchSpanProcessor(traceExporter, {
|
|
37
|
+
maxQueueSize: 512,
|
|
38
|
+
maxExportBatchSize: 128,
|
|
39
|
+
scheduledDelayMillis: 1_000,
|
|
40
|
+
exportTimeoutMillis: 5_000,
|
|
41
|
+
}),
|
|
42
|
+
]
|
|
43
|
+
: [],
|
|
44
|
+
});
|
|
45
|
+
this.meterProvider = new MeterProvider({
|
|
46
|
+
resource,
|
|
47
|
+
readers: config.signals.metrics
|
|
48
|
+
? [
|
|
49
|
+
new PeriodicExportingMetricReader({
|
|
50
|
+
exporter: metricExporter,
|
|
51
|
+
exportIntervalMillis: overrides.metricIntervalMs ?? 10_000,
|
|
52
|
+
exportTimeoutMillis: 5_000,
|
|
53
|
+
}),
|
|
54
|
+
]
|
|
55
|
+
: [],
|
|
56
|
+
});
|
|
57
|
+
this.tracer = this.tracerProvider.getTracer("@damngamerz/pi-otel", version);
|
|
58
|
+
this.instruments = createInstruments(this.meterProvider.getMeter("@damngamerz/pi-otel", version));
|
|
59
|
+
}
|
|
60
|
+
async forceFlush() {
|
|
61
|
+
const results = await Promise.allSettled([
|
|
62
|
+
this.tracerProvider.forceFlush(),
|
|
63
|
+
this.meterProvider.forceFlush(),
|
|
64
|
+
]);
|
|
65
|
+
const failures = results
|
|
66
|
+
.filter((result) => result.status === "rejected")
|
|
67
|
+
.map((result) => result.reason);
|
|
68
|
+
if (failures.length > 0)
|
|
69
|
+
throw new AggregateError(failures, "OpenTelemetry flush failed");
|
|
70
|
+
}
|
|
71
|
+
async shutdown() {
|
|
72
|
+
const failures = [];
|
|
73
|
+
try {
|
|
74
|
+
await this.forceFlush();
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
failures.push(error);
|
|
78
|
+
}
|
|
79
|
+
const results = await Promise.allSettled([this.tracerProvider.shutdown(), this.meterProvider.shutdown()]);
|
|
80
|
+
for (const result of results) {
|
|
81
|
+
if (result.status === "rejected")
|
|
82
|
+
failures.push(result.reason);
|
|
83
|
+
}
|
|
84
|
+
if (failures.length > 0)
|
|
85
|
+
throw new AggregateError(failures, "OpenTelemetry shutdown failed");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/telemetry/providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { EvaluationBatch } from "../evaluation/types.js";
|
|
2
|
+
import type { TelemetryProviders } from "./providers.js";
|
|
3
|
+
export interface RuntimeStats {
|
|
4
|
+
prompts: number;
|
|
5
|
+
turns: number;
|
|
6
|
+
toolCalls: number;
|
|
7
|
+
toolErrors: number;
|
|
8
|
+
inputTokens: number;
|
|
9
|
+
outputTokens: number;
|
|
10
|
+
costUsd: number;
|
|
11
|
+
evaluationRuns: number;
|
|
12
|
+
evaluationCostUsd: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class TelemetryRuntime {
|
|
15
|
+
private readonly providers;
|
|
16
|
+
readonly stats: RuntimeStats;
|
|
17
|
+
private sessionContext;
|
|
18
|
+
private sessionId;
|
|
19
|
+
private sessionStartedAt;
|
|
20
|
+
private agentSpan;
|
|
21
|
+
private agentContext;
|
|
22
|
+
private lastCompletedAgentContext;
|
|
23
|
+
private turnSpan;
|
|
24
|
+
private turnContext;
|
|
25
|
+
private activeLlm;
|
|
26
|
+
private readonly activeTools;
|
|
27
|
+
private toolsInCurrentOperation;
|
|
28
|
+
constructor(providers: TelemetryProviders);
|
|
29
|
+
startSession(anonymizedSessionId: string): void;
|
|
30
|
+
startAgent(): void;
|
|
31
|
+
startTurn(turnIndex: number): void;
|
|
32
|
+
startLlm(providerValue: string, modelValue: string): void;
|
|
33
|
+
noteProviderResponse(status: number): void;
|
|
34
|
+
noteFirstToken(): void;
|
|
35
|
+
finishLlm(message?: unknown, errorType?: string): void;
|
|
36
|
+
startTool(toolCallId: string, toolName: string): void;
|
|
37
|
+
finishTool(toolCallId: string, isError: boolean): void;
|
|
38
|
+
finishTurn(message?: unknown): void;
|
|
39
|
+
finishAgent(): void;
|
|
40
|
+
recordEvaluation(batch: EvaluationBatch): void;
|
|
41
|
+
forceFlush(): Promise<void>;
|
|
42
|
+
shutdown(): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=traces.d.ts.map
|