dogstatsd-ruby 1.2.0 → 1.3.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.
Files changed (3) hide show
  1. data/README.md +20 -17
  2. data/lib/statsd.rb +72 -4
  3. metadata +82 -70
data/README.md CHANGED
@@ -15,28 +15,30 @@ First install the library:
15
15
 
16
16
  Then start instrumenting your code:
17
17
 
18
- # Load the dogstats module.
19
- require 'statsd'
18
+ ``` ruby
19
+ # Load the dogstats module.
20
+ require 'statsd'
20
21
 
21
- # Create a stats instance.
22
- statsd = Statsd.new('localhost', 8125)
22
+ # Create a stats instance.
23
+ statsd = Statsd.new('localhost', 8125)
23
24
 
24
- # Increment a counter.
25
- statsd.increment('page.views')
25
+ # Increment a counter.
26
+ statsd.increment('page.views')
26
27
 
27
- # Record a gauge 50% of the time.
28
- statsd.gauge('users.online', 123, :sample_rate=>0.5)
28
+ # Record a gauge 50% of the time.
29
+ statsd.gauge('users.online', 123, :sample_rate=>0.5)
29
30
 
30
- # Sample a histogram
31
- statsd.histogram('file.upload.size', 1234)
31
+ # Sample a histogram
32
+ statsd.histogram('file.upload.size', 1234)
32
33
 
33
- # Time a block of code
34
- statsd.time('page.render') do
35
- render_page('home.html')
36
- end
34
+ # Time a block of code
35
+ statsd.time('page.render') do
36
+ render_page('home.html')
37
+ end
37
38
 
38
- # Tag a metric.
39
- statsd.histogram('query.time', 10, :tags => ["version:1"])
39
+ # Tag a metric.
40
+ statsd.histogram('query.time', 10, :tags => ["version:1"])
41
+ ```
40
42
 
41
43
  Documentation
42
44
  -------------
@@ -55,7 +57,8 @@ To suggest a feature, report a bug, or general discussion, head over
55
57
  Change Log
56
58
  ----------
57
59
 
58
-
60
+ - 1.3.0
61
+ - Added support for submitting events.
59
62
  - 1.2.0
60
63
  - Added global tags.
61
64
  - Added ability to set `namespace` and `tags` from `Statsd#initialize`.
@@ -21,6 +21,17 @@ class Statsd
21
21
  DEFAULT_HOST = '127.0.0.1'
22
22
  DEFAULT_PORT = 8125
23
23
 
24
+ # Create a dictionary to assign a key to every parameter's name, except for tags (treated differently)
25
+ # Goal: Simple and fast to add some other parameters
26
+ OPTS_KEYS = [
27
+ ['date_happened', 'd'],
28
+ ['hostname', 'h'],
29
+ ['aggregation_key', 'k'],
30
+ ['priority', 'p'],
31
+ ['source_type_name', 's'],
32
+ ['alert_type', 't']
33
+ ]
34
+
24
35
  # A namespace to prepend to all statsd calls. Defaults to no namespace.
25
36
  attr_reader :namespace
26
37
 
@@ -40,7 +51,7 @@ class Statsd
40
51
 
41
52
  # Return the current version of the library.
42
53
  def self.VERSION
43
- "1.2.0"
54
+ "1.3.0"
44
55
  end
45
56
 
46
57
  # @param [String] host your statsd host
@@ -112,7 +123,7 @@ class Statsd
112
123
  # counters.
113
124
  #
114
125
  # @param [String] stat stat name.
115
- # @param [Numeric] gauge value.
126
+ # @param [Numeric] value gauge value.
116
127
  # @param [Hash] opts the options to create the metric with
117
128
  # @option opts [Numeric] :sample_rate sample rate, 1 for always
118
129
  # @option opts [Array<String>] :tags An array of tags
@@ -125,7 +136,7 @@ class Statsd
125
136
  # Sends a value to be tracked as a histogram to the statsd server.
126
137
  #
127
138
  # @param [String] stat stat name.
128
- # @param [Numeric] histogram value.
139
+ # @param [Numeric] value histogram value.
129
140
  # @param [Hash] opts the options to create the metric with
130
141
  # @option opts [Numeric] :sample_rate sample rate, 1 for always
131
142
  # @option opts [Array<String>] :tags An array of tags
@@ -168,7 +179,7 @@ class Statsd
168
179
  # Sends a value to be tracked as a set to the statsd server.
169
180
  #
170
181
  # @param [String] stat stat name.
171
- # @param [Numeric] set value.
182
+ # @param [Numeric] value set value.
172
183
  # @param [Hash] opts the options to create the metric with
173
184
  # @option opts [Numeric] :sample_rate sample rate, 1 for always
174
185
  # @option opts [Array<String>] :tags An array of tags
@@ -178,7 +189,64 @@ class Statsd
178
189
  send_stats stat, value, :s, opts
179
190
  end
180
191
 
192
+ # This end point allows you to post events to the stream. You can tag them, set priority and even aggregate them with other events.
193
+ #
194
+ # Aggregation in the stream is made on hostname/event_type/source_type/aggregation_key.
195
+ # If there's no event type, for example, then that won't matter;
196
+ # it will be grouped with other events that don't have an event type.
197
+ #
198
+ # @param [String] title Event title
199
+ # @param [String] text Event text. Supports \n
200
+ # @param [Hash] opts the additional data about the event
201
+ # @option opts [Time, nil] :date_happened (nil) Assign a timestamp to the event. Default is now when none
202
+ # @option opts [String, nil] :hostname (nil) Assign a hostname to the event.
203
+ # @option opts [String, nil] :aggregation_key (nil) Assign an aggregation key to the event, to group it with some others
204
+ # @option opts [String, nil] :priority ('normal') Can be "normal" or "low"
205
+ # @option opts [String, nil] :source_type_name (nil) Assign a source type to the event
206
+ # @option opts [String, nil] :alert_type ('info') Can be "error", "warning", "info" or "success".
207
+ # @option opts [Array<String>, nil] :source_type_name (nil) An array of tags
208
+ # @example Report an aweful event:
209
+ # $statsd.event('Something terrible happened', 'The end is near if we do nothing', :alert_type=>'warning', :tags=>['end_of_times','urgent'])
210
+ def event(title, text, opts={})
211
+ event_string = format_event(title, text, opts)
212
+ raise "Event #{title} payload is too big (more that 8KB), event discarded" if event_string.length > 8 * 1024
213
+
214
+ send_to_socket event_string
215
+ end
216
+ def format_event(title, text, opts={})
217
+ escape_event_content title
218
+ escape_event_content text
219
+ event_string_data = "_e{#{title.length},#{text.length}}:#{title}|#{text}"
220
+
221
+ # We construct the string to be sent by adding '|key:value' parts to it when needed
222
+ # All pipes ('|') in the metada are removed. Title and Text can keep theirs
223
+ OPTS_KEYS.each do |name_key|
224
+ if name_key[0] != 'tags' && opts[name_key[0].to_sym]
225
+ value = opts[name_key[0].to_sym]
226
+ rm_pipes value
227
+ event_string_data << "|#{name_key[1]}:#{value}"
228
+ end
229
+ end
230
+ tags = opts[:tags] || nil
231
+ # Tags are joined and added as last part to the string to be sent
232
+ if tags
233
+ tags.each do |tag|
234
+ rm_pipes tag
235
+ end
236
+ tags = "#{tags.join(",")}" unless tags.empty?
237
+ event_string_data << "|##{tags}"
238
+ end
239
+
240
+ raise "Event #{title} payload is too big (more that 8KB), event discarded" if event_string_data.length > 8 * 1024
241
+ return event_string_data
242
+ end
181
243
  private
244
+ def escape_event_content(msg)
245
+ msg = msg.sub! "\n", "\\n"
246
+ end
247
+ def rm_pipes(msg)
248
+ msg = msg.sub! "|", ""
249
+ end
182
250
 
183
251
  def send_stats(stat, delta, type, opts={})
184
252
  sample_rate = opts[:sample_rate] || 1
metadata CHANGED
@@ -1,114 +1,126 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: dogstatsd-ruby
3
- version: !ruby/object:Gem::Version
4
- version: 1.2.0
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
5
  prerelease:
6
+ segments:
7
+ - 1
8
+ - 3
9
+ - 0
10
+ version: 1.3.0
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Rein Henrichs
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2013-07-10 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2014-03-27 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: minitest
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :development
23
22
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: '0'
30
- - !ruby/object:Gem::Dependency
31
- name: yard
32
- requirement: !ruby/object:Gem::Requirement
23
+ requirement: &id001 !ruby/object:Gem::Requirement
33
24
  none: false
34
- requirements:
35
- - - ~>
36
- - !ruby/object:Gem::Version
37
- version: 0.6.0
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
38
32
  type: :development
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: yard
39
36
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
37
+ requirement: &id002 !ruby/object:Gem::Requirement
41
38
  none: false
42
- requirements:
39
+ requirements:
43
40
  - - ~>
44
- - !ruby/object:Gem::Version
41
+ - !ruby/object:Gem::Version
42
+ hash: 7
43
+ segments:
44
+ - 0
45
+ - 6
46
+ - 0
45
47
  version: 0.6.0
46
- - !ruby/object:Gem::Dependency
47
- name: jeweler
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ~>
52
- - !ruby/object:Gem::Version
53
- version: '1.8'
54
48
  type: :development
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: jeweler
55
52
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
53
+ requirement: &id003 !ruby/object:Gem::Requirement
57
54
  none: false
58
- requirements:
55
+ requirements:
59
56
  - - ~>
60
- - !ruby/object:Gem::Version
61
- version: '1.8'
62
- - !ruby/object:Gem::Dependency
63
- name: simplecov
64
- requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ! '>='
68
- - !ruby/object:Gem::Version
69
- version: '0'
57
+ - !ruby/object:Gem::Version
58
+ hash: 31
59
+ segments:
60
+ - 1
61
+ - 8
62
+ version: "1.8"
70
63
  type: :development
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: simplecov
71
67
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
68
+ requirement: &id004 !ruby/object:Gem::Requirement
73
69
  none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ hash: 3
74
+ segments:
75
+ - 0
76
+ version: "0"
77
+ type: :development
78
+ version_requirements: *id004
78
79
  description: A Ruby DogStastd client
79
80
  email: code@datadoghq.com
80
81
  executables: []
82
+
81
83
  extensions: []
82
- extra_rdoc_files:
84
+
85
+ extra_rdoc_files:
83
86
  - LICENSE.txt
84
87
  - README.md
85
- files:
88
+ files:
86
89
  - LICENSE.txt
87
90
  - README.md
88
91
  - lib/statsd.rb
89
92
  homepage: http://github.com/datadog/dogstatsd-ruby
90
- licenses:
93
+ licenses:
91
94
  - MIT
92
95
  post_install_message:
93
96
  rdoc_options: []
94
- require_paths:
97
+
98
+ require_paths:
95
99
  - lib
96
- required_ruby_version: !ruby/object:Gem::Requirement
100
+ required_ruby_version: !ruby/object:Gem::Requirement
97
101
  none: false
98
- requirements:
99
- - - ! '>='
100
- - !ruby/object:Gem::Version
101
- version: '0'
102
- required_rubygems_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ hash: 3
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
110
  none: false
104
- requirements:
105
- - - ! '>='
106
- - !ruby/object:Gem::Version
107
- version: '0'
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ hash: 3
115
+ segments:
116
+ - 0
117
+ version: "0"
108
118
  requirements: []
119
+
109
120
  rubyforge_project:
110
- rubygems_version: 1.8.23
121
+ rubygems_version: 1.8.15
111
122
  signing_key:
112
123
  specification_version: 3
113
124
  summary: A Ruby DogStatsd client
114
125
  test_files: []
126
+