fluent-plugin-vertica-query 0.0.7

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: abc50c357a3a49197555d92cd9f4de03e4fa5b4a
4
+ data.tar.gz: 295737f289ead087497e5fb2c50c79f6695a008e
5
+ SHA512:
6
+ metadata.gz: ca7dec83f73c36e5a0e21205295ba05d0b0a63465a27f82b6cf8455a10c65488efd19f398213037d68fd0b6eb07ad8f214d0284fe1258da835f8d802e11f87f6
7
+ data.tar.gz: 24dc3efbc6d94f4b5b1785d738e7dc2b17b7f35fe2424fc50d1afab513d03aee10bf8e0301e1127006063ffea9869fa9780ef52e86e1ecf514cf321a98add66d
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .idea
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.1
5
+ - 2.0.0
6
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in fluent-plugin-munin.gemspec
4
+ gemspec
@@ -0,0 +1,14 @@
1
+ Copyright (c) 2012- Kentaro Yoshida
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
14
+
@@ -0,0 +1,69 @@
1
+ fluent-plugin-vertica-query
2
+ ===========================
3
+
4
+ Fluentd Input plugin to execute vertica query and fetch rows. It is useful for stationary interval metrics measurement.
5
+
6
+ ## Installation
7
+
8
+ install with gem or fluent-gem command as:
9
+
10
+ ```
11
+ # for fluentd
12
+ $ gem install fluent-plugin-vertica-query
13
+
14
+ # for td-agent
15
+ $ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-vertica-query
16
+ ```
17
+
18
+ ## Configuration
19
+
20
+ ### Config Sample
21
+ `````
22
+ <source>
23
+ type vertica_query
24
+ host localhost # Optional (default: localhost)
25
+ port 5433 # Optional (default: 5433)
26
+ username nagios # Optional (default: dbadmin)
27
+ password passw0rd # Optional (default not set)
28
+ interval 30s # Optional (default: 1m)
29
+ database db # Optional (default: not set as there is only one database per cluster)
30
+ ssl true # Optional connection via ssl (default: false)
31
+ role pseudosuperuser # Optional additional role(s) to set for the user
32
+ search_path test_date # Optional (default: not set)
33
+ tag input.vertica # Required
34
+ query SELECT * FROM V_CATALOG.RESOURCE_POOLS; # Required
35
+ # record hostname into message.
36
+ record_host yes # Optional (default: no)
37
+ # multi row results into nested record or separated message.
38
+ nest_result yes # Optional (default: no)
39
+ nest_key data # Optional (default: result)
40
+ # record the number of lines of a query result
41
+ row_count yes # Optional (default: no)
42
+ row_count_key row_count # Optional (default: row_count)
43
+ </source>
44
+
45
+ <match input.vertica>
46
+ type stdout
47
+ </match>
48
+ `````
49
+
50
+ ### Output Sample
51
+ record_hostname: yes, nest_result: no
52
+ `````
53
+ input.vertica: {"hostname":"myhost.example.com","Variable_name":"thread_cache_size","Value":"16"}
54
+ input.vertica: {"hostname":"myhost.example.com","Variable_name":"thread_stack","Value":"262144"}
55
+ `````
56
+ record_hostname: yes, nest_result: yes, nest_key: data
57
+ `````
58
+ input.vertica: {"hostname":"myhost.example.com","data":[{"Variable_name":"thread_cache_size","Value":"16"},{"Variable_name":"thread_stack","Value":"262144"}]}
59
+ `````
60
+ record_hostname: yes, nest_result: yes, nest_key: data, row_count: yes, row_count_key: row_count
61
+ `````
62
+ input.vertica: {"hostname":"myhost.example.com","row_count":2,"data":[{"Variable_name":"thread_cache_size","Value":"16"},{"Variable_name":"thread_stack","Value":"262144"}]}
63
+ `````
64
+
65
+ ### Example Query
66
+ * SELECT MAX(id) AS max_foo_id FROM foo_table;
67
+ * SELECT * FROM nodes;
68
+ * SELECT * FROM V_CATALOG.RESOURCE_POOLS;
69
+ * SELECT user_id, memory_cap_kb FROM users WHERE resource_pool='general';
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+ Rake::TestTask.new(:test) do |test|
4
+ test.libs << 'lib' << 'test'
5
+ test.pattern = 'test/**/test_*.rb'
6
+ test.verbose = true
7
+ end
8
+
9
+ task :default => :test
10
+
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "fluent-plugin-vertica-query"
6
+ s.version = "0.0.7"
7
+ s.authors = ["John Dodson"]
8
+ s.email = ["john.dodson@intentmedia.com"]
9
+ s.homepage = "https://github.com/intentmedia/fluent-plugin-vertica-query"
10
+ s.summary = %q{Fluentd Input plugin to execute Vertica query and fetch rows. It is useful for stationary interval metrics measurement. Forked from Kentaro Yoshida's fluent-plugin-mysql-query gem.}
11
+
12
+ s.files = `git ls-files`.split("\n")
13
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
15
+ s.require_paths = ["lib"]
16
+
17
+ s.add_development_dependency "rake"
18
+ s.add_runtime_dependency "fluentd"
19
+ s.add_runtime_dependency "vertica"
20
+ end
@@ -0,0 +1,100 @@
1
+ module Fluent
2
+ class VerticaQueryInput < Fluent::Input
3
+ Plugin.register_input('vertica_query', self)
4
+
5
+ def initialize
6
+ require 'vertica'
7
+ require 'socket'
8
+ super
9
+ end
10
+
11
+ config_param :host, :string, :default => 'localhost'
12
+ config_param :port, :integer, :default => 5433
13
+ config_param :username, :string, :default => 'dbadmin'
14
+ config_param :password, :string, :default => nil
15
+ config_param :database, :string, :default => nil
16
+ config_param :ssl, :bool, :default => false # use SSL for the connection
17
+ config_param :role, :string, :default => nil # the (additional) role(s) to enable for the user.
18
+ config_param :search_path, :string, :default => nil
19
+ config_param :encoding, :string, :default => 'utf8'
20
+ config_param :interval, :time, :default => '1m'
21
+ config_param :nest_result, :bool, :default => false
22
+ config_param :nest_key, :string, :default => 'result'
23
+ config_param :row_count, :bool, :default => false
24
+ config_param :row_count_key, :string, :default => 'row_count'
25
+ config_param :record_host, :bool, :default => false
26
+ config_param :tag, :string
27
+ config_param :query, :string
28
+
29
+ def configure(conf)
30
+ super
31
+ @hostname = nil
32
+ $log.info "adding vertica_query job: [#{@query}] interval: #{@interval}sec"
33
+ end
34
+
35
+ def start
36
+ @thread = Thread.new(&method(:run))
37
+ end
38
+
39
+ def shutdown
40
+ Thread.kill(@thread)
41
+ end
42
+
43
+ def run
44
+ loop do
45
+ tag = "#{@tag}".gsub('__HOSTNAME__', @host).gsub('${hostname}', @host)
46
+ record = Hash.new
47
+ record.store('host', @host) if @record_host
48
+ result = get_exec_result
49
+ record.store(@row_count_key, result.size) if @row_count
50
+ if (@nest_result)
51
+ record.store(@nest_key, result)
52
+ Engine.emit(tag, Engine.now, record)
53
+ else
54
+ result.each do |data|
55
+ Engine.emit(tag, Engine.now, record.merge(data))
56
+ end
57
+ end
58
+ sleep @interval
59
+ end
60
+ end
61
+
62
+ def get_connection
63
+ begin
64
+ return Vertica.connect({
65
+ :host => @host,
66
+ :port => @port,
67
+ :username => @username,
68
+ :password => @password,
69
+ :database => @database,
70
+ :encoding => @encoding,
71
+ :reconnect => true
72
+ })
73
+ rescue Exception => e
74
+ $log.warn "vertica_query: #{e}"
75
+ sleep @interval
76
+ retry
77
+ end
78
+ end
79
+
80
+ def query(query)
81
+ @vertica ||= get_connection
82
+ begin
83
+ return @vertica.query(query)
84
+ rescue Exception => e
85
+ $log.warn "vertica_query: #{e}"
86
+ sleep @interval
87
+ retry
88
+ end
89
+ end
90
+
91
+ def get_exec_result
92
+ result = Array.new
93
+ stmt = query(@query)
94
+ stmt.each do |row|
95
+ result.push(row)
96
+ end
97
+ return result
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+
12
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
14
+ require 'fluent/test'
15
+ unless ENV.has_key?('VERBOSE')
16
+ nulllogger = Object.new
17
+ nulllogger.instance_eval {|obj|
18
+ def method_missing(method, *args)
19
+ # pass
20
+ end
21
+ }
22
+ $log = nulllogger
23
+ end
24
+
25
+ require 'fluent/plugin/in_vertica_query'
26
+
27
+ class Test::Unit::TestCase
28
+ end
@@ -0,0 +1,40 @@
1
+ require 'helper'
2
+
3
+ class VerticaQueryInputTest < Test::Unit::TestCase
4
+ def setup
5
+ Fluent::Test.setup
6
+ end
7
+
8
+ CONFIG = %[
9
+ host localhost
10
+ port 5433
11
+ interval 30
12
+ tag input.vertica
13
+ query \echo test
14
+ record_host yes
15
+ ]
16
+
17
+ def create_driver(conf=CONFIG,tag='test')
18
+ Fluent::Test::OutputTestDriver.new(Fluent::VerticaQueryInput, tag).configure(conf)
19
+ end
20
+
21
+ def test_configure
22
+ assert_raise(Fluent::ConfigError) {
23
+ d = create_driver('')
24
+ }
25
+ d = create_driver %[
26
+ host localhost
27
+ port 5433
28
+ interval 30
29
+ tag input.vertica
30
+ query \echo test
31
+ record_host yes
32
+ ]
33
+ assert_equal 'localhost', d.instance.host
34
+ assert_equal 5433, d.instance.port
35
+ assert_equal 30, d.instance.interval
36
+ assert_equal 'input.vertica', d.instance.tag
37
+ assert_equal true, d.instance.record_host
38
+ assert_equal false, d.instance.nest_result
39
+ end
40
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-vertica-query
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.7
5
+ platform: ruby
6
+ authors:
7
+ - John Dodson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
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: vertica
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
+ description:
56
+ email:
57
+ - john.dodson@intentmedia.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - ".travis.yml"
64
+ - Gemfile
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - fluent-plugin-vertica-query.gemspec
69
+ - lib/fluent/plugin/in_vertica_query.rb
70
+ - test/helper.rb
71
+ - test/plugin/test_in_vertica_query.rb
72
+ homepage: https://github.com/intentmedia/fluent-plugin-vertica-query
73
+ licenses: []
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project:
91
+ rubygems_version: 2.2.2
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: Fluentd Input plugin to execute Vertica query and fetch rows. It is useful
95
+ for stationary interval metrics measurement. Forked from Kentaro Yoshida's fluent-plugin-mysql-query
96
+ gem.
97
+ test_files:
98
+ - test/helper.rb
99
+ - test/plugin/test_in_vertica_query.rb