@@ -44,28 +44,46 @@ func (d dynamoTableClient) metricsAutoScale(ctx context.Context, current, expect
4444
4545 level .Info (util .Logger ).Log ("msg" , "checking metrics" , "table" , current .Name , "queueLengths" , fmt .Sprint (m .queueLengths ), "errorRate" , errorRate )
4646
47+ // If we don't take explicit action, return the current provision as the expected provision
48+ expected .ProvisionedWrite = current .ProvisionedWrite
49+
4750 switch {
48- case m .queueLengths [2 ] < queueLengthScaledown && errorRate < errorFractionScaledown * float64 (current .ProvisionedWrite ):
51+ case errorRate < errorFractionScaledown * float64 (current .ProvisionedWrite ) &&
52+ m .queueLengths [2 ] < queueLengthScaledown :
4953 // No big queue, low errors -> scale down
50- expected .ProvisionedWrite = int64 (float64 (current .ProvisionedWrite ) * scaledown )
51- level .Info (util .Logger ).Log ("msg" , "metrics scale-down" , "table" , current .Name , "write" , expected .ProvisionedWrite )
54+ scaleDownWrite (current , expected , int64 (float64 (current .ProvisionedWrite )* scaledown ), "metrics scale-down" )
5255 case errorRate > 0 && m .queueLengths [2 ] > queueLengthMax :
5356 // Too big queue, some errors -> scale up
54- expected .ProvisionedWrite = int64 (float64 (current .ProvisionedWrite ) * scaleup )
55- level .Info (util .Logger ).Log ("msg" , "metrics max queue scale-up" , "table" , current .Name , "write" , expected .ProvisionedWrite )
57+ scaleUpWrite (current , expected , int64 (float64 (current .ProvisionedWrite )* scaleup ), "metrics max queue scale-up" )
5658 case errorRate > 0 &&
5759 m .queueLengths [2 ] > queueLengthAcceptable &&
5860 m .queueLengths [2 ] > m .queueLengths [1 ] && m .queueLengths [1 ] > m .queueLengths [0 ]:
5961 // Growing queue, some errors -> scale up
60- expected .ProvisionedWrite = int64 (float64 (current .ProvisionedWrite ) * scaleup )
61- level .Info (util .Logger ).Log ("msg" , "metrics queue growing scale-up" , "table" , current .Name , "write" , expected .ProvisionedWrite )
62- default :
63- // Nothing much happening - set expected to current
64- expected .ProvisionedWrite = current .ProvisionedWrite
62+ scaleUpWrite (current , expected , int64 (float64 (current .ProvisionedWrite )* scaleup ), "metrics queue growing scale-up" )
6563 }
6664 return nil
6765}
6866
67+ func scaleDownWrite (current , expected * chunk.TableDesc , newWrite int64 , msg string ) {
68+ if newWrite < expected .WriteScale .MinCapacity {
69+ newWrite = expected .WriteScale .MinCapacity
70+ }
71+ if newWrite < current .ProvisionedWrite {
72+ level .Info (util .Logger ).Log ("msg" , msg , "table" , current .Name , "write" , newWrite )
73+ expected .ProvisionedWrite = newWrite
74+ }
75+ }
76+
77+ func scaleUpWrite (current , expected * chunk.TableDesc , newWrite int64 , msg string ) {
78+ if newWrite > expected .WriteScale .MaxCapacity {
79+ newWrite = expected .WriteScale .MaxCapacity
80+ }
81+ if newWrite > current .ProvisionedWrite {
82+ level .Info (util .Logger ).Log ("msg" , msg , "table" , current .Name , "write" , newWrite )
83+ expected .ProvisionedWrite = newWrite
84+ }
85+ }
86+
6987func newMetrics (cfg DynamoDBConfig ) (* metricsData , error ) {
7088 var promAPI promV1.API
7189 if cfg .MetricsURL != "" {
0 commit comments