vitess.io/vitess@v0.16.2/go/vt/vtorc/metrics/query/aggregated.go (about) 1 // Package query provdes query metrics with this file providing 2 // aggregared metrics based on the underlying values. 3 package query 4 5 import ( 6 "time" 7 8 "github.com/montanaflynn/stats" 9 10 "vitess.io/vitess/go/vt/vtorc/collection" 11 ) 12 13 type AggregatedQueryMetrics struct { 14 // fill me in here 15 Count int 16 MaxLatencySeconds float64 17 MeanLatencySeconds float64 18 MedianLatencySeconds float64 19 P95LatencySeconds float64 20 MaxWaitSeconds float64 21 MeanWaitSeconds float64 22 MedianWaitSeconds float64 23 P95WaitSeconds float64 24 } 25 26 // AggregatedSince returns the aggregated query metrics for the period 27 // given from the values provided. 28 func AggregatedSince(c *collection.Collection, t time.Time) AggregatedQueryMetrics { 29 30 // Initialise timing metrics 31 var waitTimings []float64 32 var queryTimings []float64 33 34 // Retrieve values since the time specified 35 values, err := c.Since(t) 36 a := AggregatedQueryMetrics{} 37 if err != nil { 38 return a // empty data 39 } 40 41 // generate the metrics 42 for _, v := range values { 43 waitTimings = append(waitTimings, v.(*Metric).WaitLatency.Seconds()) 44 queryTimings = append(queryTimings, v.(*Metric).ExecuteLatency.Seconds()) 45 } 46 47 a.Count = len(waitTimings) 48 49 // generate aggregate values 50 if s, err := stats.Max(stats.Float64Data(waitTimings)); err == nil { 51 a.MaxWaitSeconds = s 52 } 53 if s, err := stats.Mean(stats.Float64Data(waitTimings)); err == nil { 54 a.MeanWaitSeconds = s 55 } 56 if s, err := stats.Median(stats.Float64Data(waitTimings)); err == nil { 57 a.MedianWaitSeconds = s 58 } 59 if s, err := stats.Percentile(stats.Float64Data(waitTimings), 95); err == nil { 60 a.P95WaitSeconds = s 61 } 62 if s, err := stats.Max(stats.Float64Data(queryTimings)); err == nil { 63 a.MaxLatencySeconds = s 64 } 65 if s, err := stats.Mean(stats.Float64Data(queryTimings)); err == nil { 66 a.MeanLatencySeconds = s 67 } 68 if s, err := stats.Median(stats.Float64Data(queryTimings)); err == nil { 69 a.MedianLatencySeconds = s 70 } 71 if s, err := stats.Percentile(stats.Float64Data(queryTimings), 95); err == nil { 72 a.P95LatencySeconds = s 73 } 74 75 return a 76 }