Like Prometheus, but for logs.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
loki/pkg/util/conv_test.go

145 lines
3.1 KiB

package util
import (
"reflect"
"testing"
"time"
"github.com/prometheus/common/model"
)
func TestRoundToMilliseconds(t *testing.T) {
tests := []struct {
name string
from time.Time
through time.Time
wantFrom model.Time
wantThrough model.Time
}{
{
"0",
time.Unix(0, 0),
time.Unix(0, 1),
model.Time(0),
model.Time(1),
},
{
"equal",
time.Unix(0, time.Millisecond.Nanoseconds()),
time.Unix(0, time.Millisecond.Nanoseconds()),
model.Time(1),
model.Time(1),
},
{
"exact",
time.Unix(0, time.Millisecond.Nanoseconds()),
time.Unix(0, 2*time.Millisecond.Nanoseconds()),
model.Time(1),
model.Time(2),
},
{
"rounding",
time.Unix(0, time.Millisecond.Nanoseconds()+10),
time.Unix(0, 2*time.Millisecond.Nanoseconds()+10),
model.Time(1),
model.Time(3),
},
{
"rounding large number in nanoseconds",
time.Unix(0, 1643958368442000064),
time.Unix(0, 1643958368443000064),
model.Time(1643958368442),
model.Time(1643958368444),
},
{
"already rounded large number in nanoseconds",
time.Unix(0, 1643958368442000000),
time.Unix(0, 1643958368443000000),
model.Time(1643958368442),
model.Time(1643958368443),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
from, through := RoundToMilliseconds(tt.from, tt.through)
if !reflect.DeepEqual(from, tt.wantFrom) {
t.Errorf("RoundToMilliseconds() from = %v, want %v", from, tt.wantFrom)
}
if !reflect.DeepEqual(through, tt.wantThrough) {
t.Errorf("RoundToMilliseconds() through = %v, want %v", through, tt.wantThrough)
}
})
}
}
LogQL: Labels and Metrics Extraction (#2769) * Adds logfmt, regexp and json logql parser Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * hook the ast with parsers. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * hook parser with memchunk. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * hook parser with the storage. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * hook parser with ingesters Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * fixes all tests Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Refactor to pipeline and implement ast parsing. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Fixes the lexer for duration and range Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Fixes all tests and add some for label filters Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Add label and line format. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Add tests for fmt label and line with validations. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Polishing parsers and add some more test cases Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Finish the unwrap parser, still need to add more tests Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Indent this hell. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Moar tests and it works. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Add more tests which lead me to find a bug in the lexer Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Add more tests and fix all engine tests Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Fixes match stage in promtail pipelines. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Hook Pipeline into ingester, tailer and storage. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Correctly setup sharding for logqlv2 Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Fixes precedences issue with label filters and add moar tests :v: * Adds quantile_over_time, grouping for non associate range aggregation parsing and moar tests * Extract with grouping * Adds parsing duration on unwrap * Improve the lexer to support more common identifier as functions. Also add duration convertion for unwrap. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Fixes the frontend logs to include org_id. The auth middleware was happening after the stats one and so org_id was not set :facepalm:. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Support byte sizes in label filters. This patch extends the duration label filter with support for byte sizes such as `1kB` and `42MiB`. * Wip on error handling. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Fixes json parser with prometheus label name rules. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * fixup! Support byte sizes in label filters. * Wip error handling, commit before big refactoring. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Refactoring in progress. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Work in progress. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Got something that builds and throw __error__ labels properly now. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Add error handling + fixes groupins and post filtering. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * 400 on pipeline errors. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Fixes a races in the log pipeline. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Unsure the key is parsable and valid. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Cleanup and code documentation. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Lint. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Lint. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Fixes frontend handler. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Fixes old test. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> * Fix go1.15 local failing test. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com> Co-authored-by: Karsten Jeschkies <k@jeschkies.xyz>
5 years ago
func TestModelLabelSetToMap(t *testing.T) {
tests := []struct {
name string
m model.LabelSet
want map[string]string
}{
{
"nil",
nil,
map[string]string{},
},
{
"one",
model.LabelSet{model.LabelName("foo"): model.LabelValue("bar")},
map[string]string{"foo": "bar"},
},
{
"two",
model.LabelSet{
model.LabelName("foo"): model.LabelValue("bar"),
model.LabelName("buzz"): model.LabelValue("fuzz"),
},
map[string]string{
"foo": "bar",
"buzz": "fuzz",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := ModelLabelSetToMap(tt.m); !reflect.DeepEqual(got, tt.want) {
t.Errorf("ModelLabelSetToMap() = %v, want %v", got, tt.want)
}
})
}
}
func TestMapToModelLabelSet(t *testing.T) {
tests := []struct {
name string
args map[string]string
want model.LabelSet
}{
{"nil", nil, model.LabelSet{}},
{
"one",
map[string]string{"foo": "bar"},
model.LabelSet{model.LabelName("foo"): model.LabelValue("bar")},
},
{
"two",
map[string]string{
"foo": "bar",
"buzz": "fuzz",
},
model.LabelSet{
model.LabelName("foo"): model.LabelValue("bar"),
model.LabelName("buzz"): model.LabelValue("fuzz"),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := MapToModelLabelSet(tt.args); !reflect.DeepEqual(got, tt.want) {
t.Errorf("MapToModelLabelSet() = %v, want %v", got, tt.want)
}
})
}
}