mcpField
O
oodle-synthetic

oodle-synthetic

github.com/oodle-aiCloud & DevOps0125 installsUpdated 3w ago
Repository

About oodle-synthetic

oodle-synthetic is an agent skill for configuring HTTP and TCP synthetic monitors with the `oodle` CLI. It explains how to set check expectations and intervals, verify targets, and preserve monitor configuration when updating.

Key features

  1. 01Configure HTTP and TCP checks
  2. 02Set status, latency, and content expectations
  3. 03Choose probe intervals and timeouts
  4. 04Verify reachability before creation
  5. 05Preserve rule configuration during updates

Use cases

  1. 01Monitor an API health endpoint
  2. 02Check TCP service reachability
  3. 03Detect slow or unexpected responses
  4. 04Update an existing synthetic monitor

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/oodle-ai/agent-skills --skill oodle-synthetic

After installing, type/oodle-syntheticin Claude Code to confirm it loaded.

Details

From the project README

Oodle Synthetic Monitors — HTTP / TCP Checks

This skill teaches the agent to configure synthetic monitors that actually catch failures: expected status and latency, sane intervals, and update-without-overwrite.

Prerequisites

brew install oodle-ai/oodle/oodle
oodle configure

Confirm the synthetic-monitors endpoint works:

oodle synthetic-monitors list -o json | jq 'length'

Command Execution Order

Before running any oodle command:

  1. Check whether the target URL or hostport is already in context.
  2. If not, ask the user to confirm the target.
  3. Test the target manually (curl -I <url>) to confirm it is reachable from the public internet.
  4. Run oodle synthetic-monitors create -f monitor.json.
  5. After creation, verify the first run succeeded with oodle synthetic-monitors get <id> -o json.

Quick Reference

TaskCommand
List monitorsoodle synthetic-monitors list -o json
Get monitoroodle synthetic-monitors get <id> -o json
Create monitoroodle synthetic-monitors create -f monitor.json
Update monitoroodle synthetic-monitors update <id> -f monitor.json
Delete monitoroodle synthetic-monitors delete <id> --force

Common Operations

Synthetic monitor schema (HTTP)
{
  "name": "API health check",
  "enabled": true,
  "rule_type": "http",
  "rule_config": {
    "http": {
      "url": "https://api.example.com/health",
      "method": "GET",
      "expected_status_codes": [200],
      "max_response_time_ms": 2000
    }
  },
  "interval": "60s",
  "timeout": "10s",
  "conditions": {
    "critical": {"op": "<", "value": 1}
  }
}
FieldMeaning
rule_typehttp or tcp (also ping, dns, ssl, traceroute, multistep)
rule_config.httpurl and method (HTTP)
rule_config.tcphost and port (TCP)
intervalDuration string between probes ("60s"); minimum 10s, recommended ≥ 60s
timeoutDuration string; at least 1s, and not more than interval
expected_status_codesStatus codes (200) or patterns ("2XX") that pass. excluded_status_codes fails on a match
max_response_time_msThe check fails when the response is slower
expected_body, expected_headersContent the response must have (e.g. "ok")
conditionsThe check result is 1 (up) or 0 (down), so {"op": "<", "value": 1} alerts when a check fails. op is a string: >, >=, <, <=, ==, !=
Synthetic monitor schema (TCP)
{
  "name": "Postgres reachability",
  "enabled": true,
  "rule_type": "tcp",
  "rule_config": {
    "tcp": {"host": "postgres.example.com", "port": 5432}
  },
  "interval": "60s",
  "timeout": "5s",
  "conditions": {
    "critical": {"op": "<", "value": 1}
  }
}
Creating a monitor
# ✅ 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
Updating a monitor
# ✅ CORRECT — get → edit → update preserves rule_config
oodle synthetic-monitors get syn_123 -o json > monitor.json
jq '.interval = "30s"' monitor.json > monitor.new.json
oodle synthetic-monitors update syn_123 -f monitor.new.json

# ❌ WRONG — partial payload removes rule_config
oodle synthetic-monitors update syn_123 -f <(echo '{"interval":"30s"}')
Deleting a monitor
# ✅ 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}')" --force

Best Practices

Use interval: "60s" (or higher) for non-critical endpoints

A 10-second interval on every endpoint multiplies cost and noise. Reserve short intervals for critical user-facing flows.

# ✅ CORRECT — 60s interval for a /health endpoint
"interval": "60s"

# ❌ WRONG — 10s on dozens of internal endpoints
"interval": "10s"
Always set expected_status_codes

Without it, the check passes on any 2XX response, which may not be the response you expect.

# ✅ CORRECT
"expected_status_codes": [200], "max_response_time_ms": 2000

# ❌ WRONG — monitor "succeeds" on any 2XX response
"expected_status_codes": []
Add max_response_time_ms to catch slow dependencies

A 200 response that takes 30 seconds is still a failure for users.

# ✅ CORRECT
"expected_status_codes": [200],
"max_response_time_ms": 2000

# ❌ WRONG — only checks status code, doesn't catch latency regressions
"expected_status_codes": [200]
Always get before update to preserve rule_config

Update is a full-document replace.

# ✅ CORRECT
oodle synthetic-monitors get syn_123 -o json > m.json
jq '.rule_config.http.expected_body = "ok"' m.json > m.new.json
oodle synthetic-monitors update syn_123 -f m.new.json

# ❌ WRONG — drops `rule_config`
oodle synthetic-monitors update syn_123 -f <(echo '{"interval":"120s"}')
Use a stable name per environment

Encode env in the name (API health check (prod), API health check (staging)) so the alert recipient knows which env to investigate.

# ✅ CORRECT
"name": "API health check (prod)"

# ❌ WRONG
"name": "health"

Failure Handling

ErrorCauseFix
401 UnauthorizedInvalid or missing API keyRun oodle configure or set OODLE_API_KEY
404 Not FoundSynthetic monitor ID does not existVerify with oodle synthetic-monitors list -o json
connection refusedWrong OODLE_DEPLOYMENT URLCheck OODLE_DEPLOYMENT env var
Monitor permanently redTarget unreachable from the probe egresscurl -I from the public internet; check firewall, DNS, TLS cert
Monitor flapsinterval too aggressive or max_response_time_ms too tightRaise interval to 60s; raise max_response_time_ms to p95+headroom
interval must be at least 10 seconds / timeout cannot exceed intervalWrong durations, or a plain numberUse duration strings such as "60s" and "10s"
rule_config silently droppedupdate was called with a partial payloadRe-create from the last get snapshot; always get → edit → update
429 Too Many RequestsMany probes scheduled at the same secondStagger by editing interval per monitor; use --retries 3 for bulk operations

References

Comments

Markdown supported