mirror of
https://github.com/SigNoz/signoz.git
synced 2025-12-22 18:06:35 +00:00
chore: fix step interval auto
This commit is contained in:
parent
1542b9d6e9
commit
f267ed8ad1
@ -7,10 +7,12 @@ import (
|
|||||||
"slices"
|
"slices"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/SigNoz/signoz/pkg/errors"
|
"github.com/SigNoz/signoz/pkg/errors"
|
||||||
"github.com/SigNoz/signoz/pkg/factory"
|
"github.com/SigNoz/signoz/pkg/factory"
|
||||||
"github.com/SigNoz/signoz/pkg/prometheus"
|
"github.com/SigNoz/signoz/pkg/prometheus"
|
||||||
|
"github.com/SigNoz/signoz/pkg/querybuilder"
|
||||||
"github.com/SigNoz/signoz/pkg/telemetrystore"
|
"github.com/SigNoz/signoz/pkg/telemetrystore"
|
||||||
"github.com/SigNoz/signoz/pkg/types/metrictypes"
|
"github.com/SigNoz/signoz/pkg/types/metrictypes"
|
||||||
"github.com/SigNoz/signoz/pkg/types/telemetrytypes"
|
"github.com/SigNoz/signoz/pkg/types/telemetrytypes"
|
||||||
@ -107,7 +109,7 @@ func (q *querier) QueryRange(ctx context.Context, orgID valuer.UUID, req *qbtype
|
|||||||
|
|
||||||
// First pass: collect all metric names that need temporality
|
// First pass: collect all metric names that need temporality
|
||||||
metricNames := make([]string, 0)
|
metricNames := make([]string, 0)
|
||||||
for _, query := range req.CompositeQuery.Queries {
|
for idx, query := range req.CompositeQuery.Queries {
|
||||||
if query.Type == qbtypes.QueryTypeBuilder {
|
if query.Type == qbtypes.QueryTypeBuilder {
|
||||||
if spec, ok := query.Spec.(qbtypes.QueryBuilderQuery[qbtypes.MetricAggregation]); ok {
|
if spec, ok := query.Spec.(qbtypes.QueryBuilderQuery[qbtypes.MetricAggregation]); ok {
|
||||||
for _, agg := range spec.Aggregations {
|
for _, agg := range spec.Aggregations {
|
||||||
@ -116,6 +118,44 @@ func (q *querier) QueryRange(ctx context.Context, orgID valuer.UUID, req *qbtype
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
switch spec := query.Spec.(type) {
|
||||||
|
case qbtypes.QueryBuilderQuery[qbtypes.TraceAggregation]:
|
||||||
|
if spec.StepInterval.Seconds() == 0 {
|
||||||
|
spec.StepInterval = qbtypes.Step{
|
||||||
|
Duration: time.Second * time.Duration(querybuilder.RecommendedStepInterval(req.Start, req.End)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if spec.StepInterval.Seconds() < float64(querybuilder.MinAllowedStepInterval(req.Start, req.End)) {
|
||||||
|
spec.StepInterval = qbtypes.Step{
|
||||||
|
Duration: time.Second * time.Duration(querybuilder.MinAllowedStepInterval(req.Start, req.End)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
req.CompositeQuery.Queries[idx].Spec = spec
|
||||||
|
case qbtypes.QueryBuilderQuery[qbtypes.LogAggregation]:
|
||||||
|
if spec.StepInterval.Seconds() == 0 {
|
||||||
|
spec.StepInterval = qbtypes.Step{
|
||||||
|
Duration: time.Second * time.Duration(querybuilder.RecommendedStepInterval(req.Start, req.End)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if spec.StepInterval.Seconds() < float64(querybuilder.MinAllowedStepInterval(req.Start, req.End)) {
|
||||||
|
spec.StepInterval = qbtypes.Step{
|
||||||
|
Duration: time.Second * time.Duration(querybuilder.MinAllowedStepInterval(req.Start, req.End)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
req.CompositeQuery.Queries[idx].Spec = spec
|
||||||
|
case qbtypes.QueryBuilderQuery[qbtypes.MetricAggregation]:
|
||||||
|
if spec.StepInterval.Seconds() == 0 {
|
||||||
|
spec.StepInterval = qbtypes.Step{
|
||||||
|
Duration: time.Second * time.Duration(querybuilder.RecommendedStepIntervalForMetric(req.Start, req.End)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if spec.StepInterval.Seconds() < float64(querybuilder.MinAllowedStepIntervalForMetric(req.Start, req.End)) {
|
||||||
|
spec.StepInterval = qbtypes.Step{
|
||||||
|
Duration: time.Second * time.Duration(querybuilder.MinAllowedStepIntervalForMetric(req.Start, req.End)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
req.CompositeQuery.Queries[idx].Spec = spec
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,10 +1,16 @@
|
|||||||
package querybuilder
|
package querybuilder
|
||||||
|
|
||||||
import "math"
|
import (
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
NsToSeconds = 1000000000
|
NsToSeconds = 1000000000
|
||||||
BucketAdjustment = 1800 // 30 minutes
|
BucketAdjustment = 1800 // 30 minutes
|
||||||
|
|
||||||
|
RecommendedNumberOfPoints = 300
|
||||||
|
MaxAllowedNumberofPoints = 1500
|
||||||
|
MaxAllowedSeries = 3000
|
||||||
)
|
)
|
||||||
|
|
||||||
// ToNanoSecs takes epoch and returns it in ns
|
// ToNanoSecs takes epoch and returns it in ns
|
||||||
@ -21,3 +27,61 @@ func ToNanoSecs(epoch uint64) uint64 {
|
|||||||
}
|
}
|
||||||
return temp * uint64(math.Pow(10, float64(19-count)))
|
return temp * uint64(math.Pow(10, float64(19-count)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RecommendedStepInterval(start, end uint64) uint64 {
|
||||||
|
start = ToNanoSecs(start)
|
||||||
|
end = ToNanoSecs(end)
|
||||||
|
|
||||||
|
step := (end - start) / RecommendedNumberOfPoints / 1e9
|
||||||
|
|
||||||
|
if step < 5 {
|
||||||
|
return 5
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the nearest lower multiple of 5
|
||||||
|
return step - step%5
|
||||||
|
}
|
||||||
|
|
||||||
|
func MinAllowedStepInterval(start, end uint64) uint64 {
|
||||||
|
start = ToNanoSecs(start)
|
||||||
|
end = ToNanoSecs(end)
|
||||||
|
|
||||||
|
step := (end - start) / MaxAllowedNumberofPoints / 1e9
|
||||||
|
|
||||||
|
if step < 5 {
|
||||||
|
return 5
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the nearest lower multiple of 5
|
||||||
|
return step - step%5
|
||||||
|
}
|
||||||
|
|
||||||
|
func RecommendedStepIntervalForMetric(start, end uint64) uint64 {
|
||||||
|
start = ToNanoSecs(start)
|
||||||
|
end = ToNanoSecs(end)
|
||||||
|
|
||||||
|
step := (end - start) / RecommendedNumberOfPoints / 1e9
|
||||||
|
|
||||||
|
// TODO: make this make use of the reporting frequency and remove the hard coded step
|
||||||
|
if step < 60 {
|
||||||
|
return 60
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the nearest lower multiple of 60
|
||||||
|
return step - step%60
|
||||||
|
}
|
||||||
|
|
||||||
|
func MinAllowedStepIntervalForMetric(start, end uint64) uint64 {
|
||||||
|
start = ToNanoSecs(start)
|
||||||
|
end = ToNanoSecs(end)
|
||||||
|
|
||||||
|
step := (end - start) / RecommendedNumberOfPoints / 1e9
|
||||||
|
|
||||||
|
// TODO: make this make use of the reporting frequency and remove the hard coded step
|
||||||
|
if step < 60 {
|
||||||
|
return 60
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the nearest lower multiple of 60
|
||||||
|
return step - step%60
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user