Skip to content

Commit cf11542

Browse files
Sync docs from cloudflare/agents#639: update msg publishing logic (docs workflow)
1 parent cc1bdf9 commit cf11542

File tree

1 file changed

+182
-0
lines changed

1 file changed

+182
-0
lines changed
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
---
2+
title: Observability
3+
pcx_content_type: concept
4+
sidebar:
5+
order: 2
6+
7+
---
8+
9+
`Agent` instances use the `observability` property to emit various internal events that can be used for logging, monitoring, and debugging. This provides deep visibility into agent behavior and lifecycle events.
10+
11+
## Default Behavior
12+
13+
The default behavior is to `console.log()` the event value:
14+
15+
```json
16+
{
17+
displayMessage: 'State updated',
18+
id: 'EnOzrS_tEo_8dHy5oyl8q',
19+
payload: {},
20+
timestamp: 1758005142787,
21+
type: 'state:update'
22+
}
23+
```
24+
25+
## Event Types
26+
27+
The SDK emits the following event types:
28+
29+
### Connection Events
30+
31+
- `connect` - New client connection established
32+
- `disconnect` - Client connection closed
33+
- `error` - Connection error occurred
34+
35+
### State Events
36+
37+
- `state:update` - Agent state was modified
38+
- `state:read` - Agent state was accessed
39+
40+
### Message Events
41+
42+
- `message:sent` - Message sent to client
43+
- `message:received` - Message received from client
44+
- `message:error` - Message processing error
45+
46+
### AI Events
47+
48+
- `ai:request` - AI model request started
49+
- `ai:response` - AI model response received
50+
- `ai:error` - AI model request failed
51+
52+
### Tool Events
53+
54+
- `tool:call` - Tool execution started
55+
- `tool:result` - Tool execution completed
56+
- `tool:error` - Tool execution failed
57+
58+
## Custom Observability
59+
60+
You can configure custom observability by implementing the `Observability` interface:
61+
62+
```ts
63+
import { Agent } from "agents";
64+
import { type Observability } from "agents/observability";
65+
66+
const observability: Observability = {
67+
emit(event) {
68+
if (event.type === "connect") {
69+
console.log(event.timestamp, event.payload.connectionId);
70+
}
71+
}
72+
};
73+
74+
class MyAgent extends Agent {
75+
override observability = observability;
76+
}
77+
```
78+
79+
## Integration Examples
80+
81+
### Logging to External Service
82+
83+
```ts
84+
import { type Observability } from "agents/observability";
85+
86+
const loggingObservability: Observability = {
87+
async emit(event) {
88+
// Send to logging service
89+
await fetch("https://logs.example.com/events", {
90+
method: "POST",
91+
body: JSON.stringify({
92+
service: "my-agent",
93+
level: event.type.includes("error") ? "error" : "info",
94+
timestamp: event.timestamp,
95+
message: event.displayMessage,
96+
data: event.payload
97+
})
98+
});
99+
}
100+
};
101+
```
102+
103+
### Metrics and Monitoring
104+
105+
```ts
106+
import { type Observability } from "agents/observability";
107+
108+
const metricsObservability: Observability = {
109+
emit(event) {
110+
// Track connection metrics
111+
if (event.type === "connect") {
112+
// Increment active connections counter
113+
env.METRICS.writeDataPoint({
114+
metric: "agent.connections.active",
115+
value: 1,
116+
timestamp: event.timestamp
117+
});
118+
}
119+
120+
// Track AI model latency
121+
if (event.type === "ai:response") {
122+
const latency = event.payload.duration;
123+
env.METRICS.writeDataPoint({
124+
metric: "agent.ai.latency",
125+
value: latency,
126+
timestamp: event.timestamp
127+
});
128+
}
129+
}
130+
};
131+
```
132+
133+
### Filtering Events
134+
135+
```ts
136+
import { type Observability } from "agents/observability";
137+
138+
const filteredObservability: Observability = {
139+
emit(event) {
140+
// Only log errors and AI events
141+
if (event.type.includes("error") || event.type.startsWith("ai:")) {
142+
console.error("[Agent Event]", {
143+
type: event.type,
144+
message: event.displayMessage,
145+
payload: event.payload
146+
});
147+
}
148+
}
149+
};
150+
```
151+
152+
## Disabling Observability
153+
154+
To disable all observability events, set the property to `undefined`:
155+
156+
```ts
157+
import { Agent } from "agents";
158+
159+
class MyAgent extends Agent {
160+
override observability = undefined;
161+
}
162+
```
163+
164+
## Best Practices
165+
166+
### Performance Considerations
167+
168+
- Observability handlers should be non-blocking
169+
- Use async operations carefully to avoid slowing down agent operations
170+
- Consider batching events for external services
171+
172+
### Security
173+
174+
- Filter sensitive data from event payloads before sending to external services
175+
- Use secure connections for external logging services
176+
- Implement rate limiting for observability endpoints
177+
178+
### Debugging
179+
180+
- Enable full observability in development environments
181+
- Use filtered observability in production to reduce noise
182+
- Include correlation IDs in events for distributed tracing

0 commit comments

Comments
 (0)