lamby 4.3.3 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/Gemfile.lock +8 -1
- data/lamby.gemspec +2 -0
- data/lib/lamby/cold_start_metrics.rb +83 -0
- data/lib/lamby/config.rb +19 -1
- data/lib/lamby/handler.rb +3 -12
- data/lib/lamby/version.rb +1 -1
- data/lib/lamby.rb +2 -2
- metadata +31 -4
- data/lib/lamby/command.rb +0 -43
- data/lib/lamby/runner.rb +0 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 940f2329a4503c79e8c2c48908b3f1c2d22445c16ebb0dc71ee0802e54e7c560
|
4
|
+
data.tar.gz: 708b36a037b00b3f66dfa3239a8060ae6b00177628a1e1cd38ba0a8ed8988a94
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2d135f4d5cab367171030c98c2126f57e9a9542b2b802535677450e47f8be6dc4c99d8865871978d73c184269c7a806d61c0b48f1fd54642ceda76289b96474
|
7
|
+
data.tar.gz: 472144850f8dd607c2709d74d6a240ea6949ce640a6e2ddc748e49a31db8f94b04cfa1b3aae842bb9fc465c798e47bc13020571dd8d611b01523e9f8378852cc
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,21 @@
|
|
2
2
|
|
3
3
|
See this http://keepachangelog.com link for information on how we want this documented formatted.
|
4
4
|
|
5
|
+
## v5.1.0
|
6
|
+
|
7
|
+
### Added
|
8
|
+
|
9
|
+
- New CloudWatch cold start metrics. Defaults to off. Enable with `config.cold_start_metrics = true`.
|
10
|
+
|
11
|
+
## v5.0.0
|
12
|
+
|
13
|
+
### Changed
|
14
|
+
|
15
|
+
- ⚠️ Breaking Changes ⚠️
|
16
|
+
- Remove Lamby::Runner & Lamby::Command in favor of LambdaConsole Ruby gem.
|
17
|
+
- New runner pattern exceptions from above. Now: LambdaConsole::Run::UnknownCommandPattern
|
18
|
+
- Switch your own runner events to new https://github.com/rails-lambda/lambda-console spec.
|
19
|
+
|
5
20
|
## v4.3.1, v4.3.2
|
6
21
|
|
7
22
|
### Changed
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
lamby (
|
4
|
+
lamby (5.1.0)
|
5
|
+
lambda-console-ruby
|
5
6
|
rack
|
6
7
|
|
7
8
|
GEM
|
@@ -98,6 +99,7 @@ GEM
|
|
98
99
|
i18n (1.12.0)
|
99
100
|
concurrent-ruby (~> 1.0)
|
100
101
|
jmespath (1.6.2)
|
102
|
+
lambda-console-ruby (1.0.0)
|
101
103
|
lambdakiq (2.2.0)
|
102
104
|
activejob
|
103
105
|
aws-sdk-sqs
|
@@ -131,6 +133,8 @@ GEM
|
|
131
133
|
nio4r (2.5.9)
|
132
134
|
nokogiri (1.14.3-aarch64-linux)
|
133
135
|
racc (~> 1.4)
|
136
|
+
nokogiri (1.14.3-arm64-darwin)
|
137
|
+
racc (~> 1.4)
|
134
138
|
pry (0.14.2)
|
135
139
|
coderay (~> 1.1)
|
136
140
|
method_source (~> 1.0)
|
@@ -167,6 +171,7 @@ GEM
|
|
167
171
|
rake (13.0.6)
|
168
172
|
ruby2_keywords (0.0.5)
|
169
173
|
thor (1.2.1)
|
174
|
+
timecop (0.9.6)
|
170
175
|
timeout (0.3.2)
|
171
176
|
tzinfo (2.0.6)
|
172
177
|
concurrent-ruby (~> 1.0)
|
@@ -178,6 +183,7 @@ GEM
|
|
178
183
|
|
179
184
|
PLATFORMS
|
180
185
|
aarch64-linux
|
186
|
+
arm64-darwin-22
|
181
187
|
|
182
188
|
DEPENDENCIES
|
183
189
|
aws-sdk-ssm
|
@@ -190,6 +196,7 @@ DEPENDENCIES
|
|
190
196
|
pry
|
191
197
|
rails
|
192
198
|
rake
|
199
|
+
timecop
|
193
200
|
webrick
|
194
201
|
|
195
202
|
BUNDLED WITH
|
data/lamby.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
spec.add_dependency 'rack'
|
22
|
+
spec.add_dependency 'lambda-console-ruby'
|
22
23
|
spec.add_development_dependency 'aws-sdk-ssm'
|
23
24
|
spec.add_development_dependency 'bundler'
|
24
25
|
spec.add_development_dependency 'rake'
|
@@ -26,5 +27,6 @@ Gem::Specification.new do |spec|
|
|
26
27
|
spec.add_development_dependency 'minitest-focus'
|
27
28
|
spec.add_development_dependency 'mocha'
|
28
29
|
spec.add_development_dependency 'pry'
|
30
|
+
spec.add_development_dependency 'timecop'
|
29
31
|
spec.add_development_dependency 'webrick'
|
30
32
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Lamby
|
2
|
+
class ColdStartMetrics
|
3
|
+
NAMESPACE = 'Lamby'
|
4
|
+
|
5
|
+
@cold_start = true
|
6
|
+
@cold_start_time = (Time.now.to_f * 1000).to_i
|
7
|
+
|
8
|
+
class << self
|
9
|
+
|
10
|
+
def instrument!
|
11
|
+
return unless @cold_start
|
12
|
+
@cold_start = false
|
13
|
+
now = (Time.now.to_f * 1000).to_i
|
14
|
+
proactive_init = (now - @cold_start_time) > 10_000
|
15
|
+
new(proactive_init).instrument!
|
16
|
+
end
|
17
|
+
|
18
|
+
def clear!
|
19
|
+
@cold_start = true
|
20
|
+
@cold_start_time = (Time.now.to_f * 1000).to_i
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(proactive_init)
|
26
|
+
@proactive_init = proactive_init
|
27
|
+
@metrics = []
|
28
|
+
@properties = {}
|
29
|
+
end
|
30
|
+
|
31
|
+
def instrument!
|
32
|
+
name = @proactive_init ? 'ProactiveInit' : 'ColdStart'
|
33
|
+
put_metric name, 1, 'Count'
|
34
|
+
puts JSON.dump(message)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def dimensions
|
40
|
+
[{ AppName: rails_app_name }]
|
41
|
+
end
|
42
|
+
|
43
|
+
def put_metric(name, value, unit = nil)
|
44
|
+
@metrics << { 'Name': name }.tap do |m|
|
45
|
+
m['Unit'] = unit if unit
|
46
|
+
end
|
47
|
+
set_property name, value
|
48
|
+
end
|
49
|
+
|
50
|
+
def set_property(name, value)
|
51
|
+
@properties[name] = value
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
def message
|
56
|
+
{
|
57
|
+
'_aws': {
|
58
|
+
'Timestamp': timestamp,
|
59
|
+
'CloudWatchMetrics': [
|
60
|
+
{
|
61
|
+
'Namespace': NAMESPACE,
|
62
|
+
'Dimensions': [dimensions.map(&:keys).flatten],
|
63
|
+
'Metrics': @metrics
|
64
|
+
}
|
65
|
+
]
|
66
|
+
}
|
67
|
+
}.tap do |m|
|
68
|
+
dimensions.each { |d| m.merge!(d) }
|
69
|
+
m.merge!(@properties)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def timestamp
|
74
|
+
Time.current.strftime('%s%3N').to_i
|
75
|
+
end
|
76
|
+
|
77
|
+
def rails_app_name
|
78
|
+
Lamby.config.metrics_app_name ||
|
79
|
+
Rails.application.class.name.split('::').first
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
data/lib/lamby/config.rb
CHANGED
@@ -41,6 +41,8 @@ module Lamby
|
|
41
41
|
|
42
42
|
def initialize_defaults
|
43
43
|
@rack_app = nil
|
44
|
+
@cold_start_metrics = false
|
45
|
+
@metrics_app_name = nil
|
44
46
|
@event_bridge_handler = lambda { |event, context| puts(event) }
|
45
47
|
end
|
46
48
|
|
@@ -53,7 +55,7 @@ module Lamby
|
|
53
55
|
end
|
54
56
|
|
55
57
|
def runner_patterns
|
56
|
-
|
58
|
+
LambdaConsole::Run::PATTERNS
|
57
59
|
end
|
58
60
|
|
59
61
|
def handled_proc
|
@@ -64,5 +66,21 @@ module Lamby
|
|
64
66
|
@handled_proc = proc
|
65
67
|
end
|
66
68
|
|
69
|
+
def cold_start_metrics?
|
70
|
+
@cold_start_metrics
|
71
|
+
end
|
72
|
+
|
73
|
+
def cold_start_metrics=(bool)
|
74
|
+
@cold_start_metrics = bool
|
75
|
+
end
|
76
|
+
|
77
|
+
def metrics_app_name
|
78
|
+
@metrics_app_name
|
79
|
+
end
|
80
|
+
|
81
|
+
def metrics_app_name=(name)
|
82
|
+
@metrics_app_name = name
|
83
|
+
end
|
84
|
+
|
67
85
|
end
|
68
86
|
end
|
data/lib/lamby/handler.rb
CHANGED
@@ -4,6 +4,7 @@ module Lamby
|
|
4
4
|
class << self
|
5
5
|
|
6
6
|
def call(app, event, context, options = {})
|
7
|
+
Lamby::ColdStartMetrics.instrument! if Lamby.config.cold_start_metrics?
|
7
8
|
new(app, event, context, options).call.response
|
8
9
|
end
|
9
10
|
|
@@ -92,10 +93,8 @@ module Lamby
|
|
92
93
|
Lambdakiq.cmd event: @event, context: @context
|
93
94
|
elsif lambda_cable?
|
94
95
|
LambdaCable.cmd event: @event, context: @context
|
95
|
-
elsif
|
96
|
-
|
97
|
-
elsif runner?
|
98
|
-
Lamby::Runner.cmd event: @event, context: @context
|
96
|
+
elsif LambdaConsole.handle?(@event)
|
97
|
+
LambdaConsole.handle(@event)
|
99
98
|
elsif event_bridge?
|
100
99
|
Lamby.config.event_bridge_handler.call @event, @context
|
101
100
|
else
|
@@ -121,14 +120,6 @@ module Lamby
|
|
121
120
|
defined?(::Lambdakiq) && ::Lambdakiq.jobs?(@event)
|
122
121
|
end
|
123
122
|
|
124
|
-
def runner?
|
125
|
-
Lamby::Runner.handle?(@event)
|
126
|
-
end
|
127
|
-
|
128
|
-
def command?
|
129
|
-
Lamby::Command.handle?(@event)
|
130
|
-
end
|
131
|
-
|
132
123
|
def lambda_cable?
|
133
124
|
defined?(::LambdaCable) && ::LambdaCable.handle?(@event, @context)
|
134
125
|
end
|
data/lib/lamby/version.rb
CHANGED
data/lib/lamby.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'lamby/logger'
|
2
2
|
require 'rack'
|
3
3
|
require 'base64'
|
4
|
+
require 'lambda-console-ruby'
|
4
5
|
require 'lamby/version'
|
5
6
|
require 'lamby/config'
|
6
7
|
require 'lamby/rack'
|
@@ -8,8 +9,7 @@ require 'lamby/rack_alb'
|
|
8
9
|
require 'lamby/rack_rest'
|
9
10
|
require 'lamby/rack_http'
|
10
11
|
require 'lamby/debug'
|
11
|
-
require 'lamby/
|
12
|
-
require 'lamby/command'
|
12
|
+
require 'lamby/cold_start_metrics'
|
13
13
|
require 'lamby/handler'
|
14
14
|
|
15
15
|
if defined?(Rails)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lamby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ken Collins
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: lambda-console-ruby
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: aws-sdk-ssm
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +136,20 @@ dependencies:
|
|
122
136
|
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: timecop
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
125
153
|
- !ruby/object:Gem::Dependency
|
126
154
|
name: webrick
|
127
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -163,7 +191,7 @@ files:
|
|
163
191
|
- images/social2.png
|
164
192
|
- lamby.gemspec
|
165
193
|
- lib/lamby.rb
|
166
|
-
- lib/lamby/
|
194
|
+
- lib/lamby/cold_start_metrics.rb
|
167
195
|
- lib/lamby/config.rb
|
168
196
|
- lib/lamby/debug.rb
|
169
197
|
- lib/lamby/handler.rb
|
@@ -175,7 +203,6 @@ files:
|
|
175
203
|
- lib/lamby/rack_http.rb
|
176
204
|
- lib/lamby/rack_rest.rb
|
177
205
|
- lib/lamby/railtie.rb
|
178
|
-
- lib/lamby/runner.rb
|
179
206
|
- lib/lamby/ssm_parameter_store.rb
|
180
207
|
- lib/lamby/tasks.rake
|
181
208
|
- lib/lamby/version.rb
|
data/lib/lamby/command.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
module Lamby
|
2
|
-
class Command
|
3
|
-
|
4
|
-
class << self
|
5
|
-
|
6
|
-
def handle?(event)
|
7
|
-
event.dig('x-lambda-console', 'command') ||
|
8
|
-
event.dig('lamby', 'command')
|
9
|
-
end
|
10
|
-
|
11
|
-
def cmd(event:, context:)
|
12
|
-
new(event).call
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
def initialize(event)
|
18
|
-
@event = event
|
19
|
-
@body = ''
|
20
|
-
end
|
21
|
-
|
22
|
-
def call
|
23
|
-
begin
|
24
|
-
body = eval(command, TOPLEVEL_BINDING).inspect
|
25
|
-
{ statusCode: 200, headers: {}, body: body }
|
26
|
-
rescue Exception => e
|
27
|
-
body = "#<#{e.class}:#{e.message}>".tap do |b|
|
28
|
-
if e.backtrace
|
29
|
-
b << "\n"
|
30
|
-
b << e.backtrace.join("\n")
|
31
|
-
end
|
32
|
-
end
|
33
|
-
{ statusCode: 422, headers: {}, body: body }
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def command
|
38
|
-
@event.dig('x-lambda-console', 'command') ||
|
39
|
-
@event.dig('lamby', 'command')
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
end
|
data/lib/lamby/runner.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'open3'
|
2
|
-
|
3
|
-
module Lamby
|
4
|
-
class Runner
|
5
|
-
class Error < StandardError ; end
|
6
|
-
class UnknownCommandPattern < Error ; end
|
7
|
-
|
8
|
-
PATTERNS = [%r{.*}]
|
9
|
-
|
10
|
-
class << self
|
11
|
-
|
12
|
-
def handle?(event)
|
13
|
-
event.dig('x-lambda-console', 'runner') ||
|
14
|
-
event.dig('lamby', 'runner')
|
15
|
-
end
|
16
|
-
|
17
|
-
def cmd(event:, context:)
|
18
|
-
new(event).call
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
def initialize(event)
|
24
|
-
@event = event
|
25
|
-
@body = ''
|
26
|
-
end
|
27
|
-
|
28
|
-
def call
|
29
|
-
validate!
|
30
|
-
status = Open3.popen3(env, command, chdir: chdir) do |_stdin, stdout, stderr, thread|
|
31
|
-
@body << stdout.read
|
32
|
-
@body << stderr.read
|
33
|
-
puts @body
|
34
|
-
thread.value.exitstatus
|
35
|
-
end
|
36
|
-
{ statusCode: status, headers: {}, body: @body }
|
37
|
-
end
|
38
|
-
|
39
|
-
def command
|
40
|
-
@event.dig('x-lambda-console', 'runner') ||
|
41
|
-
@event.dig('lamby', 'runner')
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def chdir
|
47
|
-
defined?(::Rails) ? ::Rails.root : Dir.pwd
|
48
|
-
end
|
49
|
-
|
50
|
-
def validate!
|
51
|
-
return if pattern?
|
52
|
-
raise UnknownCommandPattern.new(command)
|
53
|
-
end
|
54
|
-
|
55
|
-
def pattern?
|
56
|
-
PATTERNS.any? { |p| p === command }
|
57
|
-
end
|
58
|
-
|
59
|
-
def env
|
60
|
-
Hash[ENV.to_hash.map { |k,v| [k, ENV[k]] }]
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
end
|