fluent-client 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e2e494e8e7e21884073391ee32c0b15a788401a7
4
+ data.tar.gz: 43a49b73cf01311ea1b352e32e5d4c7443317407
5
+ SHA512:
6
+ metadata.gz: 685a9d71440c5c5bc74671433b2e44b0afba112e3f95be46d905ec4355feed3ad19c69d29e12e067c14472034b182d2489b630dd984a4afdf79e097a9fc59f72
7
+ data.tar.gz: 805b700ac45ee053d510523850a5c6c4a8ea756fb51ef1a2308ff07d1e428166d0bb320652f6eaa13c84b4fb622e8a5611169d5e135e32278ffde446505af8dc
@@ -0,0 +1,3 @@
1
+ -
2
+ ChangeLog.md
3
+ LICENSE.txt
@@ -0,0 +1,7 @@
1
+ Gemfile.lock
2
+ doc/
3
+ pkg/
4
+ **/*.gem
5
+ .yardoc/
6
+ .bundle/
7
+ vendor/bundle/
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour --format documentation
@@ -0,0 +1 @@
1
+ --markup markdown --title "fluent-client Documentation" --protected
@@ -0,0 +1,4 @@
1
+ ### 0.1.0 / 2014-09-14
2
+
3
+ * Initial release:
4
+
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem 'kramdown'
7
+ end
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2014 Hiroshi Toyama
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,98 @@
1
+ # fluent-client
2
+
3
+ fluentd command line utility
4
+
5
+ ## Examples
6
+
7
+ ### simple post to fluentd
8
+
9
+ $ fluent-client --post sometag --data id:1 name:toyama
10
+ #=> 2014-09-14 17:43:40 +0900 sometag: {"id":"1","name":"toyama"}
11
+
12
+ ### simple post to fluentd other host
13
+
14
+ $ fluent-client --post sometag --data id:1 name:toyama -h aggregate-host -p 24223
15
+
16
+ ### post stdin json
17
+
18
+ $ echo '[{"hoge":"fuga"},{"hoge":"fuga2"}]' | fluent-client -j sometag
19
+ #=> 2014-09-14 22:30:26 +0900 sometag: {"hoge":"fuga"}
20
+ #=> 2014-09-14 22:30:26 +0900 sometag: {"hoge":"fuga2"}
21
+
22
+ ### post stdin file with regular expression
23
+
24
+ $ cat server.csv
25
+ i-xxxxxxx web01 running
26
+ i-xxxxxxx web02 running
27
+ i-xxxxxxx web03 running
28
+ i-xxxxxxx web04 running
29
+ i-xxxxxxx batch01 running
30
+
31
+ $ cat server.txt | fluent-client post_parse_text sometag --format "/^(?<instance_id>[^ ]*) (?<name>[^ ]*) (?<state>[^ ]*)$/"
32
+ #=> {"instance_id"=>"i-xxxxxxx", "name"=>"web01", "state"=>"running"}
33
+ #=> {"instance_id"=>"i-xxxxxxx", "name"=>"web02", "state"=>"running"}
34
+ #=> {"instance_id"=>"i-xxxxxxx", "name"=>"web03", "state"=>"running"}
35
+ #=> {"instance_id"=>"i-xxxxxxx", "name"=>"web04", "state"=>"running"}
36
+ #=> {"instance_id"=>"i-xxxxxxx", "name"=>"batch01", "state"=>"running"}
37
+
38
+ ※ multiline not support
39
+
40
+ ### post stdin csv file
41
+
42
+ $ cat server.csv
43
+ i-xxxxxxx,web01,running
44
+ i-xxxxxxx,web02,running
45
+ i-xxxxxxx,web03,running
46
+ i-xxxxxxx,web04,running
47
+ i-xxxxxxx,batch01,running
48
+
49
+ $ cat server.csv | fluent-client post_parse_text sometag --format csv --keys instance_id,name,state
50
+ #=> {"instance_id"=>"i-xxxxxxx", "name"=>"web01", "state"=>"running"}
51
+ #=> {"instance_id"=>"i-xxxxxxx", "name"=>"web02", "state"=>"running"}
52
+ #=> {"instance_id"=>"i-xxxxxxx", "name"=>"web03", "state"=>"running"}
53
+ #=> {"instance_id"=>"i-xxxxxxx", "name"=>"web04", "state"=>"running"}
54
+ #=> {"instance_id"=>"i-xxxxxxx", "name"=>"batch01", "state"=>"running"}
55
+
56
+
57
+
58
+ ## default values
59
+
60
+ default host: localhost
61
+
62
+ default port: 24224
63
+
64
+
65
+ ## Installation
66
+
67
+ Add this line to your application's Gemfile:
68
+
69
+ gem 'fluent-client'
70
+
71
+ And then execute:
72
+
73
+ $ bundle
74
+
75
+ Or install it yourself as:
76
+
77
+ $ gem install fluent-client
78
+
79
+ ## Contributing
80
+
81
+ 1. Fork it
82
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
83
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
84
+ 4. Push to the branch (`git push origin my-new-feature`)
85
+ 5. Create new [Pull Request](../../pull/new/master)
86
+
87
+ ## Information
88
+
89
+ * [Homepage](https://github.com/toyama0919/fluent-client)
90
+ * [Issues](https://github.com/toyama0919/fluent-client/issues)
91
+ * [Documentation](http://rubydoc.info/gems/fluent-client/frames)
92
+ * [Email](mailto:toyama0919@gmail.com)
93
+
94
+ ## Copyright
95
+
96
+ Copyright (c) 2014 Hiroshi Toyama
97
+
98
+ See [LICENSE.txt](../LICENSE.txt) for details.
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+
5
+ begin
6
+ require 'bundler'
7
+ rescue LoadError => e
8
+ warn e.message
9
+ warn "Run `gem install bundler` to install Bundler."
10
+ exit -1
11
+ end
12
+
13
+ begin
14
+ Bundler.setup(:development)
15
+ rescue Bundler::BundlerError => e
16
+ warn e.message
17
+ warn "Run `bundle install` to install missing gems."
18
+ exit e.status_code
19
+ end
20
+
21
+ require 'rake'
22
+
23
+ require 'rubygems/tasks'
24
+ Gem::Tasks.new
25
+
26
+ require 'rspec/core/rake_task'
27
+ RSpec::Core::RakeTask.new
28
+
29
+ task :test => :spec
30
+ task :default => :spec
31
+
32
+ require 'yard'
33
+ YARD::Rake::YardocTask.new
34
+ task :doc => :yard
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'fluent/client'
5
+
6
+ Fluent::Client::CLI.start
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require File.expand_path('../lib/fluent/client/version', __FILE__)
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.name = "fluent-client"
7
+ gem.version = Fluent::Client::VERSION
8
+ gem.summary = %q{fluentd command line utility}
9
+ gem.description = %q{fluentd command line utility}
10
+ gem.license = "MIT"
11
+ gem.authors = ["Hiroshi Toyama"]
12
+ gem.email = "toyama0919@gmail.com"
13
+ gem.homepage = "https://github.com/toyama0919/fluent-client"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ['lib']
19
+
20
+ gem.add_dependency 'thor', '~> 0.19.1'
21
+ gem.add_dependency 'fluentd'
22
+ gem.add_dependency 'yajl-ruby'
23
+ gem.add_dependency 'fluent-logger'
24
+ gem.add_dependency 'activesupport'
25
+
26
+ gem.add_development_dependency 'bundler', '~> 1.7.2'
27
+ gem.add_development_dependency 'rake', '~> 10.3.2'
28
+ gem.add_development_dependency 'rspec', '~> 2.4'
29
+ gem.add_development_dependency 'rubygems-tasks', '~> 0.2'
30
+ gem.add_development_dependency 'yard', '~> 0.8'
31
+ end
@@ -0,0 +1,3 @@
1
+ require 'fluent/client/version'
2
+ require 'fluent/client/core'
3
+ require 'fluent/client/cli'
@@ -0,0 +1,97 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- encoding: UTF-8 -*-
3
+ require 'thor'
4
+ require 'yajl'
5
+ require 'fluent-logger'
6
+ require 'active_support/core_ext/string'
7
+ require 'fluent/log'
8
+ require 'fluent/config'
9
+ require 'fluent/engine'
10
+ require 'fluent/parser'
11
+
12
+ module Fluent
13
+ module Client
14
+ class CLI < Thor
15
+ map '--post' => :post
16
+ map '-i' => :stdin
17
+ map '-l' => :stdin_line
18
+ map '-j' => :post_json
19
+
20
+ class_option :host, type: :string, default: 'localhost', aliases: '-h', desc: 'config file'
21
+ class_option :port, type: :numeric, default: 24_224, aliases: '-p', desc: 'config file'
22
+ def initialize(args = [], options = {}, config = {})
23
+ super(args, options, config)
24
+ @global_options = config[:shell].base.options
25
+ @logger = Fluent::Logger::FluentLogger.new(nil, host: @global_options['host'], port: @global_options['port'])
26
+ @core = Core.new
27
+ end
28
+
29
+ desc '--post', 'fluent-client --post sometag --data id:1 name:toyama'
30
+ option :data, type: :hash, desc: 'config file', required: true
31
+ option :time_key, type: :string, default: nil, desc: 'config file'
32
+ def post(tag)
33
+ data = options['data']
34
+ if options['time_key'].nil?
35
+ @logger.post(tag, data)
36
+ else
37
+ @logger.post_with_time(tag, options['data'], data[options['time_key']].to_time)
38
+ end
39
+ end
40
+
41
+ desc '-j [tag]', %(echo '{"hoge":"fuga"}' | fluent-client -j sometag)
42
+ def post_json(tag)
43
+ results = parse_json(STDIN.read)
44
+ results.each do |result|
45
+ @logger.post(tag, result)
46
+ end
47
+ end
48
+
49
+ desc '-i', 'echo -n hoge | fluent-client -i sometag'
50
+ def stdin(tag)
51
+ @logger.post(tag, message: STDIN.read)
52
+ end
53
+
54
+ desc '-l', 'cat somefile | fluent-client -l sometag'
55
+ def stdin_line(tag)
56
+ STDIN.read.lines.each do |line|
57
+ @logger.post(tag, message: line)
58
+ end
59
+ end
60
+
61
+ desc 'validate_parse [tag]',
62
+ 'echo "2014-01-01 localhost test" | fluent-client validate_parse --format "/^(?<log_date>\d{4}-\d{2}-\d{2}) (?<host>[^ ]*) (?<huga>[^ ]*)$/"'
63
+ option :format, type: :string, default: nil, desc: 'format regexp', required: true
64
+ option :time_format, type: :string, default: nil, desc: 'time format'
65
+ option :keys, type: :string, default: nil, desc: 'time format'
66
+ def validate_parse
67
+ @core.parse_text(options['format'], options['time_format'], options['keys'])
68
+ end
69
+
70
+ desc 'post_parse_text [tag]',
71
+ 'echo "2014-01-01 localhost test" | fluent-client post_parse_text sometag --format "/^(?<log_date>\d{4}-\d{2}-\d{2}) (?<host>[^ ]*) (?<huga>[^ ]*)$/"'
72
+ option :format, type: :string, default: nil, desc: 'format regexp', required: true
73
+ option :time_format, type: :string, default: nil, desc: 'time format'
74
+ option :keys, type: :string, default: nil, desc: 'time format'
75
+ def post_parse_text(tag)
76
+ results = @core.parse_text(options['format'], options['time_format'], options['keys'])
77
+ results.each do |result|
78
+ @logger.post(tag, result)
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ def parse_json(buffer)
85
+ begin
86
+ data = Yajl.load(buffer)
87
+ rescue => e
88
+ data = []
89
+ buffer.lines.each do |line|
90
+ data << Yajl.load(line)
91
+ end
92
+ end
93
+ data.class == Array ? data : [data]
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,47 @@
1
+ module Fluent
2
+ module Client
3
+ class Core
4
+ def initialize
5
+ end
6
+
7
+ def create_parser(format, time_format, keys)
8
+ if format == 'multiline'
9
+ STDERR.puts 'multiline format is not support!'
10
+ exit 1
11
+ end
12
+
13
+ if format[0] == '/' && format[format.length - 1] == '/'
14
+ format = format.gsub(/^\/(.+)\/$/, '\1')
15
+ parser = Fluent::TextParser::RegexpParser.new(Regexp.new(format))
16
+ else
17
+ factory = Fluent::TextParser::TEMPLATE_REGISTRY.lookup(format)
18
+ parser = factory.call
19
+ end
20
+ parser.configure('time_format' => time_format) unless time_format.nil?
21
+ parser.configure('keys' => keys) unless keys.nil?
22
+ parser
23
+ end
24
+
25
+ def parse_text(format, time_format, keys, buffer = STDIN.read)
26
+ results = []
27
+ parser = create_parser(format, time_format, keys)
28
+ begin
29
+ buffer.lines.each_with_index do |line, i|
30
+ line = line.strip
31
+ parsed_time, parsed = parser.call(line)
32
+ if parsed.nil?
33
+ puts "format error! line #{i + 1} [#{line}]"
34
+ else
35
+ puts parsed
36
+ end
37
+ results << parsed unless parsed.nil?
38
+ end
39
+ rescue ArgumentError, RegexpError => e
40
+ STDERR.puts "\n#{e.message}\n#{e.backtrace.join("\n")}"
41
+ parsed_time = parsed = nil
42
+ end
43
+ results
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,6 @@
1
+ module Fluent
2
+ module Client
3
+ # fluent-client version
4
+ VERSION = '0.1.0'
5
+ end
6
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+ require 'fluent/client'
3
+
4
+ describe Fluent::Client do
5
+ it 'should have a VERSION constant' do
6
+ subject.const_get('VERSION').should_not be_empty
7
+ end
8
+
9
+ it 'core parse_text csv' do
10
+ @core = Core.new
11
+ results = @core.parse_text('csv', nil, 'log_date,host,url', '2014-01-01,localhost,/hoge/test')
12
+ results.first['log_date'].should == '2014-01-01'
13
+ results.first['host'].should == 'localhost'
14
+ results.first['url'].should == '/hoge/test'
15
+ end
16
+ end
@@ -0,0 +1,22 @@
1
+ require 'rspec'
2
+ require 'fluent/client/version'
3
+
4
+ include Fluent::Client
5
+
6
+ def capture_stdout
7
+ out = StringIO.new
8
+ $stdout = out
9
+ yield
10
+ return out.string
11
+ ensure
12
+ $stdout = STDOUT
13
+ end
14
+
15
+ def capture_stderr
16
+ out = StringIO.new
17
+ $stderr = out
18
+ yield
19
+ return out.string
20
+ ensure
21
+ $stderr = STDERR
22
+ end
metadata ADDED
@@ -0,0 +1,203 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Hiroshi Toyama
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.19.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.19.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: fluentd
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yajl-ruby
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: fluent-logger
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
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: activesupport
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.7.2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.7.2
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 10.3.2
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 10.3.2
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '2.4'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '2.4'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubygems-tasks
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.2'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.2'
139
+ - !ruby/object:Gem::Dependency
140
+ name: yard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.8'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.8'
153
+ description: fluentd command line utility
154
+ email: toyama0919@gmail.com
155
+ executables:
156
+ - fluent-client
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".document"
161
+ - ".gitignore"
162
+ - ".rspec"
163
+ - ".yardopts"
164
+ - ChangeLog.md
165
+ - Gemfile
166
+ - LICENSE.txt
167
+ - README.md
168
+ - Rakefile
169
+ - bin/fluent-client
170
+ - fluent-client.gemspec
171
+ - lib/fluent/client.rb
172
+ - lib/fluent/client/cli.rb
173
+ - lib/fluent/client/core.rb
174
+ - lib/fluent/client/version.rb
175
+ - spec/client_spec.rb
176
+ - spec/spec_helper.rb
177
+ homepage: https://github.com/toyama0919/fluent-client
178
+ licenses:
179
+ - MIT
180
+ metadata: {}
181
+ post_install_message:
182
+ rdoc_options: []
183
+ require_paths:
184
+ - lib
185
+ required_ruby_version: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ required_rubygems_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ requirements: []
196
+ rubyforge_project:
197
+ rubygems_version: 2.2.2
198
+ signing_key:
199
+ specification_version: 4
200
+ summary: fluentd command line utility
201
+ test_files:
202
+ - spec/client_spec.rb
203
+ - spec/spec_helper.rb