L
Observability

Logs

Structured logs with Postgres full-text search (`tsvector` + `pg_trgm`).

How it works

Logs are accepted on `POST /v1/logs` with severity (debug/info/warn/error/fatal), service_name, message, attributes, and optional trace_id/span_id for correlation. Funnel stores them in a monthly-partitioned table with a GIN index over `to_tsvector('english', message)` so search stays sub-second even at millions of rows per day.

What this lets you do

  • Live-tail logs by service, severity, or full-text query
  • Jump from a span in the trace explorer to every log line emitted during it
  • Surface anomalies fast — recent-errors panel on the project dashboard
  • Postgres-native — no separate log store to operate

Get it running

  1. 1 Drop in `opentelemetry-instrumentation-logging` (Python, Node, etc.)
  2. 2 Or POST batches directly to `/v1/logs`
  3. 3 Set `trace_id` & `span_id` on log entries to enable correlation

Code examples

curl -X POST https://funnel.example.com/v1/logs \
  -H "Authorization: Bearer st_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "logs": [{
      "time":         "2026-05-17T10:00:00Z",
      "severity":     "error",
      "service_name": "api",
      "message":      "stripe charge failed: card_declined",
      "trace_id":     "a1f3c4d5b6e7890123456789abcdef00",
      "span_id":      "0123456789abcdef",
      "attributes":   { "user.id": 42, "amount_usd": 99.0 }
    }]
  }'
Where to find it
/app/p/:org/:project/logs
Open in app →