fluent-plugin-cloudwatch-logs 0.1.2 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7433cbc405896d7a542689ab5e23c6f199043760
4
- data.tar.gz: c8f7680af5579da676e5b0379b9e911f5afa7dbe
3
+ metadata.gz: f11742cedd1eb409768c54c02aca68f71bf7eaaf
4
+ data.tar.gz: 49ce80a5464dc1dd99c847e6f39f914b314d83a9
5
5
  SHA512:
6
- metadata.gz: 0bb5a93717b9cddfc9d29fd4e4dca9c84751747b6f10b3225f5a8be0542a418223525e4f03527131daf9d3bfec543fe2d06b372f391760535deeb1cf149c555a
7
- data.tar.gz: 86be56949e121311e7ad8ebaf5fb41667fdede3d0a0a75f80418659df35664f4924756614e1bf174c03105f028fca9009a2f80fddb6a4f1a74e2bf8ae79a9d83
6
+ metadata.gz: b43fdfa3ee97e844180a4b775e238d7c9cac3eaa786d9ed26d897956f5d0b1a3071c5f3e65ad89b99e120a5c464a5c7114c0ef8376df563815b4d2e9a1f1b604
7
+ data.tar.gz: 862017735509e6e2340ecd135432d85d5edf4d5e8143ed0ef3cc9a3d08386a657ddb153e04333178838402844b3b5044010f5480ddfcb76f7137dbc6ea2919c4
data/README.md CHANGED
@@ -75,6 +75,10 @@ Fetch sample log from CloudWatch Logs:
75
75
  #use_tag_as_stream false
76
76
  #include_time_key true
77
77
  #localtime true
78
+ #log_group_name_key group_name_key
79
+ #log_stream_name_key stream_name_key
80
+ #remove_log_group_name_key true
81
+ #remove_log_stream_name_key true
78
82
  </match>
79
83
  ```
80
84
 
@@ -88,6 +92,10 @@ Fetch sample log from CloudWatch Logs:
88
92
  * `use_tag_as_stream`: to use tag as a stream name
89
93
  * `include_time_key`: include time key as part of the log entry (defaults to UTC)
90
94
  * `localtime`: use localtime timezone for `include_time_key` output (overrides UTC default)
95
+ * `log_group_name_key`: use specified field of records as log group name
96
+ * `log_stream_name_key`: use specified field of records as log stream name
97
+ * `remove_log_group_name_key`: remove field specified by `log_group_name_key`
98
+ * `remove_log_stream_name_key`: remove field specified by `log_stream_name_key`
91
99
 
92
100
  ### in_cloudwatch_logs
93
101
 
@@ -2,7 +2,7 @@ module Fluent
2
2
  module Plugin
3
3
  module Cloudwatch
4
4
  module Logs
5
- VERSION = "0.1.2"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
8
8
  end
@@ -13,8 +13,12 @@ module Fluent
13
13
  config_param :message_keys, :string, :default => nil
14
14
  config_param :max_message_length, :integer, :default => nil
15
15
  config_param :max_events_per_batch, :integer, :default => 10000
16
- config_param :use_tag_as_group, :bool, :default => false
17
- config_param :use_tag_as_stream, :bool, :default => false
16
+ config_param :use_tag_as_group, :bool, :default => false # TODO: Rename to use_tag_as_group_name ?
17
+ config_param :use_tag_as_stream, :bool, :default => false # TODO: Rename to use_tag_as_stream_name ?
18
+ config_param :log_group_name_key, :string, :default => nil
19
+ config_param :log_stream_name_key, :string, :default => nil
20
+ config_param :remove_log_group_name_key, :bool, :default => false
21
+ config_param :remove_log_stream_name_key, :bool, :default => false
18
22
  config_param :http_proxy, :string, default: nil
19
23
 
20
24
  MAX_EVENTS_SIZE = 1_048_576
@@ -29,6 +33,18 @@ module Fluent
29
33
  require 'aws-sdk-core'
30
34
  end
31
35
 
36
+ def configure(conf)
37
+ super
38
+
39
+ unless [conf['log_group_name'], conf['use_tag_as_group'], conf['log_group_name_key']].compact.size == 1
40
+ raise ConfigError, "Set only one of log_group_name, use_tag_as_group and log_group_name_key"
41
+ end
42
+
43
+ unless [conf['log_stream_name'], conf['use_tag_as_stream'], conf['log_stream_name_key']].compact.size == 1
44
+ raise ConfigError, "Set only one of log_stream_name, use_tag_as_stream and log_stream_name_key"
45
+ end
46
+ end
47
+
32
48
  def start
33
49
  super
34
50
 
@@ -47,10 +63,35 @@ module Fluent
47
63
  def write(chunk)
48
64
  events = []
49
65
  chunk.enum_for(:msgpack_each).chunk {|tag, time, record|
50
- tag
51
- }.each {|tag, rs|
52
- group_name = @use_tag_as_group ? tag : @log_group_name
53
- stream_name = @use_tag_as_stream ? tag : @log_stream_name
66
+ group = case
67
+ when @use_tag_as_group
68
+ tag
69
+ when @log_group_name_key
70
+ if @remove_log_group_name_key
71
+ record.delete(@log_group_name_key)
72
+ else
73
+ record[@log_group_name_key]
74
+ end
75
+ else
76
+ @log_group_name
77
+ end
78
+
79
+ stream = case
80
+ when @use_tag_as_stream
81
+ tag
82
+ when @log_stream_name_key
83
+ if @remove_log_stream_name_key
84
+ record.delete(@log_stream_name_key)
85
+ else
86
+ record[@log_stream_name_key]
87
+ end
88
+ else
89
+ @log_stream_name
90
+ end
91
+
92
+ [group, stream]
93
+ }.each {|group_stream, rs|
94
+ group_name, stream_name = group_stream
54
95
 
55
96
  unless log_group_exists?(group_name)
56
97
  if @auto_create_stream
@@ -43,7 +43,7 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
43
43
  d.emit({'cloudwatch' => 'logs2'}, time.to_i + 1)
44
44
  d.run
45
45
 
46
- sleep 20
46
+ sleep 10
47
47
 
48
48
  events = get_log_events
49
49
  assert_equal(2, events.size)
@@ -61,7 +61,7 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
61
61
  d.emit({'cloudwatch' => 'これは日本語です'.force_encoding('UTF-8')}, time.to_i)
62
62
  d.run
63
63
 
64
- sleep 20
64
+ sleep 10
65
65
 
66
66
  events = get_log_events
67
67
  assert_equal(1, events.size)
@@ -79,7 +79,7 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
79
79
  d.emit({'cloudwatch' => 'logs2'}, time.to_i + 1)
80
80
  d.run
81
81
 
82
- sleep 20
82
+ sleep 10
83
83
 
84
84
  events = get_log_events
85
85
  assert_equal(3, events.size)
@@ -97,6 +97,8 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
97
97
  d = create_driver(<<-EOC)
98
98
  #{default_config}
99
99
  message_keys message,cloudwatch
100
+ log_group_name #{log_group_name}
101
+ log_stream_name #{log_stream_name}
100
102
  EOC
101
103
 
102
104
  time = Time.now
@@ -104,7 +106,7 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
104
106
  d.emit({'cloudwatch' => 'logs2', 'message' => 'message2'}, time.to_i + 1)
105
107
  d.run
106
108
 
107
- sleep 20
109
+ sleep 10
108
110
 
109
111
  events = get_log_events
110
112
  assert_equal(2, events.size)
@@ -121,6 +123,8 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
121
123
  #{default_config}
122
124
  message_keys message,cloudwatch
123
125
  max_message_length 10
126
+ log_group_name #{log_group_name}
127
+ log_stream_name #{log_stream_name}
124
128
  EOC
125
129
 
126
130
  time = Time.now
@@ -128,7 +132,7 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
128
132
  d.emit({'cloudwatch' => 'logs2', 'message' => 'message2'}, time.to_i + 1)
129
133
  d.run
130
134
 
131
- sleep 20
135
+ sleep 10
132
136
 
133
137
  events = get_log_events
134
138
  assert_equal(2, events.size)
@@ -145,6 +149,7 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
145
149
  #{default_config}
146
150
  message_keys message,cloudwatch
147
151
  use_tag_as_group true
152
+ log_stream_name #{log_stream_name}
148
153
  EOC
149
154
 
150
155
  time = Time.now
@@ -152,7 +157,7 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
152
157
  d.emit({'cloudwatch' => 'logs2', 'message' => 'message2'}, time.to_i + 1)
153
158
  d.run
154
159
 
155
- sleep 20
160
+ sleep 10
156
161
 
157
162
  events = get_log_events(fluentd_tag)
158
163
  assert_equal(2, events.size)
@@ -169,6 +174,7 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
169
174
  #{default_config}
170
175
  message_keys message,cloudwatch
171
176
  use_tag_as_stream true
177
+ log_group_name #{log_group_name}
172
178
  EOC
173
179
 
174
180
  time = Time.now
@@ -176,7 +182,7 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
176
182
  d.emit({'cloudwatch' => 'logs2', 'message' => 'message2'}, time.to_i + 1)
177
183
  d.run
178
184
 
179
- sleep 20
185
+ sleep 10
180
186
 
181
187
  events = get_log_events(log_group_name, fluentd_tag)
182
188
  assert_equal(2, events.size)
@@ -192,6 +198,8 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
192
198
  d = create_driver(<<-EOC)
193
199
  #{default_config}
194
200
  include_time_key true
201
+ log_group_name #{log_group_name}
202
+ log_stream_name #{log_stream_name}
195
203
  EOC
196
204
 
197
205
  time = Time.now
@@ -199,7 +207,7 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
199
207
  d.emit({'cloudwatch' => 'logs2'}, time.to_i + 1)
200
208
  d.run
201
209
 
202
- sleep 20
210
+ sleep 10
203
211
 
204
212
  events = get_log_events
205
213
  assert_equal(2, events.size)
@@ -216,6 +224,8 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
216
224
  #{default_config}
217
225
  include_time_key true
218
226
  localtime true
227
+ log_group_name #{log_group_name}
228
+ log_stream_name #{log_stream_name}
219
229
  EOC
220
230
 
221
231
  time = Time.now
@@ -223,7 +233,7 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
223
233
  d.emit({'cloudwatch' => 'logs2'}, time.to_i + 1)
224
234
  d.run
225
235
 
226
- sleep 20
236
+ sleep 10
227
237
 
228
238
  events = get_log_events
229
239
  assert_equal(2, events.size)
@@ -233,20 +243,71 @@ class CloudwatchLogsOutputTest < Test::Unit::TestCase
233
243
  assert_equal("{\"cloudwatch\":\"logs2\",\"time\":\"#{(time+1).strftime("%Y-%m-%dT%H:%M:%S%:z")}\"}", events[1].message)
234
244
  end
235
245
 
246
+ def test_log_group_name_key_and_log_stream_name_key
247
+ new_log_stream
248
+
249
+ d = create_driver(<<-EOC)
250
+ #{default_config}
251
+ log_group_name_key group_name_key
252
+ log_stream_name_key stream_name_key
253
+ EOC
254
+
255
+ record = {'cloudwatch' => 'logs1', 'message' => 'message1', 'group_name_key' => log_group_name, 'stream_name_key' => log_stream_name}
256
+
257
+ time = Time.now
258
+ d.emit(record, time.to_i)
259
+ d.run
260
+
261
+ sleep 10
262
+
263
+ events = get_log_events(log_group_name, log_stream_name)
264
+ assert_equal(1, events.size)
265
+ assert_equal(time.to_i * 1000, events[0].timestamp)
266
+ assert_equal(record, JSON.parse(events[0].message))
267
+ end
268
+
269
+ def test_remove_log_group_name_key_and_remove_log_stream_name_key
270
+ new_log_stream
271
+
272
+ d = create_driver(<<-EOC)
273
+ #{default_config}
274
+ log_group_name_key group_name_key
275
+ log_stream_name_key stream_name_key
276
+ remove_log_group_name_key true
277
+ remove_log_stream_name_key true
278
+ EOC
279
+
280
+ time = Time.now
281
+ d.emit({'cloudwatch' => 'logs1', 'message' => 'message1', 'group_name_key' => log_group_name, 'stream_name_key' => log_stream_name}, time.to_i)
282
+ d.run
283
+
284
+ sleep 10
285
+
286
+ events = get_log_events(log_group_name, log_stream_name)
287
+ assert_equal(1, events.size)
288
+ assert_equal(time.to_i * 1000, events[0].timestamp)
289
+ assert_equal({'cloudwatch' => 'logs1', 'message' => 'message1'}, JSON.parse(events[0].message))
290
+ end
291
+
236
292
  private
237
293
  def default_config
238
294
  <<-EOC
239
- type cloudwatch_logs
240
- log_group_name #{log_group_name}
241
- log_stream_name #{log_stream_name}
242
- auto_create_stream true
243
- #{aws_key_id}
244
- #{aws_sec_key}
245
- #{region}
295
+ type cloudwatch_logs
296
+ auto_create_stream true
297
+ #{aws_key_id}
298
+ #{aws_sec_key}
299
+ #{region}
246
300
  EOC
247
301
  end
248
302
 
249
- def create_driver(conf = default_config)
303
+ def create_driver(conf = nil)
304
+ unless conf
305
+ conf = <<-EOC
306
+ #{default_config}
307
+ log_group_name #{log_group_name}
308
+ log_stream_name #{log_stream_name}
309
+ EOC
310
+ end
250
311
  Fluent::Test::BufferedOutputTestDriver.new(Fluent::CloudwatchLogsOutput, fluentd_tag).configure(conf)
251
312
  end
252
313
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-cloudwatch-logs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryota Arai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-23 00:00:00.000000000 Z
11
+ date: 2016-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
@@ -121,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
121
  version: '0'
122
122
  requirements: []
123
123
  rubyforge_project:
124
- rubygems_version: 2.4.5
124
+ rubygems_version: 2.5.1
125
125
  signing_key:
126
126
  specification_version: 4
127
127
  summary: CloudWatch Logs Plugin for Fluentd