inst-jobs-statsd 2.1.0 → 3.0.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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/lib/inst-jobs-statsd.rb +22 -18
  3. data/lib/inst_jobs_statsd/default_tracking.rb +3 -1
  4. data/lib/inst_jobs_statsd/ext/job.rb +13 -0
  5. data/lib/inst_jobs_statsd/jobs_tracker.rb +5 -1
  6. data/lib/inst_jobs_statsd/naming.rb +20 -25
  7. data/lib/inst_jobs_statsd/stats/counters/complete.rb +23 -0
  8. data/lib/inst_jobs_statsd/stats/counters/create.rb +23 -0
  9. data/lib/inst_jobs_statsd/stats/counters/run.rb +2 -0
  10. data/lib/inst_jobs_statsd/stats/counters.rb +2 -0
  11. data/lib/inst_jobs_statsd/stats/periodic/failed.rb +2 -0
  12. data/lib/inst_jobs_statsd/stats/periodic/queue.rb +3 -1
  13. data/lib/inst_jobs_statsd/stats/periodic/run.rb +3 -1
  14. data/lib/inst_jobs_statsd/stats/periodic.rb +6 -2
  15. data/lib/inst_jobs_statsd/stats/timing/failed.rb +2 -0
  16. data/lib/inst_jobs_statsd/stats/timing/perform.rb +2 -0
  17. data/lib/inst_jobs_statsd/stats/timing/pop.rb +2 -0
  18. data/lib/inst_jobs_statsd/stats/timing.rb +7 -3
  19. data/lib/inst_jobs_statsd/version.rb +3 -1
  20. metadata +89 -92
  21. data/lib/inst_jobs_statsd/stats/counters/failed.rb +0 -28
  22. data/spec/factories/jobs.rb +0 -9
  23. data/spec/factories/workers.rb +0 -9
  24. data/spec/gemfiles/42.gemfile +0 -8
  25. data/spec/gemfiles/51.gemfile +0 -8
  26. data/spec/gemfiles/60.gemfile +0 -7
  27. data/spec/inst_jobs_statsd/jobs_tracker_spec.rb +0 -29
  28. data/spec/inst_jobs_statsd/naming_spec.rb +0 -56
  29. data/spec/inst_jobs_statsd/stats/counters/failed_spec.rb +0 -20
  30. data/spec/inst_jobs_statsd/stats/counters/run_spec.rb +0 -27
  31. data/spec/inst_jobs_statsd/stats/periodic/failed_spec.rb +0 -31
  32. data/spec/inst_jobs_statsd/stats/periodic/queue_spec.rb +0 -95
  33. data/spec/inst_jobs_statsd/stats/periodic/run_spec.rb +0 -53
  34. data/spec/inst_jobs_statsd/stats/periodic_spec.rb +0 -63
  35. data/spec/inst_jobs_statsd/stats/timing/failed_spec.rb +0 -25
  36. data/spec/inst_jobs_statsd/stats/timing/perform_spec.rb +0 -35
  37. data/spec/inst_jobs_statsd/stats/timing/pop_spec.rb +0 -34
  38. data/spec/inst_jobs_statsd/stats/timing_spec.rb +0 -35
  39. data/spec/inst_statsd/default_tracking_spec.rb +0 -16
  40. data/spec/matchers.rb +0 -3
  41. data/spec/setup_test_db.rb +0 -49
  42. data/spec/spec_helper.rb +0 -61
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c7d2f71f91477c6e30a43226165ea6506e6e7b186f3fcf4876ce3b99d8595cd1
4
- data.tar.gz: a57c33ba7eb726155f0aa767a18dffc7cfb39f0faae21c51133d233076f7954d
3
+ metadata.gz: d5760a670863e6b529a17f1443c45b360ed9762b35ad9fe432a4bd66c5b3e90d
4
+ data.tar.gz: 0efe20cd91f2dcb8cb55b5f4df13c372aa2f1b60ff2401c5379a453ed16e1bae
5
5
  SHA512:
6
- metadata.gz: 7a692a9342cceb3ab900493cda108515956203e30d83acd048b96f3da2a9978f59ea711196aac5ed1c0156001847bd06548a36cd2b8e395be80a2309f077a620
7
- data.tar.gz: 70018e665a4e434fc6828391d0f67f753fb09569db8991baee0d44bfa72c73b9b3e770d5ecf8d6e0f1173961497ca586c96c552c10dfdef746c97157aea501e1
6
+ metadata.gz: 1a35e512b5a4b8a1e87205fa97a03922d70b95298635dda6d5778e9bcd110bb02b74dfd36791a963ca169dddbaafcac448c2e33beb1d640b27955f793138d990
7
+ data.tar.gz: bd8808fa5e79266049f4cc9852df42c8bea046fc19d96c0402831df006e1c2a982a8d0475f12ac603bc0b0baf7224585546f78b79b3a650611f06d67cc1fe283
@@ -1,25 +1,29 @@
1
- require 'inst-jobs'
2
- require 'inst_statsd'
1
+ # frozen_string_literal: true
3
2
 
4
- require_relative 'inst_jobs_statsd/version'
3
+ require "inst-jobs"
4
+ require "inst_statsd"
5
5
 
6
- require_relative 'inst_jobs_statsd/default_tracking'
7
- require_relative 'inst_jobs_statsd/jobs_tracker'
6
+ require_relative "inst_jobs_statsd/version"
8
7
 
9
- require_relative 'inst_jobs_statsd/naming'
8
+ require_relative "inst_jobs_statsd/default_tracking"
9
+ require_relative "inst_jobs_statsd/jobs_tracker"
10
10
 
11
- require_relative 'inst_jobs_statsd/stats/counters'
12
- require_relative 'inst_jobs_statsd/stats/counters/failed'
13
- require_relative 'inst_jobs_statsd/stats/counters/run'
11
+ require_relative "inst_jobs_statsd/naming"
14
12
 
15
- require_relative 'inst_jobs_statsd/stats/periodic'
16
- require_relative 'inst_jobs_statsd/stats/periodic/failed'
17
- require_relative 'inst_jobs_statsd/stats/periodic/queue'
18
- require_relative 'inst_jobs_statsd/stats/periodic/run'
13
+ require_relative "inst_jobs_statsd/stats/counters"
14
+ require_relative "inst_jobs_statsd/stats/counters/create"
15
+ require_relative "inst_jobs_statsd/stats/counters/run"
16
+ require_relative "inst_jobs_statsd/stats/counters/complete"
19
17
 
20
- require_relative 'inst_jobs_statsd/stats/timing'
21
- require_relative 'inst_jobs_statsd/stats/timing/failed'
22
- require_relative 'inst_jobs_statsd/stats/timing/perform'
23
- require_relative 'inst_jobs_statsd/stats/timing/pop'
18
+ require_relative "inst_jobs_statsd/stats/periodic"
19
+ require_relative "inst_jobs_statsd/stats/periodic/failed"
20
+ require_relative "inst_jobs_statsd/stats/periodic/queue"
21
+ require_relative "inst_jobs_statsd/stats/periodic/run"
24
22
 
25
- ::InstStatsd::DefaultTracking.include InstJobsStatsd::DefaultTracking
23
+ require_relative "inst_jobs_statsd/stats/timing"
24
+ require_relative "inst_jobs_statsd/stats/timing/failed"
25
+ require_relative "inst_jobs_statsd/stats/timing/perform"
26
+ require_relative "inst_jobs_statsd/stats/timing/pop"
27
+ require_relative "inst_jobs_statsd/ext/job"
28
+
29
+ InstStatsd::DefaultTracking.include InstJobsStatsd::DefaultTracking
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Defines InstStatsd::DefaultTracking.track_jobs
2
4
  # to be consistent with InstStatsd::DefaultTracking.track_sql etc
3
5
  module InstJobsStatsd
@@ -8,7 +10,7 @@ module InstJobsStatsd
8
10
 
9
11
  module ClassMethods
10
12
  def track_jobs(enable_periodic_queries: true)
11
- @jobs_tracker ||= JobsTracker.new(enable_periodic_queries: enable_periodic_queries)
13
+ @jobs_tracker ||= JobsTracker.new(enable_periodic_queries: enable_periodic_queries) # rubocop:disable Naming/MemoizedInstanceVariableName
12
14
  end
13
15
  end
14
16
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module InstJobsStatsd
4
+ module Ext
5
+ module Job
6
+ def fail!
7
+ failed_job = super
8
+ InstJobsStatsd::Stats::Counters.report_count(:failed, 1, job: failed_job)
9
+ failed_job
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module InstJobsStatsd
2
4
  class JobsTracker
3
5
  def self.track(enable_periodic_queries: true)
@@ -9,8 +11,10 @@ module InstJobsStatsd
9
11
  end
10
12
 
11
13
  def initialize(enable_periodic_queries: true)
12
- Stats::Counters::Failed.enable
14
+ Stats::Counters::Create.enable
13
15
  Stats::Counters::Run.enable
16
+ Stats::Counters::Complete.enable
17
+ ::Delayed::Job.prepend InstJobsStatsd::Ext::Job
14
18
 
15
19
  if enable_periodic_queries
16
20
  Stats::Periodic::Failed.enable
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module InstJobsStatsd
2
4
  module Naming
3
- BASENAME = 'delayedjob'.freeze
5
+ BASENAME = "delayedjob"
4
6
 
5
7
  # The root prefix for all stat names
6
8
  # TODO: Make this configurable
@@ -8,10 +10,6 @@ module InstJobsStatsd
8
10
  BASENAME
9
11
  end
10
12
 
11
- def self.configure(strand_filter: nil)
12
- @strand_filter = strand_filter
13
- end
14
-
15
13
  def self.qualified_names(stat_name, job)
16
14
  names = ["#{basename}.#{stat_name}"]
17
15
  tagged = tagged_stat(names[0], job)
@@ -37,29 +35,27 @@ module InstJobsStatsd
37
35
  def self.dd_job_tags(job)
38
36
  tags = dd_region_tags
39
37
  return tags unless job
40
- tags = custom_tags(job, tags)
38
+
39
+ tags[:cluster] = job.current_shard&.database_server&.id if job.respond_to?(:current_shard)
40
+ tags[:priority] = job.priority
41
+ tags.compact!
42
+
41
43
  return tags unless job.tag
42
- return tags if job.tag =~ /Class:0x/
44
+ return tags if job.tag.include?("Class:0x")
43
45
 
44
46
  method_tag, obj_tag = split_to_tag(job)
45
47
  tag = obj_tag
46
- tag = [obj_tag, method_tag].join('.') if method_tag.present?
48
+ tag = [obj_tag, method_tag].join(".") if method_tag.present?
47
49
  tags[:tag] = tag
48
50
  tags
49
51
  end
50
52
 
51
- def self.custom_tags(job, tags)
52
- tags[:jobshard] = job.shard.id if job.respond_to?(:shard)
53
- tags[:strand] = job.strand if job&.strand && @strand_filter&.call(job)
54
- tags
55
- end
56
-
57
53
  # this converts Foo#bar" or "Foo.bar" into "Foo and "bar",
58
54
  # and makes sure the values are valid to be used for statsd names
59
55
  def self.job_tags(job)
60
56
  return unless job
61
57
  return unless job.tag
62
- return if job.tag =~ /Class:0x/
58
+ return if job.tag.include?("Class:0x")
63
59
 
64
60
  method_tag, obj_tag = split_to_tag(job)
65
61
  tags = [obj_tag]
@@ -70,28 +66,27 @@ module InstJobsStatsd
70
66
  # We are using all existing stat names here because we do not want
71
67
  # to break existing dependencies on the non-regioned data
72
68
  def self.region_tags(stat_names)
73
- return unless ENV['INST_JOBS_STATSD_NAMESPACE']
69
+ return unless ENV["INST_JOBS_STATSD_NAMESPACE"]
74
70
 
75
71
  stat_names.map do |name|
76
72
  name
77
- .split('.')
78
- .insert(2, ENV['INST_JOBS_STATSD_NAMESPACE'])
79
- .join('.')
73
+ .split(".")
74
+ .insert(2, ENV["INST_JOBS_STATSD_NAMESPACE"])
75
+ .join(".")
80
76
  end
81
77
  end
82
78
 
83
79
  def self.dd_region_tags
84
- return {} unless ENV['INST_JOBS_STATSD_NAMESPACE']
85
- {namespace: ENV['INST_JOBS_STATSD_NAMESPACE']}
86
- end
80
+ return {} unless ENV["INST_JOBS_STATSD_NAMESPACE"]
87
81
 
88
- private
82
+ { namespace: ENV["INST_JOBS_STATSD_NAMESPACE"] }
83
+ end
89
84
 
90
85
  def self.split_to_tag(job)
91
86
  obj_tag, method_tag = job.tag.split(/[\.#]/, 2).map do |v|
92
- InstStatsd::Statsd.escape(v).gsub('::', '-')
87
+ InstStatsd::Statsd.escape(v).gsub("::", "-")
93
88
  end
94
- return method_tag, obj_tag
89
+ [method_tag, obj_tag]
95
90
  end
96
91
  end
97
92
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module InstJobsStatsd
4
+ module Stats
5
+ module Counters
6
+ module Complete
7
+ def self.enable
8
+ enable_complete_count
9
+ end
10
+
11
+ def self.enable_complete_count
12
+ Delayed::Worker.lifecycle.after(:perform) do |_worker, job|
13
+ report_complete_count(job)
14
+ end
15
+ end
16
+
17
+ def self.report_complete_count(job)
18
+ Counters.report_count(:complete, 1, job: job)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module InstJobsStatsd
4
+ module Stats
5
+ module Counters
6
+ module Create
7
+ def self.enable
8
+ enable_create_count
9
+ end
10
+
11
+ def self.enable_create_count
12
+ Delayed::Worker.lifecycle.after(:create) do |_, result:|
13
+ report_create_count(result)
14
+ end
15
+ end
16
+
17
+ def self.report_create_count(job)
18
+ Counters.report_count(:create, 1, job: job)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module InstJobsStatsd
2
4
  module Stats
3
5
  module Counters
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module InstJobsStatsd
2
4
  module Stats
3
5
  module Counters
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module InstJobsStatsd
2
4
  module Stats
3
5
  module Periodic
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module InstJobsStatsd
2
4
  module Stats
3
5
  module Periodic
@@ -35,7 +37,7 @@ module InstJobsStatsd
35
37
  jobs_run_at = queued_jobs_scope.limit(10_000).pluck(:run_at)
36
38
  age_secs = jobs_run_at.map { |t| Delayed::Job.db_time_now - t }
37
39
  Periodic.report_gauge(:queue_age_total, age_secs.sum)
38
- Periodic.report_gauge(:queue_age_max, age_secs.max)
40
+ Periodic.report_gauge(:queue_age_max, age_secs.max || 0)
39
41
  end
40
42
 
41
43
  def self.queued_jobs_scope
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module InstJobsStatsd
2
4
  module Stats
3
5
  module Periodic
@@ -26,7 +28,7 @@ module InstJobsStatsd
26
28
  jobs_run_at = running_jobs_scope.limit(10_000).pluck(:run_at)
27
29
  age_secs = jobs_run_at.map { |t| Delayed::Job.db_time_now - t }
28
30
  Periodic.report_gauge(:run_age_total, age_secs.sum)
29
- Periodic.report_gauge(:run_age_max, age_secs.max)
31
+ Periodic.report_gauge(:run_age_max, age_secs.max || 0)
30
32
  end
31
33
 
32
34
  def self.running_jobs_scope
@@ -1,12 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module InstJobsStatsd
2
4
  module Stats
3
5
  module Periodic
4
6
  def self.enable_callbacks
5
- @instance ||= Callbacks.new
7
+ @instance ||= Callbacks.new # rubocop:disable Naming/MemoizedInstanceVariableName
6
8
  end
7
9
 
8
10
  def self.add(proc)
9
11
  return unless @instance
12
+
10
13
  @instance.add(proc)
11
14
  end
12
15
 
@@ -72,6 +75,7 @@ module InstJobsStatsd
72
75
  # When the required interval of time has passed, execute the given block
73
76
  def tick
74
77
  return unless Delayed::Job.db_time_now >= @next_run
78
+
75
79
  update_next_run
76
80
  yield
77
81
  end
@@ -83,7 +87,7 @@ module InstJobsStatsd
83
87
  # from the target interval as much as possible
84
88
  def update_next_run
85
89
  ticks = ((Delayed::Job.db_time_now - @start_time) / @min_interval).floor
86
- @next_run = @start_time + (ticks + 1) * @min_interval
90
+ @next_run = @start_time + ((ticks + 1) * @min_interval)
87
91
  end
88
92
  end
89
93
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module InstJobsStatsd
2
4
  module Stats
3
5
  module Timing
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module InstJobsStatsd
2
4
  module Stats
3
5
  module Timing
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module InstJobsStatsd
2
4
  module Stats
3
5
  module Timing
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module InstJobsStatsd
2
4
  module Stats
3
5
  module Timing
4
- def self.report_timing(stat, job: nil, timing: nil, sample_rate: 1)
6
+ def self.report_timing(stat, job: nil, timing: nil, sample_rate: 1, &block)
5
7
  stats = Naming.qualified_names(stat, job)
6
8
 
7
- if block_given?
8
- InstStatsd::Statsd.time(stats, sample_rate, short_stat: stat, tags: Naming.dd_job_tags(job)) { yield }
9
+ if block
10
+ InstStatsd::Statsd.time(stats, sample_rate, short_stat: stat, tags: Naming.dd_job_tags(job), &block)
9
11
  else
10
12
  InstStatsd::Statsd.timing(stats, timing, sample_rate, short_stat: stat, tags: Naming.dd_job_tags(job))
11
13
  end
@@ -13,12 +15,14 @@ module InstJobsStatsd
13
15
 
14
16
  def self.report_job_timing_queued(job)
15
17
  return unless job
18
+
16
19
  time_in_queue = ((Delayed::Job.db_time_now - job.run_at) * 1000).round
17
20
  report_timing(:queue, job: job, timing: time_in_queue)
18
21
  end
19
22
 
20
23
  def self.report_job_timing_failed(job)
21
24
  return unless job
25
+
22
26
  time_to_failure = ((Delayed::Job.db_time_now - job.run_at) * 1000).round
23
27
  report_timing(:failed_after, job: job, timing: time_to_failure)
24
28
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module InstJobsStatsd
2
- VERSION = '2.1.0'.freeze
4
+ VERSION = "3.0.2"
3
5
  end