pi-otel 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +183 -0
- package/README.md +66 -0
- package/dist/attrs.d.ts +67 -0
- package/dist/attrs.js +124 -0
- package/dist/attrs.js.map +1 -0
- package/dist/commands/otel.d.ts +2 -0
- package/dist/commands/otel.js +438 -0
- package/dist/commands/otel.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.js +132 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +274 -0
- package/dist/index.js.map +1 -0
- package/dist/otel/logs.d.ts +14 -0
- package/dist/otel/logs.js +103 -0
- package/dist/otel/logs.js.map +1 -0
- package/dist/otel/metrics.d.ts +11 -0
- package/dist/otel/metrics.js +50 -0
- package/dist/otel/metrics.js.map +1 -0
- package/dist/otel/sdk.d.ts +14 -0
- package/dist/otel/sdk.js +162 -0
- package/dist/otel/sdk.js.map +1 -0
- package/dist/spans.d.ts +74 -0
- package/dist/spans.js +504 -0
- package/dist/spans.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
2
|
+
import { mkdirSync, openSync, readFileSync, rmSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { homedir, platform } from "node:os";
|
|
4
|
+
import { join as joinPath } from "node:path";
|
|
5
|
+
import { resolveConfig } from "../config.js";
|
|
6
|
+
import { probeTcp } from "../otel/sdk.js";
|
|
7
|
+
const OTEL_DIR = joinPath(homedir(), ".pi", "agent", "otel");
|
|
8
|
+
const PID_FILE = joinPath(OTEL_DIR, "aspire.pid");
|
|
9
|
+
const LOG_FILE = joinPath(OTEL_DIR, "aspire.log");
|
|
10
|
+
const META_FILE = joinPath(OTEL_DIR, "aspire.meta.json");
|
|
11
|
+
const CONN_FILE = joinPath(OTEL_DIR, "aspire.conn.json");
|
|
12
|
+
const OTLP_GRPC_PORT = 4317;
|
|
13
|
+
const OTLP_HTTP_PORT = 4318;
|
|
14
|
+
const UI_PORT = 18888;
|
|
15
|
+
const UI_URL = `http://localhost:${UI_PORT}`;
|
|
16
|
+
const DOCKER_CONTAINER = "pi-otel-aspire";
|
|
17
|
+
const SUBCOMMANDS = ["start", "stop", "connect", "status"];
|
|
18
|
+
const PROTOCOLS = ["grpc", "http/protobuf", "http/json"];
|
|
19
|
+
const DEFAULT_CONNECT_ENDPOINT = `http://localhost:${4317}`;
|
|
20
|
+
const DEFAULT_CONNECT_PROTOCOL = "grpc";
|
|
21
|
+
function ensureDir() {
|
|
22
|
+
mkdirSync(OTEL_DIR, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
function isWindows() {
|
|
25
|
+
return platform() === "win32";
|
|
26
|
+
}
|
|
27
|
+
function hasExe(cmd) {
|
|
28
|
+
const which = isWindows() ? "where" : "which";
|
|
29
|
+
const r = spawnSync(which, [cmd], { stdio: "ignore" });
|
|
30
|
+
return r.status === 0;
|
|
31
|
+
}
|
|
32
|
+
function detectDriver() {
|
|
33
|
+
if (hasExe("aspire"))
|
|
34
|
+
return "aspire";
|
|
35
|
+
if (hasExe("docker")) {
|
|
36
|
+
// verify daemon reachable
|
|
37
|
+
const r = spawnSync("docker", ["info"], { stdio: "ignore" });
|
|
38
|
+
if (r.status === 0)
|
|
39
|
+
return "docker";
|
|
40
|
+
}
|
|
41
|
+
if (hasExe("podman")) {
|
|
42
|
+
const r = spawnSync("podman", ["info"], { stdio: "ignore" });
|
|
43
|
+
if (r.status === 0)
|
|
44
|
+
return "podman";
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const probePort = (p, timeoutMs = 300) => probeTcp("127.0.0.1", p, timeoutMs);
|
|
49
|
+
async function waitForPort(p, totalMs = 5000) {
|
|
50
|
+
const start = Date.now();
|
|
51
|
+
while (Date.now() - start < totalMs) {
|
|
52
|
+
if (await probePort(p))
|
|
53
|
+
return true;
|
|
54
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
function readMeta() {
|
|
59
|
+
try {
|
|
60
|
+
return JSON.parse(readFileSync(META_FILE, "utf8"));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function writeMeta(m) {
|
|
67
|
+
writeFileSync(META_FILE, JSON.stringify(m, null, 2));
|
|
68
|
+
writeFileSync(PID_FILE, String(m.pid));
|
|
69
|
+
}
|
|
70
|
+
function clearMeta() {
|
|
71
|
+
for (const f of [PID_FILE, META_FILE]) {
|
|
72
|
+
try {
|
|
73
|
+
rmSync(f, { force: true });
|
|
74
|
+
}
|
|
75
|
+
catch { }
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function readConn() {
|
|
79
|
+
try {
|
|
80
|
+
return JSON.parse(readFileSync(CONN_FILE, "utf8"));
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function writeConn(c) {
|
|
87
|
+
writeFileSync(CONN_FILE, JSON.stringify(c, null, 2));
|
|
88
|
+
}
|
|
89
|
+
function pidAlive(pid) {
|
|
90
|
+
try {
|
|
91
|
+
process.kill(pid, 0);
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function killPid(pid) {
|
|
99
|
+
if (isWindows()) {
|
|
100
|
+
spawnSync("taskkill", ["/F", "/T", "/PID", String(pid)], {
|
|
101
|
+
stdio: "ignore",
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
try {
|
|
106
|
+
process.kill(pid, "SIGTERM");
|
|
107
|
+
}
|
|
108
|
+
catch { }
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function tailLog(maxBytes = 1500) {
|
|
112
|
+
try {
|
|
113
|
+
const buf = readFileSync(LOG_FILE, "utf8");
|
|
114
|
+
return buf.length > maxBytes ? buf.slice(-maxBytes) : buf;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return "(no log)";
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const ASPIRE_INSTALL_HINT = isWindows()
|
|
121
|
+
? "Install Aspire CLI: irm https://aspire.dev/install.ps1 | iex"
|
|
122
|
+
: "Install Aspire CLI: curl -sSL https://aspire.dev/install.sh | bash";
|
|
123
|
+
const DOCKER_INSTALL_HINT = "Install Docker Desktop (https://docs.docker.com/desktop/) or Podman (https://podman.io/).";
|
|
124
|
+
function noDriverMessage() {
|
|
125
|
+
return [
|
|
126
|
+
"Neither `aspire` CLI nor a container runtime (docker/podman) was found.",
|
|
127
|
+
"Install one of:",
|
|
128
|
+
` - ${ASPIRE_INSTALL_HINT}`,
|
|
129
|
+
` - ${DOCKER_INSTALL_HINT}`,
|
|
130
|
+
].join("\n");
|
|
131
|
+
}
|
|
132
|
+
function spawnAspire(logFd) {
|
|
133
|
+
// Verified against `aspire dashboard run --help` (aspire CLI, May 2026):
|
|
134
|
+
// --frontend-url, --otlp-grpc-url, --otlp-http-url, --allow-anonymous, --non-interactive
|
|
135
|
+
const args = [
|
|
136
|
+
"dashboard",
|
|
137
|
+
"run",
|
|
138
|
+
"--allow-anonymous",
|
|
139
|
+
"--non-interactive",
|
|
140
|
+
"--frontend-url",
|
|
141
|
+
`http://localhost:${UI_PORT}`,
|
|
142
|
+
"--otlp-grpc-url",
|
|
143
|
+
`http://localhost:${OTLP_GRPC_PORT}`,
|
|
144
|
+
"--otlp-http-url",
|
|
145
|
+
`http://localhost:${OTLP_HTTP_PORT}`,
|
|
146
|
+
];
|
|
147
|
+
const child = spawn("aspire", args, {
|
|
148
|
+
stdio: ["ignore", logFd, logFd],
|
|
149
|
+
detached: true,
|
|
150
|
+
windowsHide: true,
|
|
151
|
+
});
|
|
152
|
+
child.unref();
|
|
153
|
+
if (!child.pid)
|
|
154
|
+
throw new Error("failed to spawn aspire");
|
|
155
|
+
return child.pid;
|
|
156
|
+
}
|
|
157
|
+
function spawnContainer(driver, logFd) {
|
|
158
|
+
// Remove any stale container with the same name (best-effort).
|
|
159
|
+
spawnSync(driver, ["rm", "-f", DOCKER_CONTAINER], { stdio: "ignore" });
|
|
160
|
+
const args = [
|
|
161
|
+
"run",
|
|
162
|
+
"--rm",
|
|
163
|
+
"--name",
|
|
164
|
+
DOCKER_CONTAINER,
|
|
165
|
+
"-p",
|
|
166
|
+
`${UI_PORT}:${UI_PORT}`,
|
|
167
|
+
"-p",
|
|
168
|
+
`${OTLP_GRPC_PORT}:${OTLP_GRPC_PORT}`,
|
|
169
|
+
"-p",
|
|
170
|
+
`${OTLP_HTTP_PORT}:${OTLP_HTTP_PORT}`,
|
|
171
|
+
"-e",
|
|
172
|
+
"ASPIRE_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS=true",
|
|
173
|
+
"mcr.microsoft.com/dotnet/aspire-dashboard:latest",
|
|
174
|
+
];
|
|
175
|
+
const child = spawn(driver, args, {
|
|
176
|
+
stdio: ["ignore", logFd, logFd],
|
|
177
|
+
detached: true,
|
|
178
|
+
windowsHide: true,
|
|
179
|
+
});
|
|
180
|
+
child.unref();
|
|
181
|
+
if (!child.pid)
|
|
182
|
+
throw new Error(`failed to spawn ${driver}`);
|
|
183
|
+
return child.pid;
|
|
184
|
+
}
|
|
185
|
+
async function isRunning() {
|
|
186
|
+
const meta = readMeta();
|
|
187
|
+
if (meta && pidAlive(meta.pid) && (await probePort(OTLP_GRPC_PORT)))
|
|
188
|
+
return true;
|
|
189
|
+
// pidfile stale but port open (manual aspire/docker) → treat as running
|
|
190
|
+
if (await probePort(OTLP_GRPC_PORT))
|
|
191
|
+
return true;
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
async function startCmd(notify, forceDriver) {
|
|
195
|
+
ensureDir();
|
|
196
|
+
if (await isRunning()) {
|
|
197
|
+
notify(`Aspire dashboard already running → ${UI_URL}`);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
// Pre-check: port conflict from an unrelated process.
|
|
201
|
+
if (await probePort(OTLP_GRPC_PORT)) {
|
|
202
|
+
notify(`Port ${OTLP_GRPC_PORT} is in use by another process. Free it or change ports.`, "error");
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (await probePort(UI_PORT)) {
|
|
206
|
+
notify(`Port ${UI_PORT} is in use by another process. Free it or change ports.`, "error");
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const driver = forceDriver ?? detectDriver();
|
|
210
|
+
if (!driver) {
|
|
211
|
+
notify(noDriverMessage(), "error");
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
// Truncate the log so failure tails are scoped to this run.
|
|
215
|
+
writeFileSync(LOG_FILE, "");
|
|
216
|
+
const logFd = openSync(LOG_FILE, "a");
|
|
217
|
+
let pid;
|
|
218
|
+
try {
|
|
219
|
+
if (driver === "aspire") {
|
|
220
|
+
pid = spawnAspire(logFd);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
pid = spawnContainer(driver, logFd);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (e) {
|
|
227
|
+
notify(`Failed to spawn ${driver}: ${e?.message ?? e}`, "error");
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
writeMeta({ driver, pid, startedAt: new Date().toISOString() });
|
|
231
|
+
const up = await waitForPort(OTLP_GRPC_PORT, 5000);
|
|
232
|
+
if (!up) {
|
|
233
|
+
notify([
|
|
234
|
+
`Aspire dashboard (driver=${driver}) did not become ready on port ${OTLP_GRPC_PORT} within 5s.`,
|
|
235
|
+
"--- log tail ---",
|
|
236
|
+
tailLog(),
|
|
237
|
+
].join("\n"), "error");
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
writeConn({
|
|
241
|
+
endpoint: `http://localhost:${OTLP_GRPC_PORT}`,
|
|
242
|
+
protocol: "grpc",
|
|
243
|
+
});
|
|
244
|
+
notify([
|
|
245
|
+
`Aspire dashboard started (driver=${driver}, pid=${pid}).`,
|
|
246
|
+
`UI: ${UI_URL}`,
|
|
247
|
+
`OTLP gRPC: http://localhost:${OTLP_GRPC_PORT}`,
|
|
248
|
+
`OTLP HTTP: http://localhost:${OTLP_HTTP_PORT}`,
|
|
249
|
+
].join("\n"));
|
|
250
|
+
}
|
|
251
|
+
async function stopCmd(notify) {
|
|
252
|
+
const meta = readMeta();
|
|
253
|
+
const portUp = await probePort(OTLP_GRPC_PORT);
|
|
254
|
+
if (!meta && !portUp) {
|
|
255
|
+
notify("Aspire dashboard is not running (port 4317 closed, no pidfile).");
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const attempts = [];
|
|
259
|
+
// 1. Meta-driven stop (fast path when we started it).
|
|
260
|
+
if (meta) {
|
|
261
|
+
if (meta.driver === "docker" || meta.driver === "podman") {
|
|
262
|
+
const r = spawnSync(meta.driver, ["stop", DOCKER_CONTAINER], {
|
|
263
|
+
stdio: "ignore",
|
|
264
|
+
});
|
|
265
|
+
attempts.push(`${meta.driver} stop ${DOCKER_CONTAINER} → ${r.status === 0 ? "ok" : "fail"}`);
|
|
266
|
+
if (r.status !== 0 && pidAlive(meta.pid)) {
|
|
267
|
+
killPid(meta.pid);
|
|
268
|
+
attempts.push(`kill pid ${meta.pid}`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
else if (pidAlive(meta.pid)) {
|
|
272
|
+
killPid(meta.pid);
|
|
273
|
+
attempts.push(`kill pid ${meta.pid}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// 2. No-meta / fallback: try the well-known container in each available runtime.
|
|
277
|
+
if (!meta || (await probePort(OTLP_GRPC_PORT))) {
|
|
278
|
+
for (const drv of ["docker", "podman"]) {
|
|
279
|
+
if (!hasExe(drv))
|
|
280
|
+
continue;
|
|
281
|
+
const r = spawnSync(drv, ["stop", DOCKER_CONTAINER], { stdio: "ignore" });
|
|
282
|
+
if (r.status === 0)
|
|
283
|
+
attempts.push(`${drv} stop ${DOCKER_CONTAINER} → ok`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// Give it a moment to release the port.
|
|
287
|
+
for (let i = 0; i < 10; i++) {
|
|
288
|
+
if (!(await probePort(OTLP_GRPC_PORT)))
|
|
289
|
+
break;
|
|
290
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
291
|
+
}
|
|
292
|
+
const stillUp = await probePort(OTLP_GRPC_PORT);
|
|
293
|
+
clearMeta();
|
|
294
|
+
if (stillUp) {
|
|
295
|
+
notify([
|
|
296
|
+
`Port ${OTLP_GRPC_PORT} is still open after stop attempts.`,
|
|
297
|
+
"Tried: " +
|
|
298
|
+
(attempts.join("; ") || "(nothing — no meta and no known container)"),
|
|
299
|
+
"Find the process manually:",
|
|
300
|
+
isWindows()
|
|
301
|
+
? ` netstat -ano | findstr :${OTLP_GRPC_PORT}`
|
|
302
|
+
: ` lsof -iTCP:${OTLP_GRPC_PORT} -sTCP:LISTEN`,
|
|
303
|
+
].join("\n"), "error");
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
notify(meta
|
|
307
|
+
? `Aspire dashboard stopped (driver=${meta.driver}).`
|
|
308
|
+
: `Aspire dashboard stopped (${attempts.join("; ") || "port closed on its own"}).`);
|
|
309
|
+
}
|
|
310
|
+
function splitArgs(s) {
|
|
311
|
+
return s.trim().split(/\s+/).filter(Boolean);
|
|
312
|
+
}
|
|
313
|
+
function parseEndpoint(endpoint) {
|
|
314
|
+
// Accept "host:port", "http(s)://host:port", or "http(s)://host:port/path".
|
|
315
|
+
let raw = endpoint.trim();
|
|
316
|
+
if (!raw)
|
|
317
|
+
return null;
|
|
318
|
+
if (!/^https?:\/\//i.test(raw))
|
|
319
|
+
raw = `http://${raw}`;
|
|
320
|
+
let u;
|
|
321
|
+
try {
|
|
322
|
+
u = new URL(raw);
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
const host = u.hostname;
|
|
328
|
+
const port = u.port ? Number(u.port) : u.protocol === "https:" ? 443 : 80;
|
|
329
|
+
if (!host || !Number.isFinite(port))
|
|
330
|
+
return null;
|
|
331
|
+
return { host, port };
|
|
332
|
+
}
|
|
333
|
+
async function statusCmd(notify, getCwd) {
|
|
334
|
+
const cwd = getCwd();
|
|
335
|
+
const baseCfg = cwd ? resolveConfig(cwd) : null;
|
|
336
|
+
const conn = readConn();
|
|
337
|
+
const meta = readMeta();
|
|
338
|
+
// Active endpoint: conn file overrides resolved config (mirrors pi-otel:dashboard-ready logic)
|
|
339
|
+
const activeEndpoint = conn?.endpoint ?? baseCfg?.endpoint ?? "(unknown)";
|
|
340
|
+
const activeProtocol = conn?.protocol ?? baseCfg?.protocol ?? "grpc";
|
|
341
|
+
const parsed = parseEndpoint(activeEndpoint);
|
|
342
|
+
const reachable = parsed ? await probePort(parsed.port) : false;
|
|
343
|
+
const lines = [];
|
|
344
|
+
lines.push(`Connected: ${activeEndpoint} (${activeProtocol}) — ${reachable ? "reachable" : "UNREACHABLE"}`);
|
|
345
|
+
if (baseCfg && baseCfg.endpoint !== activeEndpoint) {
|
|
346
|
+
lines.push(` (config default: ${baseCfg.endpoint})`);
|
|
347
|
+
}
|
|
348
|
+
const uiUp = await probePort(UI_PORT);
|
|
349
|
+
if (uiUp)
|
|
350
|
+
lines.push(`UI: ${UI_URL}`);
|
|
351
|
+
if (meta) {
|
|
352
|
+
lines.push(`Driver: ${meta.driver}`);
|
|
353
|
+
lines.push(`PID: ${meta.pid}`);
|
|
354
|
+
lines.push(`Started: ${meta.startedAt}`);
|
|
355
|
+
}
|
|
356
|
+
notify(lines.join("\n"));
|
|
357
|
+
}
|
|
358
|
+
async function connectCmd(notify, endpoint, protocol, emit) {
|
|
359
|
+
const parsed = parseEndpoint(endpoint);
|
|
360
|
+
if (!parsed) {
|
|
361
|
+
notify(`Could not parse endpoint: ${endpoint}`, "error");
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
const reachable = await probeTcp(parsed.host, parsed.port, 1500);
|
|
365
|
+
if (!reachable) {
|
|
366
|
+
notify(`OTLP endpoint ${endpoint} (${parsed.host}:${parsed.port}) is not reachable. Start a collector first, or pass a different endpoint.`, "error");
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
writeConn({ endpoint, protocol });
|
|
370
|
+
emit({ endpoint, protocol });
|
|
371
|
+
notify(`pi-otel connected → ${endpoint} (protocol=${protocol}).`);
|
|
372
|
+
}
|
|
373
|
+
export function registerOtelCommand(pi, getCwd) {
|
|
374
|
+
pi.registerCommand("otel", {
|
|
375
|
+
description: "Aspire OTel dashboard launcher: start | stop | status | connect",
|
|
376
|
+
getArgumentCompletions: (prefix) => {
|
|
377
|
+
return SUBCOMMANDS.filter((s) => s.startsWith(prefix)).map((s) => ({
|
|
378
|
+
value: s,
|
|
379
|
+
label: s,
|
|
380
|
+
}));
|
|
381
|
+
},
|
|
382
|
+
handler: async (args, ctx) => {
|
|
383
|
+
const tokens = splitArgs(args);
|
|
384
|
+
const rawSub = tokens[0] || "";
|
|
385
|
+
const sub = (rawSub === "stat" ? "status" : rawSub);
|
|
386
|
+
const notify = (m, l = "info") => ctx.ui.notify(m, l);
|
|
387
|
+
if (sub === "start") {
|
|
388
|
+
// optional override: /otel start --driver=docker
|
|
389
|
+
const drvArg = tokens.find((t) => t.startsWith("--driver="));
|
|
390
|
+
const forced = drvArg?.split("=")[1];
|
|
391
|
+
if (forced && !["aspire", "docker", "podman"].includes(forced)) {
|
|
392
|
+
notify(`Unknown driver: ${forced}. Use aspire|docker|podman.`, "error");
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
await startCmd(notify, forced);
|
|
396
|
+
pi.events.emit("pi-otel:dashboard-ready", {
|
|
397
|
+
endpoint: `http://localhost:${OTLP_GRPC_PORT}`,
|
|
398
|
+
});
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
if (sub === "stop") {
|
|
402
|
+
await stopCmd(notify);
|
|
403
|
+
pi.events.emit("pi-otel:dashboard-stopped", {});
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
if (sub === "status") {
|
|
407
|
+
await statusCmd(notify, getCwd);
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
if (sub === "connect") {
|
|
411
|
+
const positional = tokens.slice(1).filter((t) => !t.startsWith("--"));
|
|
412
|
+
const endpoint = positional[0] ?? DEFAULT_CONNECT_ENDPOINT;
|
|
413
|
+
const protoArg = tokens.find((t) => t.startsWith("--protocol="));
|
|
414
|
+
const protocol = (protoArg?.split("=")[1] ??
|
|
415
|
+
DEFAULT_CONNECT_PROTOCOL);
|
|
416
|
+
if (!PROTOCOLS.includes(protocol)) {
|
|
417
|
+
notify(`Unknown protocol: ${protocol}. Use ${PROTOCOLS.join("|")}.`, "error");
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
await connectCmd(notify, endpoint, protocol, (payload) => pi.events.emit("pi-otel:dashboard-ready", payload));
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
notify([
|
|
424
|
+
"Usage: /otel <command>",
|
|
425
|
+
"",
|
|
426
|
+
" start [--driver=aspire|docker|podman] Start the Aspire dashboard",
|
|
427
|
+
" stop Stop the Aspire dashboard",
|
|
428
|
+
" status Show dashboard URL and port status",
|
|
429
|
+
" connect [endpoint] [--protocol=grpc|http/protobuf|http/json]",
|
|
430
|
+
" Re-wire pi-otel to an existing OTLP endpoint",
|
|
431
|
+
" (default: http://localhost:4317, grpc)",
|
|
432
|
+
"",
|
|
433
|
+
`State dir: ${OTEL_DIR}`,
|
|
434
|
+
].join("\n"), sub ? "error" : "info");
|
|
435
|
+
},
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=otel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../../src/commands/otel.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve pi-otel configuration from `.pi/settings.json` + env vars.
|
|
3
|
+
*
|
|
4
|
+
* Precedence: env vars (OTEL_* / PI_OTEL_*) override settings.json `otel.*`.
|
|
5
|
+
*/
|
|
6
|
+
import { DiagLogLevel } from "@opentelemetry/api";
|
|
7
|
+
import type { ContentCapture } from "./attrs.js";
|
|
8
|
+
export interface OtelConfig {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
endpoint: string;
|
|
11
|
+
protocol: "grpc" | "http/protobuf" | "http/json";
|
|
12
|
+
headers: Record<string, string>;
|
|
13
|
+
serviceName: string;
|
|
14
|
+
captureContent: ContentCapture;
|
|
15
|
+
sampleRatio: number;
|
|
16
|
+
signals: {
|
|
17
|
+
traces: boolean;
|
|
18
|
+
metrics: boolean;
|
|
19
|
+
logs: boolean;
|
|
20
|
+
};
|
|
21
|
+
resourceAttributes: Record<string, string>;
|
|
22
|
+
logLevel: DiagLogLevel;
|
|
23
|
+
cwd: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function resolveConfig(cwd: string): OtelConfig;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve pi-otel configuration from `.pi/settings.json` + env vars.
|
|
3
|
+
*
|
|
4
|
+
* Precedence: env vars (OTEL_* / PI_OTEL_*) override settings.json `otel.*`.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync } from "node:fs";
|
|
7
|
+
import { homedir } from "node:os";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { DiagLogLevel } from "@opentelemetry/api";
|
|
10
|
+
function tryReadJson(path) {
|
|
11
|
+
try {
|
|
12
|
+
const text = readFileSync(path, "utf8");
|
|
13
|
+
return JSON.parse(text);
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
if (e?.code === "ENOENT")
|
|
17
|
+
return null;
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function parseKvList(s, decode = false) {
|
|
22
|
+
if (!s)
|
|
23
|
+
return {};
|
|
24
|
+
const out = {};
|
|
25
|
+
for (const pair of s.split(",")) {
|
|
26
|
+
const eq = pair.indexOf("=");
|
|
27
|
+
if (eq <= 0)
|
|
28
|
+
continue;
|
|
29
|
+
const k = pair.slice(0, eq).trim();
|
|
30
|
+
if (!k)
|
|
31
|
+
continue;
|
|
32
|
+
const rawV = pair.slice(eq + 1).trim();
|
|
33
|
+
let v = rawV;
|
|
34
|
+
if (decode) {
|
|
35
|
+
try {
|
|
36
|
+
v = decodeURIComponent(rawV);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Fall back to raw value on malformed %-escapes (per W3C resource attrs spec).
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
out[k] = v;
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
function normalizeProtocol(p) {
|
|
47
|
+
if (!p)
|
|
48
|
+
return "grpc";
|
|
49
|
+
const v = p.trim().toLowerCase();
|
|
50
|
+
if (v === "grpc")
|
|
51
|
+
return "grpc";
|
|
52
|
+
if (v === "http/protobuf" || v === "http-protobuf" || v === "http")
|
|
53
|
+
return "http/protobuf";
|
|
54
|
+
if (v === "http/json")
|
|
55
|
+
return "http/json";
|
|
56
|
+
return "grpc";
|
|
57
|
+
}
|
|
58
|
+
function normalizeLogLevel(s) {
|
|
59
|
+
if (!s)
|
|
60
|
+
return undefined;
|
|
61
|
+
switch (s.trim().toLowerCase()) {
|
|
62
|
+
case "none":
|
|
63
|
+
return DiagLogLevel.NONE;
|
|
64
|
+
case "error":
|
|
65
|
+
return DiagLogLevel.ERROR;
|
|
66
|
+
case "warn":
|
|
67
|
+
case "warning":
|
|
68
|
+
return DiagLogLevel.WARN;
|
|
69
|
+
case "info":
|
|
70
|
+
return DiagLogLevel.INFO;
|
|
71
|
+
case "debug":
|
|
72
|
+
return DiagLogLevel.DEBUG;
|
|
73
|
+
case "verbose":
|
|
74
|
+
case "trace":
|
|
75
|
+
return DiagLogLevel.VERBOSE;
|
|
76
|
+
case "all":
|
|
77
|
+
return DiagLogLevel.ALL;
|
|
78
|
+
default:
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function normalizeCapture(v) {
|
|
83
|
+
if (v === true || v === "full")
|
|
84
|
+
return "full";
|
|
85
|
+
if (v === "no_tool_content")
|
|
86
|
+
return "no_tool_content";
|
|
87
|
+
return "metadata_only";
|
|
88
|
+
}
|
|
89
|
+
export function resolveConfig(cwd) {
|
|
90
|
+
const projectSettings = tryReadJson(join(cwd, ".pi", "settings.json"));
|
|
91
|
+
const globalSettings = tryReadJson(join(homedir(), ".pi", "agent", "settings.json"));
|
|
92
|
+
const merged = {
|
|
93
|
+
...(globalSettings?.otel ?? {}),
|
|
94
|
+
...(projectSettings?.otel ?? {}),
|
|
95
|
+
};
|
|
96
|
+
const envDisabled = process.env.PI_OTEL_DISABLED === "1" ||
|
|
97
|
+
process.env.PI_OTEL_DISABLED === "true";
|
|
98
|
+
const enabled = envDisabled ? false : merged?.enabled !== false;
|
|
99
|
+
const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT ??
|
|
100
|
+
merged?.endpoint ??
|
|
101
|
+
"http://127.0.0.1:4317";
|
|
102
|
+
const protocol = normalizeProtocol(process.env.OTEL_EXPORTER_OTLP_PROTOCOL ?? merged?.protocol);
|
|
103
|
+
const headers = {
|
|
104
|
+
...(merged?.headers ?? {}),
|
|
105
|
+
...parseKvList(process.env.OTEL_EXPORTER_OTLP_HEADERS),
|
|
106
|
+
};
|
|
107
|
+
const serviceName = process.env.OTEL_SERVICE_NAME ?? merged?.serviceName ?? "pi";
|
|
108
|
+
const captureContent = normalizeCapture(process.env.PI_OTEL_CAPTURE_CONTENT ?? merged?.captureContent);
|
|
109
|
+
const sampleRatio = typeof merged?.sampleRatio === "number" ? merged.sampleRatio : 1.0;
|
|
110
|
+
const envTrue = (v) => v === "1" || v === "true";
|
|
111
|
+
return {
|
|
112
|
+
enabled,
|
|
113
|
+
endpoint,
|
|
114
|
+
protocol,
|
|
115
|
+
headers,
|
|
116
|
+
serviceName,
|
|
117
|
+
captureContent,
|
|
118
|
+
sampleRatio,
|
|
119
|
+
signals: {
|
|
120
|
+
traces: merged?.signals?.traces !== false,
|
|
121
|
+
metrics: envTrue(process.env.PI_OTEL_METRICS) ||
|
|
122
|
+
merged?.signals?.metrics === true,
|
|
123
|
+
logs: envTrue(process.env.PI_OTEL_LOGS) || merged?.signals?.logs === true,
|
|
124
|
+
},
|
|
125
|
+
resourceAttributes: parseKvList(process.env.OTEL_RESOURCE_ATTRIBUTES, true),
|
|
126
|
+
logLevel: normalizeLogLevel(process.env.OTEL_LOG_LEVEL) ??
|
|
127
|
+
normalizeLogLevel(merged?.logLevel) ??
|
|
128
|
+
DiagLogLevel.DEBUG,
|
|
129
|
+
cwd,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pi-otel — OpenTelemetry traces for pi-coding-agent.
|
|
3
|
+
*
|
|
4
|
+
* Wires pi lifecycle events into an OTel span tree:
|
|
5
|
+
* pi.interaction (per user prompt)
|
|
6
|
+
* ├─ pi.llm_request
|
|
7
|
+
* └─ pi.tool.<name>
|
|
8
|
+
*
|
|
9
|
+
* See `_plans/SPEC.md` for the full design.
|
|
10
|
+
*
|
|
11
|
+
* The `/otel` command (Aspire launcher) is registered below via
|
|
12
|
+
* `registerOtelCommand`. We also expose `pi.events` channels
|
|
13
|
+
* (`pi-otel:status`, `pi-otel:trace-active`) for future consumers.
|
|
14
|
+
*
|
|
15
|
+
* ## pi-otel:log — extensibility API for other pi packages
|
|
16
|
+
*
|
|
17
|
+
* Any pi extension can route structured log records through pi-otel by emitting:
|
|
18
|
+
*
|
|
19
|
+
* pi.events.emit("pi-otel:log", {
|
|
20
|
+
* eventName: "my-package.something", // lands as event.name attribute
|
|
21
|
+
* severity: "info", // "debug" | "info" | "warn" | "error"
|
|
22
|
+
* body: "human-readable message",
|
|
23
|
+
* attributes: { "key": "value" }, // optional; string | number | boolean values
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* No-op if signals.logs is disabled or the OTel SDK is not yet initialized.
|
|
27
|
+
* pi-otel uses this channel internally for its own lifecycle events.
|
|
28
|
+
*/
|
|
29
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
30
|
+
export default function (pi: ExtensionAPI): void;
|