droid 0.9.3 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,6 +11,7 @@ require 'bunny'
11
11
  require File.dirname(__FILE__) + '/utilization'
12
12
 
13
13
  class Droid
14
+ DEFAULT_TTL = 300
14
15
 
15
16
  class BadPayload < RuntimeError; end
16
17
 
@@ -137,21 +138,20 @@ class Droid
137
138
 
138
139
  payload[:event_hash] ||= new_event_hash
139
140
  payload[:published_on] = options[:published_on] || Time.now.getgm.to_i
140
- payload[:ttl] ||= (options[:ttl].to_i || DEFAULT_TTL)
141
+ payload[:ttl] ||= (options[:ttl] || DEFAULT_TTL).to_i
141
142
 
142
143
  payload.to_json
143
144
  end
144
145
 
145
146
  def self.publish(key, payload, options={})
147
+ payload[:message_id] = new_event_hash
146
148
  res =
147
149
  reconnect_on_error do
148
150
  exchange.publish(payload_to_data(payload, options), :key => key, :immediate => options[:immediate])
149
151
  end
150
152
 
151
153
  unless options[:log] == false
152
- Log.notice "#{key} published #{payload_summary(payload)}",
153
- :event_hash => payload[:event_hash],
154
- :addendum => payload.inspect
154
+ Log.notice "amqp_message action=published key=#{key} #{payload_summary(payload)}"
155
155
  end
156
156
 
157
157
  res
@@ -168,10 +168,9 @@ class Droid
168
168
  return ' -> (empty payload)' if payload.empty?
169
169
  resume = payload.map do |k, v|
170
170
  v = v.to_s
171
- v = v[0..17] + '...' if v.size > 20
171
+ v = v[0..37] + '...' if v.size > 40
172
172
  "#{k}=#{v}"
173
- end[0,15].join(', ')
174
- resume << " (and #{payload.size - 15} more)" if payload.size > 15
173
+ end.join(", ")
175
174
  " -> #{resume}"
176
175
  end
177
176
 
@@ -296,8 +295,6 @@ class Droid
296
295
  def periodic_timer(duration, now=false, &bk) ; self.class.periodic_timer(duration, now, &bk) ; end
297
296
 
298
297
  class Basic
299
- DEFAULT_TTL = 300
300
-
301
298
  def initialize(droid, options={})
302
299
  @droid = droid
303
300
  end
@@ -367,7 +364,7 @@ class Droid
367
364
  stderr_puts "About to log error #{headers[:event_hash]}"
368
365
  stderr_puts e.message
369
366
  stderr_puts msg
370
- Log.error e.message, :addendum => msg, :event_hash => headers[:event_hash], :exception => e
367
+ Log.error "amqp_message action=error class='#{e.class}' message='#{e.message}'", :exception => e
371
368
  @droid.error_handler.call(@message, e, self) if @droid.error_handler
372
369
  rescue Exception => e
373
370
  stderr_puts "error handling error! #{e.inspect}"
@@ -412,22 +409,22 @@ class Droid
412
409
  end
413
410
 
414
411
  ttl = headers[:ttl]
415
- now = Time.now.getgm.to_i
412
+ start = Time.now.getgm.to_i
416
413
  published_on = headers[:published_on]
414
+ age = start - published_on
417
415
 
418
- Log.notice "#{@key} received #{payload_summary(params)}"
416
+ Log.notice "amqp_message action=received key=#{@key} ttl=#{ttl} age=#{age} #{payload_summary(params)}"
419
417
 
420
- if ttl == -1 or now <= (published_on + ttl)
418
+ if (ttl == -1) or (age <= ttl)
421
419
  @droid.before_filter.call(*callargs) if @droid.before_filter
422
420
  blk.call(*callargs)
421
+
422
+ finished = Time.now.getgm.to_i
423
+ Log.notice "amqp_message action=processed key=#{@key} elapsed=#{finished-start} ttl=#{ttl} age=#{age} #{payload_summary(params)}"
423
424
  else
424
- Log.error "#{@key} message timeout", :addendum => payload_summary(params)
425
+ Log.error "amqp_message action=timeout key=#{@key} ttl=#{ttl} age=#{age} #{payload_summary(params)}"
425
426
  info.ack if opts[:ack]
426
427
  end
427
-
428
- duration = Time.now.getgm.to_i - now
429
-
430
- Log.notice "(#{duration} seconds) SLOW AMQP #{@key} #{payload_summary(params)}" if duration > 3
431
428
  rescue => e
432
429
  error(e)
433
430
  ensure
@@ -452,6 +449,7 @@ class Droid
452
449
  payload[:ttl] = opts[:ttl]
453
450
 
454
451
  newpayload = Droid.payload_to_data(payload, :published_on => (headers[:published_on] || now))
452
+ Log.notice("droid_requeue key=#{@key} #{payload_summary(newpayload)}")
455
453
  @q.publish(newpayload)
456
454
  end
457
455
 
@@ -8,9 +8,11 @@ require 'digest/sha1'
8
8
  module MemcacheCluster
9
9
  extend self
10
10
 
11
+ HEROKU_NAMESPACE = '0Xfa15837Z' # heroku's internal memcache namespace
12
+
11
13
  # A MemCache object configured with heroku's internal memcache namespace.
12
14
  def heroku
13
- cache('0Xfa15837Z')
15
+ cache(HEROKU_NAMESPACE)
14
16
  end
15
17
 
16
18
  def cache_retry(prefix, opts={})
@@ -165,7 +165,6 @@ module Log
165
165
  dir = defined?(RAILS_ROOT) ? RAILS_ROOT : '.'
166
166
  File.open("#{dir}/failsafe.log", "a") do |f|
167
167
  f.puts "#{Time.now} #{params[:log][:level]} : #{params[:log][:message]}"
168
- f.puts params[:log][:addendum] if params[:log][:addendum]
169
168
  end
170
169
  when :console, nil
171
170
  console_log(params[:log][:message])
@@ -183,7 +182,7 @@ module Log
183
182
  if opts[:exception]
184
183
  msg += "\n" + format_syslog_exception(opts[:exception])
185
184
  end
186
- syslog_resource.log(level, '%s', msg)
185
+ syslog_resource.log(level, '%s', trim_syslog_msg(msg))
187
186
  rescue Exception => e
188
187
  failsafe(:log => { :level => 'error', :message => "could not log to syslog: #{e.class.name} #{e.message}"})
189
188
  unless @retried
@@ -203,6 +202,11 @@ module Log
203
202
  end
204
203
  end
205
204
 
205
+ def trim_syslog_msg(msg)
206
+ return msg if msg.size < 800
207
+ msg[0, 796] + " ..."
208
+ end
209
+
206
210
  def syslog_resource
207
211
  @@syslog ||= Syslog.open(default_options[:component].to_s, Syslog::LOG_PID | Syslog::LOG_CONS, default_options[:syslog_facility] || Syslog::LOG_USER)
208
212
  end
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: droid
3
3
  version: !ruby/object:Gem::Version
4
- hash: 61
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 9
9
- - 3
10
- version: 0.9.3
8
+ - 5
9
+ version: 0.9.5
11
10
  platform: ruby
12
11
  authors: []
13
12
 
@@ -15,18 +14,16 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-07-06 00:00:00 -07:00
17
+ date: 2010-09-27 00:00:00 -07:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: json_pure
23
22
  prerelease: false
24
23
  requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
24
  requirements:
27
25
  - - ">="
28
26
  - !ruby/object:Gem::Version
29
- hash: 3
30
27
  segments:
31
28
  - 0
32
29
  version: "0"
@@ -36,11 +33,9 @@ dependencies:
36
33
  name: amqp
37
34
  prerelease: false
38
35
  requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
36
  requirements:
41
37
  - - ">="
42
38
  - !ruby/object:Gem::Version
43
- hash: 3
44
39
  segments:
45
40
  - 0
46
41
  version: "0"
@@ -50,11 +45,9 @@ dependencies:
50
45
  name: bunny
51
46
  prerelease: false
52
47
  requirement: &id003 !ruby/object:Gem::Requirement
53
- none: false
54
48
  requirements:
55
49
  - - ">="
56
50
  - !ruby/object:Gem::Version
57
- hash: 3
58
51
  segments:
59
52
  - 0
60
53
  version: "0"
@@ -64,11 +57,9 @@ dependencies:
64
57
  name: rest-client
65
58
  prerelease: false
66
59
  requirement: &id004 !ruby/object:Gem::Requirement
67
- none: false
68
60
  requirements:
69
61
  - - ">="
70
62
  - !ruby/object:Gem::Version
71
- hash: 3
72
63
  segments:
73
64
  - 0
74
65
  version: "0"
@@ -95,10 +86,6 @@ files:
95
86
  - vendor/logger_client/lib/logger_client.rb
96
87
  - vendor/logger_client/test.rb
97
88
  - README.md
98
- - test/base.rb
99
- - test/droid_test.rb
100
- - test/heroku_droid_test.rb
101
- - test/wait_for_port_test.rb
102
89
  has_rdoc: true
103
90
  homepage:
104
91
  licenses: []
@@ -109,27 +96,23 @@ rdoc_options:
109
96
  require_paths:
110
97
  - lib
111
98
  required_ruby_version: !ruby/object:Gem::Requirement
112
- none: false
113
99
  requirements:
114
100
  - - ">="
115
101
  - !ruby/object:Gem::Version
116
- hash: 3
117
102
  segments:
118
103
  - 0
119
104
  version: "0"
120
105
  required_rubygems_version: !ruby/object:Gem::Requirement
121
- none: false
122
106
  requirements:
123
107
  - - ">="
124
108
  - !ruby/object:Gem::Version
125
- hash: 3
126
109
  segments:
127
110
  - 0
128
111
  version: "0"
129
112
  requirements: []
130
113
 
131
114
  rubyforge_project: droid
132
- rubygems_version: 1.3.7
115
+ rubygems_version: 1.3.6
133
116
  signing_key:
134
117
  specification_version: 3
135
118
  summary: AMQP wrapper