fluent-plugin-typetalk 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YzY5YjQ5MTdhMmYxYzliZDRlMmQzYzUzZTEyNmM4ZDE5NTQwYTNmMw==
4
+ NTMzMzhkY2NkYzFlMjQ4MTI3YzhjNTE2ODY0Y2UzY2MzMjlkMTlhNA==
5
5
  data.tar.gz: !binary |-
6
- ZWQ1NjVkOGMwZWIwNDQzZjZmYTQxNzMzNzZmOTFiMjhhNzk0NmIwZA==
6
+ OTNmYjJiNzEwODFlYjM0N2U5YmZkMDVmZmVmYTI5MDA4MzJkY2I2MQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NWU4MGIxZTM2NjUyZWI5YTIzMDY3OGIwYzM5NTcwZTcyNGE1M2RjZGJkODZk
10
- MDE2ZDFkMjNhODE2MjQwMDdjZDdhMGQ0NWUxYWE3YTg0OWNmM2Y0NTdhYmVh
11
- ODJjZGI1YmMwNDQ4ZjU5OWRjMjg1ODVhN2VjMTA5MTQzNzk0NTg=
9
+ MzIxNjFiZThhZDRkYTI5ODIxMzQ1Nzc2NDlhZGZhNjFmOWNmMjM5MGVlNzM5
10
+ NTRjY2FlMDI3MTg4NmMyNjRiYzcwYWViZjExYmZkYmExMDhkYmE5YjgzZTc3
11
+ OWYzY2UzMzAzZWM3MTYxMTJkOWQ0YmIwYTlkMWZhZjE4MmVhZmI=
12
12
  data.tar.gz: !binary |-
13
- NWMxY2M4NGIyZmFhZmI0ZDQ5M2I2NTA0N2E3NDA3MTc2MjQ4N2M0M2E0NGM0
14
- YTBhYjZlNDY1NTMxNjk3NWJmY2EzZWUwZDQzNzJjOTc1OWQxZWNjM2MxMzhi
15
- ODU5MGRkNjk2ZDNmM2Q5ZDRiYWFjOTFkOWI1MGY3Y2RhNmIzM2E=
13
+ ZDEwNDdjOTkwOGJjYjNkM2M1YzgzZDg5YjcxZjkzNGJjYTY1N2VjNzkxN2Fl
14
+ ZWUxMDJlYWZmZWMxNzNjMjk4M2QwZTExZjE3ODRjMDhiZTlhYzI3MzQ3YzY3
15
+ NmFkZDA1MjYwYWNkNjIyM2EzMmQwNGE3ZWI2MjY4NzI4NTEzMzk=
data/README.md CHANGED
@@ -52,6 +52,18 @@ This plugin allows you to use special value namely $hostname in out_keys. By usi
52
52
  </match>
53
53
  ```
54
54
 
55
+ By default, the number of notification you can send within a minute is limited to 10. Log lines that exceed this limit will be discarded. You can change it with `interval` and `limit` parameters.
56
+ ```
57
+ <match ...>
58
+ type typetalk
59
+ :
60
+ interval 300
61
+ limit 10
62
+ </match>
63
+ ```
64
+
65
+ In the example above, you can allow 10 notifications to be sent within 300 seconds. To remove the notification throttle, set both parameters to 0.
66
+
55
67
  ## TODO
56
68
 
57
69
  Pull requests are very welcome!!
@@ -4,8 +4,8 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "fluent-plugin-typetalk"
7
- spec.version = "0.0.3"
8
- spec.authors = ["tksmd"]
7
+ spec.version = "0.0.4"
8
+ spec.authors = ["tksmd","umakoz"]
9
9
  spec.email = ["someda@isenshi.com"]
10
10
  spec.description = %q{fluent plugin to send message to typetalk}
11
11
  spec.summary = spec.description
@@ -1,11 +1,10 @@
1
1
  module Fluent
2
- class TypetalkOutput < Fluent::BufferedOutput
2
+ class TypetalkOutput < Fluent::Output
3
3
  Fluent::Plugin.register_output('typetalk', self)
4
4
 
5
5
  config_param :client_id, :string
6
6
  config_param :client_secret, :string
7
7
  config_param :topic_id, :integer
8
- config_param :flush_interval, :time, :default => 1
9
8
 
10
9
  config_param :message, :string
11
10
  config_param :out_keys, :string, :default => ""
@@ -13,6 +12,9 @@ module Fluent
13
12
  config_param :time_format, :string, :default => nil
14
13
  config_param :tag_key, :string, :default => 'tag'
15
14
 
15
+ config_param :interval, :time, :default => 60
16
+ config_param :limit, :integer, :default => 10
17
+
16
18
  attr_reader :typetalk
17
19
 
18
20
  # Define `log` method for v0.10.42 or earlier
@@ -56,6 +58,9 @@ module Fluent
56
58
  @time_parse_proc = Proc.new {|str| str.to_i }
57
59
  end
58
60
 
61
+ @need_throttle = @limit > 0 && @interval > 0
62
+ @slot = []
63
+
59
64
  end
60
65
 
61
66
  def start
@@ -66,18 +71,35 @@ module Fluent
66
71
  super
67
72
  end
68
73
 
69
- def format(tag, time, record)
70
- [tag, time, record].to_msgpack
71
- end
74
+ def emit(tag, es, chain)
75
+ es.each do |time, record|
76
+ if @need_throttle && throttle(time)
77
+ log.error("out_typetalk:", :error => "number of posting message within #{@interval}(sec) reaches to the limit #{@limit}")
78
+ next
79
+ end
72
80
 
73
- def write(chunk)
74
- chunk.msgpack_each do |(tag,time,record)|
75
81
  begin
76
82
  send_message(tag, time, record)
77
83
  rescue => e
78
84
  log.error("out_typetalk:", :error_class => e.class, :error => e.message)
79
85
  end
80
86
  end
87
+
88
+ chain.next
89
+ end
90
+
91
+ def throttle(time)
92
+ expired = time.to_f - @interval
93
+ while @slot.first && (@slot.first <= expired)
94
+ @slot.shift
95
+ end
96
+
97
+ exceed = @slot.length >= @limit
98
+ unless exceed
99
+ @slot.push(time.to_f)
100
+ end
101
+
102
+ exceed
81
103
  end
82
104
 
83
105
  def send_message(tag, time, record)
@@ -17,14 +17,44 @@ class TypetalkOutputTest < Test::Unit::TestCase
17
17
  out_keys message
18
18
  ]
19
19
 
20
+ CONFIG_THROTTLE = %[
21
+ type typetalk
22
+ client_id 123456
23
+ client_secret secret
24
+ topic_id 1
25
+ message notice : %s
26
+ out_keys message
27
+ interval 5
28
+ limit 1
29
+ ]
30
+
31
+ CONFIG_NO_THROTTLE = %[
32
+ type typetalk
33
+ client_id 123456
34
+ client_secret secret
35
+ topic_id 1
36
+ message notice : %s
37
+ out_keys message
38
+ interval 0
39
+ limit 0
40
+ ]
41
+
20
42
  def create_driver(conf = CONFIG, tag = 'test')
21
- Fluent::Test::BufferedOutputTestDriver.new(Fluent::TypetalkOutput, tag).configure(conf)
43
+ Fluent::Test::OutputTestDriver.new(Fluent::TypetalkOutput, tag).configure(conf)
22
44
  end
23
45
 
24
46
  def test_configure
25
47
  d = create_driver()
26
48
  assert_equal '123456', Typetalk.config.client_id
27
49
  assert_equal 'secret', Typetalk.config.client_secret
50
+ assert_equal 60, d.instance.instance_variable_get(:@interval)
51
+ assert_equal 10, d.instance.instance_variable_get(:@limit)
52
+ assert_equal true, d.instance.instance_variable_get(:@need_throttle)
53
+ end
54
+
55
+ def test_configure_no_throttle
56
+ d = create_driver(CONFIG_NO_THROTTLE)
57
+ assert_equal false, d.instance.instance_variable_get(:@need_throttle)
28
58
  end
29
59
 
30
60
  def test_write
@@ -88,4 +118,19 @@ class TypetalkOutputTest < Test::Unit::TestCase
88
118
  d.run()
89
119
  end
90
120
 
121
+ def test_throttle
122
+ d = create_driver(CONFIG_THROTTLE)
123
+ stub(d.instance.typetalk).post_message(1, 'notice : test1')
124
+ stub(d.instance.typetalk).post_message(1, 'notice : test3')
125
+ stub(d.instance.log).error {|name, params|
126
+ assert_equal "out_typetalk:", name
127
+ assert_equal "number of posting message within 5.0(sec) reaches to the limit 1", params[:error]
128
+ }
129
+ d.emit({'message' => 'test1'})
130
+ d.emit({'message' => 'test2'})
131
+ sleep 5
132
+ d.emit({'message' => 'test3'})
133
+ d.run()
134
+ end
135
+
91
136
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-typetalk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - tksmd
8
+ - umakoz
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-06-03 00:00:00.000000000 Z
12
+ date: 2014-06-17 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bundler