signoz/pkg/query-service/common/query_range_test.go
Nityananda Gohain 9a3c49bce4
Store complete intervals in cache and update logic for response (#7212)
* fix: new implementation for finding missing timerange

* fix: remove unwanted code

* fix: update if condition

* fix: update logic and the test cases

* fix: correct name

* fix: filter points which are not a complete agg interval

* fix: fix the logic to use the points correctly

* fix: fix overlapping test case

* fix: add comments

* Update pkg/query-service/querycache/query_range_cache.go

Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>

* fix: use step ms

* fix: use step ms

* fix: tests

* fix: update logic to handle actual empty series

* fix: name updated

* Update pkg/query-service/app/querier/v2/helper.go

Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>

* fix: address comments

* fix: address comments

* fix: address comments

* Update pkg/query-service/common/query_range.go

Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>

* fix: add error log

* fix: handle case where end is equal to a complete window end

* fix: added comments

* fix: address comments

* fix: move function to common query range

---------

Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
2025-03-13 04:34:06 +00:00

436 lines
12 KiB
Go

package common
import (
"testing"
v3 "go.signoz.io/signoz/pkg/query-service/model/v3"
"go.signoz.io/signoz/pkg/query-service/querycache"
)
func TestFilterSeriesPoints(t *testing.T) {
// Define test cases
testCases := []struct {
name string
seriesList []*v3.Series
missStart int64 // in milliseconds
missEnd int64 // in milliseconds
stepInterval int64 // in seconds
expectedPoints []*v3.Series
expectedStart int64 // in milliseconds
expectedEnd int64 // in milliseconds
}{
{
name: "Complete aggregation window",
missStart: 1609459200000, // 01 Jan 2021 00:00:00 UTC
missEnd: 1609466400000, // 01 Jan 2021 02:00:00 UTC
stepInterval: 3600, // 1 hour
seriesList: []*v3.Series{
{
Points: []v3.Point{
{Timestamp: 1609459200000, Value: 1.0}, // 01 Jan 2021 00:00:00 UTC
{Timestamp: 1609462800000, Value: 2.0}, // 01 Jan 2021 01:00:00 UTC
{Timestamp: 1609466400000, Value: 3.0}, // 01 Jan 2021 02:00:00 UTC
},
},
},
expectedPoints: []*v3.Series{
{
Points: []v3.Point{
{Timestamp: 1609459200000, Value: 1.0},
{Timestamp: 1609462800000, Value: 2.0},
},
},
},
expectedStart: 1609459200000,
expectedEnd: 1609466400000,
},
{
name: "Filter first point",
missStart: 1609464600000, // 01 Jan 2021 01:30:00 UTC
missEnd: 1609470000000, // 01 Jan 2021 03:00:00 UTC
stepInterval: 3600, // 1 hour
seriesList: []*v3.Series{
{
Points: []v3.Point{
{Timestamp: 1609462800000, Value: 2.0}, // 01 Jan 2021 01:00:00 UTC
{Timestamp: 1609466400000, Value: 3.0}, // 01 Jan 2021 02:00:00 UTC
},
},
},
expectedPoints: []*v3.Series{
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 3.0},
},
},
},
expectedStart: 1609466400000,
expectedEnd: 1609470000000,
},
{
name: "Filter last point",
missStart: 1609466400000, // 01 Jan 2021 02:00:00 UTC
missEnd: 1609471800000, // 01 Jan 2021 03:30:00 UTC
stepInterval: 3600, // 1 hour
seriesList: []*v3.Series{
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 3.0}, // 01 Jan 2021 02:00:00 UTC
{Timestamp: 1609470000000, Value: 3.0}, // 01 Jan 2021 03:00:00 UTC
},
},
},
expectedPoints: []*v3.Series{
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 3.0},
},
},
},
expectedStart: 1609466400000,
expectedEnd: 1609470000000,
},
{
name: "Incomplete aggregation window",
missStart: 1609470000000, // 01 Jan 2021 03:00:00 UTC
missEnd: 1609471800000, // 01 Jan 2021 03:30:00 UTC
stepInterval: 3600, // 1 hour
seriesList: []*v3.Series{
{
Points: []v3.Point{},
},
},
expectedPoints: []*v3.Series{},
expectedStart: 1609470000000,
expectedEnd: 1609471800000,
},
{
name: "Filter first point with multiple series",
missStart: 1609464600000, // 01 Jan 2021 01:30:00 UTC
missEnd: 1609477200000, // 01 Jan 2021 05:00:00 UTC
stepInterval: 3600, // 1 hour
seriesList: []*v3.Series{
{
Points: []v3.Point{
{Timestamp: 1609462800000, Value: 2.0}, // 01 Jan 2021 01:00:00 UTC
{Timestamp: 1609466400000, Value: 3.0}, // 01 Jan 2021 02:00:00 UTC
{Timestamp: 1609470000000, Value: 4.0}, // 01 Jan 2021 03:00:00 UTC
{Timestamp: 1609473600000, Value: 5.0}, // 01 Jan 2021 04:00:00 UTC
},
},
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 6.0}, // 01 Jan 2021 02:00:00 UTC
{Timestamp: 1609470000000, Value: 7.0}, // 01 Jan 2021 03:00:00 UTC
{Timestamp: 1609473600000, Value: 8.0}, // 01 Jan 2021 04:00:00 UTC
},
},
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 9.0}, // 01 Jan 2021 02:00:00 UTC
{Timestamp: 1609470000000, Value: 10.0}, // 01 Jan 2021 03:00:00 UTC
{Timestamp: 1609473600000, Value: 11.0}, // 01 Jan 2021 04:00:00 UTC
},
},
},
expectedPoints: []*v3.Series{
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 3.0}, // 01 Jan 2021 02:00:00 UTC
{Timestamp: 1609470000000, Value: 4.0}, // 01 Jan 2021 03:00:00 UTC
{Timestamp: 1609473600000, Value: 5.0}, // 01 Jan 2021 04:00:00 UTC
},
},
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 6.0}, // 01 Jan 2021 02:00:00 UTC
{Timestamp: 1609470000000, Value: 7.0}, // 01 Jan 2021 03:00:00 UTC
{Timestamp: 1609473600000, Value: 8.0}, // 01 Jan 2021 04:00:00 UTC
},
},
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 9.0}, // 01 Jan 2021 02:00:00 UTC
{Timestamp: 1609470000000, Value: 10.0}, // 01 Jan 2021 03:00:00 UTC
{Timestamp: 1609473600000, Value: 11.0}, // 01 Jan 2021 04:00:00 UTC
},
},
},
expectedStart: 1609466400000,
expectedEnd: 1609477200000,
},
{
name: "Filter last point",
missStart: 1609466400000, // 01 Jan 2021 02:00:00 UTC
missEnd: 1609475400000, // 01 Jan 2021 04:30:00 UTC
stepInterval: 3600, // 1 hour
seriesList: []*v3.Series{
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 3.0}, // 01 Jan 2021 02:00:00 UTC
{Timestamp: 1609470000000, Value: 4.0}, // 01 Jan 2021 03:00:00 UTC
{Timestamp: 1609473600000, Value: 5.0}, // 01 Jan 2021 04:00:00 UTC
},
},
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 6.0}, // 01 Jan 2021 02:00:00 UTC
},
},
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 9.0}, // 01 Jan 2021 02:00:00 UTC
{Timestamp: 1609470000000, Value: 10.0}, // 01 Jan 2021 03:00:00 UTC
},
},
},
expectedPoints: []*v3.Series{
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 3.0}, // 01 Jan 2021 02:00:00 UTC
{Timestamp: 1609470000000, Value: 4.0}, // 01 Jan 2021 03:00:00 UTC
},
},
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 6.0}, // 01 Jan 2021 02:00:00 UTC
},
},
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 9.0}, // 01 Jan 2021 02:00:00 UTC
{Timestamp: 1609470000000, Value: 10.0}, // 01 Jan 2021 03:00:00 UTC
},
},
},
expectedStart: 1609466400000,
expectedEnd: 1609473600000,
},
{
name: "half range should return empty result",
missStart: 1609473600000, // 01 Jan 2021 04:00:00 UTC
missEnd: 1609475400000, // 01 Jan 2021 04:30:00 UTC
stepInterval: 3600, // 1 hour
seriesList: []*v3.Series{
{
Points: []v3.Point{
{Timestamp: 1609473600000, Value: 1.0}, // 01 Jan 2021 04:00:00 UTC
},
},
},
expectedPoints: []*v3.Series{},
expectedStart: 1609473600000,
expectedEnd: 1609475400000,
},
{
name: "respect actual empty series",
missStart: 1609466400000, // 01 Jan 2021 02:00:00 UTC
missEnd: 1609475400000, // 01 Jan 2021 04:30:00 UTC
stepInterval: 3600, // 1 hour
seriesList: []*v3.Series{
{
Points: []v3.Point{},
},
},
expectedPoints: []*v3.Series{
{
Points: []v3.Point{},
},
},
expectedStart: 1609466400000,
expectedEnd: 1609473600000,
},
{
name: "Remove point that is not a complete aggregation window",
missStart: 1609466400000, // 01 Jan 2021 02:00:00 UTC
missEnd: 1609470000000, // 01 Jan 2021 03:00:00 UTC
stepInterval: 3600, // 1 hour
seriesList: []*v3.Series{
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 2.0}, // 01 Jan 2021 02:00:00 UTC
{Timestamp: 1609470000000, Value: 3.0}, // 01 Jan 2021 03:00:00 UTC
},
},
},
expectedPoints: []*v3.Series{
{
Points: []v3.Point{
{Timestamp: 1609466400000, Value: 2.0},
},
},
},
expectedStart: 1609466400000,
expectedEnd: 1609470000000,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
filteredSeries, startTime, endTime := FilterSeriesPoints(tc.seriesList, tc.missStart, tc.missEnd, tc.stepInterval)
if len(tc.expectedPoints) != len(filteredSeries) {
t.Errorf("Expected %d series, got %d", len(tc.expectedPoints), len(filteredSeries))
return
}
for i := range tc.expectedPoints {
if len(tc.expectedPoints[i].Points) != len(filteredSeries[i].Points) {
t.Errorf("Series %d: Expected %d points, got %d\nExpected points: %+v\nGot points: %+v",
i,
len(tc.expectedPoints[i].Points),
len(filteredSeries[i].Points),
tc.expectedPoints[i].Points,
filteredSeries[i].Points)
continue
}
for j := range tc.expectedPoints[i].Points {
if tc.expectedPoints[i].Points[j].Timestamp != filteredSeries[i].Points[j].Timestamp {
t.Errorf("Series %d Point %d: Expected timestamp %d, got %d", i, j, tc.expectedPoints[i].Points[j].Timestamp, filteredSeries[i].Points[j].Timestamp)
}
if tc.expectedPoints[i].Points[j].Value != filteredSeries[i].Points[j].Value {
t.Errorf("Series %d Point %d: Expected value %f, got %f", i, j, tc.expectedPoints[i].Points[j].Value, filteredSeries[i].Points[j].Value)
}
}
}
if tc.expectedStart != startTime {
t.Errorf("Expected start time %d, got %d", tc.expectedStart, startTime)
}
if tc.expectedEnd != endTime {
t.Errorf("Expected end time %d, got %d", tc.expectedEnd, endTime)
}
})
}
}
func TestGetSeriesFromCachedData(t *testing.T) {
testCases := []struct {
name string
data []querycache.CachedSeriesData
start int64
end int64
expectedCount int
expectedPoints int
}{
{
name: "Single point outside range",
data: []querycache.CachedSeriesData{
{
Data: []*v3.Series{
{
Labels: map[string]string{"label1": "value1"},
Points: []v3.Point{
{Timestamp: 1609473600000, Value: 1.0},
},
},
},
},
},
start: 1609475400000, // 01 Jan 2021 04:30:00 UTC
end: 1609477200000, // 01 Jan 2021 05:00:00 UTC
expectedCount: 1,
expectedPoints: 0,
},
{
name: "Single point inside range",
data: []querycache.CachedSeriesData{
{
Data: []*v3.Series{
{
Labels: map[string]string{"label1": "value1"},
Points: []v3.Point{
{Timestamp: 1609476000000, Value: 1.0},
},
},
},
},
},
start: 1609475400000, // 01 Jan 2021 04:30:00 UTC
end: 1609477200000, // 01 Jan 2021 05:00:00 UTC
expectedCount: 1,
expectedPoints: 1,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
series := GetSeriesFromCachedData(tc.data, tc.start, tc.end)
if len(series) != tc.expectedCount {
t.Errorf("Expected %d series, got %d", tc.expectedCount, len(series))
}
if len(series[0].Points) != tc.expectedPoints {
t.Errorf("Expected %d points, got %d", tc.expectedPoints, len(series[0].Points))
}
})
}
}
func TestGetSeriesFromCachedDataV2(t *testing.T) {
testCases := []struct {
name string
data []querycache.CachedSeriesData
start int64
end int64
step int64
expectedCount int
expectedPoints int
}{
{
name: "Single point outside range",
data: []querycache.CachedSeriesData{
{
Data: []*v3.Series{
{
Labels: map[string]string{"label1": "value1"},
Points: []v3.Point{
{Timestamp: 1609473600000, Value: 1.0},
},
},
},
},
},
start: 1609475400000,
end: 1609477200000,
step: 1000,
expectedCount: 1,
expectedPoints: 0,
},
{
name: "Single point inside range",
data: []querycache.CachedSeriesData{
{
Data: []*v3.Series{
{
Labels: map[string]string{"label1": "value1"},
Points: []v3.Point{
{Timestamp: 1609476000000, Value: 1.0},
},
},
},
},
},
start: 1609475400000,
end: 1609477200000,
step: 1000,
expectedCount: 1,
expectedPoints: 1,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
series := GetSeriesFromCachedDataV2(tc.data, tc.start, tc.end, tc.step)
if len(series) != tc.expectedCount {
t.Errorf("Expected %d series, got %d", tc.expectedCount, len(series))
}
if len(series[0].Points) != tc.expectedPoints {
t.Errorf("Expected %d points, got %d", tc.expectedPoints, len(series[0].Points))
}
})
}
}