Sylphx Observability

First success · tutorial

Admit one log. Query it back.

The first useful result is an admitted record that the same signed Binding can read back. This site does not accept tokens, does not host a login, and is not an inspect-bound-project console.

Job and developer

Independent developer or product team: bind one Sylphx project/environment to Observability, ingest one log, and retrieve that log through the public contract.

Prerequisites

  • A current Platform Project Binding for product observability. Discovery is Binding api_base. Dest peel is https://api.observability.sylphx.com; do not compile sibling hostnames. Predecessor peel https://observability.api.sylphx.com is residual dens, not dest.
  • A matching Identity delegation for the same binding, capabilities, and budgets. Binding maximum 900s; delegation maximum 300s.
  • Generated clients from this repository: @sylphx/observability-sdk and observability CLI, or the Rust SDK. Not Platform sylphx-sdk.
  • Contract revision 2026-08-16.3 at proto/sylphx/observability/v1/observability.proto.

Minimum CLI path

Set the peel from Binding api_base, then call generated operations. Environment names below are CLI wiring, not a second protocol.

export OBSERVABILITY_API_URL="$BINDING_API_BASE"
export OBSERVABILITY_PROJECT_BINDING="<sylphx-project-binding+jwt>"
export OBSERVABILITY_DELEGATION="<sylphx-delegation+jwt>"

observability IngestLogs --body '{
  "writes": [{
    "idempotencyKey": "first-success-log-1",
    "record": {
      "severity": "SEVERITY_INFO",
      "service": "first-success",
      "body": "admitted record for readback"
    }
  }]
}'

observability QueryLogs --body '{
  "timeRange": { "startTime": "<window-start>", "endTime": "<window-end>" },
  "page": { "limit": 50 },
  "filter": { "services": ["first-success"] }
}'

Minimum SDK path

import { ObservabilityClient } from "@sylphx/observability-sdk";

const client = new ObservabilityClient({
  baseUrl: binding.api_base,
  projectBinding,
  delegation,
});

const ingested = await client.call("IngestLogs", {
  body: {
    writes: [{
      idempotencyKey: "first-success-log-1",
      record: {
        severity: "SEVERITY_INFO",
        service: "first-success",
        body: "admitted record for readback",
      },
    }],
  },
});

const readback = await client.call("QueryLogs", {
  body: {
    timeRange: { startTime, endTime },
    page: { limit: 50 },
    filter: { services: ["first-success"] },
  },
});

Headers sent by the generated client: Sylphx-Project-Binding: Bearer … and Authorization: Bearer …. No x-project-id. No product key.

Expected result and readback

Ingest returns the admitted log identity. Query through the same Binding returns that tenant's rows for the bounded window, including the first-success service. A copied identity or cursor cannot disclose another project or environment.

Typed failure, recovery, cleanup

  • Missing, stale, revoked, forged, or mismatched Binding/delegation: zero domain writes or rows.
  • Divergent replay of a live idempotency key: conflict before a second row.
  • Over-budget or over-window query: fail closed; shrink the interval or filters.
  • Stable error envelope carries code, occurrence id, and retryability without secrets.
  • Cleanup is tenant deletion only after conservation and legal-hold checks — not a raw payload wipe from this site.

Production-shaped next step

Keep using generated operations: correlate with traces and error groups, append audit evidence, set retention, export a conservation receipt, and read GET /v1/operations/{operation_id}. Do not paste tokens into this site. Do not treat /healthz on either host as first success.