vitess.io/vitess@v0.16.2/go/vt/vttablet/tabletserver/throttle/mysql_test.go (about) 1 /* 2 Copyright 2017 GitHub Inc. 3 4 Licensed under MIT License. See https://github.com/github/freno/blob/master/LICENSE 5 */ 6 7 package throttle 8 9 import ( 10 "context" 11 "testing" 12 13 "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/base" 14 "vitess.io/vitess/go/vt/vttablet/tabletserver/throttle/mysql" 15 16 "github.com/stretchr/testify/assert" 17 ) 18 19 var ( 20 key1 = mysql.InstanceKey{Hostname: "10.0.0.1", Port: 3306} 21 key2 = mysql.InstanceKey{Hostname: "10.0.0.2", Port: 3306} 22 key3 = mysql.InstanceKey{Hostname: "10.0.0.3", Port: 3306} 23 key4 = mysql.InstanceKey{Hostname: "10.0.0.4", Port: 3306} 24 key5 = mysql.InstanceKey{Hostname: "10.0.0.5", Port: 3306} 25 ) 26 27 func TestAggregateMySQLProbesNoErrors(t *testing.T) { 28 ctx := context.Background() 29 clusterName := "c0" 30 key1cluster := mysql.GetClusterInstanceKey(clusterName, &key1) 31 key2cluster := mysql.GetClusterInstanceKey(clusterName, &key2) 32 key3cluster := mysql.GetClusterInstanceKey(clusterName, &key3) 33 key4cluster := mysql.GetClusterInstanceKey(clusterName, &key4) 34 key5cluster := mysql.GetClusterInstanceKey(clusterName, &key5) 35 instanceResultsMap := mysql.InstanceMetricResultMap{ 36 key1cluster: base.NewSimpleMetricResult(1.2), 37 key2cluster: base.NewSimpleMetricResult(1.7), 38 key3cluster: base.NewSimpleMetricResult(0.3), 39 key4cluster: base.NewSimpleMetricResult(0.6), 40 key5cluster: base.NewSimpleMetricResult(1.1), 41 } 42 var probes mysql.Probes = map[mysql.InstanceKey](*mysql.Probe){} 43 for clusterKey := range instanceResultsMap { 44 probes[clusterKey.Key] = &mysql.Probe{Key: clusterKey.Key} 45 } 46 { 47 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 0, false, 0) 48 value, err := worstMetric.Get() 49 assert.NoError(t, err) 50 assert.Equal(t, value, 1.7) 51 } 52 { 53 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 1, false, 0) 54 value, err := worstMetric.Get() 55 assert.NoError(t, err) 56 assert.Equal(t, value, 1.2) 57 } 58 { 59 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 2, false, 0) 60 value, err := worstMetric.Get() 61 assert.NoError(t, err) 62 assert.Equal(t, value, 1.1) 63 } 64 { 65 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 3, false, 0) 66 value, err := worstMetric.Get() 67 assert.NoError(t, err) 68 assert.Equal(t, value, 0.6) 69 } 70 { 71 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 4, false, 0) 72 value, err := worstMetric.Get() 73 assert.NoError(t, err) 74 assert.Equal(t, value, 0.3) 75 } 76 { 77 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 5, false, 0) 78 value, err := worstMetric.Get() 79 assert.NoError(t, err) 80 assert.Equal(t, value, 0.3) 81 } 82 } 83 84 func TestAggregateMySQLProbesNoErrorsIgnoreHostsThreshold(t *testing.T) { 85 ctx := context.Background() 86 clusterName := "c0" 87 key1cluster := mysql.GetClusterInstanceKey(clusterName, &key1) 88 key2cluster := mysql.GetClusterInstanceKey(clusterName, &key2) 89 key3cluster := mysql.GetClusterInstanceKey(clusterName, &key3) 90 key4cluster := mysql.GetClusterInstanceKey(clusterName, &key4) 91 key5cluster := mysql.GetClusterInstanceKey(clusterName, &key5) 92 instanceResultsMap := mysql.InstanceMetricResultMap{ 93 key1cluster: base.NewSimpleMetricResult(1.2), 94 key2cluster: base.NewSimpleMetricResult(1.7), 95 key3cluster: base.NewSimpleMetricResult(0.3), 96 key4cluster: base.NewSimpleMetricResult(0.6), 97 key5cluster: base.NewSimpleMetricResult(1.1), 98 } 99 var probes mysql.Probes = map[mysql.InstanceKey](*mysql.Probe){} 100 for clusterKey := range instanceResultsMap { 101 probes[clusterKey.Key] = &mysql.Probe{Key: clusterKey.Key} 102 } 103 { 104 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 0, false, 1.0) 105 value, err := worstMetric.Get() 106 assert.NoError(t, err) 107 assert.Equal(t, value, 1.7) 108 } 109 { 110 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 1, false, 1.0) 111 value, err := worstMetric.Get() 112 assert.NoError(t, err) 113 assert.Equal(t, value, 1.2) 114 } 115 { 116 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 2, false, 1.0) 117 value, err := worstMetric.Get() 118 assert.NoError(t, err) 119 assert.Equal(t, value, 1.1) 120 } 121 { 122 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 3, false, 1.0) 123 value, err := worstMetric.Get() 124 assert.NoError(t, err) 125 assert.Equal(t, value, 0.6) 126 } 127 { 128 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 4, false, 1.0) 129 value, err := worstMetric.Get() 130 assert.NoError(t, err) 131 assert.Equal(t, value, 0.6) 132 } 133 { 134 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 5, false, 1.0) 135 value, err := worstMetric.Get() 136 assert.NoError(t, err) 137 assert.Equal(t, value, 0.6) 138 } 139 } 140 141 func TestAggregateMySQLProbesWithErrors(t *testing.T) { 142 ctx := context.Background() 143 clusterName := "c0" 144 key1cluster := mysql.GetClusterInstanceKey(clusterName, &key1) 145 key2cluster := mysql.GetClusterInstanceKey(clusterName, &key2) 146 key3cluster := mysql.GetClusterInstanceKey(clusterName, &key3) 147 key4cluster := mysql.GetClusterInstanceKey(clusterName, &key4) 148 key5cluster := mysql.GetClusterInstanceKey(clusterName, &key5) 149 instanceResultsMap := mysql.InstanceMetricResultMap{ 150 key1cluster: base.NewSimpleMetricResult(1.2), 151 key2cluster: base.NewSimpleMetricResult(1.7), 152 key3cluster: base.NewSimpleMetricResult(0.3), 153 key4cluster: base.NoSuchMetric, 154 key5cluster: base.NewSimpleMetricResult(1.1), 155 } 156 var probes mysql.Probes = map[mysql.InstanceKey](*mysql.Probe){} 157 for clusterKey := range instanceResultsMap { 158 probes[clusterKey.Key] = &mysql.Probe{Key: clusterKey.Key} 159 } 160 { 161 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 0, false, 0) 162 _, err := worstMetric.Get() 163 assert.Error(t, err) 164 assert.Equal(t, err, base.ErrNoSuchMetric) 165 } 166 { 167 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 1, false, 0) 168 value, err := worstMetric.Get() 169 assert.NoError(t, err) 170 assert.Equal(t, value, 1.7) 171 } 172 { 173 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 2, false, 0) 174 value, err := worstMetric.Get() 175 assert.NoError(t, err) 176 assert.Equal(t, value, 1.2) 177 } 178 179 instanceResultsMap[key1cluster] = base.NoSuchMetric 180 { 181 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 0, false, 0) 182 _, err := worstMetric.Get() 183 assert.Error(t, err) 184 assert.Equal(t, err, base.ErrNoSuchMetric) 185 } 186 { 187 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 1, false, 0) 188 _, err := worstMetric.Get() 189 assert.Error(t, err) 190 assert.Equal(t, err, base.ErrNoSuchMetric) 191 } 192 { 193 worstMetric := aggregateMySQLProbes(ctx, &probes, clusterName, instanceResultsMap, 2, false, 0) 194 value, err := worstMetric.Get() 195 assert.NoError(t, err) 196 assert.Equal(t, value, 1.7) 197 } 198 }