2016-03-09 22:29:02 -05:00
// Copyright 2015 The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package promql
2017-08-07 17:15:38 +01:00
import (
"context"
"testing"
2017-08-10 16:28:49 +02:00
"github.com/prometheus/prometheus/pkg/labels"
"github.com/prometheus/prometheus/pkg/timestamp"
"github.com/prometheus/prometheus/util/testutil"
2017-08-07 17:15:38 +01:00
)
2016-03-09 22:29:02 -05:00
func BenchmarkHoltWinters4Week5Min ( b * testing . B ) {
input := `
clear
load 5 m
http_requests { path = "/foo" } 0 + 10 x8064
eval instant at 4 w holt_winters ( http_requests [ 4 w ] , 0.3 , 0.3 )
2016-08-24 18:37:09 +02:00
{ path = "/foo" } 80640
2016-03-09 22:29:02 -05:00
`
bench := NewBenchmark ( b , input )
bench . Run ( )
}
func BenchmarkHoltWinters1Week5Min ( b * testing . B ) {
input := `
clear
load 5 m
http_requests { path = "/foo" } 0 + 10 x2016
eval instant at 1 w holt_winters ( http_requests [ 1 w ] , 0.3 , 0.3 )
{ path = "/foo" } 20160
`
bench := NewBenchmark ( b , input )
bench . Run ( )
}
func BenchmarkHoltWinters1Day1Min ( b * testing . B ) {
input := `
clear
load 1 m
http_requests { path = "/foo" } 0 + 10 x1440
eval instant at 1 d holt_winters ( http_requests [ 1 d ] , 0.3 , 0.3 )
2016-08-24 18:37:09 +02:00
{ path = "/foo" } 14400
2016-03-09 22:29:02 -05:00
`
bench := NewBenchmark ( b , input )
bench . Run ( )
}
func BenchmarkChanges1Day1Min ( b * testing . B ) {
input := `
clear
load 1 m
http_requests { path = "/foo" } 0 + 10 x1440
eval instant at 1 d changes ( http_requests [ 1 d ] )
2016-08-24 18:37:09 +02:00
{ path = "/foo" } 1440
2016-03-09 22:29:02 -05:00
`
bench := NewBenchmark ( b , input )
bench . Run ( )
}
2017-08-07 17:15:38 +01:00
func TestDeriv ( t * testing . T ) {
// https://github.com/prometheus/prometheus/issues/2674#issuecomment-315439393
// This requires more precision than the usual test system offers,
// so we test it by hand.
2017-08-10 16:28:49 +02:00
storage := testutil . NewStorage ( t )
defer storage . Close ( )
2017-08-07 17:15:38 +01:00
engine := NewEngine ( storage , nil )
2017-08-10 16:28:49 +02:00
a , err := storage . Appender ( )
if err != nil {
t . Fatal ( err )
}
metric := labels . FromStrings ( "__name__" , "foo" )
a . Add ( metric , 1493712816939 , 1.0 )
a . Add ( metric , 1493712846939 , 1.0 )
if err := a . Commit ( ) ; err != nil {
t . Fatal ( err )
}
2017-08-07 17:15:38 +01:00
2017-08-10 16:28:49 +02:00
query , err := engine . NewInstantQuery ( "deriv(foo[30m])" , timestamp . Time ( 1493712846939 ) )
2017-08-07 17:15:38 +01:00
if err != nil {
t . Fatalf ( "Error parsing query: %s" , err )
}
result := query . Exec ( context . Background ( ) )
if result . Err != nil {
t . Fatalf ( "Error running query: %s" , result . Err )
}
vec , _ := result . Vector ( )
2017-08-10 16:28:49 +02:00
if len ( vec ) != 1 {
t . Fatalf ( "Expected 1 result, got %d" , len ( vec ) )
2017-08-07 17:15:38 +01:00
}
2017-08-10 16:28:49 +02:00
if vec [ 0 ] . V != 0.0 {
t . Fatalf ( "Expected 0.0 as value, got %f" , vec [ 0 ] . V )
2017-08-07 17:15:38 +01:00
}
}