Class: Sidekiq::Metrics::Query
- Inherits:
-
Object
- Object
- Sidekiq::Metrics::Query
- Defined in:
- lib/sidekiq/metrics/query.rb
Overview
Allows caller to query for Sidekiq execution metrics within Redis. Caller sets a set of attributes to act as filters. #fetch will call Redis and return a Hash of results.
NB: all metrics and times/dates are UTC only. We specifically do not support timezones.
Defined Under Namespace
Classes: JobResult, MarkResult, Result
Instance Method Summary collapse
- #for_job(klass, minutes: 60) ⇒ Object
-
#initialize(pool: nil, now: Time.now) ⇒ Query
constructor
A new instance of Query.
-
#top_jobs(class_filter: nil, minutes: 60) ⇒ Object
Get metric data for all jobs from the last hour
class_filter
: return only results for classes matching filter.
Constructor Details
#initialize(pool: nil, now: Time.now) ⇒ Query
Returns a new instance of Query.
16 17 18 19 20 |
# File 'lib/sidekiq/metrics/query.rb', line 16 def initialize(pool: nil, now: Time.now) @time = now.utc @pool = pool || Sidekiq.default_configuration.redis_pool @klass = nil end |
Instance Method Details
#for_job(klass, minutes: 60) ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/sidekiq/metrics/query.rb', line 54 def for_job(klass, minutes: 60) result = Result.new time = @time redis_results = @pool.with do |conn| conn.pipelined do |pipe| minutes.times do |idx| key = "j|#{time.strftime("%Y%m%d")}|#{time.hour}:#{time.min}" pipe.hmget key, "#{klass}|ms", "#{klass}|p", "#{klass}|f" result.prepend_bucket time time -= 60 end end end time = @time @pool.with do |conn| redis_results.each do |(ms, p, f)| result.job_results[klass].add_metric "ms", time, ms.to_i if ms result.job_results[klass].add_metric "p", time, p.to_i if p result.job_results[klass].add_metric "f", time, f.to_i if f result.job_results[klass].add_hist time, Histogram.new(klass).fetch(conn, time).reverse time -= 60 end end result.marks = fetch_marks(result.starts_at..result.ends_at) result end |
#top_jobs(class_filter: nil, minutes: 60) ⇒ Object
Get metric data for all jobs from the last hour
+class_filter+: return only results for classes matching filter
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/sidekiq/metrics/query.rb', line 24 def top_jobs(class_filter: nil, minutes: 60) result = Result.new time = @time redis_results = @pool.with do |conn| conn.pipelined do |pipe| minutes.times do |idx| key = "j|#{time.strftime("%Y%m%d")}|#{time.hour}:#{time.min}" pipe.hgetall key result.prepend_bucket time time -= 60 end end end time = @time redis_results.each do |hash| hash.each do |k, v| kls, metric = k.split("|") next if class_filter && !class_filter.match?(kls) result.job_results[kls].add_metric metric, time, v.to_i end time -= 60 end result.marks = fetch_marks(result.starts_at..result.ends_at) result end |