droid 0.9.3 → 0.9.5

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.
@@ -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