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 }