// the take
Riemann is a stream processor for monitoring events: things like Riemann-health, collectd, or your own app push time-stamped events in, and a Clojure DSL lets you define streams that filter, fold, and route them to alerting or storage backends. It's for ops teams who want programmable alerting logic instead of static threshold configs, and who don't mind writing Clojure to get it.
The stream processing DSL (streams.clj) is genuinely powerful — you can express rate limiting, percentile folds, and multi-stage routing as composable functions instead of YAML rule soup. The backend integration list is enormous and still maintained: Kafka, Elasticsearch, InfluxDB (both versions), Prometheus, Clickhouse, Cloudwatch, Stackdriver, plus every paging service (PagerDuty, Opsgenie, VictorOps). Transport layer supports TCP, UDP, TLS, SSE and Graphite/OpenTSDB wire protocols, so it slots into existing metrics pipelines without a translation layer. Test coverage is real — nearly every integration module has a matching test file, and CI runs on GitHub Actions rather than being vestigial.
Configuration is live Clojure code, not data — that's the same feature that makes it powerful and the reason onboarding anyone who doesn't know Clojure is slow, and a bad config can throw a runtime exception instead of failing a schema check. It's a single-process stream processor with no built-in clustering or HA story; scaling out means running independent instances and solving fan-out yourself. It holds no history — every long-term storage need (the folds, the indexes) is in-memory or delegated to one of those twenty-plus backend integrations, so Riemann itself is a point of total data loss if it crashes before flushing. The ecosystem has clearly been overtaken by Prometheus/OpenTelemetry for new deployments — this is a mature, stable project, not a growing one, and some of those integrations (Keen.io, Librato, Boundary) are for services that no longer exist.
We read the README, the directory tree and a key source file in October 2026. Nobody pays to be listed. How we judge →