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 }