fluent-plugin-cloudwatch-put 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d384c9797d32c4f7342de78a6354b35112c7cce6
4
+ data.tar.gz: f37a80601492563df64e5e77c2428ca22e72bd83
5
+ SHA512:
6
+ metadata.gz: c9d30d0c594b9317f56c728f29745f78a8763bb36273556da7c57b9040e95c1081759779ff0102a9a55844e7810011dc921be452f412834836a8c3b9606cd797
7
+ data.tar.gz: be243f0ef19d60b0eaffea326f9450b7a86fe878e00233408dbecb7cfa44246b056da77efe6df5c1f1330edfcc6aca697ac22477d95e3a9e9ab72f1276ff4d2f
@@ -0,0 +1,11 @@
1
+ /.bundle
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /gemfiles/.bundle
11
+ *.gemfile.lock
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.8
4
+ - 2.3.4
5
+ - 2.4.2
6
+ before_install: gem install bundler
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem "aws-sdk", "~> 2.2"
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 joker1007
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,197 @@
1
+ # fluent-plugin-cloudwatch-put
2
+ [![Build Status](https://travis-ci.org/joker1007/fluent-plugin-cloudwatch-put.svg?branch=master)](https://travis-ci.org/joker1007/fluent-plugin-cloudwatch-put)
3
+
4
+ [Fluentd](http://fluentd.org/) output plugin to put metric data to AWS CloudWatch.
5
+
6
+ This plugin for fluentd-0.14.x or later.
7
+
8
+ ## Installation
9
+
10
+ ### RubyGems
11
+
12
+ ```
13
+ $ gem install fluent-plugin-cloudwatch-put
14
+ ```
15
+
16
+ ### Bundler
17
+
18
+ Add following line to your Gemfile:
19
+
20
+ ```ruby
21
+ gem "fluent-plugin-cloudwatch-put"
22
+ ```
23
+
24
+ And then execute:
25
+
26
+ ```
27
+ $ bundle
28
+ ```
29
+
30
+ ## Plugin helpers
31
+
32
+ * inject
33
+
34
+ * See also: Fluent::Plugin::Output
35
+
36
+ ## Configuration
37
+
38
+ ```
39
+ <match cloudwatch.metric_name>
40
+ @type cloudwatch_put
41
+
42
+ <buffer tag, key1>
43
+ path cloudwatch.*.buffer
44
+
45
+ flush_interval 1m
46
+ </buffer>
47
+
48
+ aws_key_id "#{ENV["AWS_ACCESS_KEY_ID"]}"
49
+ aws_sec_key "#{ENV["AWS_SECRET_ACCESS_KEY"]}"
50
+
51
+ region ap-northeast-1
52
+
53
+ namespace "Dummy/Namespace"
54
+ metric_name ${tag[1]}
55
+ unit Count
56
+ value_key value
57
+
58
+ use_statistic_sets
59
+
60
+ <dimensions>
61
+ name method
62
+ value ${key1}
63
+ </dimensions>
64
+ </match>
65
+ ```
66
+
67
+ ### namespace (string) (required)
68
+
69
+ CloudWatch metric namespace (support placeholder)
70
+
71
+ ### metric_name (string) (required)
72
+
73
+ CloudWatch metric name (support placeholder)
74
+
75
+ ### unit (string) (required)
76
+
77
+ CloudWatch metric unit (support placeholder)
78
+
79
+ ### value_key (string) (required)
80
+
81
+ Use this key as metric value
82
+
83
+ ### storage_resolution (integer) (optional)
84
+
85
+ Cloudwatch storage resolution
86
+
87
+ Default value: `60`.
88
+
89
+ ### use_statistic_sets (bool) (optional)
90
+
91
+ If this is true, aggregates record chunk before put metric
92
+
93
+
94
+ ### \<dimensions\> section (required) (multiple)
95
+
96
+ #### name (string) (required)
97
+
98
+ Dimension name (support placeholder)
99
+
100
+ #### key (string) (optional)
101
+
102
+ Use this key as dimension value. If use_statistic_sets is true, this param is not supported. Use `value`
103
+
104
+ #### value (string) (optional)
105
+
106
+ Use static value as dimension value (support placeholder)
107
+
108
+
109
+ ### \<buffer\> section (optional) (multiple)
110
+
111
+ #### chunk_limit_size (optional)
112
+
113
+ Default value: `30720`.
114
+
115
+ #### chunk_limit_records (optional)
116
+
117
+ Default value: `20`.
118
+
119
+ ## Configuration for Authentication
120
+
121
+ ### aws_key_id (string) (optional)
122
+
123
+ AWS access key id
124
+
125
+ ### aws_sec_key (string) (optional)
126
+
127
+ AWS secret key.
128
+
129
+ ### region (string) (optional)
130
+
131
+ region name
132
+
133
+ Default value: `us-east-1`.
134
+
135
+ ### proxy_uri (string) (optional)
136
+
137
+ URI of proxy environment
138
+
139
+ ### \<assume_role_credentials\> section (optional) (single)
140
+
141
+ #### role_arn (string) (required)
142
+
143
+ The Amazon Resource Name (ARN) of the role to assume
144
+
145
+ #### role_session_name (string) (required)
146
+
147
+ An identifier for the assumed role session
148
+
149
+ #### policy (string) (optional)
150
+
151
+ An IAM policy in JSON format
152
+
153
+ #### duration_seconds (integer) (optional)
154
+
155
+ The duration, in seconds, of the role session (900-3600)
156
+
157
+ #### external_id (string) (optional)
158
+
159
+ A unique identifier that is used by third parties when assuming roles in their customers' accounts.
160
+
161
+ ### \<instance_profile_credentials\> section (optional) (single)
162
+
163
+ #### retries (integer) (optional)
164
+
165
+ Number of times to retry when retrieving credentials
166
+
167
+ #### ip_address (string) (optional)
168
+
169
+ IP address (default:169.254.169.254)
170
+
171
+ #### port (integer) (optional)
172
+
173
+ Port number (default:80)
174
+
175
+ #### http_open_timeout (float) (optional)
176
+
177
+ Number of seconds to wait for the connection to open
178
+
179
+ #### http_read_timeout (float) (optional)
180
+
181
+ Number of seconds to wait for one block to be read
182
+
183
+ ### \<shared_credentials\> section (optional) (single)
184
+
185
+ #### path (string) (optional)
186
+
187
+ Path to the shared file. (default: $HOME/.aws/credentials)
188
+
189
+ #### profile_name (string) (optional)
190
+
191
+ Profile name. Default to 'default' or ENV['AWS_PROFILE']
192
+
193
+ ## Copyright
194
+
195
+ * Copyright(c) 2017- joker1007
196
+ * License
197
+ * MIT License
@@ -0,0 +1,13 @@
1
+ require "bundler"
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require "rake/testtask"
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs.push("lib", "test")
8
+ t.test_files = FileList["test/**/test_*.rb"]
9
+ t.verbose = true
10
+ t.warning = true
11
+ end
12
+
13
+ task default: [:test]
@@ -0,0 +1,30 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "fluent-plugin-cloudwatch-put"
6
+ spec.version = "0.1.0"
7
+ spec.authors = ["joker1007"]
8
+ spec.email = ["kakyoin.hierophant@gmail.com"]
9
+
10
+ spec.summary = %q{Cloudwatch put metric plugin for fluentd.}
11
+ spec.description = %q{Cloudwatch put metric plugin for fluentd.}
12
+ spec.homepage = "https://github.com/joker1007/fluent-plugin-cloudwatch-put"
13
+ spec.license = "MIT"
14
+
15
+ test_files, files = `git ls-files -z`.split("\x0").partition do |f|
16
+ f.match(%r{^(test|spec|features)/})
17
+ end
18
+ spec.files = files
19
+ spec.executables = files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ spec.test_files = test_files
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.14"
24
+ spec.add_development_dependency "rake", "~> 12.0"
25
+ spec.add_development_dependency "test-unit", "~> 3.0"
26
+ spec.add_development_dependency "test-unit-rr"
27
+
28
+ spec.add_runtime_dependency "fluentd", [">= 0.14.10", "< 2"]
29
+ spec.add_runtime_dependency "aws-sdk", ">= 2"
30
+ end
@@ -0,0 +1,252 @@
1
+ require "fluent/plugin/output"
2
+
3
+ begin
4
+ require "aws-sdk-cloudwatch"
5
+ rescue LoadError
6
+ require "aws-sdk"
7
+ end
8
+
9
+ module Fluent
10
+ module Plugin
11
+ class CloudWatchPutOutput < Fluent::Plugin::Output
12
+ Fluent::Plugin.register_output("cloudwatch_put", self)
13
+
14
+ helpers :inject
15
+
16
+ # Credential Configs from fluent-plugin-s3
17
+ # Apache License, version 2.0
18
+ desc "AWS access key id"
19
+ config_param :aws_key_id, :string, default: nil, secret: true
20
+ desc "AWS secret key."
21
+ config_param :aws_sec_key, :string, default: nil, secret: true
22
+ config_section :assume_role_credentials, multi: false do
23
+ desc "The Amazon Resource Name (ARN) of the role to assume"
24
+ config_param :role_arn, :string, secret: true
25
+ desc "An identifier for the assumed role session"
26
+ config_param :role_session_name, :string
27
+ desc "An IAM policy in JSON format"
28
+ config_param :policy, :string, default: nil
29
+ desc "The duration, in seconds, of the role session (900-3600)"
30
+ config_param :duration_seconds, :integer, default: nil
31
+ desc "A unique identifier that is used by third parties when assuming roles in their customers' accounts."
32
+ config_param :external_id, :string, default: nil, secret: true
33
+ end
34
+ config_section :instance_profile_credentials, multi: false do
35
+ desc "Number of times to retry when retrieving credentials"
36
+ config_param :retries, :integer, default: nil
37
+ desc "IP address (default:169.254.169.254)"
38
+ config_param :ip_address, :string, default: nil
39
+ desc "Port number (default:80)"
40
+ config_param :port, :integer, default: nil
41
+ desc "Number of seconds to wait for the connection to open"
42
+ config_param :http_open_timeout, :float, default: nil
43
+ desc "Number of seconds to wait for one block to be read"
44
+ config_param :http_read_timeout, :float, default: nil
45
+ # config_param :delay, :integer or :proc, :default => nil
46
+ # config_param :http_degub_output, :io, :default => nil
47
+ end
48
+ config_section :shared_credentials, multi: false do
49
+ desc "Path to the shared file. (default: $HOME/.aws/credentials)"
50
+ config_param :path, :string, default: nil
51
+ desc "Profile name. Default to 'default' or ENV['AWS_PROFILE']"
52
+ config_param :profile_name, :string, default: nil
53
+ end
54
+
55
+ desc "region name"
56
+ config_param :region, :string, default: ENV["AWS_REGION"] || "us-east-1"
57
+
58
+ desc "URI of proxy environment"
59
+ config_param :proxy_uri, :string, default: nil
60
+
61
+ desc "CloudWatch metric namespace (support placeholder)"
62
+ config_param :namespace, :string
63
+ desc "CloudWatch metric name (support placeholder)"
64
+ config_param :metric_name, :string
65
+ desc "CloudWatch metric unit (support placeholder)"
66
+ config_param :unit, :string
67
+
68
+ desc "Definition of dimension"
69
+ config_section :dimensions, multi: true, required: true do
70
+ desc "Dimension name (support placeholder)"
71
+ config_param :name, :string
72
+ desc "Use this key as dimension value. If use_statistic_sets is true, this param is not supported. Use `value`"
73
+ config_param :key, :string, default: nil
74
+ desc "Use static value as dimension value (support placeholder)"
75
+ config_param :value, :string, default: nil
76
+ end
77
+
78
+ desc "Use this key as metric value"
79
+ config_param :value_key, :string
80
+
81
+ desc "Cloudwatch storage resolution"
82
+ config_param :storage_resolution, :integer, default: 60
83
+
84
+ desc "If this is true, aggregates record chunk before put metric"
85
+ config_param :use_statistic_sets, :bool, default: false
86
+
87
+ config_section :buffer do
88
+ config_set_default :chunk_limit_size, 30 * 1024
89
+ config_set_default :chunk_limit_records, 20 # max record size of metric_data payload
90
+ end
91
+
92
+ attr_reader :cloudwatch
93
+
94
+ def configure(conf)
95
+ super
96
+
97
+ @dimensions.each do |d|
98
+ unless d.key.nil? ^ d.value.nil?
99
+ raise Fluent::ConfigError, "'Either dimensions[key]' or 'dimensions[value]' must be set"
100
+ end
101
+
102
+ if @use_statistic_sets && d.key
103
+ raise Fluent::ConfigError, "If 'use_statistic_sets' is true, dimensions[key] is not supportted"
104
+ end
105
+ end
106
+
107
+ placeholder_params = "namespace=#{@namespace}/metric_name=#{@metric_name}/unit=#{@unit}/dimensions[name]=#{@dimensions.map(&:name).join(",")}/dimensions[value]=#{@dimensions.map(&:value).join(",")}"
108
+ placeholder_validate!(:cloudwatch_put, placeholder_params)
109
+ end
110
+
111
+ def start
112
+ super
113
+
114
+ options = setup_credentials
115
+ options[:region] = @region if @region
116
+ options[:http_proxy] = @proxy_uri if @proxy_uri
117
+ log.on_trace do
118
+ options[:http_wire_trace] = true
119
+ options[:logger] = log
120
+ end
121
+
122
+ @cloudwatch = Aws::CloudWatch::Client.new(options)
123
+ end
124
+
125
+ def write(chunk)
126
+ if @use_statistic_sets
127
+ metric_data = build_statistic_metric_data(chunk)
128
+ else
129
+ metric_data = build_metric_data(chunk)
130
+ end
131
+
132
+ namespace = extract_placeholders(@namespace, chunk.metadata)
133
+ log.debug "Put metric to #{namespace}, count=#{metric_data.size}"
134
+ log.on_trace do
135
+ log.trace metric_data.to_json
136
+ end
137
+ @cloudwatch.put_metric_data({
138
+ namespace: namespace,
139
+ metric_data: metric_data,
140
+ })
141
+ end
142
+
143
+ private
144
+
145
+ def base_metric_data(meta)
146
+ {
147
+ metric_name: extract_placeholders(@metric_name, meta),
148
+ unit: extract_placeholders(@unit, meta),
149
+ storage_resolution: @storage_resolution,
150
+ }
151
+ end
152
+
153
+ def build_metric_data(chunk)
154
+ meta = chunk.metadata
155
+ metric_data = []
156
+ chunk.msgpack_each do |(timestamp, record)|
157
+ metric_data << base_metric_data(meta).merge({
158
+ dimensions: @dimensions.map { |d|
159
+ {
160
+ name: extract_placeholders(d.name, meta),
161
+ value: d.key ? record[d.key] : extract_placeholders(d.value, meta),
162
+ }
163
+ },
164
+ value: record[@value_key].to_f,
165
+ timestamp: Time.at(timestamp)
166
+ })
167
+ end
168
+ metric_data
169
+ end
170
+
171
+ def build_statistic_metric_data(chunk)
172
+ meta = chunk.metadata
173
+ values = []
174
+ timestamps = []
175
+ chunk.msgpack_each do |(timestamp, record)|
176
+ values << record[@value_key].to_f
177
+ timestamps << timestamp
178
+ end
179
+
180
+ [
181
+ base_metric_data(meta).merge({
182
+ dimensions: @dimensions.map { |d|
183
+ {
184
+ name: extract_placeholders(d.name, meta),
185
+ value: extract_placeholders(d.value, meta),
186
+ }
187
+ },
188
+ statistic_values: {
189
+ sample_count: values.size,
190
+ sum: values.inject(&:+),
191
+ minimum: values.min,
192
+ maximum: values.max,
193
+ },
194
+ timestamp: Time.at(timestamps.max)
195
+ })
196
+ ]
197
+ end
198
+
199
+ # Credential Configs from fluent-plugin-s3
200
+ # Apache License, version 2.0
201
+ def setup_credentials
202
+ options = {}
203
+ credentials_options = {}
204
+ case
205
+ when @aws_key_id && @aws_sec_key
206
+ options[:access_key_id] = @aws_key_id
207
+ options[:secret_access_key] = @aws_sec_key
208
+ when @assume_role_credentials
209
+ c = @assume_role_credentials
210
+ credentials_options[:role_arn] = c.role_arn
211
+ credentials_options[:role_session_name] = c.role_session_name
212
+ credentials_options[:policy] = c.policy if c.policy
213
+ credentials_options[:duration_seconds] = c.duration_seconds if c.duration_seconds
214
+ credentials_options[:external_id] = c.external_id if c.external_id
215
+ if @region
216
+ credentials_options[:client] = Aws::STS::Client.new(region: @region)
217
+ end
218
+ options[:credentials] = Aws::AssumeRoleCredentials.new(credentials_options)
219
+ when @instance_profile_credentials
220
+ c = @instance_profile_credentials
221
+ credentials_options[:retries] = c.retries if c.retries
222
+ credentials_options[:ip_address] = c.ip_address if c.ip_address
223
+ credentials_options[:port] = c.port if c.port
224
+ credentials_options[:http_open_timeout] = c.http_open_timeout if c.http_open_timeout
225
+ credentials_options[:http_read_timeout] = c.http_read_timeout if c.http_read_timeout
226
+ if ENV["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"]
227
+ options[:credentials] = Aws::ECSCredentials.new(credentials_options)
228
+ else
229
+ options[:credentials] = Aws::InstanceProfileCredentials.new(credentials_options)
230
+ end
231
+ when @shared_credentials
232
+ c = @shared_credentials
233
+ credentials_options[:path] = c.path if c.path
234
+ credentials_options[:profile_name] = c.profile_name if c.profile_name
235
+ options[:credentials] = Aws::SharedCredentials.new(credentials_options)
236
+ when @aws_iam_retries
237
+ log.warn("'aws_iam_retries' parameter is deprecated. Use 'instance_profile_credentials' instead")
238
+ credentials_options[:retries] = @aws_iam_retries
239
+ if ENV["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"]
240
+ options[:credentials] = Aws::ECSCredentials.new(credentials_options)
241
+ else
242
+ options[:credentials] = Aws::InstanceProfileCredentials.new(credentials_options)
243
+ end
244
+ else
245
+ # Use default credentials
246
+ # See http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html
247
+ end
248
+ options
249
+ end
250
+ end
251
+ end
252
+ end
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.expand_path("../../", __FILE__))
2
+ require "test-unit"
3
+ require "test/unit/rr"
4
+ require "fluent/test"
5
+ require "fluent/test/driver/output"
6
+ require "fluent/test/helpers"
7
+
8
+ Test::Unit::TestCase.include(Fluent::Test::Helpers)
9
+ Test::Unit::TestCase.extend(Fluent::Test::Helpers)
@@ -0,0 +1,245 @@
1
+ require "helper"
2
+ require "fluent/plugin/out_cloudwatch_put.rb"
3
+
4
+ class CloudWatchPutOutputTest < Test::Unit::TestCase
5
+ setup do
6
+ Fluent::Test.setup
7
+ end
8
+
9
+ DEFAULT_CONF = %q{
10
+ region ap-northeast-1
11
+ namespace Test
12
+ metric_name MetricName
13
+ unit Count
14
+
15
+ <dimensions>
16
+ name dim1
17
+ key key1
18
+ </dimensions>
19
+
20
+ <dimensions>
21
+ name dim2
22
+ key key2
23
+ </dimensions>
24
+
25
+ value_key key3
26
+
27
+ aws_key_id dummy
28
+ aws_sec_key dummy
29
+ }
30
+
31
+ test "configure" do
32
+ d = create_driver
33
+ assert { d.instance.buffer.chunk_limit_size == 30 * 1024 }
34
+ assert { d.instance.dimensions.size == 2 }
35
+ assert { d.instance.dimensions[0].name == "dim1" }
36
+ assert { d.instance.dimensions[1].name == "dim2" }
37
+ end
38
+
39
+ test "write" do
40
+ d = create_driver
41
+ now = Time.now.to_i
42
+
43
+ d.instance.start
44
+
45
+ mock(d.instance.cloudwatch).put_metric_data({
46
+ namespace: "Test",
47
+ metric_data: [
48
+ {
49
+ metric_name: "MetricName",
50
+ dimensions: [
51
+ {
52
+ name: "dim1",
53
+ value: "val1",
54
+ },
55
+ {
56
+ name: "dim2",
57
+ value: "val2",
58
+ },
59
+ ],
60
+ timestamp: Time.at(now),
61
+ value: 1.0,
62
+ unit: "Count",
63
+ storage_resolution: 60,
64
+ },
65
+ {
66
+ metric_name: "MetricName",
67
+ dimensions: [
68
+ {
69
+ name: "dim1",
70
+ value: "val1",
71
+ },
72
+ {
73
+ name: "dim2",
74
+ value: "val2",
75
+ },
76
+ ],
77
+ timestamp: Time.at(now),
78
+ value: 2.0,
79
+ unit: "Count",
80
+ storage_resolution: 60,
81
+ },
82
+ {
83
+ metric_name: "MetricName",
84
+ dimensions: [
85
+ {
86
+ name: "dim1",
87
+ value: "val1",
88
+ },
89
+ {
90
+ name: "dim2",
91
+ value: "val2",
92
+ },
93
+ ],
94
+ timestamp: Time.at(now),
95
+ value: 3.0,
96
+ unit: "Count",
97
+ storage_resolution: 60,
98
+ },
99
+ ]
100
+ })
101
+
102
+ d.run do
103
+ d.feed('tag', now, {"key1" => "val1", "key2" => "val2", "key3" => 1})
104
+ d.feed('tag', now, {"key1" => "val1", "key2" => "val2", "key3" => 2})
105
+ d.feed('tag', now, {"key1" => "val1", "key2" => "val2", "key3" => 3})
106
+ end
107
+ end
108
+
109
+ test "write (use_statistic_sets)" do
110
+ conf = %q{
111
+ region ap-northeast-1
112
+ namespace Test
113
+ metric_name MetricName
114
+ unit Count
115
+
116
+ use_statistic_sets
117
+
118
+ <dimensions>
119
+ name dim1
120
+ value dim_value1
121
+ </dimensions>
122
+
123
+ <dimensions>
124
+ name dim2
125
+ value dim_value2
126
+ </dimensions>
127
+
128
+ value_key key3
129
+
130
+ aws_key_id dummy
131
+ aws_sec_key dummy
132
+ }
133
+ d = create_driver(conf)
134
+ now = Time.now.to_i
135
+
136
+ d.instance.start
137
+
138
+ mock(d.instance.cloudwatch).put_metric_data({
139
+ namespace: "Test",
140
+ metric_data: [
141
+ {
142
+ metric_name: "MetricName",
143
+ dimensions: [
144
+ {
145
+ name: "dim1",
146
+ value: "dim_value1",
147
+ },
148
+ {
149
+ name: "dim2",
150
+ value: "dim_value2",
151
+ },
152
+ ],
153
+ timestamp: Time.at(now),
154
+ statistic_values: {
155
+ sample_count: 3,
156
+ sum: 6.0,
157
+ minimum: 1.0,
158
+ maximum: 3.0,
159
+ },
160
+ unit: "Count",
161
+ storage_resolution: 60,
162
+ },
163
+ ]
164
+ })
165
+
166
+ d.run do
167
+ d.feed('tag', now, {"key1" => "val1", "key2" => "val2", "key3" => 1})
168
+ d.feed('tag', now, {"key1" => "val1", "key2" => "val2", "key3" => 2})
169
+ d.feed('tag', now, {"key1" => "val1", "key2" => "val2", "key3" => 3})
170
+ end
171
+ end
172
+
173
+ test "write (use_statistic_sets) (placeholder)" do
174
+ conf = %q{
175
+ <buffer tag, key1, key2>
176
+ </buffer>
177
+
178
+ region ap-northeast-1
179
+ namespace ${tag[0]}
180
+ metric_name ${tag[1]}
181
+ unit Count
182
+
183
+ use_statistic_sets
184
+
185
+ <dimensions>
186
+ name dim1
187
+ value ${key1}
188
+ </dimensions>
189
+
190
+ <dimensions>
191
+ name dim2
192
+ value ${key2}
193
+ </dimensions>
194
+
195
+ value_key key3
196
+
197
+ aws_key_id dummy
198
+ aws_sec_key dummy
199
+ }
200
+ d = create_driver(conf)
201
+ now = Time.now.to_i
202
+
203
+ d.instance.start
204
+
205
+ mock(d.instance.cloudwatch).put_metric_data({
206
+ namespace: "namespace",
207
+ metric_data: [
208
+ {
209
+ metric_name: "metric_name",
210
+ dimensions: [
211
+ {
212
+ name: "dim1",
213
+ value: "val1",
214
+ },
215
+ {
216
+ name: "dim2",
217
+ value: "val2",
218
+ },
219
+ ],
220
+ timestamp: Time.at(now),
221
+ statistic_values: {
222
+ sample_count: 3,
223
+ sum: 6.0,
224
+ minimum: 1.0,
225
+ maximum: 3.0,
226
+ },
227
+ unit: "Count",
228
+ storage_resolution: 60,
229
+ },
230
+ ]
231
+ })
232
+
233
+ d.run do
234
+ d.feed('namespace.metric_name', now, {"key1" => "val1", "key2" => "val2", "key3" => 1})
235
+ d.feed('namespace.metric_name', now, {"key1" => "val1", "key2" => "val2", "key3" => 2})
236
+ d.feed('namespace.metric_name', now, {"key1" => "val1", "key2" => "val2", "key3" => 3})
237
+ end
238
+ end
239
+
240
+ private
241
+
242
+ def create_driver(conf = DEFAULT_CONF)
243
+ Fluent::Test::Driver::Output.new(Fluent::Plugin::CloudWatchPutOutput).configure(conf)
244
+ end
245
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-cloudwatch-put
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - joker1007
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-10-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.14'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '12.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '12.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: test-unit
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: test-unit-rr
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: fluentd
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 0.14.10
76
+ - - "<"
77
+ - !ruby/object:Gem::Version
78
+ version: '2'
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: 0.14.10
86
+ - - "<"
87
+ - !ruby/object:Gem::Version
88
+ version: '2'
89
+ - !ruby/object:Gem::Dependency
90
+ name: aws-sdk
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '2'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '2'
103
+ description: Cloudwatch put metric plugin for fluentd.
104
+ email:
105
+ - kakyoin.hierophant@gmail.com
106
+ executables: []
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - ".gitignore"
111
+ - ".travis.yml"
112
+ - Gemfile
113
+ - LICENSE
114
+ - README.md
115
+ - Rakefile
116
+ - fluent-plugin-cloudwatch-put.gemspec
117
+ - lib/fluent/plugin/out_cloudwatch_put.rb
118
+ - test/helper.rb
119
+ - test/plugin/test_out_cloudwatch_put.rb
120
+ homepage: https://github.com/joker1007/fluent-plugin-cloudwatch-put
121
+ licenses:
122
+ - MIT
123
+ metadata: {}
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubyforge_project:
140
+ rubygems_version: 2.6.13
141
+ signing_key:
142
+ specification_version: 4
143
+ summary: Cloudwatch put metric plugin for fluentd.
144
+ test_files:
145
+ - test/helper.rb
146
+ - test/plugin/test_out_cloudwatch_put.rb