litestack 0.4.1 → 0.4.2

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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.standard.yml +3 -0
  3. data/BENCHMARKS.md +23 -7
  4. data/CHANGELOG.md +11 -0
  5. data/Gemfile +1 -7
  6. data/Gemfile.lock +92 -0
  7. data/README.md +120 -6
  8. data/ROADMAP.md +45 -0
  9. data/Rakefile +3 -1
  10. data/WHYLITESTACK.md +1 -1
  11. data/assets/litecache_metrics.png +0 -0
  12. data/assets/litedb_metrics.png +0 -0
  13. data/assets/litemetric_logo_teal.png +0 -0
  14. data/assets/litesearch_logo_teal.png +0 -0
  15. data/bench/bench.rb +17 -10
  16. data/bench/bench_cache_rails.rb +10 -13
  17. data/bench/bench_cache_raw.rb +17 -22
  18. data/bench/bench_jobs_rails.rb +18 -12
  19. data/bench/bench_jobs_raw.rb +17 -10
  20. data/bench/bench_queue.rb +4 -6
  21. data/bench/rails_job.rb +5 -7
  22. data/bench/skjob.rb +4 -4
  23. data/bench/uljob.rb +6 -6
  24. data/lib/action_cable/subscription_adapter/litecable.rb +5 -8
  25. data/lib/active_job/queue_adapters/litejob_adapter.rb +6 -8
  26. data/lib/active_record/connection_adapters/litedb_adapter.rb +65 -75
  27. data/lib/active_support/cache/litecache.rb +38 -41
  28. data/lib/generators/litestack/install/install_generator.rb +3 -3
  29. data/lib/generators/litestack/install/templates/database.yml +7 -1
  30. data/lib/litestack/liteboard/liteboard.rb +269 -149
  31. data/lib/litestack/litecable.rb +41 -37
  32. data/lib/litestack/litecable.sql.yml +22 -11
  33. data/lib/litestack/litecache.rb +79 -88
  34. data/lib/litestack/litecache.sql.yml +81 -22
  35. data/lib/litestack/litecache.yml +1 -1
  36. data/lib/litestack/litedb.rb +35 -40
  37. data/lib/litestack/litejob.rb +30 -29
  38. data/lib/litestack/litejobqueue.rb +63 -65
  39. data/lib/litestack/litemetric.rb +80 -92
  40. data/lib/litestack/litemetric.sql.yml +244 -234
  41. data/lib/litestack/litemetric_collector.sql.yml +38 -41
  42. data/lib/litestack/litequeue.rb +39 -41
  43. data/lib/litestack/litequeue.sql.yml +39 -31
  44. data/lib/litestack/litescheduler.rb +15 -15
  45. data/lib/litestack/litesearch/index.rb +93 -63
  46. data/lib/litestack/litesearch/model.rb +66 -65
  47. data/lib/litestack/litesearch/schema.rb +53 -56
  48. data/lib/litestack/litesearch/schema_adapters/backed_adapter.rb +46 -50
  49. data/lib/litestack/litesearch/schema_adapters/basic_adapter.rb +44 -35
  50. data/lib/litestack/litesearch/schema_adapters/contentless_adapter.rb +3 -6
  51. data/lib/litestack/litesearch/schema_adapters/standalone_adapter.rb +7 -9
  52. data/lib/litestack/litesearch/schema_adapters.rb +4 -9
  53. data/lib/litestack/litesearch.rb +6 -9
  54. data/lib/litestack/litesupport.rb +76 -86
  55. data/lib/litestack/railtie.rb +1 -1
  56. data/lib/litestack/version.rb +2 -2
  57. data/lib/litestack.rb +6 -4
  58. data/lib/railties/rails/commands/dbconsole.rb +11 -15
  59. data/lib/sequel/adapters/litedb.rb +16 -21
  60. data/lib/sequel/adapters/shared/litedb.rb +168 -168
  61. data/scripts/build_metrics.rb +91 -0
  62. data/scripts/test_cable.rb +30 -0
  63. data/scripts/test_job_retry.rb +33 -0
  64. data/scripts/test_metrics.rb +60 -0
  65. data/template.rb +2 -2
  66. metadata +101 -6
@@ -0,0 +1,91 @@
1
+ require_relative "../lib/litestack/litemetric"
2
+ require_relative "../lib/litestack/litecache"
3
+ require_relative "../lib/litestack/litejob"
4
+
5
+ # standard:disable Style/GlobalVars
6
+
7
+ # initialize the litemetric to modify the date function
8
+
9
+ lm = Litemetric.instance
10
+
11
+ # initialize the queue to capture the options
12
+ Litejobqueue.new({
13
+ path: ":memory:",
14
+ retries: 2,
15
+ queues: [["normal", 1], ["urgent", 3], ["critical", 10]],
16
+ metrics: true,
17
+ log: nil
18
+ })
19
+
20
+ $time = Time.now.to_i #- 10800
21
+ $start_time = Time.now.to_i
22
+
23
+ class NormalJob
24
+ include Litejob
25
+ self.queue = "normal"
26
+ def perform(time)
27
+ $time = time #-= (rand * 100).to_i #10 seconds in the past
28
+ sleep 0.001
29
+ warn "performing some normal action"
30
+ end
31
+ end
32
+
33
+ class SlowJob
34
+ include Litejob
35
+ self.queue = "normal"
36
+
37
+ def perform(time)
38
+ $time = time # (rand * 100).to_i #10 seconds in the past
39
+ sleep 0.1
40
+ warn "performing some slow action"
41
+ end
42
+ end
43
+
44
+ class CriticalJob
45
+ include Litejob
46
+ self.queue = "critical"
47
+
48
+ def perform(time)
49
+ $time = time # (rand * 100).to_i #10 seconds in the past
50
+ sleep 0.01
51
+ warn "performing some critical action"
52
+ end
53
+ end
54
+
55
+ class UrgentJob
56
+ include Litejob
57
+ self.queue = "urgent"
58
+
59
+ def perform(time)
60
+ $time = time # (rand * 100).to_i #10 seconds in the past
61
+ sleep 0.001
62
+ warn "performing some urgent action"
63
+ end
64
+ end
65
+
66
+ cache = Litecache.new({metrics: true})
67
+
68
+ def lm.current_time_slot
69
+ ($time / 300) * 300
70
+ end
71
+
72
+ jobs = [SlowJob, UrgentJob, NormalJob, CriticalJob]
73
+
74
+ payload = "A" * 128
75
+ setter = proc { cache.set((rand * 1000).to_i.to_s, payload) }
76
+ getter = proc { cache.get((rand * 1300).to_i.to_s) }
77
+ cache_actions = [getter] * 5
78
+ cache_actions << setter
79
+
80
+ t = Time.now
81
+ 5000.times do |i|
82
+ $time = $start_time - (rand * (3600 * 24 * 7 * 52)).to_i # up to 52 weeks in the past
83
+ jobs.sample.perform_async($time)
84
+ cache_actions.sample.call
85
+ puts "Finished #{i} events after #{Time.now - t} seconds for time_slot=#{lm.send(:current_time_slot)}" if i % 1000 == 0 && i > 0
86
+ end
87
+ puts "finished creating jobs, now summarizing"
88
+ lm.summarize
89
+ sleep
90
+
91
+ # standard:enable Style/GlobalVars
@@ -0,0 +1,30 @@
1
+ require_relative "../lib/litestack/litecable"
2
+
3
+ # fork
4
+
5
+ lc = Litecable.new({logger: "STDOUT", metrics: true})
6
+
7
+ class Client
8
+ def initialize(channel)
9
+ @channel = channel
10
+ warn "[#{Process.pid}]:#{object_id} listening to #{@channel}"
11
+ end
12
+
13
+ def call(*args)
14
+ warn "[#{Process.pid}]:#{object_id} recieved #{args} from #{@channel}"
15
+ end
16
+ end
17
+
18
+ channels = []
19
+ 5.times { |i| channels << "channel##{i + 1}" }
20
+
21
+ 20.times do
22
+ channel = channels.sample
23
+ lc.subscribe(channel, Client.new(channel))
24
+ end
25
+
26
+ 100.times do |i|
27
+ lc.broadcast(channels.sample, "message##{i + 1}")
28
+ end
29
+
30
+ sleep
@@ -0,0 +1,33 @@
1
+ require "minitest/autorun"
2
+ require "../lib/litestack/litejob"
3
+
4
+ # create a job queue (will be saved in a class variable)
5
+ Litejobqueue.new({retries: 3, retry_delay: 1, retry_delay_multiplier: 1, gc_sleep_interval: 1, dead_job_retention: 1, logger: "STDOUT"})
6
+
7
+ class MyJob
8
+ include Litejob
9
+
10
+ @@attempts = {}
11
+
12
+ def perform(name, time)
13
+ if @@attempts[name]
14
+ @@attempts[name] += 1
15
+ else
16
+ @@attempts[name] = 1
17
+ end
18
+ puts "Job: #{name}: attempt #{@@attempts[name]}"
19
+ raise "some error" if Time.now.to_i < time
20
+ puts "Job: #{name}: finished"
21
+ end
22
+ end
23
+
24
+ # this job will fail forever
25
+ MyJob.perform_async("FAILURE", Time.now.to_i + 10)
26
+
27
+ # this job will fail two times
28
+ MyJob.perform_async("EVENTUAL SUCCESS", Time.now.to_i + 2)
29
+
30
+ # this job will never fail
31
+ MyJob.perform_async("SUCCESS", Time.now.to_i)
32
+
33
+ sleep
@@ -0,0 +1,60 @@
1
+ require "../lib/litestack"
2
+
3
+ # standard:disable Style/GlobalVars
4
+
5
+ class SomeAction
6
+ include Litemetric::Measurable
7
+
8
+ def initialize
9
+ collect_metrics
10
+ end
11
+
12
+ def do1(param)
13
+ capture("something", param)
14
+ end
15
+
16
+ def do2(param)
17
+ capture("anotherthing", param)
18
+ end
19
+
20
+ def do3(param)
21
+ measure("differentthing", param) do
22
+ sleep 0.001
23
+ end
24
+ end
25
+
26
+ def report
27
+ resolution = "minute"
28
+ puts topics = @litemetric.topics
29
+ topics.each do |topic|
30
+ puts topic
31
+ puts events = @litemetric.event_names(resolution, topic)
32
+ events.each do |event|
33
+ if event[0] == "differentthing"
34
+ puts keys = @litemetric.keys(resolution, topic, event[0])
35
+ keys.each do |key|
36
+ puts @litemetric.event_data(resolution, topic, event[0], key[0])
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ some_action = SomeAction.new
45
+ $time = Time.now.to_i - 10800
46
+ lm = Litemetric.instance
47
+ def lm.current_time_slot
48
+ ($time / 300) * 300
49
+ end
50
+ t = Time.now
51
+ 40000.times do |i|
52
+ $time += (rand * 100).to_i # extra 10 seconds
53
+ action = ["do1", "do2", "do3"].sample
54
+ some_action.send(action, "key_#{i}")
55
+ puts "Finished #{i} events after #{Time.now - t} seconds" if i % 1000 == 0 && i > 0
56
+ end
57
+ puts "finished capturing, now reporting"
58
+ # some_action.report
59
+
60
+ # standard:enable Style/GlobalVars
data/template.rb CHANGED
@@ -1,6 +1,6 @@
1
- # Run `rails new my-app -m https://raw.githubusercontent.com/bradgessler/litestack/master/template.rb`
1
+ # Run `rails new my-app -m https://raw.githubusercontent.com/oldmoe/litestack/master/template.rb`
2
2
  # to create a new Rails app with Litestack pre-installed.
3
- gem "litestack", github: "bradgessler/litestack"
3
+ gem "litestack", github: "litestack"
4
4
 
5
5
  after_bundle do
6
6
  generate "litestack:install"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: litestack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mohamed Hassan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-11 00:00:00.000000000 Z
11
+ date: 2023-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sqlite3
@@ -94,6 +94,90 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: railties
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: minitest
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rack
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3.0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: standard
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
97
181
  description:
98
182
  email:
99
183
  - oldmoe@gmail.com
@@ -102,19 +186,26 @@ executables:
102
186
  extensions: []
103
187
  extra_rdoc_files: []
104
188
  files:
189
+ - ".standard.yml"
105
190
  - BENCHMARKS.md
106
191
  - CHANGELOG.md
107
192
  - Gemfile
193
+ - Gemfile.lock
108
194
  - LICENSE.txt
109
195
  - README.md
196
+ - ROADMAP.md
110
197
  - Rakefile
111
198
  - WHYLITESTACK.md
112
199
  - assets/event_page.png
113
200
  - assets/index_page.png
114
201
  - assets/litecable_logo_teal.png
115
202
  - assets/litecache_logo_teal.png
203
+ - assets/litecache_metrics.png
116
204
  - assets/litedb_logo_teal.png
205
+ - assets/litedb_metrics.png
117
206
  - assets/litejob_logo_teal.png
207
+ - assets/litemetric_logo_teal.png
208
+ - assets/litesearch_logo_teal.png
118
209
  - assets/litestack_logo_teal.png
119
210
  - assets/litestack_logo_teal_large.png
120
211
  - assets/topic_page.png
@@ -176,15 +267,19 @@ files:
176
267
  - lib/sequel/adapters/litedb.rb
177
268
  - lib/sequel/adapters/shared/litedb.rb
178
269
  - samples/ultrajob.yaml
270
+ - scripts/build_metrics.rb
271
+ - scripts/test_cable.rb
272
+ - scripts/test_job_retry.rb
273
+ - scripts/test_metrics.rb
179
274
  - template.rb
180
- homepage: http://github.com/oldmoe/litestack
275
+ homepage: https://github.com/oldmoe/litestack
181
276
  licenses:
182
277
  - MIT
183
278
  metadata:
184
279
  allowed_push_host: https://rubygems.org
185
- homepage_uri: http://github.com/oldmoe/litestack
186
- source_code_uri: http://github.com/oldmoe/litestack
187
- changelog_uri: http://github.com/oldmoe/litestack/CHANEGELOG.md
280
+ homepage_uri: https://github.com/oldmoe/litestack
281
+ source_code_uri: https://github.com/oldmoe/litestack
282
+ changelog_uri: https://github.com/oldmoe/litestack/CHANEGELOG.md
188
283
  post_install_message:
189
284
  rdoc_options: []
190
285
  require_paths: