Observability Studio is a local OpenTelemetry workspace for receiving, exploring, and validating telemetry while developing services. It includes a Go collector, REST API, MCP server, React UI, and repo-scoped agent skills for auditing, adding, and verifying OpenTelemetry instrumentation.
| Skill | Purpose |
|---|---|
$otel-audit |
Scan a service for observability coverage gaps without modifying code |
$otel-instrument |
Add OpenTelemetry auto-instrumentation, default local application logs, and optional custom spans or metrics |
$otel-verify |
Prove existing instrumentation with app-code tests and optional local OTLP evidence |
$splunk-configure |
Generate Splunk O11y detector Terraform from an audit report |
$splunk-detector-publish |
Diff local detector Terraform against live Splunk detectors and create only the gaps |
$splunk-dashboard-publish |
Diff local dashboard Terraform against live Splunk dashboards and create only the gaps |
$splunk-sync |
(deprecated, use $splunk-detector-publish) Diff local detector Terraform against live Splunk detectors and create only the gaps |
$splunk-dashboard-sync |
(deprecated, use $splunk-dashboard-publish) Diff local dashboard Terraform against live Splunk dashboards and create only the gaps |
The canonical skill sources live under skills/. Codex discovers repo-local
entries through .agents/skills/, which points at those source directories.
Download the latest zip for your platform from Releases, then install the skills and MCP config for your agent:
unzip obstudio_*_darwin_arm64.zip
cd obstudio_*_darwin_arm64
# Install for all supported agents (or pass just one target)
./obstudio install --target=codex,claude-code,cursor,kiro,windsurf,copilotAfter unzipping the release, run obstudio install from that extracted
directory without moving the files. The installer expects weaver to be next
to obstudio. --target accepts codex, claude-code, cursor, kiro,
windsurf, copilot, or a comma-separated list of those values. For each
selected agent with a skills directory, the installer stores the managed bundle
under that directory and creates top-level discoverable skill entries such as
otel-audit, otel-instrument, and otel-verify in the agent skills root.
copilot has no agent-skills mechanism, so its install configures only the MCP
server (VS Code user mcp.json) and installs no skill entries.
After installation, restart the agent if it does not discover the new skills.
Kiro installs the bundle under ~/.kiro/skills/obstudio, creates its
discoverable skill entries in ~/.kiro/skills, and configures MCP in
~/.kiro/settings/mcp.json. Invoke a skill in Kiro with its slash command,
such as /otel-audit.
Pass --connect-remote-o11y to also connect the installed target(s) to the
Splunk Observability remote MCP server (separate from the local server the
install above configures) — see
docs/USER.md.
Release archives are verified against checksums.txt published by the release
pipeline before the Codex plugin bootstrapper extracts them.
For the Codex plugin trust contract, including local Observer bootstrap,
localhost endpoints and Splunk publish behavior,
see plugins/obstudio/SECURITY.md and
plugins/obstudio/PRIVACY.md. The same plugin
bundle serves Claude Code through the repository's .claude-plugin/marketplace.json.
make build
make runThe collector starts on:
| Service | URL |
|---|---|
| Telemetry Explorer | http://localhost:3000 |
| OTLP/HTTP | http://localhost:4318 |
| OTLP/gRPC | localhost:4317 |
| MCP endpoint | http://localhost:3000/mcp |
Use obstudio --observer-http-port <port> to move the Observer UI, REST API,
and MCP endpoint to a different port. The OTLP receivers stay fixed at 4318
and 4317; these are also used by the editor extension.
Use this workflow when editing the Telemetry Explorer UI (observer/client)
and you want changes to show up without a full make build each time.
-
Start the collector with the
devbuild tag so it serves client assets straight from disk instead of the snapshot embedded bymake build:make build-client cd observer && go run -tags dev ./cmd/obstudio
-
In a second terminal, watch and rebuild the client on every save:
make dev
-
Open http://localhost:3000. From here it hot-reloads on its own: each client rebuild pushes a reload signal over the existing telemetry WebSocket to every open tab, so there's no need to manually refresh the browser after a save.
The dev build tag only affects the binary you run locally with go run -tags dev; release and embedded builds (make build/make run) never
include it, and the reload-trigger endpoint it adds does not exist otherwise.
Obstudio accepts OTLP traces, metrics, and logs and displays all three in the
local Telemetry Explorer. Splunk Observability Cloud forwarding is opt-in and
applies only to traces and metrics. Logs sent to /v1/logs remain in the local
Explorer's Logs view, even when trace and metric forwarding are enabled.
To forward received metrics to Splunk Observability Cloud, put the settings in Obstudio's default env file:
mkdir -p ~/.obstudio
chmod 700 ~/.obstudio
cat > ~/.obstudio/env <<'EOF'
OBSTUDIO_SPLUNK_METRICS_EXPORT=true
SPLUNK_REALM=<your-realm>
SPLUNK_ACCESS_TOKEN=<your-org-ingest-token>
EOF
chmod 600 ~/.obstudio/env
obstudioThe token must be an org access token with ingest scope. Splunk's documented
OTLP/HTTP authentication header is X-SF-Token.
Shell environment variables override values from the env file. Use
obstudio --env-file <path> or OBSTUDIO_ENV_FILE=<path> to load a different
env file.
Obstudio forwards metrics over OTLP/HTTP protobuf to:
https://ingest.<realm>.observability.splunkcloud.com/v2/datapoint/otlp
Use OBSTUDIO_SPLUNK_METRICS_ENDPOINT to override the full endpoint. Explicit
endpoint values are used exactly as configured. Use
OBSTUDIO_SPLUNK_METRICS_TIMEOUT to override the default 5s export timeout.
The access token is only read from the environment and is never returned by
/api/health.
To also forward received traces to Splunk Observability Cloud APM, add the traces flag to the same env file:
cat >> ~/.obstudio/env <<'EOF'
OBSTUDIO_SPLUNK_TRACES_EXPORT=true
EOFThe same SPLUNK_REALM and SPLUNK_ACCESS_TOKEN values are used for both
metrics and traces. Obstudio forwards traces over OTLP/HTTP protobuf to:
https://ingest.<realm>.observability.splunkcloud.com/v2/trace/otlp
Use OBSTUDIO_SPLUNK_TRACES_ENDPOINT to override the full endpoint. Use
OBSTUDIO_SPLUNK_TRACES_TIMEOUT to override the default 5s export timeout.
Once traces are flowing, the service appears as an APM service in Splunk
Observability Cloud and becomes a valid target for $splunk-sync.
From a service directory, invoke the relevant skill in Codex:
$otel-audit
$otel-instrument
$otel-verify
$splunk-configure
$splunk-sync
Use $otel-audit to understand what is missing before editing. Use
$otel-instrument when you are ready to add SDK setup, auto-instrumentation,
and targeted custom signals. It runs the $otel-verify workflow by default
after its implementation gate. The audit writes canonical
.observe/otel-audit.json plus a self-contained .observe/otel.html; review
and select findings through the returned localhost link, then copy and run the
generated $otel-instrument command. The command carries the explicit finding
IDs, decision answers, and validated service root. You can alternatively invoke
$otel-instrument --ids OTEL-001,OTEL-004 directly; the skill writes the same
validated selection handoff before editing. Instrumentation writes a separate
.observe/otel-instrumentation.html that maps selected gaps to code changes,
exact telemetry, product impact, proof, and next actions; it does not turn the
audit HTML into a change log. Both HTML reports are returned as user-clicked,
tokenized 127.0.0.1 links and are never opened automatically. Markdown and
JSON reports remain local-file links. The bundled renderer uses only the Python
standard library, and both HTML reports have no Bun, Node, YAML parser, package,
font, or external network dependency. Run $otel-verify after the canonical
audit/selection and instrumentation handoff to recheck existing instrumentation
and refresh proof in the instrumentation HTML. It produces
.observe/otel-verify.json plus the readable .observe/otel-verify.md. See
OTel Verify for invocation and report-reading guidance.
Use $splunk-configure after auditing to generate Splunk Observability Cloud
detector Terraform — it reads the audit report, classifies metrics, and outputs
ready-to-apply HCL with a terraform.tfvars.example for credentials. Use
$splunk-sync to diff those specs against live Splunk detectors and create only
the ones that don't exist yet.
Validation is available through the Explorer UI, REST API, and MCP.
- Start
obstudio. - Send traces, metrics, and logs to the OTLP receiver.
- Open the Validation tab and run validation.
- Use the findings to inspect affected telemetry rows.
| Surface | Entry points |
|---|---|
| REST | /api/query/validation/summary, /api/query/validation/latest, /api/validation/run, /api/validation/refresh |
| MCP | observer_validation_status, observer_validation_analyze, observer_validation_refresh |
If you move obstudio manually instead of using obstudio install, keep
the bundled weaver runtime beside it or make weaver available on
PATH.
obstudio/
├── observer/ # Go collector, REST API, MCP server, and embedded web UI
├── extension/ # VS Code-compatible extension for Visual Studio Code, Kiro, and Cursor
├── skills/ # Canonical agent skill sources
│ ├── otel-audit/
│ ├── otel-instrument/
│ ├── otel-verify/
│ ├── splunk-configure/
│ ├── splunk-detector-publish/
│ ├── splunk-sync/ # deprecated alias → splunk-detector-publish
│ ├── splunk-dashboard-publish/
│ ├── splunk-dashboard-sync/ # deprecated alias → splunk-dashboard-publish
│ └── references/ # Shared language guides and signal references
├── .agents/skills/ # Repo-scoped Codex skill entries
├── evals/ # Fixture services and JSON eval cases
├── pytest-codex-evals/# Reusable pytest plugin for Codex eval harnessing
├── eval-reports/ # Latest summarized eval reports
├── docs/ # Design docs and usage examples
├── Makefile
├── AGENTS.md
└── CONTRIBUTING.md
| Tool | Version | Purpose |
|---|---|---|
| Go | 1.25+ | Collector and CLI |
| Node.js | 20+ | React client and VS Code-compatible editor extension |
| npm | latest | JavaScript package management |
| uv | latest | Python eval harness and Python fixture apps |
| Docker | latest | Optional runtime eval checks |
| Target | Description |
|---|---|
make build |
Build the obstudio binary with embedded skills and client assets |
make run |
Build and start the collector |
make test |
Run Go tests |
make test-client |
Run React client tests |
make test-extension |
Run extension tests |
make test-all |
Run Go, client, extension, and skill-script tests |
make fmt |
Format Go source |
make vet |
Vet Go source |
make tidy |
Tidy Go modules |
make list-skills |
List repo skills |
make eval-validation |
Validate eval JSONs without running Codex |
make eval-sanity |
Run quick loaded-skill eval checks |
make eval-rubric |
Run schema-constrained rubric eval checks |
make eval-runtime |
Run Docker/Observer runtime eval checks |
make -C evals eval-*-test / make -C evals eval-*-report |
Split eval execution from report rendering |
make eval-all |
Run validation, sanity, rubric, and runtime evals |
make eval-all-ab |
Run validation plus A/B sanity, rubric, and runtime evals |
make test-pytest-plugin |
Run reusable pytest plugin tests |
make build-pytest-plugin |
Build pytest plugin distribution artifacts |
make publish-pytest-plugin |
Publish pytest plugin artifacts with uv publish credentials |
make release-local |
Build local release archives |
make clean |
Remove build artifacts |
Skill eval definitions and fixture apps live under evals/. See
evals/README.md for eval modes, commands, configs, and
report locations.
| Command | Description |
|---|---|
obstudio |
Start the collector, web UI, REST API, OTLP receivers, and MCP server |
obstudio install --target=<agent>[,<agent>...] |
Install skills and configure MCP for one or more supported agents |
obstudio --version |
Print version |
Read CONTRIBUTING.md for the development process and AGENTS.md for repo-specific AI agent guidelines.
Apache License 2.0. See LICENSE.