Skip to content

Commit 1056d09

Browse files
committed
Respect max and min capacity
1 parent 30d2b5f commit 1056d09

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

pkg/chunk/aws/dynamodb_table_client_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func fixtureWriteScale() chunk.AutoScalingConfig {
3434
return chunk.AutoScalingConfig{
3535
Enabled: true,
3636
MinCapacity: 10,
37-
MaxCapacity: 20,
37+
MaxCapacity: 300,
3838
OutCooldown: 100,
3939
InCooldown: 100,
4040
TargetValue: 80.0,

pkg/chunk/aws/metrics_autoscaling.go

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
6987
func newMetrics(cfg DynamoDBConfig) (*metricsData, error) {
7088
var promAPI promV1.API
7189
if cfg.MetricsURL != "" {

0 commit comments

Comments
 (0)