From Fragmented to Fluid: Simplifying ServiceRadar with Elixir, Rustler, and CloudNativePG
In observability, complexity is the enemy. Our previous architecture asked a React app to hit two APIs (core in Go, SRQL our Domain-Specific Language (DSL) and query engine in Rust) through Nginx/Kong for JWT verification, while a Go-based auth service issued JWKS/OAuth tokens. We'd been wrestling with this stack for a while—slow initial renders, state management sprawl, and the constant churn of keeping dependencies current across a deep node_modules tree.
React2Shell forced the conversation we'd been putting off. The vulnerability itself was bad enough, but the follow-up CVEs and the broader pattern they revealed made us take a harder look at what we were signing up for. React is a mature framework carrying years of accumulated complexity and technical debt. That's not a criticism—it's the natural arc of any widely-adopted JS project. But for a team shipping observability tooling, betting on a stack where the next critical CVE feels like a matter of "when" rather than "if" wasn't a trade-off we wanted to keep making.
An upcoming release takes a different shape:
- Phoenix + LiveView serves as the experience layer
- Rustler-embedded SRQL runs inside the Phoenix app as a NIF—no extra service
- CloudNativePG with TimescaleDB + Apache AGE provides a single unified data store
- Go core continues to orchestrate agents, pollers, and ingestion