funktor 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +18 -3
  3. data/funktor-testapp/Gemfile.lock +2 -2
  4. data/funktor-testapp/app/services/job_flood.rb +1 -1
  5. data/funktor-testapp/app/workers/single_thread_audit_worker.rb +3 -0
  6. data/funktor-testapp/funktor_config/environment.yml +2 -2
  7. data/funktor-testapp/funktor_config/function_definitions/default_queue_handler.yml +3 -1
  8. data/funktor-testapp/funktor_config/function_definitions/incoming_job_handler.yml +3 -1
  9. data/funktor-testapp/funktor_config/function_definitions/job_activator.yml +1 -2
  10. data/funktor-testapp/funktor_config/function_definitions/low_concurrency_queue_handler.yml +13 -0
  11. data/funktor-testapp/funktor_config/funktor.yml +25 -25
  12. data/funktor-testapp/funktor_config/iam_permissions/{single_thread_queue.yml → low_concurrency_queue.yml} +1 -1
  13. data/funktor-testapp/funktor_config/resources/cloudwatch_dashboard.yml +22 -17
  14. data/funktor-testapp/funktor_config/resources/default_queue.yml +2 -2
  15. data/funktor-testapp/funktor_config/resources/incoming_job_queue.yml +2 -2
  16. data/funktor-testapp/funktor_config/resources/jobs_table.yml +16 -4
  17. data/funktor-testapp/funktor_config/resources/low_concurrency_queue.yml +22 -0
  18. data/funktor-testapp/funktor_init.yml +16 -8
  19. data/funktor-testapp/lambda_event_handlers/{single_thread_queue_handler.rb → low_concurrency_queue_handler.rb} +0 -0
  20. data/funktor-testapp/serverless.yml +4 -3
  21. data/funktor.gemspec +3 -1
  22. data/lib/funktor/activity_tracker.rb +6 -2
  23. data/lib/funktor/cli/templates/funktor_config/function_definitions/incoming_job_handler.yml +3 -1
  24. data/lib/funktor/cli/templates/funktor_config/function_definitions/job_activator.yml +1 -2
  25. data/lib/funktor/cli/templates/funktor_config/function_definitions/work_queue_handler.yml +3 -1
  26. data/lib/funktor/cli/templates/funktor_config/funktor.yml +6 -6
  27. data/lib/funktor/cli/templates/funktor_config/resources/cloudwatch_dashboard.yml +3 -2
  28. data/lib/funktor/cli/templates/funktor_config/resources/incoming_job_queue.yml +2 -2
  29. data/lib/funktor/cli/templates/funktor_config/resources/jobs_table.yml +16 -4
  30. data/lib/funktor/cli/templates/funktor_config/resources/work_queue.yml +2 -2
  31. data/lib/funktor/cli/templates/funktor_init.yml.tt +14 -8
  32. data/lib/funktor/cli/templates/serverless.yml +1 -0
  33. data/lib/funktor/incoming_job_handler.rb +11 -15
  34. data/lib/funktor/job.rb +50 -5
  35. data/lib/funktor/job_activator.rb +52 -26
  36. data/lib/funktor/shard_utils.rb +6 -0
  37. data/lib/funktor/version.rb +1 -1
  38. data/lib/funktor/web/application.rb +139 -0
  39. data/lib/funktor/web/views/index.erb +3 -0
  40. data/lib/funktor/web/views/layout.erb +58 -0
  41. data/lib/funktor/web/views/processing.erb +29 -0
  42. data/lib/funktor/web/views/queued.erb +29 -0
  43. data/lib/funktor/web/views/retries.erb +35 -0
  44. data/lib/funktor/web/views/scheduled.erb +26 -0
  45. data/lib/funktor/web/views/stats.erb +9 -0
  46. data/lib/funktor/web/views/table_stats_with_buttons.erb +11 -0
  47. data/lib/funktor/web.rb +1 -0
  48. data/lib/funktor/work_queue_handler.rb +41 -0
  49. data/lib/funktor/worker/funktor_options.rb +3 -1
  50. data/lib/funktor/worker.rb +8 -11
  51. data/lib/funktor.rb +16 -16
  52. metadata +46 -6
  53. data/funktor-testapp/funktor_config/function_definitions/single_thread_queue_handler.yml +0 -11
  54. data/funktor-testapp/funktor_config/resources/single_thread_queue.yml +0 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6216b831ca8e28aa8d17cb86295d740bf63e95df6ce36ec966f435b6df7f427c
4
- data.tar.gz: 7ade52e2f087fce2b5f61461bcbec625f7a72a82557500e3c2efb98606deadb7
3
+ metadata.gz: f23eb6f9be928f479660d5320e71f6766105cbf0ab2c143346186b08b5b58bb8
4
+ data.tar.gz: 456f201c8eea7705017823b27161ab3acc1ad7325575d2125e9793943d8ac8cd
5
5
  SHA512:
6
- metadata.gz: 6a9b429d66bbf60a0bd64a040616eb7743b861466646550f98151dc99320ed882233e131a82d21badcacfc2f7916b05c5b6c52168bb8899c8c81823289b24ab3
7
- data.tar.gz: c594578835a62eda89537a42c55021badcdb1a5e240abb1a493d36dea7e3aed5e4a3cf7126afd2aef75bcae17c7619c0e404268488308c6f5e1974d2e2ffc322
6
+ metadata.gz: 04aa22cc41754a5ee59c0b095ea18df52313185bc440fc94bacd167fb9bfdaa4291fa3e9fb4f9bcd305212cd230505af905c295c6894239ffea4ca948f65f153
7
+ data.tar.gz: 9051f19ce855b54cab65d5c224a9044e48227af4c8a22725b9d1ab6ae6f6ee31d1dde84956e3cd3a88b16ab0b46f586cfdc30354ddb928eb2460125d23935038
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- funktor (0.5.0)
4
+ funktor (0.6.0)
5
5
  activesupport
6
6
  aws-sdk-dynamodb (~> 1.62)
7
7
  aws-sdk-sqs (~> 1.37)
@@ -22,8 +22,8 @@ GEM
22
22
  addressable (2.8.0)
23
23
  public_suffix (>= 2.0.2, < 5.0)
24
24
  aws-eventstream (1.1.1)
25
- aws-partitions (1.487.0)
26
- aws-sdk-core (3.119.0)
25
+ aws-partitions (1.490.0)
26
+ aws-sdk-core (3.119.1)
27
27
  aws-eventstream (~> 1, >= 1.0.2)
28
28
  aws-partitions (~> 1, >= 1.239.0)
29
29
  aws-sigv4 (~> 1.1)
@@ -51,6 +51,8 @@ GEM
51
51
  jmespath (1.4.0)
52
52
  method_source (1.0.0)
53
53
  minitest (5.14.4)
54
+ mustermann (1.1.1)
55
+ ruby2_keywords (~> 0.0.1)
54
56
  pry (0.13.1)
55
57
  coderay (~> 1.1)
56
58
  method_source (~> 1.0)
@@ -58,6 +60,9 @@ GEM
58
60
  byebug (~> 11.0)
59
61
  pry (~> 0.13.0)
60
62
  public_suffix (4.0.6)
63
+ rack (2.2.3)
64
+ rack-protection (2.1.0)
65
+ rack
61
66
  rake (12.3.3)
62
67
  rexml (3.2.5)
63
68
  rspec (3.10.0)
@@ -73,13 +78,21 @@ GEM
73
78
  diff-lcs (>= 1.2.0, < 2.0)
74
79
  rspec-support (~> 3.10.0)
75
80
  rspec-support (3.10.2)
81
+ ruby2_keywords (0.0.5)
76
82
  simplecov (0.21.2)
77
83
  docile (~> 1.1)
78
84
  simplecov-html (~> 0.11)
79
85
  simplecov_json_formatter (~> 0.1)
80
86
  simplecov-html (0.12.3)
81
87
  simplecov_json_formatter (0.1.2)
88
+ sinatra (2.1.0)
89
+ mustermann (~> 1.0)
90
+ rack (~> 2.2)
91
+ rack-protection (= 2.1.0)
92
+ tilt (~> 2.0)
82
93
  thor (1.1.0)
94
+ tilt (2.0.10)
95
+ timecop (0.9.4)
83
96
  tzinfo (2.0.4)
84
97
  concurrent-ruby (~> 1.0)
85
98
  webmock (3.12.2)
@@ -98,6 +111,8 @@ DEPENDENCIES
98
111
  rake (~> 12.0)
99
112
  rspec (~> 3.0)
100
113
  simplecov
114
+ sinatra
115
+ timecop
101
116
  webmock
102
117
 
103
118
  BUNDLED WITH
@@ -1,14 +1,14 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- activesupport (6.1.4)
4
+ activesupport (6.1.4.1)
5
5
  concurrent-ruby (~> 1.0, >= 1.0.2)
6
6
  i18n (>= 1.6, < 2)
7
7
  minitest (>= 5.1)
8
8
  tzinfo (~> 2.0)
9
9
  zeitwerk (~> 2.3)
10
10
  aws-eventstream (1.1.1)
11
- aws-partitions (1.483.0)
11
+ aws-partitions (1.488.0)
12
12
  aws-sdk-core (3.119.0)
13
13
  aws-eventstream (~> 1, >= 1.0.2)
14
14
  aws-partitions (~> 1, >= 1.239.0)
@@ -23,7 +23,7 @@ class JobFlood
23
23
  job_target_time = Time.now + (minute * 60) + rand(60)
24
24
  job_sleep = rand(0.0..max_job_length_in_seconds.to_f)
25
25
  puts job_target_time
26
- AuditWorker.perform_at(job_target_time, {
26
+ [AuditWorker, AuditWorker, SingleThreadAuditWorker].sample.perform_at(job_target_time, {
27
27
  mode: 'later',
28
28
  message: 'msg: from random JobFlood - ' + SecureRandom.hex,
29
29
  target_time: job_target_time,
@@ -0,0 +1,3 @@
1
+ class SingleThreadAuditWorker < AuditWorker
2
+ funktor_options queue: :low_concurrency
3
+ end
@@ -7,8 +7,8 @@ FUNKTOR_INCOMING_JOB_QUEUE:
7
7
  Ref: IncomingJobQueue
8
8
  FUNKTOR_DEFAULT_QUEUE:
9
9
  Ref: DefaultQueue
10
- FUNKTOR_SINGLE_THREAD_QUEUE:
11
- Ref: SingleThreadQueue
10
+ FUNKTOR_LOW_CONCURRENCY_QUEUE:
11
+ Ref: LowConcurrencyQueue
12
12
  FUNKTOR_ACTIVITY_TABLE:
13
13
  Ref: ActivityTable
14
14
  FUNKTOR_JOBS_TABLE:
@@ -1,10 +1,12 @@
1
1
  handler: lambda_event_handlers/default_queue_handler.call
2
- timeout: ${self:custom.funktor.DefaultQueueHandler.timeout, 900}
2
+ timeout: ${self:custom.funktor.DefaultQueueHandler.functionTimeout, 900}
3
3
  reservedConcurrency: ${self:custom.funktor.DefaultQueueHandler.reservedConcurrency, null}
4
4
  provisionedConcurrency: ${self:custom.funktor.DefaultQueueHandler.provisionedConcurrency, null}
5
5
  memorySize: ${self:custom.funktor.DefaultQueueHandler.memorySize, 256}
6
6
  events:
7
7
  - sqs:
8
+ batchSize: ${self:custom.funktor.DefaultQueueHandler.batchSize, 1}
9
+ maximumBatchingWindow: ${self:custom.funktor.DefaultQueueHandler.maximumBatchingWindow, 0}
8
10
  arn:
9
11
  Fn::GetAtt:
10
12
  - DefaultQueue
@@ -1,10 +1,12 @@
1
1
  handler: lambda_event_handlers/incoming_job_handler.call
2
- timeout: ${self:custom.funktor.IncomingJobHandler.timeout, 30}
2
+ timeout: ${self:custom.funktor.IncomingJobHandler.functionTimeout, 30}
3
3
  reservedConcurrency: ${self:custom.funktor.IncomingJobHandler.reservedConcurrency, null}
4
4
  provisionedConcurrency: ${self:custom.funktor.IncomingJobHandler.provisionedConcurrency, null}
5
5
  memorySize: ${self:custom.funktor.IncomingJobHandler.memorySize, 256}
6
6
  events:
7
7
  - sqs:
8
+ batchSize: ${self:custom.funktor.IncomingJobHandler.batchSize, 1}
9
+ maximumBatchingWindow: ${self:custom.funktor.IncomingJobHandler.maximumBatchingWindow, 0}
8
10
  arn:
9
11
  Fn::GetAtt:
10
12
  - IncomingJobQueue
@@ -1,8 +1,7 @@
1
1
  handler: lambda_event_handlers/job_activator.call
2
- timeout: ${self:custom.funktor.JobActivator.timeout, 30}
2
+ timeout: ${self:custom.funktor.JobActivator.functionTimeout, 30}
3
3
  reservedConcurrency: ${self:custom.funktor.JobActivator.reservedConcurrency, null}
4
4
  provisionedConcurrency: ${self:custom.funktor.JobActivator.provisionedConcurrency, null}
5
5
  memorySize: ${self:custom.funktor.JobActivator.memorySize, 256}
6
- #reservedConcurrency: 1
7
6
  events:
8
7
  - schedule: rate(1 minute)
@@ -0,0 +1,13 @@
1
+ handler: lambda_event_handlers/low_concurrency_queue_handler.call
2
+ timeout: ${self:custom.funktor.LowConcurrencyQueueHandler.functionTimeout, 900}
3
+ reservedConcurrency: ${self:custom.funktor.LowConcurrencyQueueHandler.reservedConcurrency, null}
4
+ provisionedConcurrency: ${self:custom.funktor.LowConcurrencyQueueHandler.provisionedConcurrency, null}
5
+ memorySize: ${self:custom.funktor.LowConcurrencyQueueHandler.memorySize, 256}
6
+ events:
7
+ - sqs:
8
+ batchSize: ${self:custom.funktor.LowConcurrencyQueueHandler.batchSize, 1}
9
+ maximumBatchingWindow: ${self:custom.funktor.LowConcurrencyQueueHandler.maximumBatchingWindow, 0}
10
+ arn:
11
+ Fn::GetAtt:
12
+ - LowConcurrencyQueue
13
+ - Arn
@@ -3,7 +3,7 @@ IncomingJobHandler:
3
3
  # to a handler at one time, so you'll want this to be at least 10x the maximum time you
4
4
  # expect to spend for one message. The incoming job handler usually will be pretty fast,
5
5
  # but we default to a high number here to allow for the times when things go weird.
6
- timeout: 300
6
+ functionTimeout: 300
7
7
  # reservedConcurrency represents the maximum number of concurrent executions.
8
8
  # For the incoming job handler you probably don't want to limit it because you
9
9
  # want to get things onto work queues as quickly as possible.
@@ -16,17 +16,17 @@ IncomingJobHandler:
16
16
  # For the incoming jobs handler you probably don't need this to be too large,
17
17
  # but if you're seeing large delays at this stage it might help to bump it up.
18
18
  memorySize: 256
19
- batchSize: 10
20
- maximumBatchingWindow: 1
21
- visibilityTimeout: 900
22
- logRetentionInDays: 30
19
+ batchSize: 1
20
+ maximumBatchingWindow: 0
21
+ visibilityTimeout: 1800
22
+ maxReceiveCount: 20
23
23
 
24
24
  JobActivator:
25
25
  # timeout is how long the handler can possibly run. Up to 10 messages may be delivered
26
26
  # to a handler at one time, so you'll want this to be at least 10x the maximum time you
27
27
  # expect to spend for one message. The job activator usually will be pretty fast,
28
28
  # but we default to a high number here to allow for the times when things go weird.
29
- timeout: 300
29
+ functionTimeout: 300
30
30
  # reservedConcurrency represents the maximum number of concurrent executions.
31
31
  # For the job activator you probably don't want to limit it because you
32
32
  # want to get things onto work queues as quickly as possible when they're ready.
@@ -39,10 +39,10 @@ JobActivator:
39
39
  # For the job activator you probably don't need this to be too large,
40
40
  # but if you're seeing large delays at this stage it might help to bump it up.
41
41
  memorySize: 256
42
- batchSize: 10
43
- maximumBatchingWindow: 1
44
- visibilityTimeout: 900
45
- logRetentionInDays: 30
42
+ batchSize: 1
43
+ maximumBatchingWindow: 0
44
+ visibilityTimeout: 1800
45
+ maxReceiveCount: 20
46
46
 
47
47
 
48
48
 
@@ -51,7 +51,7 @@ DefaultQueueHandler:
51
51
  # to a handler at one time, so you'll want this to be at least 10x the maximum time you
52
52
  # expect to spend for one message. The active job handler may be slow if your jobs are
53
53
  # doing a lot of work, so we default to the maximum here.
54
- timeout: 300
54
+ functionTimeout: 300
55
55
  # reservedConcurrency represents the maximum number of concurrent executions.
56
56
  # For the active job handler you may want to limit it if you have resource limitations
57
57
  # like database connections that you need to avoid exhausting.
@@ -65,21 +65,21 @@ DefaultQueueHandler:
65
65
  # required to actually do your jobs. You can choose an even higher number to increase
66
66
  # the available CPU to make the jobs run faster.
67
67
  memorySize: 256
68
- batchSize: 10
69
- maximumBatchingWindow: 1
70
- visibilityTimeout: 900
71
- logRetentionInDays: 30
68
+ batchSize: 1
69
+ maximumBatchingWindow: 0
70
+ visibilityTimeout: 1800
71
+ maxReceiveCount: 20
72
72
 
73
- SingleThreadQueueHandler:
73
+ LowConcurrencyQueueHandler:
74
74
  # timeout is how long the handler can possibly run. Up to 10 messages may be delivered
75
75
  # to a handler at one time, so you'll want this to be at least 10x the maximum time you
76
76
  # expect to spend for one message. The active job handler may be slow if your jobs are
77
77
  # doing a lot of work, so we default to the maximum here.
78
- timeout: 300
78
+ functionTimeout: 300
79
79
  # reservedConcurrency represents the maximum number of concurrent executions.
80
80
  # For the active job handler you may want to limit it if you have resource limitations
81
81
  # like database connections that you need to avoid exhausting.
82
- reservedConcurrency: 1
82
+ reservedConcurrency: 10
83
83
  # provisionedConcurrency represents the number of lambda functions that will always
84
84
  # be available. For the active job handler you probably don't need to set this
85
85
  # unless your jobs are very bursty AND very time sensitive.
@@ -89,10 +89,10 @@ SingleThreadQueueHandler:
89
89
  # required to actually do your jobs. You can choose an even higher number to increase
90
90
  # the available CPU to make the jobs run faster.
91
91
  memorySize: 256
92
- batchSize: 10
93
- maximumBatchingWindow: 1
94
- visibilityTimeout: 900
95
- logRetentionInDays: 30
92
+ batchSize: 1
93
+ maximumBatchingWindow: 0
94
+ visibilityTimeout: 1800
95
+ maxReceiveCount: 20
96
96
 
97
97
 
98
98
 
@@ -106,9 +106,9 @@ DashboardName: ${self:service}-${self:custom.stage}-dashboard
106
106
  DefaultQueueName: ${self:service}-${self:custom.stage}-default
107
107
  DefaultDeadJobQueueName: ${self:service}-${self:custom.stage}-default-dead
108
108
  DefaultQueueHandlerName: ${self:service}-${self:custom.stage}-DefaultQueueHandler
109
- SingleThreadQueueName: ${self:service}-${self:custom.stage}-single-thread
110
- SingleThreadDeadJobQueueName: ${self:service}-${self:custom.stage}-single-thread-dead
111
- SingleThreadQueueHandlerName: ${self:service}-${self:custom.stage}-SingleThreadQueueHandler
109
+ LowConcurrencyQueueName: ${self:service}-${self:custom.stage}-low-concurrency
110
+ LowConcurrencyDeadJobQueueName: ${self:service}-${self:custom.stage}-low-concurrency-dead
111
+ LowConcurrencyQueueHandlerName: ${self:service}-${self:custom.stage}-LowConcurrencyQueueHandler
112
112
  JobsTableName: ${self:service}-${self:custom.stage}-jobs
113
113
  ActivityTableName: ${self:service}-${self:custom.stage}-activity
114
114
  JobActivatorName: ${self:service}-${self:custom.stage}-JobActivator
@@ -5,4 +5,4 @@ Action:
5
5
  - sqs:SendMessage
6
6
  - sqs:GetQueueAttributes
7
7
  Resource:
8
- - "Fn::GetAtt": [ SingleThreadQueue, Arn ]
8
+ - "Fn::GetAtt": [ LowConcurrencyQueue, Arn ]
@@ -34,6 +34,8 @@ Resources:
34
34
  [ "funktor-testapp", "Duration", "WorkerClassName", "GreetingsWorker" ],
35
35
  [ "...", { "stat": "p99" } ],
36
36
  [ "funktor-testapp", "Duration", "WorkerClassName", "HelloWorker" ],
37
+ [ "...", { "stat": "p99" } ],
38
+ [ "funktor-testapp", "Duration", "WorkerClassName", "SingleThreadAuditWorker" ],
37
39
  [ "...", { "stat": "p99" } ]
38
40
  ],
39
41
  "view": "timeSeries",
@@ -58,6 +60,8 @@ Resources:
58
60
  [ "funktor-testapp", "processed", "WorkerClassName", "GreetingsWorker" ],
59
61
  [ ".", "failed", ".", "." ],
60
62
  [ "funktor-testapp", "processed", "WorkerClassName", "HelloWorker" ],
63
+ [ ".", "failed", ".", "." ],
64
+ [ "funktor-testapp", "processed", "WorkerClassName", "SingleThreadAuditWorker" ],
61
65
  [ ".", "failed", ".", "." ]
62
66
  ],
63
67
  "view": "timeSeries",
@@ -79,7 +83,7 @@ Resources:
79
83
  "metrics": [
80
84
  [ "funktor-testapp", "Duration", "Queue", "default" ],
81
85
  [ "...", { "stat": "p99" } ],
82
- [ "funktor-testapp", "Duration", "Queue", "singleThread" ],
86
+ [ "funktor-testapp", "Duration", "Queue", "low_concurrency" ],
83
87
  [ "...", { "stat": "p99" } ]
84
88
  ],
85
89
  "view": "timeSeries",
@@ -100,7 +104,7 @@ Resources:
100
104
  "metrics": [
101
105
  [ "funktor-testapp", "processed", "Queue", "default" ],
102
106
  [ ".", "failed", ".", "." ],
103
- [ "funktor-testapp", "processed", "Queue", "singleThread" ],
107
+ [ "funktor-testapp", "processed", "Queue", "low_concurrency" ],
104
108
  [ ".", "failed", ".", "." ]
105
109
  ],
106
110
  "view": "timeSeries",
@@ -426,7 +430,7 @@ Resources:
426
430
  "x": 0,
427
431
  "type": "text",
428
432
  "properties": {
429
- "markdown": "\n# SingleThread Queue\n"
433
+ "markdown": "\n# LowConcurrency Queue\n"
430
434
  }
431
435
  },
432
436
  {
@@ -438,7 +442,7 @@ Resources:
438
442
  "properties": {
439
443
  "metrics": [
440
444
  [ "AWS/SQS", "NumberOfMessagesReceived", "QueueName",
441
- "${self:custom.funktor.SingleThreadQueueName}", { "label": "Messages Per Minute" } ]
445
+ "${self:custom.funktor.LowConcurrencyQueueName}", { "label": "Messages Per Minute" } ]
442
446
  ],
443
447
  "view": "singleValue",
444
448
  "region": "us-east-1",
@@ -456,8 +460,8 @@ Resources:
456
460
  "properties": {
457
461
  "metrics": [
458
462
  [ "AWS/Lambda", "Duration", "FunctionName",
459
- "${self:custom.funktor.SingleThreadQueueHandlerName}", "Resource",
460
- "${self:custom.funktor.SingleThreadQueueHandlerName}", { "label": "p10" } ],
463
+ "${self:custom.funktor.LowConcurrencyQueueHandlerName}", "Resource",
464
+ "${self:custom.funktor.LowConcurrencyQueueHandlerName}", { "label": "p10" } ],
461
465
  [ "...", { "label": "p50", "stat": "p50" } ],
462
466
  [ "...", { "label": "p99", "stat": "p99" } ],
463
467
  [ "...", { "label": "Average", "stat": "Average" } ]
@@ -478,14 +482,14 @@ Resources:
478
482
  "properties": {
479
483
  "metrics": [
480
484
  [ "AWS/SQS", "NumberOfMessagesReceived", "QueueName",
481
- "${self:custom.funktor.SingleThreadQueueName}",
485
+ "${self:custom.funktor.LowConcurrencyQueueName}",
482
486
  { "label": "Received" } ],
483
487
  [ ".", "NumberOfMessagesDeleted", ".", ".", { "label": "Handled" } ],
484
488
  [ "AWS/Lambda", "Invocations", "FunctionName",
485
- "${self:custom.funktor.SingleThreadQueueHandlerName}", "Resource",
486
- "${self:custom.funktor.SingleThreadQueueHandlerName}", { "label": "Handler Invocations" } ],
489
+ "${self:custom.funktor.LowConcurrencyQueueHandlerName}", "Resource",
490
+ "${self:custom.funktor.LowConcurrencyQueueHandlerName}", { "label": "Handler Invocations" } ],
487
491
  [ "AWS/SQS", "ApproximateNumberOfMessagesVisible", "QueueName",
488
- "${self:custom.funktor.SingleThreadQueueName}", { "label": "Pending?" } ],
492
+ "${self:custom.funktor.LowConcurrencyQueueName}", { "label": "Pending?" } ],
489
493
  [ ".", "ApproximateNumberOfMessagesNotVisible", ".", ".", { "label": "Backlog?" } ],
490
494
  [ ".", "NumberOfMessagesSent", ".", ".", { "label": "Sent" } ],
491
495
  [ ".", "ApproximateNumberOfMessagesDelayed", ".", ".", { "label": "Delayed" } ]
@@ -493,7 +497,7 @@ Resources:
493
497
  "view": "timeSeries",
494
498
  "stacked": false,
495
499
  "region": "us-east-1",
496
- "title": "SingleThread Queue (Async jobs go here immediately, scheduled jobs land here in the minute before they're scheduled)",
500
+ "title": "LowConcurrency Queue (Async jobs go here immediately, scheduled jobs land here in the minute before they're scheduled)",
497
501
  "period": 60,
498
502
  "stat": "Sum",
499
503
  "liveData": true
@@ -508,12 +512,12 @@ Resources:
508
512
  "properties": {
509
513
  "period": 60,
510
514
  "metrics": [
511
- [ "AWS/Lambda", "Duration", "FunctionName", "${self:custom.funktor.SingleThreadQueueHandlerName}", { "stat": "Minimum" } ],
515
+ [ "AWS/Lambda", "Duration", "FunctionName", "${self:custom.funktor.LowConcurrencyQueueHandlerName}", { "stat": "Minimum" } ],
512
516
  [ "...", { "stat": "Average" } ],
513
517
  [ "...", { "stat": "Maximum" } ]
514
518
  ],
515
519
  "region": "us-east-1",
516
- "title": "SingleThread Queue Handler Duration in Milliseconds",
520
+ "title": "LowConcurrency Queue Handler Duration in Milliseconds",
517
521
  "view": "timeSeries",
518
522
  "stacked": false,
519
523
  "liveData": true
@@ -529,12 +533,12 @@ Resources:
529
533
  "period": 60,
530
534
  "metrics": [
531
535
  [ "AWS/Lambda", "Errors", "FunctionName",
532
- "${self:custom.funktor.SingleThreadQueueHandlerName}", { "id": "errors", "stat": "Sum", "color": "#d13212" } ],
536
+ "${self:custom.funktor.LowConcurrencyQueueHandlerName}", { "id": "errors", "stat": "Sum", "color": "#d13212" } ],
533
537
  [ ".", "Invocations", ".", ".", { "id": "invocations", "stat": "Sum", "visible": false } ],
534
538
  [ { "expression": "100 - 100 * errors / MAX([errors, invocations])", "label": "Success rate (%)", "id": "availability", "yAxis": "right", "region": "us-east-1" } ]
535
539
  ],
536
540
  "region": "us-east-1",
537
- "title": "SingleThread Queue Handler Error count and success rate (%)",
541
+ "title": "LowConcurrency Queue Handler Error count and success rate (%)",
538
542
  "yAxis": {
539
543
  "right": {
540
544
  "max": 100
@@ -555,10 +559,10 @@ Resources:
555
559
  "period": 60,
556
560
  "metrics": [
557
561
  [ "AWS/Lambda", "ConcurrentExecutions", "FunctionName",
558
- "${self:custom.funktor.SingleThreadQueueHandlerName}", { "stat": "Maximum" } ]
562
+ "${self:custom.funktor.LowConcurrencyQueueHandlerName}", { "stat": "Maximum" } ]
559
563
  ],
560
564
  "region": "us-east-1",
561
- "title": "SingleThread Queue Handler Concurrent executions",
565
+ "title": "LowConcurrency Queue Handler Concurrent executions",
562
566
  "view": "timeSeries",
563
567
  "stacked": false,
564
568
  "liveData": true
@@ -765,6 +769,7 @@ Resources:
765
769
  [ "...", "Query" ],
766
770
  [ ".", "ThrottledRequests", ".", ".", ".", "PutItem", { "yAxis": "right", "visible": false } ],
767
771
  [ ".", "SuccessfulRequestLatency", ".", ".", ".", "DeleteItem" ],
772
+ [ ".", "SuccessfulRequestLatency", ".", ".", ".", "UpdateItem" ],
768
773
  [ ".", "ThrottledRequests", ".", ".", ".", ".", { "yAxis": "right", "visible": false } ]
769
774
  ],
770
775
  "view": "timeSeries",
@@ -3,11 +3,11 @@ Resources:
3
3
  Type: AWS::SQS::Queue
4
4
  Properties:
5
5
  QueueName: ${self:custom.funktor.DefaultQueueName}
6
- VisibilityTimeout: 300
6
+ VisibilityTimeout: ${self:custom.funktor.DefaultQueueHandler.visibilityTimeout}
7
7
  RedrivePolicy:
8
8
  deadLetterTargetArn:
9
9
  "Fn::GetAtt": [ DefaultDeadLetterQueue, Arn ]
10
- maxReceiveCount: 5
10
+ maxReceiveCount: ${self:custom.funktor.DefaultQueueHandler.maxReceiveCount}
11
11
  DefaultDeadLetterQueue:
12
12
  Type: AWS::SQS::Queue
13
13
  Properties: