vitess.io/vitess@v0.16.2/go/vt/vtorc/discovery/queue_aggregated_stats.go (about)

     1  /*
     2     Copyright 2017 Simon J Mudd
     3  
     4     Licensed under the Apache License, Version 2.0 (the "License");
     5     you may not use this file except in compliance with the License.
     6     You may obtain a copy of the License at
     7  
     8         http://www.apache.org/licenses/LICENSE-2.0
     9  
    10     Unless required by applicable law or agreed to in writing, software
    11     distributed under the License is distributed on an "AS IS" BASIS,
    12     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13     See the License for the specific language governing permissions and
    14     limitations under the License.
    15  */
    16  
    17  package discovery
    18  
    19  import (
    20  	"github.com/montanaflynn/stats"
    21  
    22  	"vitess.io/vitess/go/vt/log"
    23  )
    24  
    25  // AggregatedQueueMetrics contains aggregate information some part queue metrics
    26  type AggregatedQueueMetrics struct {
    27  	ActiveMinEntries    float64
    28  	ActiveMeanEntries   float64
    29  	ActiveMedianEntries float64
    30  	ActiveP95Entries    float64
    31  	ActiveMaxEntries    float64
    32  	QueuedMinEntries    float64
    33  	QueuedMeanEntries   float64
    34  	QueuedMedianEntries float64
    35  	QueuedP95Entries    float64
    36  	QueuedMaxEntries    float64
    37  }
    38  
    39  // we pull out values in ints so convert to float64 for metric calculations
    40  func intSliceToFloat64Slice(someInts []int) stats.Float64Data {
    41  	var slice stats.Float64Data
    42  
    43  	for _, v := range someInts {
    44  		slice = append(slice, float64(v))
    45  	}
    46  
    47  	return slice
    48  }
    49  
    50  // DiscoveryQueueMetrics returns some raw queue metrics based on the
    51  // period (last N entries) requested.
    52  func (q *Queue) DiscoveryQueueMetrics(period int) []QueueMetric {
    53  	q.Lock()
    54  	defer q.Unlock()
    55  
    56  	// adjust period in case we ask for something that's too long
    57  	if period > len(q.metrics) {
    58  		log.Infof("DiscoveryQueueMetrics: wanted: %d, adjusting period to %d", period, len(q.metrics))
    59  		period = len(q.metrics)
    60  	}
    61  
    62  	a := q.metrics[len(q.metrics)-period:]
    63  	log.Infof("DiscoveryQueueMetrics: returning values: %+v", a)
    64  	return a
    65  }
    66  
    67  // AggregatedDiscoveryQueueMetrics Returns some aggregate statistics
    68  // based on the period (last N entries) requested.  We store up to
    69  // config.Config.DiscoveryQueueMaxStatisticsSize values and collect once
    70  // a second so we expect period to be a smaller value.
    71  func (q *Queue) AggregatedDiscoveryQueueMetrics(period int) *AggregatedQueueMetrics {
    72  	wanted := q.DiscoveryQueueMetrics(period)
    73  
    74  	var activeEntries, queuedEntries []int
    75  	// fill vars
    76  	for i := range wanted {
    77  		activeEntries = append(activeEntries, wanted[i].Active)
    78  		queuedEntries = append(queuedEntries, wanted[i].Queued)
    79  	}
    80  
    81  	a := &AggregatedQueueMetrics{
    82  		ActiveMinEntries:    min(intSliceToFloat64Slice(activeEntries)),
    83  		ActiveMeanEntries:   mean(intSliceToFloat64Slice(activeEntries)),
    84  		ActiveMedianEntries: median(intSliceToFloat64Slice(activeEntries)),
    85  		ActiveP95Entries:    percentile(intSliceToFloat64Slice(activeEntries), 95),
    86  		ActiveMaxEntries:    max(intSliceToFloat64Slice(activeEntries)),
    87  		QueuedMinEntries:    min(intSliceToFloat64Slice(queuedEntries)),
    88  		QueuedMeanEntries:   mean(intSliceToFloat64Slice(queuedEntries)),
    89  		QueuedMedianEntries: median(intSliceToFloat64Slice(queuedEntries)),
    90  		QueuedP95Entries:    percentile(intSliceToFloat64Slice(queuedEntries), 95),
    91  		QueuedMaxEntries:    max(intSliceToFloat64Slice(queuedEntries)),
    92  	}
    93  	log.Infof("AggregatedDiscoveryQueueMetrics: returning values: %+v", a)
    94  	return a
    95  }