fluent-plugin-mackerel 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7cdc01b9ed1b88271cdb43f047f2ee5d6c99d202
4
- data.tar.gz: 37f679989f7833d96030e0d3318c373699814ee4
3
+ metadata.gz: fba2647b6e58433c48d7f479da35206aa0f0ef4e
4
+ data.tar.gz: d775a6c6c53739eb1e3503968b5780de18773133
5
5
  SHA512:
6
- metadata.gz: a05ea65c41a6aece83247c6b1726e531227e42b78642855427f5f693cbc1491e0fef228e50b3ecb8f6966ffcb806d1f824b01a2e2b8e1573841e3d437ad5f8b6
7
- data.tar.gz: ba513b40e4347e0e0e0f4a63479f28c69e183e5f86118a7299d13fdee0c7af5073108492e5673a87e02086b5b62cb7e060ecfa9dfefdd6d267d1e3c7917b17b2
6
+ metadata.gz: 6ce5fea01ec17d19e7587a8ec46f116827f27ab1ecb7d7eca5cd2b9cdf72a09b741e4f902e7c3af6327e8e8f5b9f21318a169bf4eb1ea9b1e1bdc6d7c20c69b3
7
+ data.tar.gz: ad0c53ceaf70db022eb3a5cea4b2ccd5fbdb2c5797d145f4568992fc8cf0a94a93e36b4c04f84b671a78395e323815d82cd538750277f2c514b8742f696c76c8
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # fluent-plugin-mackerel [![Build Status](https://travis-ci.org/tksmd/fluent-plugin-mackerel.png?branch=master)](https://travis-ci.org/tksmd/fluent-plugin-mackerel)
1
+ # fluent-plugin-mackerel [![Build Status](https://travis-ci.org/mackerelio/fluent-plugin-mackerel.png?branch=master)](https://travis-ci.org/mackerelio/fluent-plugin-mackerel)
2
2
 
3
3
  ## Overview
4
4
 
@@ -29,6 +29,7 @@ This plugin uses [APIv0](http://help-ja.mackerel.io/entry/spec/api/v0) of macker
29
29
  api_key 123456
30
30
  hostid xyz
31
31
  metrics_name http_status.${out_key}
32
+ use_zero_for_empty
32
33
  out_keys 2xx_count,3xx_count,4xx_count,5xx_count
33
34
  </match>
34
35
  ```
@@ -44,6 +45,9 @@ Then the sent metric data will look like this:
44
45
  ```
45
46
  As shown above, `${out_key}` will be replaced with out_key like "2xx_count" when sending metrics.
46
47
 
48
+ In the case some outkeys do not have any value, the value will be set to `0` with `use_zero_for_empty`, the default of which is true.
49
+ For example, you set `out_keys 2xx_count,3xx_count,4xx_count,5xx_count`, but you only get `2xx_count`, `3xx_count` and `4xx_count`, then `5xx_count` will be set to `0` with `use_zero_for_empty`.
50
+
47
51
  You can use `out_key_pattern` instead of `out_keys`. Input records whose key matches the pattern set to `out_key_pattern` will be sent. Either `out_keys` or `out_key_pattern` is required.
48
52
 
49
53
  ```
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "fluent-plugin-mackerel"
7
- spec.version = "0.1.1"
7
+ spec.version = "0.1.2"
8
8
  spec.authors = ["tksmd","hatz48","stanaka","Songmu"]
9
9
  spec.email = ["developers@mackerel.io"]
10
10
  spec.description = %q{fluent plugin to send metrics to mackerel.io}
@@ -13,6 +13,7 @@ module Fluent
13
13
  config_param :out_keys, :string, :default => nil
14
14
  config_param :out_key_pattern, :string, :default => nil
15
15
  config_param :origin, :string, :default => nil
16
+ config_param :use_zero_for_empty, :bool, :default => true
16
17
 
17
18
  MAX_BUFFER_CHUNK_LIMIT = 100 * 1024
18
19
  config_set_default :buffer_chunk_limit, MAX_BUFFER_CHUNK_LIMIT
@@ -101,10 +102,26 @@ module Fluent
101
102
  [tag, time, record].to_msgpack
102
103
  end
103
104
 
105
+ def generate_metric(key, tokens, time, value)
106
+ name = @name_processor.nil? ? key :
107
+ @name_processor.map{ |p| p.call(:out_key => key, :tokens => tokens) }.join('.')
108
+
109
+ metric = {
110
+ 'value' => value,
111
+ 'time' => time,
112
+ 'name' => @remove_prefix ? name : "%s.%s" % ['custom', name]
113
+ }
114
+ metric['hostId'] = @hostid_processor.call(:tokens => tokens) if @hostid
115
+ return metric
116
+ end
117
+
104
118
  def write(chunk)
105
119
  metrics = []
120
+ processed = {}
121
+ tags = {}
122
+ time_latest = 0
106
123
  chunk.msgpack_each do |(tag,time,record)|
107
-
124
+ tags[tag] = true
108
125
  tokens = tag.split('.')
109
126
 
110
127
  if @out_keys
@@ -114,16 +131,20 @@ module Fluent
114
131
  end
115
132
 
116
133
  out_keys.map do |key|
117
- name = @name_processor.nil? ? key :
118
- @name_processor.map{ |p| p.call(:out_key => key, :tokens => tokens) }.join('.')
134
+ metrics << generate_metric(key, tokens, time, record[key].to_f)
135
+ time_latest = time if time_latest == 0 || time_latest < time
136
+ processed[tag + "." + key] = true
137
+ end
138
+ end
119
139
 
120
- metric = {
121
- 'value' => record[key].to_f,
122
- 'time' => time,
123
- 'name' => @remove_prefix ? name : "%s.%s" % ['custom', name]
124
- }
125
- metric['hostId'] = @hostid_processor.call(:tokens => tokens) if @hostid
126
- metrics << metric
140
+ if @out_keys && @use_zero_for_empty
141
+ tags.each_key do |tag|
142
+ tokens = tag.split('.')
143
+ @out_keys.each do |key|
144
+ unless processed[tag + "." + key]
145
+ metrics << generate_metric(key, tokens, time_latest, 0.0)
146
+ end
147
+ end
127
148
  end
128
149
  end
129
150
 
@@ -132,6 +153,7 @@ module Fluent
132
153
  end
133
154
 
134
155
  def send(metrics)
156
+ log.debug("out_mackerel: #{metrics}")
135
157
  begin
136
158
  if @hostid
137
159
  @mackerel.post_metrics(metrics)
@@ -106,6 +106,14 @@ class MackerelOutputTest < Test::Unit::TestCase
106
106
  out_keys val1,val2,val3
107
107
  ]
108
108
 
109
+ CONFIG_SERVICE_USE_ZERO = %[
110
+ type mackerel
111
+ api_key 123456
112
+ service xyz
113
+ use_zero_for_empty
114
+ out_keys val1,val2,val3
115
+ ]
116
+
109
117
  def create_driver(conf = CONFIG, tag='test')
110
118
  Fluent::Test::BufferedOutputTestDriver.new(Fluent::MackerelOutput, tag).configure(conf)
111
119
  end
@@ -231,6 +239,20 @@ end
231
239
  d.run()
232
240
  end
233
241
 
242
+ def test_service_use_zero
243
+ d = create_driver(CONFIG_SERVICE_USE_ZERO)
244
+ mock(d.instance.mackerel).post_service_metrics('xyz', [
245
+ {"value"=>1.0, "time"=>1399997498, "name"=>"custom.val1"},
246
+ {"value"=>2.0, "time"=>1399997498, "name"=>"custom.val2"},
247
+ {"value"=>0.0, "time"=>1399997498, "name"=>"custom.val3"},
248
+ ])
249
+
250
+ ENV["TZ"]="Asia/Tokyo"
251
+ t = Time.strptime('2014-05-14 01:11:38', '%Y-%m-%d %T')
252
+ d.emit({'val1' => 1, 'val2' => 2, 'foo' => 3}, t)
253
+ d.run()
254
+ end
255
+
234
256
  def test_name_processor
235
257
  [
236
258
  {metrics_name: "${out_key}", expected: "val1"},
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-mackerel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - tksmd
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-02-26 00:00:00.000000000 Z
14
+ date: 2015-04-14 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: mackerel-client
@@ -137,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
137
  version: '0'
138
138
  requirements: []
139
139
  rubyforge_project:
140
- rubygems_version: 2.2.2
140
+ rubygems_version: 2.4.5
141
141
  signing_key:
142
142
  specification_version: 4
143
143
  summary: fluent plugin to send metrics to mackerel.io