2025-05-25 22:14:47 +05:30
|
|
|
package querybuilder
|
|
|
|
|
|
2025-06-23 14:00:50 +05:30
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"math"
|
|
|
|
|
)
|
2025-05-25 22:14:47 +05:30
|
|
|
|
2025-05-27 20:54:48 +05:30
|
|
|
const (
|
|
|
|
|
NsToSeconds = 1000000000
|
|
|
|
|
BucketAdjustment = 1800 // 30 minutes
|
2025-06-21 17:49:33 +05:30
|
|
|
|
|
|
|
|
RecommendedNumberOfPoints = 300
|
|
|
|
|
MaxAllowedNumberOfPoints = 1500
|
|
|
|
|
MaxAllowedSeries = 3000
|
2025-05-27 20:54:48 +05:30
|
|
|
)
|
|
|
|
|
|
2025-05-25 22:14:47 +05:30
|
|
|
// ToNanoSecs takes epoch and returns it in ns
|
|
|
|
|
func ToNanoSecs(epoch uint64) uint64 {
|
|
|
|
|
temp := epoch
|
|
|
|
|
count := 0
|
|
|
|
|
if epoch == 0 {
|
|
|
|
|
count = 1
|
|
|
|
|
} else {
|
|
|
|
|
for epoch != 0 {
|
|
|
|
|
epoch /= 10
|
|
|
|
|
count++
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return temp * uint64(math.Pow(10, float64(19-count)))
|
|
|
|
|
}
|
2025-06-21 17:49:33 +05:30
|
|
|
|
|
|
|
|
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(srikanthccv): make this make use of the reporting frequency and remove the 60
|
|
|
|
|
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(srikanthccv): make this make use of the reporting frequency and remove the 60
|
|
|
|
|
if step < 60 {
|
|
|
|
|
return 60
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// return the nearest lower multiple of 60
|
|
|
|
|
return step - step%60
|
|
|
|
|
}
|
2025-06-23 14:00:50 +05:30
|
|
|
|
|
|
|
|
func AssignReservedVars(vars map[string]any, start, end uint64) {
|
|
|
|
|
start = ToNanoSecs(start)
|
|
|
|
|
end = ToNanoSecs(end)
|
|
|
|
|
|
|
|
|
|
vars["start_timestamp"] = start / 1_000_000_000
|
|
|
|
|
vars["end_timestamp"] = end / 1_000_000_000
|
|
|
|
|
vars["start_timestamp_ms"] = start / 1_000_000
|
|
|
|
|
vars["end_timestamp_ms"] = end / 1_000_000
|
|
|
|
|
vars["SIGNOZ_START_TIME"] = start / 1_000_000
|
|
|
|
|
vars["SIGNOZ_END_TIME"] = end / 1_000_000
|
|
|
|
|
vars["start_timestamp_nano"] = start
|
|
|
|
|
vars["end_timestamp_nano"] = end
|
|
|
|
|
vars["start_datetime"] = fmt.Sprintf("toDateTime(%d)", start/1_000_000_000)
|
|
|
|
|
vars["end_datetime"] = fmt.Sprintf("toDateTime(%d)", end/1_000_000_000)
|
|
|
|
|
}
|