Nothing to operate
No daemon, no config file, no health check, no upgrade window. The database is a struct in your binary, and it goes away when your process does.
Fieldnote is a single dependency and a single file on disk. No server to run, no port to open, no cluster to reason about. It handles a few billion points on one machine and gets out of the way.
cargo add fieldnote
1.4 M
Points ingested per second
11 MB
Compiled, no dependencies
0
Processes to supervise
use fieldnote::{Db, Point, Window}; // one file, no server, no config let db = Db::open("sensors.fn")?; db.write("greenhouse.temp", Point { at: now(), value: 21.4, tags: &[("bed", "north")], })?; // downsample four million rows let hourly = db .series("greenhouse.temp") .between(week_ago(), now()) .window(Window::Hours(1)) .mean()?; assert_eq!(hourly.len(), 168);
Most time-series workloads are a single machine writing to a single disk. Fieldnote is built for that case and declines the rest.
No daemon, no config file, no health check, no upgrade window. The database is a struct in your binary, and it goes away when your process does.
There is no query language to learn or to escape. Windows, aggregates and joins are ordinary methods, checked by the compiler like the rest of your code.
The on-disk format is documented in nine pages and stable since v2.0. Copy the file to another machine and it opens, on any platform Rust targets.
The whole public surface is thirty-one functions. This is most of them.
Db::open(path)Open or create a database file
Db::write(series, point)Append one point, fsync optional
Db::write_batch(series, &[point])Append many, one syscall
Db::series(name)Begin a query on one series
Query::between(from, to)Bound the range, inclusive
Query::window(unit)Bucket into fixed intervals
Query::mean() / max() / p99()Reduce each bucket
Query::tagged(key, value)Filter by tag, index-backed
Db::compact()Rewrite and reclaim, online
Db::snapshot(path)Consistent copy without stopping writes
Single machine, 8 cores, NVMe. Fieldnote loses on distributed fan-out because it does not do distributed fan-out.
| Workload | Fieldnote | Server A | Server B |
|---|---|---|---|
| Ingest, 1 series | 1.42 M/s | 0.61 M/s | 0.88 M/s |
| Ingest, 10k series | 0.94 M/s | 0.55 M/s | 0.71 M/s |
| Range scan, 30 days | 42 ms | 118 ms | 96 ms |
| Hourly downsample, 1 yr | 210 ms | 640 ms | 480 ms |
| Fan-out across 6 nodes | not supported | 1.9 s | 1.1 s |
| Cold start | 3 ms | 2.4 s | 1.8 s |
Fieldnote is for the very common case where you do not. It is Apache 2.0, has no corporate owner, and the maintainers answer issues on weekdays.
Read the reference