@nicofains1/agentwatch 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -36
- package/dist/alerts.d.ts.map +1 -1
- package/dist/alerts.js +8 -5
- package/dist/alerts.js.map +1 -1
- package/dist/cli/index.js +159 -92
- package/dist/cli/index.js.map +1 -1
- package/dist/heartbeat.js +1 -1
- package/dist/heartbeat.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/otel.d.ts +27 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +80 -0
- package/dist/otel.js.map +1 -0
- package/dist/trace.d.ts.map +1 -1
- package/dist/trace.js +6 -1
- package/dist/trace.js.map +1 -1
- package/package.json +14 -2
package/README.md
CHANGED
|
@@ -2,7 +2,36 @@
|
|
|
2
2
|
|
|
3
3
|
Observability for multi-agent systems. Track heartbeats, trace cross-agent actions, detect cascade failures, and replay what went wrong.
|
|
4
4
|
|
|
5
|
-
Built for teams running fleets of AI agents (CrewAI, AutoGen, LangGraph, custom) who need to understand why Agent B failed after Agent A timed out.
|
|
5
|
+
Built for teams running fleets of AI agents (CrewAI, AutoGen, LangGraph, PocketFlow, custom) who need to understand why Agent B failed after Agent A timed out.
|
|
6
|
+
|
|
7
|
+
## Try it in 30 seconds
|
|
8
|
+
|
|
9
|
+
No install needed. Run this and see a full cascade failure traced across 5 agents:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx @nicofains1/agentwatch demo
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Output:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
AgentWatch Fleet Dashboard
|
|
19
|
+
============================================================
|
|
20
|
+
Agents: 5 total | 3 healthy | 1 degraded | 1 error | 0 offline
|
|
21
|
+
|
|
22
|
+
Cascade Failure (4 steps, root cause: scheduler/dispatch-batch)
|
|
23
|
+
============================================================
|
|
24
|
+
[ROOT] scheduler/dispatch-batch [ok] 15ms
|
|
25
|
+
|
|
|
26
|
+
[ 1 ] fetcher/call-api [error] 30000ms
|
|
27
|
+
TIMEOUT after 30000ms
|
|
28
|
+
|
|
|
29
|
+
[ 2 ] processor/transform [error] 120ms
|
|
30
|
+
Error: input is null - expected array from fetcher
|
|
31
|
+
|
|
|
32
|
+
[FAIL] notifier/send-alert [error] 8ms
|
|
33
|
+
Error: no processed data to report
|
|
34
|
+
```
|
|
6
35
|
|
|
7
36
|
## Install
|
|
8
37
|
|
|
@@ -15,27 +44,31 @@ npm install @nicofains1/agentwatch
|
|
|
15
44
|
```typescript
|
|
16
45
|
import { AgentWatch } from '@nicofains1/agentwatch';
|
|
17
46
|
|
|
18
|
-
const aw = new AgentWatch(); //
|
|
47
|
+
const aw = new AgentWatch(); // creates agentwatch.db
|
|
19
48
|
|
|
20
|
-
//
|
|
49
|
+
// 1. Report heartbeats from your agents
|
|
21
50
|
aw.report('agent-a', 'healthy');
|
|
22
51
|
aw.report('agent-b', 'healthy');
|
|
23
52
|
|
|
24
|
-
// Trace
|
|
53
|
+
// 2. Trace actions across agents
|
|
25
54
|
const traceId = aw.createTraceId();
|
|
26
55
|
|
|
27
|
-
const e1 = aw.trace(traceId, 'agent-a', 'fetch-data',
|
|
28
|
-
|
|
29
|
-
parentEventId: e1.id,
|
|
30
|
-
status: 'error',
|
|
31
|
-
durationMs: 4200,
|
|
32
|
-
});
|
|
56
|
+
const e1 = aw.trace(traceId, 'agent-a', 'fetch-data',
|
|
57
|
+
'url=https://api.example.com', 'rows=150');
|
|
33
58
|
|
|
34
|
-
|
|
59
|
+
const e2 = aw.trace(traceId, 'agent-b', 'process',
|
|
60
|
+
JSON.stringify({ rows: 150 }), 'Error: out of memory', {
|
|
61
|
+
parentEventId: e1.id,
|
|
62
|
+
status: 'error',
|
|
63
|
+
durationMs: 4200,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// 3. Find the root cause
|
|
35
67
|
const chain = aw.correlate(e2.id);
|
|
36
|
-
console.log(chain?.root_cause);
|
|
68
|
+
console.log(chain?.root_cause);
|
|
69
|
+
// -> { agent: 'agent-a', action: 'fetch-data', ... }
|
|
37
70
|
|
|
38
|
-
// Fleet dashboard
|
|
71
|
+
// 4. Fleet dashboard
|
|
39
72
|
console.log(aw.dashboardText());
|
|
40
73
|
```
|
|
41
74
|
|
|
@@ -53,14 +86,17 @@ console.log(aw.dashboardText());
|
|
|
53
86
|
|
|
54
87
|
**Forensic replay** - Given a trace ID, replay all cascade chains to understand the full failure sequence.
|
|
55
88
|
|
|
89
|
+
**OpenTelemetry export** - Export traces as OTEL spans with GenAI semantic conventions. Plug into Jaeger, Grafana, or any OTEL-compatible backend.
|
|
90
|
+
|
|
56
91
|
## CLI
|
|
57
92
|
|
|
58
93
|
```bash
|
|
59
|
-
npx agentwatch
|
|
60
|
-
npx agentwatch
|
|
61
|
-
npx agentwatch
|
|
62
|
-
npx agentwatch
|
|
63
|
-
npx agentwatch
|
|
94
|
+
npx @nicofains1/agentwatch demo # See it in action with sample data
|
|
95
|
+
npx @nicofains1/agentwatch dashboard # Fleet health overview
|
|
96
|
+
npx @nicofains1/agentwatch cascade <event-id> # Trace cascade from a failure
|
|
97
|
+
npx @nicofains1/agentwatch failures [agent] # List recent failures
|
|
98
|
+
npx @nicofains1/agentwatch alerts [agent] # List active alerts
|
|
99
|
+
npx @nicofains1/agentwatch replay <trace-id> # Replay all cascades in a trace
|
|
64
100
|
```
|
|
65
101
|
|
|
66
102
|
Set `AGENTWATCH_DB` to point to your database file (default: `agentwatch.db`).
|
|
@@ -71,56 +107,68 @@ Set `AGENTWATCH_DB` to point to your database file (default: `agentwatch.db`).
|
|
|
71
107
|
|
|
72
108
|
```typescript
|
|
73
109
|
const aw = new AgentWatch({
|
|
74
|
-
db_path: 'agentwatch.db', // SQLite file path
|
|
75
|
-
alert_window_minutes: 30, // De-dup window for alerts
|
|
76
|
-
heartbeat_stale_minutes: 30, // When to mark agents as offline
|
|
110
|
+
db_path: 'agentwatch.db', // SQLite file path
|
|
111
|
+
alert_window_minutes: 30, // De-dup window for alerts
|
|
112
|
+
heartbeat_stale_minutes: 30, // When to mark agents as offline
|
|
77
113
|
});
|
|
78
114
|
```
|
|
79
115
|
|
|
80
116
|
### Heartbeats
|
|
81
117
|
|
|
82
118
|
```typescript
|
|
83
|
-
aw.report(agent
|
|
84
|
-
aw.getLatestHeartbeat(agent
|
|
85
|
-
aw.getFleetHealth()
|
|
119
|
+
aw.report(agent, status, context?) // status: 'healthy' | 'degraded' | 'error' | 'offline'
|
|
120
|
+
aw.getLatestHeartbeat(agent) // -> Heartbeat | undefined
|
|
121
|
+
aw.getFleetHealth() // -> AgentHealth[]
|
|
86
122
|
```
|
|
87
123
|
|
|
88
124
|
### Tracing
|
|
89
125
|
|
|
90
126
|
```typescript
|
|
91
|
-
aw.createTraceId()
|
|
92
|
-
aw.trace(traceId, agent, action, input, output,
|
|
93
|
-
|
|
94
|
-
|
|
127
|
+
aw.createTraceId() // -> string (UUID)
|
|
128
|
+
aw.trace(traceId, agent, action, input, output, {
|
|
129
|
+
parentEventId?: number, // link to parent event
|
|
130
|
+
status?: 'ok' | 'error', // default: 'ok'
|
|
131
|
+
durationMs?: number, // execution time
|
|
132
|
+
}) // -> TraceEvent
|
|
133
|
+
aw.getTraceEvents(traceId) // -> TraceEvent[]
|
|
134
|
+
aw.getRecentFailures(agent?, limit?) // -> TraceEvent[]
|
|
95
135
|
```
|
|
96
136
|
|
|
97
137
|
### Cascade Detection
|
|
98
138
|
|
|
99
139
|
```typescript
|
|
100
|
-
aw.correlate(failureEventId
|
|
101
|
-
aw.replay(traceId
|
|
140
|
+
aw.correlate(failureEventId) // -> CascadeChain | null (walk back to root cause)
|
|
141
|
+
aw.replay(traceId) // -> CascadeChain[] (all cascades in a trace)
|
|
102
142
|
```
|
|
103
143
|
|
|
104
144
|
### Alerts
|
|
105
145
|
|
|
106
146
|
```typescript
|
|
107
|
-
aw.alert(agent, alertType, message)
|
|
108
|
-
aw.resolveAlert(alertId
|
|
109
|
-
aw.activeAlerts(agent
|
|
147
|
+
aw.alert(agent, alertType, message) // auto-deduplicates within window
|
|
148
|
+
aw.resolveAlert(alertId)
|
|
149
|
+
aw.activeAlerts(agent?) // -> Alert[]
|
|
110
150
|
```
|
|
111
151
|
|
|
112
152
|
### Dashboard
|
|
113
153
|
|
|
114
154
|
```typescript
|
|
115
|
-
aw.dashboard()
|
|
116
|
-
aw.dashboardText()
|
|
155
|
+
aw.dashboard() // -> DashboardOutput (structured)
|
|
156
|
+
aw.dashboardText() // -> string (formatted for terminal)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### OpenTelemetry Export
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
// Requires optional peer deps: @opentelemetry/api, @opentelemetry/sdk-trace-base
|
|
163
|
+
await aw.exportTraceToOtel(traceId, { serviceName: 'my-agents' });
|
|
164
|
+
await aw.exportRecentToOtel(1); // last 1 hour
|
|
117
165
|
```
|
|
118
166
|
|
|
119
167
|
## Storage
|
|
120
168
|
|
|
121
169
|
Uses SQLite via `better-sqlite3`. The database file is created automatically on first use. WAL mode is enabled for concurrent reads.
|
|
122
170
|
|
|
123
|
-
Tables: `heartbeats`, `trace_events`, `alerts` - all with proper indexes
|
|
171
|
+
Tables: `heartbeats`, `trace_events`, `alerts` - all with proper indexes.
|
|
124
172
|
|
|
125
173
|
## License
|
|
126
174
|
|
package/dist/alerts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../src/alerts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,YAAY,CAAC;AAOvD;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,aAAa,GAAE,MAAW,GACzB,KAAK,CAuCP;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,GACd,IAAI,CAEN;
|
|
1
|
+
{"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../src/alerts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,YAAY,CAAC;AAOvD;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,aAAa,GAAE,MAAW,GACzB,KAAK,CAuCP;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,GACd,IAAI,CAEN;AAMD,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,KAAK,EAAE,CAWT"}
|
package/dist/alerts.js
CHANGED
|
@@ -23,7 +23,7 @@ export function recordAlert(db, agent, alertType, message, windowMinutes = 30) {
|
|
|
23
23
|
SET count = ?, severity = ?, message = ?, last_seen = datetime('now')
|
|
24
24
|
WHERE id = ?
|
|
25
25
|
`).run(newCount, severity, message, existing.id);
|
|
26
|
-
return { ...existing, count: newCount, severity, message, last_seen:
|
|
26
|
+
return { ...existing, count: newCount, severity, message, last_seen: sqliteNow(), resolved: !!existing.resolved };
|
|
27
27
|
}
|
|
28
28
|
const stmt = db.prepare(`
|
|
29
29
|
INSERT INTO alerts (agent, alert_type, severity, message)
|
|
@@ -37,25 +37,28 @@ export function recordAlert(db, agent, alertType, message, windowMinutes = 30) {
|
|
|
37
37
|
severity: 'info',
|
|
38
38
|
message,
|
|
39
39
|
count: 1,
|
|
40
|
-
first_seen:
|
|
41
|
-
last_seen:
|
|
40
|
+
first_seen: sqliteNow(),
|
|
41
|
+
last_seen: sqliteNow(),
|
|
42
42
|
resolved: false,
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
45
|
export function resolveAlert(db, alertId) {
|
|
46
46
|
db.prepare(`UPDATE alerts SET resolved = 1 WHERE id = ?`).run(alertId);
|
|
47
47
|
}
|
|
48
|
+
function coerceAlert(row) {
|
|
49
|
+
return { ...row, resolved: !!row.resolved };
|
|
50
|
+
}
|
|
48
51
|
export function getActiveAlerts(db, agent) {
|
|
49
52
|
if (agent) {
|
|
50
53
|
return db.prepare(`
|
|
51
54
|
SELECT * FROM alerts WHERE agent = ? AND resolved = 0
|
|
52
55
|
ORDER BY severity DESC, last_seen DESC
|
|
53
|
-
`).all(agent);
|
|
56
|
+
`).all(agent).map(coerceAlert);
|
|
54
57
|
}
|
|
55
58
|
return db.prepare(`
|
|
56
59
|
SELECT * FROM alerts WHERE resolved = 0
|
|
57
60
|
ORDER BY severity DESC, last_seen DESC
|
|
58
|
-
`).all();
|
|
61
|
+
`).all().map(coerceAlert);
|
|
59
62
|
}
|
|
60
63
|
function escalateSeverity(count) {
|
|
61
64
|
if (count >= 10)
|
package/dist/alerts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alerts.js","sourceRoot":"","sources":["../src/alerts.ts"],"names":[],"mappings":"AAGA,SAAS,SAAS,CAAC,QAAQ,GAAG,CAAC;IAC7B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,EAAqB,EACrB,KAAa,EACb,SAAiB,EACjB,OAAe,EACf,gBAAwB,EAAE;IAE1B,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAE1D,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;GAK3B,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAsB,CAAC;IAE3D,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC5C,EAAE,CAAC,OAAO,CAAC;;;;KAIV,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEjD,OAAO,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"alerts.js","sourceRoot":"","sources":["../src/alerts.ts"],"names":[],"mappings":"AAGA,SAAS,SAAS,CAAC,QAAQ,GAAG,CAAC;IAC7B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,EAAqB,EACrB,KAAa,EACb,SAAiB,EACjB,OAAe,EACf,gBAAwB,EAAE;IAE1B,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAE1D,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;GAK3B,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAsB,CAAC;IAE3D,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC5C,EAAE,CAAC,OAAO,CAAC;;;;KAIV,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEjD,OAAO,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACpH,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGvB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAEnD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;QAClC,KAAK;QACL,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,MAAM;QAChB,OAAO;QACP,KAAK,EAAE,CAAC;QACR,UAAU,EAAE,SAAS,EAAE;QACvB,SAAS,EAAE,SAAS,EAAE;QACtB,QAAQ,EAAE,KAAK;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,EAAqB,EACrB,OAAe;IAEf,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,WAAW,CAAC,GAA4B;IAC/C,OAAO,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAW,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,EAAqB,EACrB,KAAc;IAEd,IAAI,KAAK,EAAE,CAAC;QACV,OAAQ,EAAE,CAAC,OAAO,CAAC;;;KAGlB,CAAC,CAAC,GAAG,CAAC,KAAK,CAA+B,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/D,CAAC;IACD,OAAQ,EAAE,CAAC,OAAO,CAAC;;;GAGlB,CAAC,CAAC,GAAG,EAAgC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,UAAU,CAAC;IACnC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,118 +1,185 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { AgentWatch } from '../index.js';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
3
5
|
const args = process.argv.slice(2);
|
|
4
6
|
const command = args[0];
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
7
|
+
if (command === 'demo') {
|
|
8
|
+
runDemo();
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
const dbPath = process.env.AGENTWATCH_DB ?? 'agentwatch.db';
|
|
12
|
+
const aw = new AgentWatch({ db_path: dbPath });
|
|
13
|
+
runCli(aw, command);
|
|
14
|
+
}
|
|
15
|
+
function runDemo() {
|
|
16
|
+
const dbPath = join(tmpdir(), `agentwatch-demo-${Date.now()}.db`);
|
|
17
|
+
const aw = new AgentWatch({ db_path: dbPath });
|
|
18
|
+
try {
|
|
19
|
+
// Seed heartbeats for a 5-agent fleet
|
|
20
|
+
aw.report('scheduler', 'healthy', '{"tasks_queued": 12}');
|
|
21
|
+
aw.report('fetcher', 'healthy', '{"apis_connected": 3}');
|
|
22
|
+
aw.report('processor', 'degraded', '{"queue_depth": 847}');
|
|
23
|
+
aw.report('notifier', 'healthy', '{"channels": ["slack", "email"]}');
|
|
24
|
+
aw.report('reporter', 'error', '{"last_report": "failed"}');
|
|
25
|
+
// Create a cascade: fetcher times out -> processor gets bad data -> notifier fails
|
|
26
|
+
const t1 = aw.createTraceId();
|
|
27
|
+
const e1 = aw.trace(t1, 'scheduler', 'dispatch-batch', '{"batch_id": 42}', '{"assigned_to": "fetcher"}', { durationMs: 15 });
|
|
28
|
+
const e2 = aw.trace(t1, 'fetcher', 'call-api', '{"url": "https://api.vendor.io/data"}', 'TIMEOUT after 30000ms', { parentEventId: e1.id, status: 'error', durationMs: 30000 });
|
|
29
|
+
const e3 = aw.trace(t1, 'processor', 'transform', '{"source": "fetcher"}', 'Error: input is null - expected array from fetcher', { parentEventId: e2.id, status: 'error', durationMs: 120 });
|
|
30
|
+
const e4 = aw.trace(t1, 'notifier', 'send-alert', '{"type": "batch-complete"}', 'Error: no processed data to report', { parentEventId: e3.id, status: 'error', durationMs: 8 });
|
|
31
|
+
// A second trace that works fine
|
|
32
|
+
const t2 = aw.createTraceId();
|
|
33
|
+
aw.trace(t2, 'scheduler', 'dispatch-batch', '{"batch_id": 43}', '{"assigned_to": "fetcher"}', { durationMs: 10 });
|
|
34
|
+
aw.trace(t2, 'fetcher', 'call-api', '{"url": "https://api.vendor.io/data"}', '{"rows": 250}', { durationMs: 800 });
|
|
35
|
+
// Print everything
|
|
36
|
+
console.log(aw.dashboardText());
|
|
37
|
+
console.log('');
|
|
38
|
+
// Show cascade
|
|
39
|
+
const chain = aw.correlate(e4.id);
|
|
40
|
+
if (chain) {
|
|
41
|
+
console.log(`Cascade Failure (4 steps, root cause: ${chain.root_cause.agent}/${chain.root_cause.action})`);
|
|
25
42
|
console.log('='.repeat(60));
|
|
26
|
-
console.log(`Root cause: ${chain.root_cause.agent} / ${chain.root_cause.action}`);
|
|
27
|
-
console.log(`Chain length: ${chain.chain.length} steps`);
|
|
28
|
-
console.log('');
|
|
29
43
|
for (let i = 0; i < chain.chain.length; i++) {
|
|
30
44
|
const step = chain.chain[i];
|
|
31
|
-
const
|
|
32
|
-
console.log(`[${
|
|
33
|
-
console.log(`
|
|
34
|
-
console.log(` Output: ${truncate(step.output, 120)}`);
|
|
35
|
-
console.log(` Time: ${step.timestamp}`);
|
|
45
|
+
const tag = i === 0 ? 'ROOT' : i === chain.chain.length - 1 ? 'FAIL' : ` ${i} `;
|
|
46
|
+
console.log(`[${tag}] ${step.agent}/${step.action} [${step.status}] ${step.duration_ms}ms`);
|
|
47
|
+
console.log(` ${truncate(step.output, 80)}`);
|
|
36
48
|
if (i < chain.chain.length - 1)
|
|
37
49
|
console.log(' |');
|
|
38
50
|
}
|
|
39
|
-
break;
|
|
40
51
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
52
|
+
console.log('');
|
|
53
|
+
console.log(`Alerts: ${aw.activeAlerts().length} active`);
|
|
54
|
+
for (const a of aw.activeAlerts()) {
|
|
55
|
+
console.log(` [${a.severity.toUpperCase()}] ${a.agent}: ${truncate(a.message, 60)}`);
|
|
56
|
+
}
|
|
57
|
+
console.log('');
|
|
58
|
+
console.log('---');
|
|
59
|
+
console.log(`Demo database: ${dbPath}`);
|
|
60
|
+
console.log('Explore it:');
|
|
61
|
+
console.log(` AGENTWATCH_DB=${dbPath} npx @nicofains1/agentwatch dashboard`);
|
|
62
|
+
console.log(` AGENTWATCH_DB=${dbPath} npx @nicofains1/agentwatch failures`);
|
|
63
|
+
console.log(` AGENTWATCH_DB=${dbPath} npx @nicofains1/agentwatch cascade ${e4.id}`);
|
|
64
|
+
console.log(` AGENTWATCH_DB=${dbPath} npx @nicofains1/agentwatch replay ${t1}`);
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
aw.close();
|
|
68
|
+
}
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
function runCli(aw, command) {
|
|
72
|
+
try {
|
|
73
|
+
switch (command) {
|
|
74
|
+
case 'dashboard': {
|
|
75
|
+
console.log(aw.dashboardText());
|
|
47
76
|
break;
|
|
48
77
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
console.log('
|
|
78
|
+
case 'cascade': {
|
|
79
|
+
const failureId = parseInt(args[1], 10);
|
|
80
|
+
if (isNaN(failureId)) {
|
|
81
|
+
console.error('Usage: agentwatch cascade <failure-event-id>');
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
const chain = aw.correlate(failureId);
|
|
85
|
+
if (!chain) {
|
|
86
|
+
console.error(`No trace event found with id ${failureId}`);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
console.log(`Cascade for failure #${failureId}`);
|
|
90
|
+
console.log('='.repeat(60));
|
|
91
|
+
console.log(`Root cause: ${chain.root_cause.agent} / ${chain.root_cause.action}`);
|
|
92
|
+
console.log(`Chain length: ${chain.chain.length} steps`);
|
|
93
|
+
console.log('');
|
|
94
|
+
for (let i = 0; i < chain.chain.length; i++) {
|
|
95
|
+
const step = chain.chain[i];
|
|
96
|
+
const prefix = i === 0 ? 'ROOT' : i === chain.chain.length - 1 ? 'FAIL' : ` ${i} `;
|
|
97
|
+
console.log(`[${prefix}] ${step.agent} / ${step.action} (${step.status}, ${step.duration_ms}ms)`);
|
|
98
|
+
console.log(` Input: ${truncate(step.input, 120)}`);
|
|
99
|
+
console.log(` Output: ${truncate(step.output, 120)}`);
|
|
100
|
+
console.log(` Time: ${step.timestamp}`);
|
|
101
|
+
if (i < chain.chain.length - 1)
|
|
102
|
+
console.log(' |');
|
|
103
|
+
}
|
|
62
104
|
break;
|
|
63
105
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
106
|
+
case 'failures': {
|
|
107
|
+
const agent = args[1];
|
|
108
|
+
const limit = parseInt(args[2] ?? '20', 10);
|
|
109
|
+
const failures = aw.getRecentFailures(agent, limit);
|
|
110
|
+
if (failures.length === 0) {
|
|
111
|
+
console.log('No recent failures.');
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
console.log(`Recent failures${agent ? ` for ${agent}` : ''} (${failures.length})`);
|
|
115
|
+
console.log('='.repeat(60));
|
|
116
|
+
for (const f of failures) {
|
|
117
|
+
console.log(`#${f.id} | ${f.agent} / ${f.action} | trace=${f.trace_id.slice(0, 8)} | ${f.created_at}`);
|
|
118
|
+
console.log(` Output: ${truncate(f.output, 100)}`);
|
|
119
|
+
}
|
|
120
|
+
break;
|
|
70
121
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
122
|
+
case 'alerts': {
|
|
123
|
+
const alertAgent = args[1];
|
|
124
|
+
const alerts = aw.activeAlerts(alertAgent);
|
|
125
|
+
if (alerts.length === 0) {
|
|
126
|
+
console.log('No active alerts.');
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
console.log(`Active alerts (${alerts.length})`);
|
|
130
|
+
console.log('='.repeat(60));
|
|
131
|
+
for (const a of alerts) {
|
|
132
|
+
console.log(`[${a.severity.toUpperCase()}] ${a.agent} / ${a.alert_type} (x${a.count})`);
|
|
133
|
+
console.log(` ${a.message}`);
|
|
134
|
+
console.log(` First: ${a.first_seen} | Last: ${a.last_seen}`);
|
|
135
|
+
}
|
|
136
|
+
break;
|
|
78
137
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
138
|
+
case 'replay': {
|
|
139
|
+
const traceId = args[1];
|
|
140
|
+
if (!traceId) {
|
|
141
|
+
console.error('Usage: agentwatch replay <trace-id>');
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
const chains = aw.replay(traceId);
|
|
145
|
+
if (chains.length === 0) {
|
|
146
|
+
console.log(`No failures found in trace ${traceId}`);
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
console.log(`Trace ${traceId} - ${chains.length} cascade(s) found`);
|
|
150
|
+
console.log('='.repeat(60));
|
|
151
|
+
for (const chain of chains) {
|
|
152
|
+
console.log('');
|
|
153
|
+
console.log(`Cascade -> failure #${chain.failure_id} (${chain.chain.length} steps)`);
|
|
154
|
+
for (let i = 0; i < chain.chain.length; i++) {
|
|
155
|
+
const step = chain.chain[i];
|
|
156
|
+
const arrow = i < chain.chain.length - 1 ? ' ->' : ' X';
|
|
157
|
+
console.log(` ${step.agent}/${step.action} [${step.status}]${arrow}`);
|
|
158
|
+
console.log(` in: ${truncate(step.input, 80)}`);
|
|
159
|
+
console.log(` out: ${truncate(step.output, 80)}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
82
162
|
break;
|
|
83
163
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
for (const chain of chains) {
|
|
164
|
+
default: {
|
|
165
|
+
console.log('AgentWatch - Multi-agent observability');
|
|
87
166
|
console.log('');
|
|
88
|
-
console.log(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
167
|
+
console.log('Usage:');
|
|
168
|
+
console.log(' agentwatch demo Run a demo with sample data');
|
|
169
|
+
console.log(' agentwatch dashboard Fleet health overview');
|
|
170
|
+
console.log(' agentwatch cascade <event-id> Trace cascade from failure');
|
|
171
|
+
console.log(' agentwatch failures [agent] List recent failures');
|
|
172
|
+
console.log(' agentwatch alerts [agent] List active alerts');
|
|
173
|
+
console.log(' agentwatch replay <trace-id> Replay all cascades in a trace');
|
|
174
|
+
console.log('');
|
|
175
|
+
console.log('Environment:');
|
|
176
|
+
console.log(' AGENTWATCH_DB Path to SQLite database (default: agentwatch.db)');
|
|
96
177
|
}
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
default: {
|
|
100
|
-
console.log('AgentWatch - Multi-agent observability');
|
|
101
|
-
console.log('');
|
|
102
|
-
console.log('Usage:');
|
|
103
|
-
console.log(' agentwatch dashboard Fleet health overview');
|
|
104
|
-
console.log(' agentwatch cascade <event-id> Trace cascade from failure');
|
|
105
|
-
console.log(' agentwatch failures [agent] List recent failures');
|
|
106
|
-
console.log(' agentwatch alerts [agent] List active alerts');
|
|
107
|
-
console.log(' agentwatch replay <trace-id> Replay all cascades in a trace');
|
|
108
|
-
console.log('');
|
|
109
|
-
console.log('Environment:');
|
|
110
|
-
console.log(' AGENTWATCH_DB Path to SQLite database (default: agentwatch.db)');
|
|
111
178
|
}
|
|
112
179
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
180
|
+
finally {
|
|
181
|
+
aw.close();
|
|
182
|
+
}
|
|
116
183
|
}
|
|
117
184
|
function truncate(s, max) {
|
|
118
185
|
const oneline = s.replace(/\n/g, ' ');
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/heartbeat.js
CHANGED
package/dist/heartbeat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"AAGA,+DAA+D;AAC/D,SAAS,SAAS,CAAC,QAAQ,GAAG,CAAC;IAC7B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,MAAM,CACpB,EAAqB,EACrB,KAAa,EACb,MAAmB,EACnB,UAAkB,IAAI;IAEtB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGvB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;QAClC,KAAK;QACL,MAAM;QACN,OAAO;QACP,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"AAGA,+DAA+D;AAC/D,SAAS,SAAS,CAAC,QAAQ,GAAG,CAAC;IAC7B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,MAAM,CACpB,EAAqB,EACrB,KAAa,EACb,MAAmB,EACnB,UAAkB,IAAI;IAEtB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGvB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;QAClC,KAAK;QACL,MAAM;QACN,OAAO;QACP,UAAU,EAAE,SAAS,EAAE;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,EAAqB,EACrB,KAAa;IAEb,OAAO,EAAE,CAAC,OAAO,CAAC;;;;;GAKjB,CAAC,CAAC,GAAG,CAAC,KAAK,CAA0B,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,EAAqB,EACrB,eAAuB,EAAE;IAEzB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;GAEzB,CAAC,CAAC,GAAG,EAAyB,CAAC;IAEhC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAwB,EAAE,cAAc,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;QAC1G,CAAC;QAED,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,GAAG,cAAc,CAAC;QACnD,MAAM,MAAM,GAAgB,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAEhE,0DAA0D;QAC1D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG7B,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAoB,CAAC;QAEzC,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG/B,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAoB,CAAC;QAEzC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC;YAC/B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YACvD,CAAC,CAAC,CAAC,CAAC;QAEN,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAG7B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAoB,CAAC;QAEjC,OAAO;YACL,KAAK;YACL,MAAM;YACN,cAAc,EAAE,MAAM,CAAC,UAAU;YACjC,UAAU,EAAE,MAAM;YAClB,aAAa,EAAE,UAAU,CAAC,GAAG;SAC9B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AgentWatchConfig, AgentStatus, TraceEvent, CascadeChain } from './types.js';
|
|
2
|
+
import type { OtelExportOptions } from './otel.js';
|
|
2
3
|
export declare class AgentWatch {
|
|
3
4
|
private db;
|
|
4
5
|
private alertWindowMinutes;
|
|
@@ -22,8 +23,12 @@ export declare class AgentWatch {
|
|
|
22
23
|
getRecentFailures(agent?: string, limit?: number): TraceEvent[];
|
|
23
24
|
getLatestHeartbeat(agent: string): import("./types.js").Heartbeat | undefined;
|
|
24
25
|
getFleetHealth(): import("./types.js").AgentHealth[];
|
|
26
|
+
exportTraceToOtel(traceId: string, options?: OtelExportOptions): Promise<number>;
|
|
27
|
+
exportRecentToOtel(hours?: number, options?: OtelExportOptions): Promise<number>;
|
|
25
28
|
close(): void;
|
|
26
29
|
}
|
|
27
30
|
export type { AgentStatus, AlertSeverity, Heartbeat, TraceEvent, Alert, AgentHealth, CascadeStep, CascadeChain, AgentWatchConfig, } from './types.js';
|
|
28
31
|
export { createTraceId } from './trace.js';
|
|
32
|
+
export { exportTraceEvents } from './otel.js';
|
|
33
|
+
export type { OtelExportOptions } from './otel.js';
|
|
29
34
|
//# 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":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnD,qBAAa,UAAU;IACrB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,qBAAqB,CAAS;gBAE1B,MAAM,GAAE,gBAAqB;IAQzC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,MAAa;IAKjE,KAAK,CACH,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9E,UAAU;IAWb,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAKtD,SAAS;IAIT,aAAa,IAAI,MAAM;IAKvB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAIvD,YAAY,CAAC,OAAO,EAAE,MAAM;IAI5B,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM;IAK3B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE;IAKvC,aAAa,IAAI,MAAM;IAIvB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE;IAI7C,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE;IAI/D,kBAAkB,CAAC,KAAK,EAAE,MAAM;IAIhC,cAAc;IAKR,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAMhF,kBAAkB,CAAC,KAAK,GAAE,MAAU,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAWzF,KAAK;CAGN;AAGD,YAAY,EACV,WAAW,EACX,aAAa,EACb,SAAS,EACT,UAAU,EACV,KAAK,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -66,10 +66,27 @@ export class AgentWatch {
|
|
|
66
66
|
getFleetHealth() {
|
|
67
67
|
return getFleetHealth(this.db, this.heartbeatStaleMinutes);
|
|
68
68
|
}
|
|
69
|
+
// Feature 6: OTEL span export
|
|
70
|
+
async exportTraceToOtel(traceId, options) {
|
|
71
|
+
const events = this.getTraceEvents(traceId);
|
|
72
|
+
const { exportTraceEvents } = await import('./otel.js');
|
|
73
|
+
return exportTraceEvents(events, options);
|
|
74
|
+
}
|
|
75
|
+
async exportRecentToOtel(hours = 1, options) {
|
|
76
|
+
const since = new Date(Date.now() - hours * 3600_000).toISOString().replace('T', ' ').replace('Z', '');
|
|
77
|
+
const events = this.db.prepare(`
|
|
78
|
+
SELECT * FROM trace_events
|
|
79
|
+
WHERE created_at >= ?
|
|
80
|
+
ORDER BY created_at ASC
|
|
81
|
+
`).all(since);
|
|
82
|
+
const { exportTraceEvents } = await import('./otel.js');
|
|
83
|
+
return exportTraceEvents(events, options);
|
|
84
|
+
}
|
|
69
85
|
close() {
|
|
70
86
|
this.db.close();
|
|
71
87
|
}
|
|
72
88
|
}
|
|
73
89
|
// Re-export for direct use
|
|
74
90
|
export { createTraceId } from './trace.js';
|
|
91
|
+
export { exportTraceEvents } from './otel.js';
|
|
75
92
|
//# 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":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC7G,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/otel.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry span exporter for AgentWatch traces.
|
|
3
|
+
*
|
|
4
|
+
* Converts stored trace events into OTEL spans following the
|
|
5
|
+
* GenAI semantic conventions (gen_ai.operation.name = "invoke_agent").
|
|
6
|
+
*
|
|
7
|
+
* Requires optional peer dependencies:
|
|
8
|
+
* @opentelemetry/api
|
|
9
|
+
* @opentelemetry/sdk-trace-base
|
|
10
|
+
*/
|
|
11
|
+
import type { TraceEvent } from './types.js';
|
|
12
|
+
/** Options for creating an OTEL exporter from AgentWatch traces. */
|
|
13
|
+
export interface OtelExportOptions {
|
|
14
|
+
/** OTEL SpanExporter instance. If not provided, uses ConsoleSpanExporter. */
|
|
15
|
+
exporter?: unknown;
|
|
16
|
+
/** Service name reported in OTEL resource. Default: "agentwatch" */
|
|
17
|
+
serviceName?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Export an array of AgentWatch trace events as OTEL spans.
|
|
21
|
+
*
|
|
22
|
+
* Each TraceEvent becomes a span with GenAI semantic attributes.
|
|
23
|
+
* Parent-child relationships are preserved where possible within
|
|
24
|
+
* the same export batch.
|
|
25
|
+
*/
|
|
26
|
+
export declare function exportTraceEvents(events: TraceEvent[], options?: OtelExportOptions): Promise<number>;
|
|
27
|
+
//# sourceMappingURL=otel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,oEAAoE;AACpE,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoDD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,CA0DjB"}
|
package/dist/otel.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry span exporter for AgentWatch traces.
|
|
3
|
+
*
|
|
4
|
+
* Converts stored trace events into OTEL spans following the
|
|
5
|
+
* GenAI semantic conventions (gen_ai.operation.name = "invoke_agent").
|
|
6
|
+
*
|
|
7
|
+
* Requires optional peer dependencies:
|
|
8
|
+
* @opentelemetry/api
|
|
9
|
+
* @opentelemetry/sdk-trace-base
|
|
10
|
+
*/
|
|
11
|
+
let otelApi = null;
|
|
12
|
+
let sdkTrace = null;
|
|
13
|
+
async function loadOtelDeps() {
|
|
14
|
+
if (otelApi && sdkTrace)
|
|
15
|
+
return { api: otelApi, sdk: sdkTrace };
|
|
16
|
+
try {
|
|
17
|
+
otelApi = await import('@opentelemetry/api');
|
|
18
|
+
sdkTrace = await import('@opentelemetry/sdk-trace-base');
|
|
19
|
+
return { api: otelApi, sdk: sdkTrace };
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
throw new Error('OpenTelemetry packages not installed. Run: npm install @opentelemetry/api @opentelemetry/sdk-trace-base');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Export an array of AgentWatch trace events as OTEL spans.
|
|
27
|
+
*
|
|
28
|
+
* Each TraceEvent becomes a span with GenAI semantic attributes.
|
|
29
|
+
* Parent-child relationships are preserved where possible within
|
|
30
|
+
* the same export batch.
|
|
31
|
+
*/
|
|
32
|
+
export async function exportTraceEvents(events, options = {}) {
|
|
33
|
+
if (events.length === 0)
|
|
34
|
+
return 0;
|
|
35
|
+
const { sdk } = await loadOtelDeps();
|
|
36
|
+
const exporter = (options.exporter ?? new sdk.ConsoleSpanExporter());
|
|
37
|
+
const processor = new sdk.SimpleSpanProcessor(exporter);
|
|
38
|
+
const provider = new sdk.BasicTracerProvider({
|
|
39
|
+
spanProcessors: [processor],
|
|
40
|
+
});
|
|
41
|
+
const tracer = provider.getTracer(options.serviceName ?? 'agentwatch', '0.1.0');
|
|
42
|
+
let exported = 0;
|
|
43
|
+
for (const event of events) {
|
|
44
|
+
const spanName = `invoke_agent ${event.agent}`;
|
|
45
|
+
const startTime = new Date(event.created_at);
|
|
46
|
+
const startMs = startTime.getTime();
|
|
47
|
+
const span = tracer.startSpan(spanName, {
|
|
48
|
+
startTime: [Math.floor(startMs / 1000), (startMs % 1000) * 1_000_000],
|
|
49
|
+
});
|
|
50
|
+
// GenAI semantic conventions
|
|
51
|
+
span.setAttribute('gen_ai.operation.name', 'invoke_agent');
|
|
52
|
+
span.setAttribute('gen_ai.agent.name', event.agent);
|
|
53
|
+
// AgentWatch-specific attributes
|
|
54
|
+
span.setAttribute('agentwatch.trace_id', event.trace_id);
|
|
55
|
+
span.setAttribute('agentwatch.action', event.action);
|
|
56
|
+
span.setAttribute('agentwatch.event_id', event.id);
|
|
57
|
+
span.setAttribute('agentwatch.duration_ms', event.duration_ms);
|
|
58
|
+
if (event.input)
|
|
59
|
+
span.setAttribute('agentwatch.input', event.input);
|
|
60
|
+
if (event.output)
|
|
61
|
+
span.setAttribute('agentwatch.output', event.output);
|
|
62
|
+
if (event.parent_event_id !== null) {
|
|
63
|
+
span.setAttribute('agentwatch.parent_event_id', event.parent_event_id);
|
|
64
|
+
}
|
|
65
|
+
if (event.status === 'error') {
|
|
66
|
+
span.setStatus({ code: 2, message: event.output }); // SpanStatusCode.ERROR = 2
|
|
67
|
+
span.setAttribute('error.type', `agent_error:${event.action}`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
span.setStatus({ code: 1 }); // SpanStatusCode.OK = 1
|
|
71
|
+
}
|
|
72
|
+
// End span at start + duration
|
|
73
|
+
const endMs = startMs + event.duration_ms;
|
|
74
|
+
span.end([Math.floor(endMs / 1000), (endMs % 1000) * 1_000_000]);
|
|
75
|
+
exported++;
|
|
76
|
+
}
|
|
77
|
+
await provider.forceFlush();
|
|
78
|
+
return exported;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=otel.js.map
|
package/dist/otel.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"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"}
|
package/dist/trace.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAQxE,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,KAAK,CACnB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IACJ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CAChB,GACL,UAAU,CA2BZ;AAED,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,GACd,UAAU,EAAE,CAMd;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,MAAM,GACrB,YAAY,GAAG,IAAI,CAkCrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,GACjB,UAAU,EAAE,CAed;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,GACd,YAAY,EAAE,CAUhB"}
|
package/dist/trace.js
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
+
/** Format a date as SQLite-compatible `YYYY-MM-DD HH:MM:SS` */
|
|
3
|
+
function sqliteNow() {
|
|
4
|
+
const d = new Date();
|
|
5
|
+
return d.toISOString().replace('T', ' ').replace(/\.\d{3}Z$/, '');
|
|
6
|
+
}
|
|
2
7
|
export function createTraceId() {
|
|
3
8
|
return randomUUID();
|
|
4
9
|
}
|
|
@@ -18,7 +23,7 @@ export function trace(db, traceId, agent, action, input, output, opts = {}) {
|
|
|
18
23
|
parent_event_id: opts.parentEventId ?? null,
|
|
19
24
|
status: opts.status ?? 'ok',
|
|
20
25
|
duration_ms: opts.durationMs ?? 0,
|
|
21
|
-
created_at:
|
|
26
|
+
created_at: sqliteNow(),
|
|
22
27
|
};
|
|
23
28
|
}
|
|
24
29
|
export function getTraceEvents(db, traceId) {
|
package/dist/trace.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,KAAK,CACnB,EAAqB,EACrB,OAAe,EACf,KAAa,EACb,MAAc,EACd,KAAa,EACb,MAAc,EACd,OAII,EAAE;IAEN,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGvB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CACrB,OAAO,EACP,KAAK,EACL,MAAM,EACN,KAAK,EACL,MAAM,EACN,IAAI,CAAC,aAAa,IAAI,IAAI,EAC1B,IAAI,CAAC,MAAM,IAAI,IAAI,EACnB,IAAI,CAAC,UAAU,IAAI,CAAC,CACrB,CAAC;IACF,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;QAClC,QAAQ,EAAE,OAAO;QACjB,KAAK;QACL,MAAM;QACN,KAAK;QACL,MAAM;QACN,eAAe,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI;QAC3C,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;QAC3B,WAAW,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;QACjC,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nicofains1/agentwatch",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Multi-agent observability: cascade failure detection, heartbeats, and forensic replay",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -18,7 +18,17 @@
|
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"better-sqlite3": "^11.8.0"
|
|
20
20
|
},
|
|
21
|
+
"peerDependencies": {
|
|
22
|
+
"@opentelemetry/api": "^1.9.0",
|
|
23
|
+
"@opentelemetry/sdk-trace-base": "^1.30.0 || ^2.0.0"
|
|
24
|
+
},
|
|
25
|
+
"peerDependenciesMeta": {
|
|
26
|
+
"@opentelemetry/api": { "optional": true },
|
|
27
|
+
"@opentelemetry/sdk-trace-base": { "optional": true }
|
|
28
|
+
},
|
|
21
29
|
"devDependencies": {
|
|
30
|
+
"@opentelemetry/api": "^1.9.0",
|
|
31
|
+
"@opentelemetry/sdk-trace-base": "^2.0.0",
|
|
22
32
|
"@types/better-sqlite3": "^7.6.8"
|
|
23
33
|
},
|
|
24
34
|
"files": [
|
|
@@ -34,7 +44,9 @@
|
|
|
34
44
|
"tracing",
|
|
35
45
|
"fleet-management",
|
|
36
46
|
"ai-agents",
|
|
37
|
-
"debugging"
|
|
47
|
+
"debugging",
|
|
48
|
+
"opentelemetry",
|
|
49
|
+
"otel"
|
|
38
50
|
],
|
|
39
51
|
"author": "nicofains1",
|
|
40
52
|
"repository": {
|