···6363 "jwt_secret": "REPLACE_WITH_A_RANDOM_SECRET",
6464 "admin_password": "REPLACE_WITH_A_RANDOM_SECRET",
6565 "metrics_token": "REPLACE_WITH_A_RANDOM_SECRET",
6666+ "sentry_dsn": "https://PUBLIC_KEY@o0.ingest.sentry.io/0",
6667 "bsky_appview_url": "https://api.bsky.app",
6768 "bsky_appview_did": "did:web:api.bsky.app",
6869 "chat_service_url": "https://api.bsky.chat",
···8081- `hostname`: the host relays should crawl
8182- `service_handle_domain`: the suffix used for local handles
8283- `jwt_secret`: required; the server now refuses to start if it is missing or still set to the old `perlsky-dev-secret` fallback
8484+- `sentry_dsn`: optional; when set, perlsky reports unhandled XRPC exceptions to Sentry
8385- If you want users like `alice.pds.example.com`, set `service_handle_domain` to `pds.example.com`, not `example.com`.
8486- Public handle resolution for `alice.pds.example.com` also requires wildcard DNS for `*.pds.example.com` and a reverse proxy/TLS setup that will answer those subdomains.
8587- `invite_code_required`: if true, `createAccount` requires a valid invite code
···327329- [ops/grafana/perlsky-dashboard.json](../ops/grafana/perlsky-dashboard.json)
328330329331See [METRICS.md](./METRICS.md) for the metric surface and dashboard notes.
332332+333333+## Sentry
334334+335335+If you want exception reporting in addition to Prometheus metrics, add `sentry_dsn` to `/etc/perlsky/perlsky.json`.
336336+337337+The current integration is intentionally narrow:
338338+339339+- it reports unhandled XRPC exceptions
340340+- it does not report ordinary handled XRPC errors like `InvalidToken`
341341+- it is a no-op when `sentry_dsn` is unset
330342331343## Prometheus
332344
+7
docs/METRICS.md
···105105106106The dashboard expects a Prometheus data source. When provisioning, either keep the checked-in `uid` from the example data source or update the dashboard's `${DS_PROMETHEUS}` mapping during import.
107107108108+## Sentry
109109+110110+Prometheus is still the main place to watch rates and latency. If you also configure `sentry_dsn`, perlsky will report unhandled XRPC exceptions to Sentry. That works well as a complement to:
111111+112112+- `perlsky_xrpc_errors_total` for handled request failures
113113+- `perlsky_xrpc_unhandled_exceptions_total` for internal 500-class failures
114114+108115## Example Scrape
109116110117```sh