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  }