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  }