Go Whisper is a Go implementation of the Whisper database, which is part of the Graphite Project.
To create a new whisper database you must define it's retention levels (see: storage schemas), aggregation method and the xFilesFactor. The xFilesFactor specifies the fraction of data points in a propagation interval that must have known values for a propagation to occur.
Create a new whisper database in "/tmp/test.wsp" with two retention levels (1 second for 1 day and 1 hour for 5 weeks), it will sum values when propagating them to the next retention level, and it requires half the values of the first retention level to be set before they are propagated.
retentions, err := whisper.ParseRetentionDefs("1s:1d,1h:5w")
if err == nil {
wsp, err := whisper.Create("/tmp/test.wsp", retentions, whisper.Sum, 0.5)
}
Alternatively you can open an existing whisper database.
wsp, err := whisper.Open("/tmp/test.wsp")
Once you have a whisper database you can set values at given time points. This sets the time point 1 hour ago to 12345.678.
wsp.Update(12345.678, time.Now().Add(time.ParseDuration("-1h")).Unix())
And you can retrieve time series from it. This example fetches a time series for the last 1 hour and then iterates through it's points.
series, err := wsp.Fetch(time.Now().Add(time.ParseDuration("-1h")).Unix(), time.Now().Unix())
if err != nil {
// handle
}
for _, point := range series.Points() {
fmt.Println(point.Time, point.Value)
}
This implementation is not thread safe. Writing to a database concurrently will cause bad things to happen. It is up to the user to manage this in their application as they need to.
Go Whisper is licenced under a BSD Licence.