Send OpenTelemetry. Query it with SQL.
sigiro stores your traces, logs, metrics and profiles. Query them with SQL over one HTTP API, from your agent through the CLI and MCP, or in the dashboard.
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
Installed on your servers: free, and sigiro sends no data to us. Signed up: the hosted beta, which stores your telemetry on servers we run.
how you use it
Four steps. You connect, ask, correlate, and drill down.
Point your OpenTelemetry exporter at sigiro, then ask in SQL. Each step below is one shell session.
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 s.span_attributes ->> 'gen_ai.request.model' AS model,
count(DISTINCT s.span_id) AS calls, max(s.duration) AS slowest
FROM sigiro_spans s JOIN sigiro_logs l USING (trace_id)
WHERE s.service_name = 'checkout' AND l.severity_number >= 17
AND s.timestamp > now() - INTERVAL '30 minutes'
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
Installs a single binary to ~/.local/bin/sigiro. Reads the script first if you would rather: sigiro.com/install.
Paste into Claude Code, Codex, Cursor or any MCP-capable agent. It installs sigiro, starts it, and registers sigiro mcp as an MCP server.
Discover. Your agent reads the API description without help.
One public document describes all of the endpoints.
[
"/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
- Answers you can rerun
- Every answer is a SQL query. You, your agent or a teammate can run it again.
- Every signal in one place
- Traces, logs, metrics and profiles are tables you can join in one query.
- 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 when you run it. The hosted beta has no published price yet; talk to us.
- Your data stays with you
- You install sigiro on your servers. sigiro sends no data to us. The hosted beta is the exception: it stores your telemetry with us.
- sigiro monitors sigiro
- sigiro sends its telemetry to sigiro. This is how we find our own failures.