Skip to content
sigiro

The data layer for software that repairs itself.

Send OpenTelemetry to sigiro. When a service fails, you get ranked results, the suspect deploy, and the query for each result.

factory loop · five stages
Detect, step 1 of 5

Detect · sigiro

$ curl -sS -X POST localhost:9999/v1/query --data-binary "SELECT count(*) AS failed_spans FROM sigiro_spans WHERE service_name = 'checkout' AND status_code = 2 AND timestamp > CURRENT_TIMESTAMP - INTERVAL '30 minutes'"

[{ "failed_spans": 246 }]

Diagnose · sigiro

$ curl -sS -X POST localhost:9999/v1/query --data-binary "SELECT span_name, count(*) AS failures FROM sigiro_spans WHERE service_name = 'checkout' AND status_code = 2 AND timestamp > CURRENT_TIMESTAMP - INTERVAL '30 minutes' GROUP BY span_name ORDER BY failures DESC LIMIT 5"

[{ "span_name": "POST /api/orders", "failures": 246 }]

Fix · your agent

$ claude "checkout times out since 9f2c1ab"

read src/orders/upstream.ts

edit src/orders/upstream.ts +4 −1

test 42 passed

push fix: bound the orders upstream call at 5s

Verify · your pipeline, on our evidence

$ curl -sS -X POST localhost:9999/v1/query --data-binary "SELECT count(*) AS errors_last_5m FROM sigiro_spans WHERE service_name = 'checkout' AND status_code = 2 AND timestamp > CURRENT_TIMESTAMP - INTERVAL '5 minutes'"

[{ "errors_last_5m": 0 }]

Learn · your memory

$ cat playbooks/checkout-upstream-timeout.md

## checkout · upstream timeout

observed 246 failed checkout spans in a 30-minute window

cause unbounded upstream call, shipped in 9f2c1ab

fix 5s deadline on the orders client

watch the same shape on any service calling orders

Free when you install it. sigiro sends no data to us.

how you use it

Four steps. You connect, ask, correlate, and prove.

You send OpenTelemetry to sigiro. You ask one question. Each step below is one shell session.

Connect, step 1 of 4
Connect1 of 4
$ curl -fsSL https://sigiro.com/install | sh
installed ~/.local/bin/sigiro
$ sigiro serve &
[1] 41802
listening on 4317, 4318, 9999
$ export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
$ export OTEL_SERVICE_NAME=checkout
$ npm start &
[1] 41823
checkout listening on :3000
$ sigiro status
ready · OTLP 4317 and 4318 · service checkout · 18,402 spans in 5 min
$

sigiro uses standard OTLP on the standard ports.

$ curl -fsSL https://sigiro.com/install | sh
installed ~/.local/bin/sigiro

$ sigiro serve &
[1] 41802
listening on 4317, 4318, 9999

$ export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
$ export OTEL_SERVICE_NAME=checkout
$ npm start &
[1] 41823
checkout listening on :3000

$ sigiro status
ready · OTLP 4317 and 4318 · service checkout · 18,402 spans in 5 min

$ curl -sS -X POST localhost:9999/v1/query --data-binary "SELECT span_name, count(*) AS calls FROM sigiro_spans WHERE service_name = 'checkout' AND timestamp > CURRENT_TIMESTAMP - INTERVAL '30 minutes' GROUP BY span_name ORDER BY calls DESC LIMIT 5"
[
  { "span_name": "POST /api/orders", "calls": 1284 },
  { "span_name": "GET /api/cart", "calls": 342 }
]

$ cat models.sql
SELECT model, count(*) AS calls, max(duration) AS slowest
FROM spans JOIN logs USING (trace_id)
WHERE service = 'checkout' AND status = 'error'
GROUP BY model ORDER BY slowest DESC

$ curl -sS -X POST localhost:9999/v1/query --data-binary "$(cat models.sql)"
MODEL           CALLS  SLOWEST
gpt-5.2-mini      246    30.0s
claude-haiku-4.6   31     2.1s

$ curl -sS -X POST localhost:9999/v1/query --data-binary "SELECT trace_id, duration, status_message FROM sigiro_spans WHERE service_name = 'checkout' AND status_code = 2 AND timestamp > CURRENT_TIMESTAMP - INTERVAL '30 minutes' ORDER BY timestamp DESC LIMIT 3"
[
  { "trace_id": "9f2c1ab4e77d", "duration": 30012, "status_message": "context deadline exceeded" },
  { "trace_id": "3b81fe0a2c56", "duration": 30004, "status_message": "context deadline exceeded" }
]

Start

install the CLI
curl -fsSL https://sigiro.com/install | sh

Installs a single binary to ~/.local/bin/sigiro. Reads the script first if you would rather: sigiro.com/install.

or give this to your agent
Install and run sigiro, the open-source observability data layer, on this machine. Run: curl -fsSL https://sigiro.com/install | sh — then start it with: sigiro serve. It listens on 4317 and 4318 for OTLP and on 9999 for its HTTP API. Point this project’s OpenTelemetry exporter at http://localhost:4318. Then add https://sigiro.com/mcp as an MCP server so you can query the telemetry directly; it uses OAuth device flow, so open the URL it prints to authorize.

Paste into Claude Code, Codex, Cursor or any MCP-capable agent. It installs sigiro, starts it, and connects over /mcp.

01

Discover. Your agent reads the API description without help.

One public document describes all of the endpoints.

GET /openapi.json · public, no key
[
  "/v1/query",
  "/v1/services",
  "/v1/traces/{trace_id}"
]

what you get

No migration. sigiro connects to the tools you use.

Send telemetry from

  • OpenTelemetry
  • Node.js
  • Python
  • Go
  • Java
  • .NET
  • Ruby
  • Rust
  • Claude Code
  • Codex
  • Vercel AI SDK
  • LangChain
  • Ollama

Run it on

  • Docker
  • Kubernetes
  • Fly.io
  • Railway
  • Render
  • Cloudflare

Read by

  • Claude Code
  • Cursor
  • Codex
  • Anything that speaks SQL
Prove it yourself
Each result contains the query that made it.
Nothing to maintain
You set no thresholds and no rules. sigiro uses the history of each service.
Installation in five minutes
One command and two environment variables. You change no code.
Free when you install it
No fees for hosts, seats or data. Talk to us if you want us to run it for you.
Your data stays with you
You install sigiro on your servers. sigiro sends no data to us.
sigiro monitors sigiro
sigiro sends its telemetry to sigiro. This is how we find our own failures.