Loading...
Loading...
Create and manage Oodle synthetic monitors — HTTP and TCP health checks with assertions and configurable intervals.
npx skill4agent add oodle-ai/agent-skills oodle-syntheticbrew install oodle-ai/oodle/oodle
oodle configureoodle synthetic-monitors list -o json | jq 'length'curl -I <url>oodle synthetic-monitors create -f monitor.jsonoodle synthetic-monitors get <id> -o json| Task | Command |
|---|---|
| List monitors | |
| Get monitor | |
| Create monitor | |
| Update monitor | |
| Delete monitor | |
{
"name": "API health check",
"type": "http",
"target": "https://api.example.com/health",
"interval": 60,
"assertions": [
{"type": "statusCode", "value": "200"},
{"type": "responseTime", "value": "2000"}
]
}| Field | Meaning |
|---|---|
| |
| URL (HTTP) or |
| Seconds between probes; minimum 30, recommended ≥ 60 |
| |
| String form of the expected value (e.g. |
{
"name": "Postgres reachability",
"type": "tcp",
"target": "postgres.example.com:5432",
"interval": 60,
"assertions": [
{"type": "responseTime", "value": "1000"}
]
}# ✅ CORRECT — manual reachability test, then create
curl -sSfI https://api.example.com/health
oodle synthetic-monitors create -f monitor.json
# ❌ WRONG — creating against an unreachable target leaves a permanently-failing monitor
oodle synthetic-monitors create -f monitor.json# ✅ CORRECT — get → edit → update preserves all assertions
oodle synthetic-monitors get syn_123 -o json > monitor.json
jq '.interval = 30' monitor.json > monitor.new.json
oodle synthetic-monitors update syn_123 -f monitor.new.json
# ❌ WRONG — partial payload removes assertions
oodle synthetic-monitors update syn_123 -f <(echo '{"interval":30}')# ✅ CORRECT
oodle synthetic-monitors get syn_123 -o json > /dev/null
oodle synthetic-monitors delete syn_123 --force
# ❌ WRONG — name-grep delete
oodle synthetic-monitors delete "$(oodle synthetic-monitors list | grep health | awk '{print $1}')" --forceinterval: 60# ✅ CORRECT — 60s interval for a /health endpoint
"interval": 60
# ❌ WRONG — 10s on dozens of internal endpoints
"interval": 10statusCode# ✅ CORRECT
"assertions": [{"type":"statusCode","value":"200"},{"type":"responseTime","value":"2000"}]
# ❌ WRONG — monitor "succeeds" on a 500 response
"assertions": []responseTime# ✅ CORRECT
"assertions": [
{"type":"statusCode","value":"200"},
{"type":"responseTime","value":"2000"}
]
# ❌ WRONG — only checks status code, doesn't catch latency regressions
"assertions": [{"type":"statusCode","value":"200"}]getupdate# ✅ CORRECT
oodle synthetic-monitors get syn_123 -o json > m.json
jq '.assertions += [{"type":"bodyContains","value":"ok"}]' m.json > m.new.json
oodle synthetic-monitors update syn_123 -f m.new.json
# ❌ WRONG — drops `assertions` and `target`
oodle synthetic-monitors update syn_123 -f <(echo '{"interval":120}')nameAPI health check (prod)API health check (staging)# ✅ CORRECT
"name": "API health check (prod)"
# ❌ WRONG
"name": "health"| Error | Cause | Fix |
|---|---|---|
| 401 Unauthorized | Invalid or missing API key | Run |
| 404 Not Found | Synthetic monitor ID does not exist | Verify with |
| connection refused | Wrong | Check |
| Monitor permanently red | Target unreachable from the probe egress | |
| Monitor flaps | | Raise interval to 60s; raise |
| Assertions silently dropped | | Re-create from the last |
| 429 Too Many Requests | Many probes scheduled at the same second | Stagger by editing |