Logs, Events & Replicas — API Reference
Package: dodil.ignite.v1 · Service: ComputeService
App logs (stdout/stderr) and events (pod-lifecycle) are sourced live from the worker cluster and are not persisted — once a pod scales to zero, is evicted, or its K8s event TTL (~1h) elapses, the data is gone. Bring your own retention (Sentry / Datadog / writing to S3 from inside the handler). ListAppReplicas tells you which replica_ids are running so you can pin logs and events to a single pod. Build logs (GetBuildLog) are the one persisted stream here.
gRPC reaches every method at dodil.ignite.v1.ComputeService/<Method> on $IGNITE_GRPC; the HTTP gateway mirrors each one. Several of these RPCs are server-streaming (StreamAppLogs, StreamAppEvents, StreamCompileLogs) — they return a stream of messages rather than a single response. See Conventions → Using gRPC for grpcurl setup. gRPC requests use the proto field names (snake_case); HTTP uses pbjson (camelCase). Responses render camelCase.
| RPC | HTTP |
|---|---|
GetAppLogs | GET /v1/ignite/app/{organization_name}/{app_name}/logs |
StreamAppLogs | GET /v1/ignite/app/{organization_name}/{app_name}/logs/stream |
GetAppEvents | GET /v1/ignite/app/{organization_name}/{app_name}/events |
StreamAppEvents | GET /v1/ignite/app/{organization_name}/{app_name}/events/stream |
ListAppReplicas | GET /v1/ignite/app/{organization_name}/{app_name}/replicas |
GetBuildLog | GET /v1/ignite/app/{organization_name}/{app_name}/builds/{build_id}/log |
StreamCompileLogs | GET /v1/ignite/compile/{deploy_id}/logs |
GetAppLogs
Recent stdout/stderr from the app’s currently-running pods. Aggregated across replicas unless replica_id is set; limit caps the line count (default 1000, capped server-side).
Request
HTTP
curl -sS "https://api.dev.dodil.io/v1/ignite/app/acme-corp/my-data-processor/logs?limit=200" \
-H "Authorization: Bearer $DODIL_TOKEN"Response
HTTP
{
"lines": [
{
"timestampMs": "1716894000123",
"replicaId": "my-data-processor-7c9d8-abcde",
"stream": "LOG_STREAM_STDOUT",
"line": "processed batch 42 in 18ms"
}
],
"truncated": false
}StreamAppLogs
Server-streaming tail of LogLine messages — the stream stays open and each new log line arrives as its own message. Set from_start to replay the pod’s full history from container start before tailing.
Request
HTTP
curl -sS -N "https://api.dev.dodil.io/v1/ignite/app/acme-corp/my-data-processor/logs/stream" \
-H "Authorization: Bearer $DODIL_TOKEN"Response
Server-stream of LogLine messages (same shape as in GetAppLogs), one per emitted log line, until the caller disconnects.
GetAppEvents
K8s pod-lifecycle events — image pulls, scheduling, crashes, OOM kills, probe failures, KEDA wake/sleep. Distinct from logs: this is what the platform observes about the pod, not what the user’s code printed. K8s retains events for ~1h, so older events are gone.
Request
HTTP
curl -sS "https://api.dev.dodil.io/v1/ignite/app/acme-corp/my-data-processor/events?severity=Warning" \
-H "Authorization: Bearer $DODIL_TOKEN"Response
HTTP
{
"events": [
{
"timestampMs": "1716894001000",
"kind": "APP_EVENT_KIND_OOM_KILLED",
"reason": "OOMKilling",
"message": "Memory cgroup out of memory: Killed process 1",
"replicaId": "my-data-processor-7c9d8-abcde",
"count": 1,
"severity": "Warning"
}
],
"truncated": false
}StreamAppEvents
Server-streaming tail of AppEvent messages as the platform observes new pod-lifecycle events.
Request
HTTP
curl -sS -N "https://api.dev.dodil.io/v1/ignite/app/acme-corp/my-data-processor/events/stream" \
-H "Authorization: Bearer $DODIL_TOKEN"Response
Server-stream of AppEvent messages (same shape as in GetAppEvents).
ListAppReplicas
The app’s currently-running pod replicas — use it before filtering logs or events to learn which replica_ids exist.
Request
HTTP
curl -sS "https://api.dev.dodil.io/v1/ignite/app/acme-corp/my-data-processor/replicas" \
-H "Authorization: Bearer $DODIL_TOKEN"Response
HTTP
{
"replicas": [
{
"replicaId": "my-data-processor-7c9d8-abcde",
"clusterId": "worker-eu-1",
"nodeName": "ip-10-0-3-17",
"status": "STATUS_RUNNING",
"ready": true,
"restartCount": 0,
"startedMs": "1716893900000",
"conditionsSummary": "PodScheduled=True, Initialized=True, ContainersReady=True",
"cpuMillicoresUsed": "120",
"memoryMbUsed": "210"
}
]
}GetBuildLog
The persisted build log for a completed build — used to replay after the live StreamCompileLogs stream has ended. Logs are GC’d after a retention window (default 3 days); after GC the response has found=false and an empty body rather than an error.
Request
HTTP
curl -sS "https://api.dev.dodil.io/v1/ignite/app/acme-corp/my-data-processor/builds/bld_01HZX9/log" \
-H "Authorization: Bearer $DODIL_TOKEN"Response
HTTP
{
"log": "U3RlcCAxLzg6IEZST00gcHl0aG9uOjMuMTItc2xpbQo=",
"found": true
}log is base64-encoded over JSON (proto bytes); decode it to recover the plain-text build log.
StreamCompileLogs
Server-streaming compile log for a Wasm app deployment — keyed by deploy_id rather than the app path (the /v1/ignite/compile/{deploy_id}/logs route avoids a gateway collision with GetAppLogs). Set from_start to replay from the beginning of the build.
Request
HTTP
curl -sS -N "https://api.dev.dodil.io/v1/ignite/compile/dpl_01HZX9/logs?fromStart=true" \
-H "Authorization: Bearer $DODIL_TOKEN"Response
Server-stream of CompileLogChunk messages:
message CompileLogChunk {
bytes data = 1; // a chunk of compile output (base64 over JSON)
int64 timestamp_ms = 2;
}See also
- Invocation & Executions — invoke, track, and watch executions
- Versions — list, rollback, inspect versions;
GetAppCode - Apps — app metadata, config, and
GetAppState - Core Concepts — the typed entities the API reads/writes
grpcurlreference — flags + reflection fallbacks