Profiles

Embed
Preview of the card
<a href="https://forumulate.com/p/watchtower/docs/profiles"><img src="https://forumulate.com/api/public/orgs/watchtower/spaces/docs/pages/409c937d-c61c-40da-bd3d-43d6c3628091/social-card.svg?v=3e7ae33eec8b" alt="Profiles" width="600" height="315"></a>

Push CPU, wall, allocation and other profiles with an ingestion key that has ingest:profiles. The gateway stores the raw bytes and the worker parses them; the tenant and environment come from the key, never from the request. Limits: 8 MiB (compressed) per request, 60 profiles per minute per project. Over the size you get 413; over the rate you get 429 with Retry-After. Success is 202 {"profile_id": "<uuid>"}. Delivery is at-least-once.

Set WT_ENDPOINT (for example https://ingest.example.com) and WT_INGEST_KEY. Authenticate with Authorization: Bearer $WT_INGEST_KEY.

pprof or folded stacks

curl -X POST "$WT_ENDPOINT/v1/profiles?service=checkout&version=1.4.2&format=pprof" \
  -H "Authorization: Bearer $WT_INGEST_KEY" \
  -H "Content-Type: application/octet-stream" \
  -H "Content-Encoding: gzip" \
  --data-binary @cpu.pb.gz

service is required; format is pprof (default) or folded. Content-Encoding may be gzip or absent. env is accepted and ignored: the environment is the key's.

OTLP profiles

OTLP/HTTP protobuf: POST /v1development/profiles with Content-Type: application/x-protobuf. OTLP/gRPC: opentelemetry.proto.collector.profiles.v1development.ProfilesService/Export on the OTLP gRPC port. JSON is not accepted yet.

Pyroscope-compatible ingest

POST /ingest?name=checkout.cpu{env=prod}&from=<unix s>&until=<unix s>&units=samples&format=pprof|folded with a raw body. This is compatible, not Pyroscope: the application name maps to the service, the {...} tags to labels. Multipart uploads are not accepted.

Debug files

Native frames are symbolized from debug files you upload with wtctl sourcemaps; unresolved frames show as [unknown] module+0xoffset until you upload.

Updated