cosmonats 0.7.0 → 0.9.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.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +219 -113
  3. data/lib/cosmo/active_job/adapter.rb +1 -2
  4. data/lib/cosmo/api/counter.rb +17 -17
  5. data/lib/cosmo/api/cron/entry.rb +10 -11
  6. data/lib/cosmo/api/cron.rb +6 -3
  7. data/lib/cosmo/api/job.rb +1 -1
  8. data/lib/cosmo/api/kv.rb +3 -3
  9. data/lib/cosmo/api/registry.rb +1 -1
  10. data/lib/cosmo/api/stats/busy.rb +6 -1
  11. data/lib/cosmo/api/stats/metrics.rb +109 -0
  12. data/lib/cosmo/api/stats/processes.rb +14 -4
  13. data/lib/cosmo/api/stats/totals.rb +4 -12
  14. data/lib/cosmo/api/stats.rb +18 -2
  15. data/lib/cosmo/api/stream.rb +7 -2
  16. data/lib/cosmo/batch/counters.rb +19 -0
  17. data/lib/cosmo/batch.rb +6 -6
  18. data/lib/cosmo/cli.rb +21 -5
  19. data/lib/cosmo/client.rb +37 -14
  20. data/lib/cosmo/config/cosmo.yml +58 -0
  21. data/lib/cosmo/config/settings.rb +20 -0
  22. data/lib/cosmo/config.rb +144 -19
  23. data/lib/cosmo/heartbeat.rb +11 -0
  24. data/lib/cosmo/job/data.rb +17 -12
  25. data/lib/cosmo/job/enqueuer.rb +53 -0
  26. data/lib/cosmo/job/limit.rb +2 -2
  27. data/lib/cosmo/job/processor.rb +32 -58
  28. data/lib/cosmo/job/requeue.rb +20 -0
  29. data/lib/cosmo/job.rb +8 -22
  30. data/lib/cosmo/logger.rb +15 -2
  31. data/lib/cosmo/middleware/busy.rb +15 -0
  32. data/lib/cosmo/middleware/chain.rb +137 -0
  33. data/lib/cosmo/middleware/limit.rb +50 -0
  34. data/lib/cosmo/middleware/metrics.rb +39 -0
  35. data/lib/cosmo/{sentry/job_processor_middleware.rb → middleware/sentry.rb} +26 -30
  36. data/lib/cosmo/middleware/totals.rb +29 -0
  37. data/lib/cosmo/middleware.rb +7 -0
  38. data/lib/cosmo/processor.rb +11 -5
  39. data/lib/cosmo/publisher.rb +1 -13
  40. data/lib/cosmo/railtie.rb +2 -2
  41. data/lib/cosmo/services.rb +69 -0
  42. data/lib/cosmo/stream/processor.rb +7 -1
  43. data/lib/cosmo/utils/hash.rb +7 -8
  44. data/lib/cosmo/utils.rb +0 -1
  45. data/lib/cosmo/version.rb +1 -1
  46. data/lib/cosmo/web/assets/app.css +271 -571
  47. data/lib/cosmo/web/assets/app.js +158 -0
  48. data/lib/cosmo/web/assets/fonts/OFL.txt +92 -0
  49. data/lib/cosmo/web/assets/fonts/geist-mono.woff2 +0 -0
  50. data/lib/cosmo/web/assets/fonts/geist.woff2 +0 -0
  51. data/lib/cosmo/web/assets/logo.svg +10 -0
  52. data/lib/cosmo/web/cache.rb +75 -0
  53. data/lib/cosmo/web/chart.rb +122 -0
  54. data/lib/cosmo/web/circuit.rb +55 -0
  55. data/lib/cosmo/web/context.rb +0 -4
  56. data/lib/cosmo/web/controllers/application.rb +16 -0
  57. data/lib/cosmo/web/controllers/batches.rb +1 -0
  58. data/lib/cosmo/web/controllers/crons.rb +17 -2
  59. data/lib/cosmo/web/controllers/jobs.rb +59 -54
  60. data/lib/cosmo/web/controllers/metrics.rb +49 -0
  61. data/lib/cosmo/web/controllers/overview.rb +70 -0
  62. data/lib/cosmo/web/controllers/processes.rb +33 -0
  63. data/lib/cosmo/web/controllers/streams.rb +26 -28
  64. data/lib/cosmo/web/helpers/application.rb +67 -0
  65. data/lib/cosmo/web/renderer.rb +19 -6
  66. data/lib/cosmo/web/throughput.rb +104 -0
  67. data/lib/cosmo/web/views/batches/_table.erb +42 -43
  68. data/lib/cosmo/web/views/batches/index.erb +3 -10
  69. data/lib/cosmo/web/views/crons/_table.erb +32 -53
  70. data/lib/cosmo/web/views/crons/index.erb +2 -9
  71. data/lib/cosmo/web/views/jobs/_args.erb +5 -0
  72. data/lib/cosmo/web/views/jobs/_busy.erb +25 -121
  73. data/lib/cosmo/web/views/jobs/_dead.erb +42 -82
  74. data/lib/cosmo/web/views/jobs/_enqueued.erb +33 -113
  75. data/lib/cosmo/web/views/jobs/_panel.erb +29 -0
  76. data/lib/cosmo/web/views/jobs/_queue_row.erb +18 -0
  77. data/lib/cosmo/web/views/jobs/_queues.erb +20 -0
  78. data/lib/cosmo/web/views/jobs/_scheduled.erb +20 -54
  79. data/lib/cosmo/web/views/jobs/index.erb +4 -17
  80. data/lib/cosmo/web/views/layout.erb +73 -22
  81. data/lib/cosmo/web/views/metrics/_chart.erb +41 -0
  82. data/lib/cosmo/web/views/metrics/_panel.erb +13 -0
  83. data/lib/cosmo/web/views/metrics/_table.erb +25 -0
  84. data/lib/cosmo/web/views/metrics/index.erb +9 -0
  85. data/lib/cosmo/web/views/overview/_badges.erb +3 -0
  86. data/lib/cosmo/web/views/overview/_kpis.erb +19 -0
  87. data/lib/cosmo/web/views/overview/_running.erb +18 -0
  88. data/lib/cosmo/web/views/overview/_throughput.erb +50 -0
  89. data/lib/cosmo/web/views/overview/_workers.erb +25 -0
  90. data/lib/cosmo/web/views/overview/index.erb +28 -0
  91. data/lib/cosmo/web/views/processes/_table.erb +67 -0
  92. data/lib/cosmo/web/views/processes/index.erb +1 -0
  93. data/lib/cosmo/web/views/shared/_pager.erb +22 -0
  94. data/lib/cosmo/web/views/shared/unavailable.erb +7 -0
  95. data/lib/cosmo/web/views/streams/_info.erb +28 -86
  96. data/lib/cosmo/web/views/streams/_list.erb +7 -0
  97. data/lib/cosmo/web/views/streams/_pause_banner.erb +8 -16
  98. data/lib/cosmo/web/views/streams/_stream.erb +52 -0
  99. data/lib/cosmo/web/views/streams/index.erb +3 -11
  100. data/lib/cosmo/web/views/streams/info.erb +3 -11
  101. data/lib/cosmo/web.rb +67 -33
  102. data/lib/cosmo.rb +38 -0
  103. data/sig/cosmo/api/counter.rbs +2 -3
  104. data/sig/cosmo/api/cron/entry.rbs +2 -1
  105. data/sig/cosmo/api/stats/busy.rbs +3 -1
  106. data/sig/cosmo/api/stats/metrics.rbs +42 -0
  107. data/sig/cosmo/api/stats/processes.rbs +3 -0
  108. data/sig/cosmo/api/stats/totals.rbs +3 -2
  109. data/sig/cosmo/api/stats.rbs +4 -0
  110. data/sig/cosmo/api/stream.rbs +2 -0
  111. data/sig/cosmo/batch/counters.rbs +10 -0
  112. data/sig/cosmo/batch.rbs +3 -4
  113. data/sig/cosmo/cli.rbs +2 -0
  114. data/sig/cosmo/client.rbs +4 -1
  115. data/sig/cosmo/config/settings.rbs +31 -0
  116. data/sig/cosmo/config.rbs +59 -5
  117. data/sig/cosmo/heartbeat.rbs +2 -0
  118. data/sig/cosmo/job/data.rbs +5 -3
  119. data/sig/cosmo/job/enqueuer.rbs +11 -0
  120. data/sig/cosmo/job/processor.rbs +3 -5
  121. data/sig/cosmo/job/requeue.rbs +9 -0
  122. data/sig/cosmo/job.rbs +0 -2
  123. data/sig/cosmo/logger.rbs +6 -0
  124. data/sig/cosmo/middleware/chain.rbs +51 -0
  125. data/sig/cosmo/middleware/sentry.rbs +14 -0
  126. data/sig/cosmo/middleware.rbs +35 -0
  127. data/sig/cosmo/processor.rbs +2 -0
  128. data/sig/cosmo/publisher.rbs +1 -9
  129. data/sig/cosmo/services.rbs +18 -0
  130. data/sig/cosmo/stream/processor.rbs +2 -0
  131. data/sig/cosmo/utils/hash.rbs +2 -3
  132. data/sig/cosmo.rbs +11 -0
  133. metadata +60 -20
  134. data/lib/cosmo/sentry/auto.rb +0 -6
  135. data/lib/cosmo/utils/overrides.rb +0 -206
  136. data/lib/cosmo/utils/warnings.rb +0 -17
  137. data/lib/cosmo/web/controllers/actions.rb +0 -16
  138. data/lib/cosmo/web/views/actions/index.erb +0 -7
  139. data/lib/cosmo/web/views/jobs/_processes.erb +0 -131
  140. data/lib/cosmo/web/views/jobs/_stats.erb +0 -73
  141. data/lib/cosmo/web/views/jobs/_tabs.erb +0 -8
  142. data/lib/cosmo/web/views/jobs/busy.erb +0 -18
  143. data/lib/cosmo/web/views/jobs/dead.erb +0 -18
  144. data/lib/cosmo/web/views/jobs/enqueued.erb +0 -18
  145. data/lib/cosmo/web/views/jobs/scheduled.erb +0 -18
  146. data/lib/cosmo/web/views/streams/_stream_row.erb +0 -42
  147. data/lib/cosmo/web/views/streams/_table.erb +0 -25
@@ -1,18 +0,0 @@
1
- <section>
2
- <header><%= render('jobs/_tabs') %></header>
3
-
4
- <div hx-get="<%= url_for('/jobs/_stats') %>"
5
- hx-trigger="load, every <%= poll_interval %>s"
6
- hx-swap="innerHTML">
7
- <div class="alert alert-info">Loading statistics…</div>
8
- </div>
9
-
10
- <div id="content">
11
- <div id="busy-poller"
12
- hx-get="<%= url_for('/jobs/_busy') %>"
13
- hx-trigger="load"
14
- hx-swap="outerHTML">
15
- <div class="alert alert-info">Loading busy jobs&hellip;</div>
16
- </div>
17
- </div>
18
- </section>
@@ -1,18 +0,0 @@
1
- <section>
2
- <header><%= render('jobs/_tabs') %></header>
3
-
4
- <div hx-get="<%= url_for('/jobs/_stats') %>"
5
- hx-trigger="load, every <%= poll_interval %>s"
6
- hx-swap="innerHTML">
7
- <div class="alert alert-info">Loading statistics…</div>
8
- </div>
9
-
10
- <div id="content">
11
- <div id="dead-jobs"
12
- hx-get="<%= url_for('/jobs/_dead') %>"
13
- hx-trigger="load"
14
- hx-swap="outerHTML">
15
- <div class="alert alert-info">Loading dead jobs&hellip;</div>
16
- </div>
17
- </div>
18
- </section>
@@ -1,18 +0,0 @@
1
- <section>
2
- <header><%= render('jobs/_tabs') %></header>
3
-
4
- <div hx-get="<%= url_for('/jobs/_stats') %>"
5
- hx-trigger="load, every <%= poll_interval %>s"
6
- hx-swap="innerHTML">
7
- <div class="alert alert-info">Loading statistics…</div>
8
- </div>
9
-
10
- <div id="content">
11
- <div id="enqueued-poller"
12
- hx-get="<%= url_for('/jobs/_enqueued', stream_name: @stream_name) %>"
13
- hx-trigger="load"
14
- hx-swap="outerHTML">
15
- <div class="alert alert-info">Loading enqueued jobs&hellip;</div>
16
- </div>
17
- </div>
18
- </section>
@@ -1,18 +0,0 @@
1
- <section>
2
- <header><%= render('jobs/_tabs') %></header>
3
-
4
- <div hx-get="<%= url_for('/jobs/_stats') %>"
5
- hx-trigger="load, every <%= poll_interval %>s"
6
- hx-swap="innerHTML">
7
- <div class="alert alert-info">Loading statistics…</div>
8
- </div>
9
-
10
- <div id="content">
11
- <div id="scheduled-poller"
12
- hx-get="<%= url_for('/jobs/_scheduled') %>"
13
- hx-trigger="load"
14
- hx-swap="outerHTML">
15
- <div class="alert alert-info">Loading scheduled jobs&hellip;</div>
16
- </div>
17
- </div>
18
- </section>
@@ -1,42 +0,0 @@
1
- <tr id="stream-row-<%= h(@stream[:name]) %>">
2
- <td>
3
- <a href="<%= url_for('/streams/info', { name: u(@stream[:name]) }) %>"
4
- hx-get="<%= url_for('/streams/info', { name: u(@stream[:name]) }) %>"
5
- hx-target="#content"
6
- hx-push-url="true"
7
- class="stream-link"><%= h(@stream[:name]) %></a>
8
- </td>
9
- <td><%= format_numbers(@stream[:messages]) %></td>
10
- <td><%= format_bytes(@stream[:bytes]) %></td>
11
- <td><%= @stream[:consumer_count] %></td>
12
- <td>
13
- <div class="subjects">
14
- <% Array(@stream[:subjects]).each do |subject| -%>
15
- <span class="subject-tag"><%= h(subject) %></span>
16
- <% end -%>
17
- </div>
18
- </td>
19
- <td><code><%= format_numbers(@stream[:first_seq]) %> &rarr; <%= format_numbers(@stream[:last_seq]) %></code></td>
20
- <td>
21
- <% if @stream[:paused] -%>
22
- <span class="badge badge-warning">&#9208; Paused</span>
23
- <% elsif @stream[:consumer_count].to_i > 0 -%>
24
- <span class="badge badge-success">&#9654; Active</span>
25
- <% else -%>
26
- <span class="badge">No consumers</span>
27
- <% end -%>
28
- </td>
29
- <td>
30
- <% if @stream[:paused] -%>
31
- <a hx-patch="<%= url_for('/streams/unpause', { name: u(@stream[:name]) }) %>"
32
- hx-target="#stream-row-<%= h(@stream[:name]) %>"
33
- hx-swap="outerHTML"
34
- class="btn btn-success">&#9654; Resume</a>
35
- <% else -%>
36
- <a hx-patch="<%= url_for('/streams/pause', { name: u(@stream[:name]) }) %>"
37
- hx-target="#stream-row-<%= h(@stream[:name]) %>"
38
- hx-swap="outerHTML"
39
- class="btn btn-warning">&#9208; Pause</a>
40
- <% end -%>
41
- </td>
42
- </tr>
@@ -1,25 +0,0 @@
1
- <% if @streams.empty? -%>
2
- <div class="alert alert-info">No streams found</div>
3
- <% else -%>
4
- <div class="table-container">
5
- <table>
6
- <thead>
7
- <tr>
8
- <th>Name</th>
9
- <th>Messages</th>
10
- <th>Size</th>
11
- <th>Consumers</th>
12
- <th>Subjects</th>
13
- <th>Sequence</th>
14
- <th>Status</th>
15
- <th>Actions</th>
16
- </tr>
17
- </thead>
18
- <tbody>
19
- <% @streams.each do |stream| -%>
20
- <%= render("streams/_stream_row", { stream: stream }) %>
21
- <% end -%>
22
- </tbody>
23
- </table>
24
- </div>
25
- <% end -%>