func bucketsFromMetricPoints(metricPoints []metricPoint, resultField func(metricPoint) float64, timerange api.Timerange) [][]float64 { buckets := make([][]float64, timerange.Slots()) for _, point := range metricPoints { addMetricPoint(point, resultField, timerange, buckets) } return buckets }
func addMetricPoint(metricPoint metricPoint, field func(metricPoint) float64, timerange api.Timerange, buckets [][]float64) bool { value := field(metricPoint) // The index to assign within the array is computed using the timestamp. // It floors to the nearest index. index := (metricPoint.Timestamp - timerange.Start()) / timerange.ResolutionMillis() if index < 0 || index >= int64(timerange.Slots()) { return false } buckets[index] = append(buckets[index], value) return true }
func (value ScalarValue) ToSeriesList(timerange api.Timerange) (api.SeriesList, error) { series := make([]float64, timerange.Slots()) for i := range series { series[i] = float64(value) } return api.SeriesList{ Series: []api.Timeseries{api.Timeseries{Values: series, TagSet: api.NewTagSet()}}, Timerange: timerange, }, nil }
func processResult(parsedResult queryResponse, timerange api.Timerange, sampler sampler) []float64 { // buckets are each filled with from the points stored in result.Values, according to their timestamps. buckets := bucketsFromMetricPoints(parsedResult.Values, sampler.fieldSelector, timerange) // values will hold the final values to be returned as the series. values := make([]float64, timerange.Slots()) for i, bucket := range buckets { if len(bucket) == 0 { values[i] = math.NaN() continue } values[i] = sampler.bucketSampler(bucket) } return values }
func processResult( points []metricPoint, timerange api.Timerange, sampler sampler, queryResolution Resolution) []float64 { // buckets are each filled with from the points stored in `points`, according to their timestamps. buckets := bucketsFromMetricPoints(points, sampler.fieldSelector, timerange) // values will hold the final values to be returned as the series. values := make([]float64, timerange.Slots()) for i, bucket := range buckets { if len(bucket) == 0 { values[i] = math.NaN() continue } values[i] = sampler.bucketSampler(bucket) } // interpolate. return values }