Merge pull request #164 from prometheus/extensibility/futureproof/values

Refresh SampleValue to 64-bit floating point.
This commit is contained in:
Matt T. Proud 2013-04-21 11:38:01 -07:00
commit bb12929cf4
8 changed files with 36 additions and 31 deletions

View file

@ -50,8 +50,8 @@ message SampleKey {
message SampleValueSeries { message SampleValueSeries {
message Value { message Value {
optional int64 timestamp = 1; optional int64 timestamp = 1;
optional float value = 2; optional double value = 2;
} }
repeated Value value = 1; repeated Value value = 1;
} }

View file

@ -15,6 +15,7 @@ package model
import ( import (
"bytes" "bytes"
"code.google.com/p/goprotobuf/proto"
"fmt" "fmt"
"sort" "sort"
"time" "time"
@ -70,10 +71,12 @@ func (l LabelSet) String() string {
type Metric map[LabelName]LabelValue type Metric map[LabelName]LabelValue
// A SampleValue is a representation of a value for a given sample at a given // A SampleValue is a representation of a value for a given sample at a given
// time. It is presently float32 due to that being the representation that // time.
// Protocol Buffers provide of floats in Go. This is a smell and should be type SampleValue float64
// remedied down the road.
type SampleValue float32 func (s SampleValue) ToDTO() *float64 {
return proto.Float64(float64(s))
}
func (v SampleValue) MarshalJSON() ([]byte, error) { func (v SampleValue) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf("\"%f\"", v)), nil return []byte(fmt.Sprintf("\"%f\"", v)), nil

View file

@ -59,14 +59,14 @@ func testProcessor001Process(t test.Tester) {
Sample: model.Sample{ Sample: model.Sample{
Metric: model.Metric{"percentile": "0.010000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "zed"}, Metric: model.Metric{"percentile": "0.010000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "zed"},
Value: 0.04598141, Value: 0.0459814091918713,
}, },
}, },
{ {
Sample: model.Sample{ Sample: model.Sample{
Metric: model.Metric{"percentile": "0.010000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "bar"}, Metric: model.Metric{"percentile": "0.010000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "bar"},
Value: 78.485634, Value: 78.48563317257356,
}, },
}, },
{ {
@ -80,14 +80,14 @@ func testProcessor001Process(t test.Tester) {
Sample: model.Sample{ Sample: model.Sample{
Metric: model.Metric{"percentile": "0.050000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "zed"}, Metric: model.Metric{"percentile": "0.050000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "zed"},
Value: 0.04598141, Value: 0.0459814091918713,
}, },
}, },
{ {
Sample: model.Sample{ Sample: model.Sample{
Metric: model.Metric{"percentile": "0.050000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "bar"}, Metric: model.Metric{"percentile": "0.050000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "bar"},
Value: 78.485634, Value: 78.48563317257356,
}, },
}, },
{ {
@ -101,63 +101,63 @@ func testProcessor001Process(t test.Tester) {
Sample: model.Sample{ Sample: model.Sample{
Metric: model.Metric{"percentile": "0.500000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "zed"}, Metric: model.Metric{"percentile": "0.500000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "zed"},
Value: 0.61204565, Value: 0.6120456642749681,
}, },
}, },
{ {
Sample: model.Sample{ Sample: model.Sample{
Metric: model.Metric{"percentile": "0.500000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "bar"}, Metric: model.Metric{"percentile": "0.500000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "bar"},
Value: 97.317986, Value: 97.31798360385088,
}, },
}, },
{ {
Sample: model.Sample{ Sample: model.Sample{
Metric: model.Metric{"percentile": "0.500000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "foo"}, Metric: model.Metric{"percentile": "0.500000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "foo"},
Value: 84.63044, Value: 84.63044031436561,
}, },
}, },
{ {
Sample: model.Sample{ Sample: model.Sample{
Metric: model.Metric{"percentile": "0.900000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "zed"}, Metric: model.Metric{"percentile": "0.900000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "zed"},
Value: 1.3559151, Value: 1.355915069887731,
}, },
}, },
{ {
Sample: model.Sample{ Sample: model.Sample{
Metric: model.Metric{"percentile": "0.900000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "bar"}, Metric: model.Metric{"percentile": "0.900000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "bar"},
Value: 109.89202, Value: 109.89202084295582,
}, },
}, },
{ {
Sample: model.Sample{ Sample: model.Sample{
Metric: model.Metric{"percentile": "0.900000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "foo"}, Metric: model.Metric{"percentile": "0.900000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "foo"},
Value: 160.21101, Value: 160.21100853053224,
}, },
}, },
{ {
Sample: model.Sample{ Sample: model.Sample{
Metric: model.Metric{"percentile": "0.990000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "zed"}, Metric: model.Metric{"percentile": "0.990000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "zed"},
Value: 1.7727332, Value: 1.772733213161236,
}, },
}, },
{ {
Sample: model.Sample{ Sample: model.Sample{
Metric: model.Metric{"percentile": "0.990000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "bar"}, Metric: model.Metric{"percentile": "0.990000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "bar"},
Value: 109.99626, Value: 109.99626121011262,
}, },
}, },
{ {
Sample: model.Sample{ Sample: model.Sample{
Metric: model.Metric{"percentile": "0.990000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "foo"}, Metric: model.Metric{"percentile": "0.990000", model.MetricNameLabel: "rpc_latency_microseconds", "service": "foo"},
Value: 172.49829, Value: 172.49828748957728,
}, },
}, },
}, },

View file

@ -235,7 +235,7 @@ var expressionTests = []struct {
}, { }, {
// Rates should transform per-interval deltas to per-second rates. // Rates should transform per-interval deltas to per-second rates.
expr: "rate(http_requests{group='canary',instance='1',job='app-server'}[10m])", expr: "rate(http_requests{group='canary',instance='1',job='app-server'}[10m])",
output: []string{"http_requests{group='canary',instance='1',job='app-server'} => 0.26666668 @[%v]"}, output: []string{"http_requests{group='canary',instance='1',job='app-server'} => 0.26666666666666666 @[%v]"},
fullRanges: 1, fullRanges: 1,
intervalRanges: 0, intervalRanges: 0,
}, { }, {

View file

@ -40,7 +40,7 @@ type (
sample struct { sample struct {
time time.Time time time.Time
value float32 value float64
} }
sampleGroup struct { sampleGroup struct {
@ -90,7 +90,7 @@ func (s sampleGroup) Get() (key, value coding.Encoder) {
for _, value := range s.values { for _, value := range s.values {
series.Value = append(series.Value, &dto.SampleValueSeries_Value{ series.Value = append(series.Value, &dto.SampleValueSeries_Value{
Timestamp: proto.Int64(value.time.Unix()), Timestamp: proto.Int64(value.time.Unix()),
Value: proto.Float32(float32(value.value)), Value: proto.Float64(value.value),
}) })
} }

View file

@ -619,7 +619,7 @@ func (l *LevelDBMetricPersistence) AppendSamples(samples model.Samples) (err err
for _, sample := range chunk { for _, sample := range chunk {
value.Value = append(value.Value, &dto.SampleValueSeries_Value{ value.Value = append(value.Value, &dto.SampleValueSeries_Value{
Timestamp: proto.Int64(sample.Timestamp.Unix()), Timestamp: proto.Int64(sample.Timestamp.Unix()),
Value: proto.Float32(float32(sample.Value)), Value: sample.Value.ToDTO(),
}) })
} }

View file

@ -26,7 +26,7 @@ func GetValueAtTimeTests(persistenceMaker func() (MetricPersistence, test.Closer
month time.Month month time.Month
day int day int
hour int hour int
value float32 value float64
} }
type input struct { type input struct {
@ -358,7 +358,7 @@ func GetBoundaryValuesTests(persistenceMaker func() (MetricPersistence, test.Clo
month time.Month month time.Month
day int day int
hour int hour int
value float32 value float64
} }
type input struct { type input struct {
@ -672,7 +672,7 @@ func GetRangeValuesTests(persistenceMaker func() (MetricPersistence, test.Closer
month time.Month month time.Month
day int day int
hour int hour int
value float32 value float64
} }
type input struct { type input struct {
@ -691,7 +691,7 @@ func GetRangeValuesTests(persistenceMaker func() (MetricPersistence, test.Closer
month time.Month month time.Month
day int day int
hour int hour int
value float32 value model.SampleValue
} }
type behavior struct { type behavior struct {

View file

@ -233,10 +233,12 @@ func levelDBGetRangeValues(l *LevelDBMetricPersistence, fp model.Fingerprint, i
return nil, err return nil, err
} }
samples = append(samples, model.SamplePair{ for _, value := range retrievedValue.Value {
Value: model.SampleValue(*retrievedValue.Value[0].Value), samples = append(samples, model.SamplePair{
Timestamp: indexable.DecodeTime(retrievedKey.Timestamp), Value: model.SampleValue(*value.Value),
}) Timestamp: time.Unix(*value.Timestamp, 0),
})
}
} }
return return