gouda 0.1.5 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0be474cea3bc87b9c0a41c9c654a31e4dc865e46876249a1db615bf56e494a40
4
- data.tar.gz: '048574e736404c6c76f437fdfded93d7e810a23c83bb4f28ede8dffe9761a215'
3
+ metadata.gz: 760773cc030761badbc847c89278a501588ba47ff6106c8d4a3a71ae30aebaac
4
+ data.tar.gz: 5039b969fc5f258a898ab66c1f617d4bfdaa33bc29d69f285fd875e1e60617fe
5
5
  SHA512:
6
- metadata.gz: 00e687d2fc384484cf2c07bf6c661e8d5ff1287a96f4e4f0abd98df2933538d7d81946ee51fe8e7abd6f2e5b285b6762aba231d359926ba5ee09d07a8b7e526c
7
- data.tar.gz: cbd09ad83be4b9e6b9b35e20b2c80b7c8a5b8de1e20f8adfa6d0701d1aa31be7e5ea8edd2e64fab8f67e69cdc9757d1bcf79908fac9a81e9eccf9497f0a1c073
6
+ metadata.gz: c29cd1f3ea3ccba5b7995c3d32aed5c9a27d10b7609bee622edd7766ba2acee17a875b1a48f35e24d9bec42e7353f38451c35b79ae970994128ca2931a2e7ff1
7
+ data.tar.gz: 2c70d0d7a0a989c3d6e52ab87df3287831561a50e0ef766d4d18cf21939f06e47f19de48dd480ed2acffc340f727ad046a67e7cc6d6e37dfc3963f181f8742d8
data/CHANGELOG.md CHANGED
@@ -27,3 +27,16 @@
27
27
 
28
28
  - Update documentation
29
29
  - Don't pass on scheduler keys to retries
30
+
31
+ ## [0.1.6] - 2023-06-18
32
+
33
+ - Fix: don't upsert workloads twice when starting Gouda.
34
+ - Add back in Appsignal calls
35
+
36
+ ## [0.1.7] - 2023-06-21
37
+
38
+ - Separate all instrumentation to use ActiveSupport::Notification
39
+
40
+ ## [0.1.8] - 2023-06-21
41
+
42
+ - Move some missed instrumentations to Gouda.instrument
data/lib/gouda/adapter.rb CHANGED
@@ -83,7 +83,7 @@ class Gouda::Adapter
83
83
  # Use batches of 500 so that we do not exceed the maximum statement size or do not create a transaction for the
84
84
  # insert which times out
85
85
  inserted_ids_and_positions = bulk_insert_attributes.each_slice(500).flat_map do |chunk|
86
- ActiveSupport::Notifications.instrument("insert_all.gouda", {n_rows: chunk.size}) do |payload|
86
+ Gouda.instrument(:insert_all, {n_rows: chunk.size}) do |payload|
87
87
  rows = Gouda::Workload.insert_all(chunk, returning: [:id, :position_in_bulk])
88
88
  payload[:inserted_jobs] = rows.length
89
89
  payload[:rejected_jobs] = chunk.size - rows.length
data/lib/gouda/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Gouda
4
- VERSION = "0.1.5"
4
+ VERSION = "0.1.8"
5
5
  end
data/lib/gouda/worker.rb CHANGED
@@ -163,7 +163,8 @@ module Gouda
163
163
  # Find jobs which just hung and clean them up (mark them as "finished" and enqueue replacement workloads if possible)
164
164
  Gouda::Workload.reap_zombie_workloads
165
165
  rescue => e
166
- # Appsignal.add_exception(e)
166
+ Gouda.instrument(:exception, {exception: e})
167
+
167
168
  warn "Uncaught exception during housekeeping (#{e.class} - #{e}"
168
169
  end
169
170
 
@@ -63,7 +63,7 @@ class Gouda::Workload < ActiveRecord::Base
63
63
  workload.with_lock("FOR UPDATE SKIP LOCKED") do
64
64
  Gouda.logger.info { "Reviving (re-enqueueing) Gouda workload #{workload.id} after interruption" }
65
65
 
66
- # Appsignal.increment_counter("gouda_workloads_revived", 1, job_class: workload.active_job_class_name)
66
+ Gouda.instrument(:workloads_revived_counter, {size: 1, job_class: workload.active_job_class_name})
67
67
 
68
68
  interrupted_at = workload.last_execution_heartbeat_at
69
69
  workload.update!(state: "finished", interrupted_at: interrupted_at, last_execution_heartbeat_at: Time.now.utc, execution_finished_at: Time.now.utc)
@@ -110,7 +110,7 @@ class Gouda::Workload < ActiveRecord::Base
110
110
  .lock("FOR UPDATE SKIP LOCKED")
111
111
  .limit(1)
112
112
 
113
- _first_available_workload = ActiveSupport::Notifications.instrument("checkout_and_lock_one.gouda", {queue_constraint: queue_constraint.to_sql}) do |payload|
113
+ _first_available_workload = ActiveSupport::Notifications.instrument(:checkout_and_lock_one, {queue_constraint: queue_constraint.to_sql}) do |payload|
114
114
  payload[:condition_sql] = jobs.to_sql
115
115
  payload[:retried_checkouts_due_to_concurrent_exec] = 0
116
116
  uncached do # Necessary because we SELECT with a clock_timestamp() which otherwise gets cached by ActiveRecord query cache
@@ -147,7 +147,7 @@ class Gouda::Workload < ActiveRecord::Base
147
147
  end
148
148
 
149
149
  def perform_and_update_state!
150
- ActiveSupport::Notifications.instrument("perform_job.gouda", {workload: self}) do |instrument_payload|
150
+ Gouda.instrument(:perform_job, {workload: self}) do |instrument_payload|
151
151
  extras = {}
152
152
  if Gouda::JobFuse.exists?(active_job_class_name: active_job_class_name)
153
153
  extras[:error] = {class_name: "WorkloadSkippedError", message: "Skipped because of a fuse at #{Time.now.utc}"}
data/lib/gouda.rb CHANGED
@@ -46,8 +46,6 @@ module Gouda
46
46
  end
47
47
 
48
48
  def self.start
49
- Gouda::Scheduler.upsert_workloads_from_entries_list!
50
-
51
49
  queue_constraint = if ENV["GOUDA_QUEUES"]
52
50
  Gouda.parse_queue_constraint(ENV["GOUDA_QUEUES"])
53
51
  else
@@ -72,6 +70,11 @@ module Gouda
72
70
  Gouda.config.logger
73
71
  end
74
72
 
73
+ def self.instrument(channel, options, &block)
74
+ ActiveSupport::Notifications.instrument("#{channel}.gouda", options, &block)
75
+ end
76
+
77
+
75
78
  def self.create_tables(active_record_schema)
76
79
  active_record_schema.create_enum :gouda_workload_state, %w[enqueued executing finished]
77
80
  active_record_schema.create_table :gouda_workloads, id: :uuid do |t|
@@ -645,6 +645,15 @@ class GoudaTest < ActiveSupport::TestCase
645
645
  assert_equal ["did-run"], Thread.current[:gouda_test_side_effects]
646
646
  end
647
647
 
648
+ test "instrumentation" do
649
+ payload = subscribed_notification_for("workloads_revived_counter.gouda") do
650
+ Gouda.instrument(:workloads_revived_counter, {size: 1, job_class: "test_class"})
651
+ end
652
+
653
+ assert_equal "test_class", payload[:job_class]
654
+ assert_equal 1, payload[:size]
655
+ end
656
+
648
657
  def sample_description(sample)
649
658
  values = sample.map(&:to_f).sort
650
659
 
@@ -67,4 +67,17 @@ class ActiveSupport::TestCase
67
67
  end
68
68
  end
69
69
  end
70
+
71
+ def subscribed_notification_for(notification)
72
+ payload = nil
73
+ subscription = ActiveSupport::Notifications.subscribe notification do |name, start, finish, id, _payload|
74
+ payload = _payload
75
+ end
76
+
77
+ yield
78
+
79
+ ActiveSupport::Notifications.unsubscribe(subscription)
80
+
81
+ return payload
82
+ end
70
83
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gouda
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian van Hesteren
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-06-18 00:00:00.000000000 Z
12
+ date: 2024-06-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -188,7 +188,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
188
188
  - !ruby/object:Gem::Version
189
189
  version: '0'
190
190
  requirements: []
191
- rubygems_version: 3.5.11
191
+ rubygems_version: 3.5.13
192
192
  signing_key:
193
193
  specification_version: 4
194
194
  summary: Job Scheduler