Skip to content

Service twin · API + UI

Datadog

Test observability and on-call agents that manage monitors, dashboards, events, metrics, logs, SLOs, downtimes, incidents, synthetics tests, and notebooks.

API + UIspec-groundedREST · MCP · CLI
Terminal
$ uv tool install --with "blobfish-sdk @ https://blobfish.ai/sdk/blobfish_sdk-0.6.2-py3-none-any.whl" "blobfish-cli @ https://blobfish.ai/sdk/blobfish_cli-0.1.13-py3-none-any.whl"
$ blobfish login
$ blobfish twin-runs create --twins datadog --ttl 60 --wait

What’s inside

A deterministic, seeded, resettable replica: every operation below executes real state transitions against the twin’s own SQLite state — reads are hash-invariant, writes produce inspectable diffs, and reset restores the seed baseline.

Operations133
Reads64
Writes69
Entities26
Lifecycles1

Seeded entities

EntityTableFieldsAbout
dashboarddashboards19A dashboard (v1 Dashboard object): title, layout_type and widgets are required, as in the vendor schema.
dashboard_listdashboard_lists8A manual dashboard list (v1 DashboardList object).
downtimedowntimes14A downtime (v2 JSON:API resource, modeled flat: id, type + attributes). Cancel is a guarded status transition to `canceled`, as the vendor keeps canceled downtimes listable.
eventevents21An event (v1 Event object; v2 event reads add message/timestamp flat). v1 and v2 event operations share this table.
incidentincidents31An incident (v2 JSON:API resource, modeled flat: id, type + attributes; create/update bodies are the request's attributes object).
incident_impactincident_impacts10An incident impact (v2 JSON:API resource, modeled flat; incident_id is taken from the URL).
incident_todoincident_todos9An incident todo (v2 JSON:API resource, modeled flat; incident_id references the incident).
incident_typeincident_types11An incident type (v2 JSON:API resource, modeled flat: id, type + attributes).
loglogs12A log line: the v2 intake item (ddsource, ddtags, hostname, message, service) plus the searchable log attributes (host, status, tags, timestamp), modeled flat.
logs_archivelogs_archives12A logs archive (v2 JSON:API resource, modeled flat: id, type + attributes).
logs_metriclogs_metrics5A log-based metric (v2 JSON:API resource, modeled flat: id, type + attributes).
logs_pipelinelogs_pipelines9A logs processing pipeline (v1 LogsPipeline object).
metricmetrics11A submitted metric series (v2 MetricSeries / v1 Series): one row per submitted series; the query endpoints search these rows and the v1/v2 metrics listings (`GET /api/v1/metrics`, `GET /api/v2/metrics`) are served from them. Per-metric-name metadata and tag-configuration writes are not modeled.
monitormonitors18A monitor (v1 Monitor object): type + query define the check; options/tags/priority as in the vendor schema. type is enum-checked on write; priority is declared 1..5 (seeds stay in range) but not enforced on write. The server-computed per-group `state` object is not modeled (the twin evaluates no monitor queries), so reads carry no `state` key.
monitor_config_policymonitor_config_policies4Monitor configuration policy (v2 JSON:API resource, modeled flat: id, type + attributes).
monitor_notification_rulemonitor_notification_rules9Monitor notification rule (v2 JSON:API resource, modeled flat: id, type + attributes).
notebooknotebooks11A notebook (v1 JSON:API resource, modeled flat: id, type + attributes; create/update bodies are the request's attributes object).
service_checkservice_checks7A submitted service check run (v1 ServiceCheck object), one row per submitted check.
shared_dashboardshared_dashboards18A public (shared) dashboard link (v1 SharedDashboard object), keyed by its share token.
sloslos17A service level objective (v1 ServiceLevelObjective object).
slo_correctionslo_corrections15An SLO status correction (v1 JSON:API resource, modeled flat: id, type + attributes; slo_id references the SLO).
synthetics_global_variablesynthetics_global_variables10A synthetics global variable (v1 SyntheticsGlobalVariable object).
synthetics_locationsynthetics_locations2A synthetics managed location (v1 SyntheticsLocation object).
synthetics_private_locationsynthetics_private_locations6A synthetics private location (v1 SyntheticsPrivateLocation object).
synthetics_testsynthetics_tests13A synthetics test (v1 SyntheticsTestDetails, API and browser variants merged), keyed by public_id. Bulk delete, trigger runs and the pause toggle are not modeled.
synthetics_test_resultsynthetics_test_results8A synthetics API test result (v1 result objects), keyed by result_id; public_id is taken from the URL.

Guarded lifecycles

These state machines are enforced, not decorative: an action whose from state doesn’t match is rejected the way the production service rejects it.

downtime.status

active → canceled → ended → scheduled
  • cancel: scheduled|active → canceled

Three surfaces, one state

Mount Datadog in a twin environment and the same seeded state serves vendor-shaped REST operations, an MCP endpoint for tool calling, and a generated bf-twin CLI — with copy-on-write sessions per rollout and a one-call reset to the seed baseline. Prefer raw HTTP? The same create works with curl:

API
$ curl -sS -X POST https://blobfish.ai/api/v1/twin/environments \
    -H "X-API-Key: $BLOBFISH_API_KEY" -H "Content-Type: application/json" \
    -d '{"services":["datadog"],"ttl_minutes":60}'

Known limitations

Spec-grounded surface with synthetic seeded values; operations outside the spec are not mounted.