Sentrinel β Feature Matrix & Roadmap
Researched July 2026 against: Sentry, PostHog, Axiom, Better Stack, Highlight.io (now LaunchDarkly Observability), Langfuse, Helicone (maintenance mode since the Mintlify acquisition), Grafana + Prometheus, Datadog / New Relic, and the OpenTelemetry spec.
Two market signals worth remembering when scoping: Highlight.io was acquired and folded into LaunchDarkly, and Helicone is in maintenance mode β being an inline proxy or chasing every category is risky; a focused API-monitoring product with a shared ingest pipeline is the durable shape.
Capability matrix (β first-class Β· β partial Β· β absent)
| Capability | Sentry | PostHog | Axiom | Better Stack | Langfuse | Grafana+Prom | Datadog/NR | Sentrinel today | Sentrinel target |
|---|---|---|---|---|---|---|---|---|---|
| Multi-tenant orgs + auth | β | β | β | β | β | β | β | β | β |
| Endpoint/APM metrics (p50/p95/p99, Apdex) | β | β | β | β | β | β | β | β | β |
| Error grouping & stack traces | β | β | β | β | β | β | β | β fingerprinted issues | β |
| Request logs w/ headers & payloads | β | β | β | β | β | β | β | β | β |
| Application logs correlated to requests | β | β | β | β | β | β | β | β | β |
| Log search & live tail | β | β | β | β | β | β | β | β search + SSE tail | β |
| Field/attribute explorer (log vocabulary) | β | β | β | β | β | β | β | β keys + top values, click to filter | β |
| Breadcrumbs (trail leading to a failure) | β | β | β | β | β | β | β | β logs+spans+outcome interleaved | β |
| Issue assignment & ownership | β | β | β | β | β | β | β | β assign + filter by assignee | β + ownership rules |
| Distributed tracing (OTLP ingest) | β | β | β | β | β | β | β | β nested waterfall + OTLP | β |
| Uptime / synthetic checks | β | β | β | β | β | β | β | β (HTTP checks) | β multi-region later |
| Cron / heartbeat monitoring | β | β | β | β | β | β | β | β | β |
| Alerting + notification channels | β | β | β | β | β | β | β | β Slack, Discord, webhook, email | β |
| SLOs & error budgets | β | β | β | β | β | β | β | β | β |
| Consumers / API-client analytics | β | β | β | β | β | β | β | β | β |
| Host metrics (CPU/RAM) | β | β | β | β | β | β | β | β | β |
| Database query performance (per-query metrics) | β | β | β | β | β | β | β | β pg_stat_statements, ranked by share of DB time |
β + MySQL |
| Database wait events & blocking chains | β | β | β | β | β | β | β | β 1s pg_stat_activity sampling, pg_blocking_pids |
β |
| Database health (connections, cache hit, deadlocks, lag) | β | β | β | β | β | β | β | β | β |
| Table bloat & index advisories | β | β | β | β | β | β | β | β bloat, missing index, index overhead | β + unused-index detection |
| Optional query-text masking in the collector | β | β | β | β | β | β | β | β off by default, literals stripped on the host when on | β |
| Explain plans & plan-change history | β | β | β | β | β | β | β | β collector EXPLAINs the top statements, one row per plan change | β |
| Custom dashboards (saved charts) | β | β | β | β | β | β | β | β composed in Settings, rendered at /dashboards | β |
| Release / deploy tracking | β | β | β | β | β | β | β | β deploy markers | β |
| LLM call tracing & cost | β | β | β | β | β | β | β | β priced GenAI spans | β |
| SQL access to telemetry | β | β | β | β | β | β | β | β guarded, Postgres-backed | β ClickHouse-backed |
| Status pages | β | β | β | β | β | β | β | β public + incidents | β |
| Custom / business metrics | β | β | β | β | β | β | β | β counter, gauge, histogram; folded in-process, in TypeScript, Python and Dart | β |
| Session replay | β | β | β | β | β | β | β | β rrweb, error-triggered, masked by default | β + sampled sessions |
| Mobileβbackend on one trace | β | β | β | β | β | β | β | β traceparent from the SDK | β β the thing nobody else joins cleanly |
| Product analytics (events, funnels, retention) | β | β | β | β | β | β | β | β web + mobile track(), funnels, retention |
β |
| Feature flags | β | β | β | β | β | β | β | β | out of scope |
| Profiling | β | β | β | β | β | β | β | β | out of scope for now |
| On-call schedules / escalation | β | β | β | β | β | β | β | β | integrate, don't build |
| Saved queries / starred views | β | β | β | β | β | β | β | β named filter sets per page, starrable | β |
| Query language (APL / Discover) | β | β | β | β | β | β | β | β guarded SQL console, against ClickHouse or Postgres | field filters cover most of it |
| Release health (crash-free rate per release) | β | β | β | β | β | β | β | β crash-free sessions + users, per release | β |
| Mobile crash reporting | β | β | β | β | β | β | β | β uncaught Dart, persisted across the crash | β native iOS/Android absent |
| Mobile performance (app start, frames) | β | β | β | β | β | β | β | β start-to-first-frame, slow/frozen frames | β |
| Breadcrumbs on a crash report | β | β | β | β | β | β | β | β 25 bounded, rendered as a trail | β |
| Browser error monitoring | β | β | β | β | β | β | β | β uncaught + rejections + fetch, no key in the bundle | β |
| Browser β backend distributed trace | β | β | β | β | β | β | β | β traceparent on same-origin fetch |
β |
| Request geo + client IP | β | β | β | β | β | β | β | β country + resolved client IP per request | β |
| Serving host per request | β | β | β | β | β | β | β | β which vhost/replica answered | β |
| Dark mode | β | β | β | β | β | β | β | β light / dark / auto | β |
| Trials, quotas & billing enforcement | β | β | β | β | β | β | β | β trial clock, blocking gate, ingest grace | β + self-serve checkout |
| Operator console (per-tenant billing) | β | β | β | β | β | β | β | β allowlisted platform admin | β |
| Web release health (crash-free page loads) | β | β | β | β | β | β | β | β one session per page load | β |
| Source maps / minified stack recovery | β | β | β | β | β | β | β | β upload by API key from CI; symbolicated at ingest, before fingerprinting | β |
| Web vitals (LCP, CLS, INP) | β | β | β | β | β | β | β | β collected per session, shown as p75 per release | β |
| Stack symbolication / deobfuscation | β | β | β | β | β | β | β | β dSYM/ProGuard artifacts upload and store; no native stack is rewritten yet | β |
| Suspect commits / code owners | β | β | β | β | β | β | β | β | needs VCS integration |
| Purpose-bound API keys (one key per integration) | β | β | β | β | β | β | β | β server, mobile, database collector, OTLP, AI agent β enforced per surface, a leak exposes one integration | β |
| Coding-agent access (MCP server + CLI) | β | β | β | β | β | β | β | β six read tools + resolve, on an agent key pinned to one app | β |
| Durable ingest with two-way failover | β | β | β | β | β | β | β | β log used whenever a broker answers; storeβlog failover behind a circuit breaker; state on /health | β |
| Python / Django SDK | β | β | β | β | β | β | β | β requests, errors, logs, consumers, custom metrics, spans, outbound tracing, browser tunnel, resource usage; no runtime deps | β |
| Python / FastAPI & Starlette SDK | β | β | β | β | β | β | β | β pure ASGI middleware: requests, errors (HTTPException and validation included), logs from sync and async endpoints, spans, httpx tracing, browser tunnel; no runtime deps | β |
Priorities
P0 β core (shared pipeline, natural fit)
- β Done β Storage architecture for scale: Postgres control plane + ClickHouse telemetry store.
- β
Done β Error grouping into fingerprinted issues (
issuestable,/api/issues, Issues page with resolve/ignore/regression lifecycle). - β Done β Application logs: console capture in @sentrinel/plugin correlated by request ID, Logs tab + log-level filter in Request logs UI.
- β Done β Alert notification channels: Slack / Discord / generic webhook delivery, managed on the Alerts page. (Email still open.)
- β
Done β OTLP/HTTP ingest (
POST /v1/traces) so any OTel SDK or Collector can send traces. - β
Done β Auth & multi-tenancy: self-serve signup (one org per account),
sessions, roles, team management, login throttling, and org scoping enforced
on every dashboard route (
SENTRINEL_REQUIRE_AUTH=true). - β Done β Quota enforcement: per-org monthly counters, 429 over quota, usage on Settings.
P1 β cheap extensions of P0
8. β
Done β Cron/heartbeat monitoring: check-in URLs, sweeper, missed-job notifications.
9. β
Done β Live tail (SSE) on requests, logs, and errors, with a Live toggle on Request logs.
10. β
Done β SLOs: availability + latency objectives with error budgets and burn-down.
11. β
Done β Custom dashboards: saved widget configs (Settings β Custom dashboards).
12. β
Done β Deploy markers: version from the plugin β deployments, shown on Settings.
P2 β with clear pull only
13. β
Done β Status pages: public route over uptime + incidents (/public/status/:slug).
14. β
Done β LLM spans: GenAI attrs + price table β cost per model, client, and endpoint.
15. β
Done β Guarded read-only SQL console.
P3 β mobile
16. β
Done β Crash reporting for Dart: uncaught errors captured automatically and
written to disk before the process dies, delivered on the next launch. The
persistence is what makes it crash reporting rather than error reporting β
the ordinary buffer flushes on a timer a crashing app never reaches.
17. β
Done β Release health: one app_sessions row per launch, crash-free
sessions and crash-free users per release. Force-quits are counted as
abnormal, apart from crashes, because blaming a release for a user swiping
the app away makes the number worthless.
18. β
Done β Flutter integration package (sentrinel_flutter): framework and
engine error handlers, app start, slow/frozen frames, navigation breadcrumbs.
Separate from the pure-Dart core so the core stays usable from CLIs and
server-side jobs.
P4 β the gaps the first list named
19. β
Done β Email notification channel, refused at creation on a deployment
that cannot actually send, rather than failing silently at the moment an
alert fires.
20. β
Done β SQL console against ClickHouse, not just Postgres, so the
console can see the store that holds the telemetry.
21. β
Done β Saved views: a named filter set per page, starrable, scoped to
the org.
22. β
Done β Web vitals: LCP, CLS and INP through PerformanceObserver,
carried on the session and reported as p75 per release β vitals have a long
tail and the tail is the point, so an average would hide it.
23. β
Done β Explain plans and plan-change history: the collector EXPLAINs
the top statements on the host and sends one row per plan change, so a
regression shows as the plan that changed rather than a query that got slow.
24. β
Done β Source maps: uploaded with an API key from CI (a build pipeline
has no browser session, which is why the feature was unreachable while the
only upload route needed one), symbolicated at ingest before fingerprinting
so issues group by real source location, with the minified stack preserved.
Not started, and deliberately so β native iOS/Android crash handlers and
native stack symbolication (source maps, the web half, shipped). They are one
project, not two: native traces without symbolication are unreadable hex, so
shipping the first without the second gives you nothing. Together that is a
quarter of work plus permanent maintenance across both toolchains, on Sentry's
strongest ground. The differentiator worth
defending instead is already shipped: a mobile tap and the backend span it
caused on one trace, via traceparent.
Closed since this list was written: the email notification channel, the ClickHouse-backed SQL console, saved views, web vitals, explain plans and plan-change history, and the source-map half of symbolication. Each is marked in the matrix above with what actually shipped.
Remaining, in the order the gap costs you something:
| # | Gap | Where it stands |
|---|---|---|
| 1 | Native stack symbolication | symbol_artifacts accepts and stores dsym, proguard and symbols, and lib/symbol-service.ts reads only sourcemap. So the upload half is done and nothing consumes the native half β a stored dSYM changes no stack today. |
| 2 | Native iOS/Android crash handlers | Deliberately not started β see above. Pointless before #1 regardless. |
Smaller, already scoped in the matrix above: unused-index detection, MySQL support, multi-region uptime checks, sampled (not just error-triggered) session replay, and issue ownership rules.
P3 β deliberately out of scope RUM, product analytics, feature flags, surveys (browser SDK products); profiling (cost/benefit); LLM gateway/proxying (different risk posture β see Helicone); on-call scheduling (integrate PagerDuty/Better Stack via the webhook channel instead).