resque-cloudwatch-metrics 0.3.0 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 733c1beb5e744c021fd6367622aa79aa5f9c0ad7
4
- data.tar.gz: 93cca39a1c74279ed2b35ed394f59895dd51289d
3
+ metadata.gz: 7c911ab4ce8fdc6e886d16ba91e7e73ff850ef69
4
+ data.tar.gz: 6532bffdca221cdf3bb2657a3544263ee35b8792
5
5
  SHA512:
6
- metadata.gz: f824a25e5cef1afe76edfbbbc4a04754caa044fb206731e5f4fffd1ae13454b0202716d7a3f487ffbe39dcacb7cc6d783cb5d486141b1b0710ff71a6f62dd889
7
- data.tar.gz: 98b97cf81fa69c0b6ef21a73fedcedbd78937871d3e057a58ce610026856a3a444ef90c422c8e3480f9841ca232241d9b08883ebad5f21a3a69db5688be9151d
6
+ metadata.gz: 5169a01442cfa8948a710ccc2c8ad8e34ec91f14c233d2180752fd7a238a45e5e0cb4ac97abdc5c73ab72505a21fec18140a1e4e20ddc1839c4bf4b918d70c18
7
+ data.tar.gz: 0de3324587cee5b870e5c53246b45f74d7bdc08af51ac70f28d9e388e047f1b04a6a5f74ca4ded85a6bb51543826cf01a8dc9796cf6648eda79f72e3049df61c
data/README.md CHANGED
@@ -39,6 +39,16 @@ Usage: resque-cloudwatch-metrics [options]
39
39
  --redis-namespace <namespace>
40
40
  --cw-namespace <namespace>
41
41
  -i, --interval <interval>
42
+ --skip-pending
43
+ --skip-processed
44
+ --skip-failed
45
+ --skip-queues
46
+ --skip-workers
47
+ --skip-working
48
+ --skip-pending-per-queue
49
+ --not-working
50
+ --processing
51
+ --dryrun
42
52
  ```
43
53
 
44
54
  ## Development
@@ -1,7 +1,7 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- aws-sdk-core (2.6.41)
4
+ aws-sdk-core (2.6.44)
5
5
  aws-sigv4 (~> 1.0)
6
6
  jmespath (~> 1.0)
7
7
  aws-sigv4 (1.0.0)
@@ -20,7 +20,7 @@ GEM
20
20
  redis-namespace (~> 1.3)
21
21
  sinatra (>= 0.9.2)
22
22
  vegas (~> 0.1.2)
23
- resque-cloudwatch-metrics (0.3.0)
23
+ resque-cloudwatch-metrics (0.4.0)
24
24
  aws-sdk-core (~> 2)
25
25
  resque (~> 1)
26
26
  sinatra (1.4.7)
@@ -22,6 +22,8 @@ module Resque
22
22
  def parse_arguments(args)
23
23
  options = {}
24
24
  redis = {}
25
+ skip = []
26
+ extra = []
25
27
 
26
28
  opt = OptionParser.new
27
29
  opt.on('-h', '--host <host>') { |v| redis[:host] = v }
@@ -33,21 +35,41 @@ module Resque
33
35
  opt.on('--redis-namespace <namespace>') { |v| options[:redis_namespace] = v }
34
36
  opt.on('--cw-namespace <namespace>') { |v| options[:cw_namespace] = v }
35
37
  opt.on('-i', '--interval <interval>') { |v| options[:interval] = v.to_f }
38
+ opt.on('--skip-pending') { skip << :pending }
39
+ opt.on('--skip-processed') { skip << :processed }
40
+ opt.on('--skip-failed') { skip << :failed }
41
+ opt.on('--skip-queues') { skip << :queues }
42
+ opt.on('--skip-workers') { skip << :workers }
43
+ opt.on('--skip-working') { skip << :working }
44
+ opt.on('--skip-pending-per-queue') { skip << :pending_per_queue }
45
+ opt.on('--not-working') { extra << :not_working }
46
+ opt.on('--processing') { extra << :processing }
47
+ opt.on('--dryrun') { options[:dryrun] = true }
36
48
  opt.parse(args)
37
49
 
38
50
  options[:redis] ||= redis unless redis.empty?
51
+
52
+ metric = {}
53
+ metric[:skip] = skip unless skip.empty?
54
+ metric[:extra] = extra unless extra.empty?
55
+ options[:metric] = metric unless metric.empty?
56
+
39
57
  options
40
58
  end
41
59
  end
42
60
 
43
61
  def initialize(redis: nil,
44
62
  redis_namespace: nil,
63
+ cw_namespace: DEFAULT_CW_NAMESPACE,
45
64
  interval: nil,
46
- cw_namespace: DEFAULT_CW_NAMESPACE)
65
+ metric: {},
66
+ dryrun: false)
47
67
  Resque.redis = redis if redis
48
68
  @redis_namespace = redis_namespace
49
69
  @interval = interval
50
70
  @cw_namespace = cw_namespace
71
+ @metric_options = metric
72
+ @dryrun = dryrun
51
73
  end
52
74
 
53
75
  def run
@@ -67,7 +89,7 @@ module Resque
67
89
  def run_once
68
90
  put_metric_data(
69
91
  redis_namespaces
70
- .map { |redis_namespace| Metric.create(redis_namespace) }
92
+ .map { |redis_namespace| Metric.create(redis_namespace, @metric_options) }
71
93
  .flat_map(&:to_cloudwatch_metric_data)
72
94
  )
73
95
  end
@@ -88,16 +110,30 @@ module Resque
88
110
  end
89
111
 
90
112
  def put_metric_data(metric_data)
113
+ if @dryrun
114
+ dump_metric_data(metric_data)
115
+ return
116
+ end
117
+
91
118
  metric_data.each_slice(MAX_METRIC_DATA_PER_PUT).map do |data|
92
- Thread.start(data) do |data|
93
- cloudwatch.put_metric_data(
119
+ Thread.start(data, cloudwatch) do |data_, cloudwatch_|
120
+ cloudwatch_.put_metric_data(
94
121
  namespace: @cw_namespace,
95
- metric_data: data,
122
+ metric_data: data_,
96
123
  )
97
124
  end
98
125
  end.each(&:join)
99
126
  end
100
127
 
128
+ def dump_metric_data(metric_data)
129
+ puts metric_data.to_json(
130
+ indent: ' ' * 2,
131
+ space: ' ',
132
+ object_nl: "\n",
133
+ array_nl: "\n",
134
+ )
135
+ end
136
+
101
137
  def cloudwatch
102
138
  @_cloudwatch ||= Aws::CloudWatch::Client.new
103
139
  end
@@ -6,18 +6,21 @@ module Resque
6
6
  module CloudWatch
7
7
  class Metrics
8
8
  class Metric
9
+ DEFAULT_METRIC_NAMES = %i(pending processed failed queues workers working).freeze
10
+
9
11
  class << self
10
12
  @@mutex = Mutex.new
11
13
 
12
- def create(namespace)
14
+ def create(namespace, skip: [], extra: [])
13
15
  @@mutex.synchronize do
14
16
  Resque.redis.namespace = namespace
15
17
  new(
16
18
  Time.now,
17
19
  namespace,
18
20
  Resque.info,
19
- current_queue_sizes,
21
+ !skip.include?(:pending_per_queue) && current_queue_sizes,
20
22
  get_previous_processed(namespace),
23
+ skip: skip, extra: extra,
21
24
  ).tap do |metric|
22
25
  set_previous_processed(namespace, metric.processed)
23
26
  end
@@ -31,22 +34,24 @@ module Resque
31
34
  end
32
35
 
33
36
  def get_previous_processed(namespace)
34
- @_previous_processed ||= {}
35
- @_previous_processed[namespace]
37
+ @previous_processed ||= {}
38
+ @previous_processed[namespace]
36
39
  end
37
40
 
38
41
  def set_previous_processed(namespace, previous_processed)
39
- @_previous_processed ||= {}
40
- @_previous_processed[namespace] = previous_processed
42
+ @previous_processed ||= {}
43
+ @previous_processed[namespace] = previous_processed
41
44
  end
42
45
  end
43
46
 
44
- def initialize(time, namespace, info, queue_sizes, previous_processed)
47
+ def initialize(time, namespace, info, queue_sizes, previous_processed, skip: [], extra: [])
45
48
  @time = time
46
49
  @namespace = namespace
47
50
  @info = info
48
51
  @queue_sizes = queue_sizes
49
52
  @previous_processed = previous_processed
53
+ @skip = skip
54
+ @extra = extra
50
55
  end
51
56
 
52
57
  def pending; @info[:pending]; end
@@ -65,16 +70,27 @@ module Resque
65
70
  end
66
71
 
67
72
  def to_cloudwatch_metric_data
68
- %i(pending processed failed queues workers working not_working processing).map do |key|
73
+ metric_data = metric_names.map do |key|
69
74
  build_cloudwatch_metric_datum(camelize(key.to_s), public_send(key))
70
- end +
71
- @queue_sizes.map do |name, size|
72
- build_cloudwatch_metric_datum('Pending', size, queue: name)
73
75
  end
76
+
77
+ if @queue_sizes
78
+ metric_data.concat(
79
+ @queue_sizes.map do |name, size|
80
+ build_cloudwatch_metric_datum('Pending', size, Queue: name)
81
+ end
82
+ )
83
+ end
84
+
85
+ metric_data
74
86
  end
75
87
 
76
88
  private
77
89
 
90
+ def metric_names
91
+ DEFAULT_METRIC_NAMES - @skip + @extra
92
+ end
93
+
78
94
  def build_cloudwatch_metric_datum(metric_name, value, dimensions = {})
79
95
  {
80
96
  metric_name: metric_name,
@@ -86,7 +102,7 @@ module Resque
86
102
  end
87
103
 
88
104
  def default_dimensions
89
- @_default_dimensions = Dimensions.new(namespace: @namespace.to_s)
105
+ Dimensions.new(Namespace: @namespace.to_s)
90
106
  end
91
107
 
92
108
  def incremental_size_of_processed
@@ -3,7 +3,7 @@
3
3
  module Resque
4
4
  module CloudWatch
5
5
  class Metrics
6
- VERSION = '0.3.0'
6
+ VERSION = '0.4.0'
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque-cloudwatch-metrics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaki Takeuchi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-28 00:00:00.000000000 Z
11
+ date: 2017-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-core