-
Notifications
You must be signed in to change notification settings - Fork 54
Expand file tree
/
Copy pathmysql.go
More file actions
85 lines (79 loc) · 2.32 KB
/
mysql.go
File metadata and controls
85 lines (79 loc) · 2.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package throttle
import (
"net/http"
"sort"
"github.com/github/freno/pkg/base"
"github.com/github/freno/pkg/mysql"
)
func aggregateMySQLProbes(
probes *mysql.Probes,
clusterName string,
instanceResultsMap mysql.InstanceMetricResultMap,
clusterInstanceHttpChecksMap mysql.ClusterInstanceHttpCheckResultMap,
ignoreHostsCount int,
ignoreDialTcpErrors bool,
ignoreHostsThreshold float64,
bypassOnNohosts bool,
) (worstMetric base.MetricResult) {
// probes is known not to change. It can be *replaced*, but not changed.
// so it's safe to iterate it
probeValues := []float64{}
for _, probe := range *probes {
if clusterInstanceHttpChecksMap[mysql.MySQLHttpCheckHashKey(clusterName, &probe.Key)] == http.StatusNotFound {
continue
}
instanceMetricResult, ok := instanceResultsMap[mysql.GetClusterInstanceKey(clusterName, &probe.Key)]
if !ok {
return base.NoMetricResultYet
}
value, err := instanceMetricResult.Get()
if err != nil {
if ignoreDialTcpErrors && base.IsDialTcpError(err) {
continue
}
if ignoreHostsCount > 0 {
// ok to skip this error
ignoreHostsCount = ignoreHostsCount - 1
continue
}
return instanceMetricResult
}
// No error
probeValues = append(probeValues, value)
}
if len(probeValues) == 0 {
if bypassOnNohosts {
return base.NewSimpleMetricResult(0.0)
}
return base.NoHostsMetricResult
}
// If we got here, that means no errors (or good-to-skip errors)
sort.Float64s(probeValues)
// probeValues sorted ascending (from best, ie smallest, to worst, ie largest)
for ignoreHostsCount > 0 {
goodToIgnore := func() bool {
// Note that these hosts don't have errors
numProbeValues := len(probeValues)
if numProbeValues <= 1 {
// We wish to retain at least one host
return false
}
if ignoreHostsThreshold <= 0 {
// No threshold conditional (or implicitly "any value exceeds the threshold")
return true
}
if worstValue := probeValues[numProbeValues-1]; worstValue > ignoreHostsThreshold {
return true
}
return false
}()
if goodToIgnore {
probeValues = probeValues[0 : len(probeValues)-1]
}
// And, whether ignored or not, we are reducing our tokens
ignoreHostsCount = ignoreHostsCount - 1
}
worstValue := probeValues[len(probeValues)-1]
worstMetric = base.NewSimpleMetricResult(worstValue)
return worstMetric
}