Skip to main content

Structured logging

Log custom events from the server using the log() function:
Every log entry requires source and type. Beyond that, you can include any fields you want — these become available for log filtering and metric dimensioning. Logs are searchable in the monitoring dashboard at /admin/monitoring/logs.

Client-side logging

Log events from the frontend using the logs.ingest tRPC procedure:
The framework automatically sets source: "app" and attaches the authenticated user’s ID.

metrics.json schema

Defined at the app root. Configures how metrics are derived from log entries and how charts are rendered on the monitoring dashboard. Validated at build time.

Metrics

Each metric definition derives a metric from matching log entries:

Dimensions

Dimensions define how metric values are grouped. Each dimension maps a log field to a set of labeled buckets:
Buckets bound cardinality — log values that don’t match any bucket are excluded from that dimension.

Charts

Each chart definition renders a chart on the monitoring dashboard:

Stat types

Built-in metrics

The framework ships with default metrics that require no configuration: Default charts are included for request count by status, error rate, latency percentiles, workflow job status, and infrastructure metrics (CPU, memory, task count).

Default metrics.json

Every scaffolded app includes the following metrics.json:

Monitoring

The dashboard at /admin/monitoring/dashboard displays all configured charts organized by tab. Logs are searchable at /admin/monitoring/logs with filtering by source, type, user, and trace ID. For more information on viewing metrics and logs for deployed apps, see the Monitoring documentation. Metrics and logs are also available through the observability API for external monitoring integrations.