mirror of
https://github.com/grafana/grafana.git
synced 2024-11-27 03:11:01 -06:00
59 lines
1.7 KiB
Go
59 lines
1.7 KiB
Go
|
package azuremonitor
|
||
|
|
||
|
import "encoding/json"
|
||
|
|
||
|
// setAutoTimeGrain tries to find the closest interval to the query's intervalMs value
|
||
|
// if the metric has a limited set of possible intervals/time grains then use those
|
||
|
// instead of the default list of intervals
|
||
|
func setAutoTimeGrain(intervalMs int64, timeGrains interface{}) (string, error) {
|
||
|
// parses array of numbers from the timeGrains json field
|
||
|
allowedTimeGrains := []int64{}
|
||
|
tgs, ok := timeGrains.([]interface{})
|
||
|
if ok {
|
||
|
for _, v := range tgs {
|
||
|
jsonNumber, ok := v.(json.Number)
|
||
|
if ok {
|
||
|
tg, err := jsonNumber.Int64()
|
||
|
if err == nil {
|
||
|
allowedTimeGrains = append(allowedTimeGrains, tg)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
autoInterval := findClosestAllowedIntervalMS(intervalMs, allowedTimeGrains)
|
||
|
tg := &TimeGrain{}
|
||
|
autoTimeGrain, err := tg.createISO8601DurationFromIntervalMS(autoInterval)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
|
||
|
return autoTimeGrain, nil
|
||
|
}
|
||
|
|
||
|
// findClosestAllowedIntervalMs is used for the auto time grain setting.
|
||
|
// It finds the closest time grain from the list of allowed time grains for Azure Monitor
|
||
|
// using the Grafana interval in milliseconds
|
||
|
// Some metrics only allow a limited list of time grains. The allowedTimeGrains parameter
|
||
|
// allows overriding the default list of allowed time grains.
|
||
|
func findClosestAllowedIntervalMS(intervalMs int64, allowedTimeGrains []int64) int64 {
|
||
|
allowedIntervals := defaultAllowedIntervalsMS
|
||
|
|
||
|
if len(allowedTimeGrains) > 0 {
|
||
|
allowedIntervals = allowedTimeGrains
|
||
|
}
|
||
|
|
||
|
closest := allowedIntervals[0]
|
||
|
|
||
|
for i, allowed := range allowedIntervals {
|
||
|
if intervalMs > allowed {
|
||
|
if i+1 < len(allowedIntervals) {
|
||
|
closest = allowedIntervals[i+1]
|
||
|
} else {
|
||
|
closest = allowed
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return closest
|
||
|
}
|