fluent-plugin-pg_stat 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: ff4064c361117b317d6392be4db0616da7d7ed38
4
+ data.tar.gz: 13860097aa685ef76369d701a5f4ef6a83749326
5
+ SHA512:
6
+ metadata.gz: 6ce1753b2509c3185299cd863f6b200bee19ab65877b2e72a65c2f16c44811fca83d1245d7e934d5a686a8c9732dc877f439ebb7f76e22f65b510be35a7eaf7d
7
+ data.tar.gz: 66acfca77d35264dc04a9374aae96150a707ce9365da5ceb98bdb575fbd8d899f96d232a70b6f833b2ee4e49fd5829e3bc3e1b19f3ffbb63bf6e23a6513211ef
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,3 @@
1
+ # fluent-plugin-pg\_stat
2
+
3
+ PostgreSQL stat input plugin for Fleuentd
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = 'fluent-plugin-pg_stat'
6
+ gem.description = 'PostgreSQL stat input plugin for Fleuentd'
7
+ gem.homepage = 'https://github.com/hagihala/fluent-plugin-pg_stat'
8
+ gem.summary = gem.description
9
+ gem.licenses = ['Apache-2.0']
10
+ gem.version = File.read('VERSION').strip
11
+ gem.authors = ['Yusuke Hagihara']
12
+ gem.email = 'yusuke.hagihara@gmail.com'
13
+ gem.has_rdoc = false
14
+ gem.files = `git ls-files`.split("\n")
15
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ gem.require_paths = ['lib']
18
+
19
+ gem.add_dependency 'fluentd', ['>= 0.12.0', '< 2']
20
+ gem.add_dependency 'pg', '~> 0.19', '>= 0.19.0'
21
+ gem.add_development_dependency 'rake', '~> 12'
22
+ end
@@ -0,0 +1,116 @@
1
+ require 'fluent/input'
2
+ require 'json'
3
+ require 'pg'
4
+
5
+ module Fluent
6
+ class PgStatStatementsInput < Input
7
+ Plugin.register_input('pg_stat_statements', self)
8
+
9
+ class << self
10
+ unless method_defined?(:desc)
11
+ def desc(description)
12
+ end
13
+ end
14
+ end
15
+
16
+ desc 'PostgreSQL host'
17
+ config_param :host, :string
18
+ desc 'RDBMS port (default: 5432)'
19
+ config_param :port, :integer, default: 5432
20
+ desc 'login user name'
21
+ config_param :username, :string, default: nil
22
+ desc 'login password'
23
+ config_param :password, :string, default: nil, secret: true
24
+ desc 'past to store last value'
25
+ config_param :state_file, :string, default: nil
26
+ desc 'tag'
27
+ config_param :tag, :string, default: nil
28
+ desc 'interval in second to run SQLs (optional)'
29
+ config_param :select_interval, :time, default: 60
30
+
31
+ define_method(:log) { $log } unless method_defined?(:log)
32
+
33
+ def configure(conf)
34
+ super
35
+
36
+ @column_names = %w(
37
+ calls total_time rows
38
+ shared_blks_hit shared_blks_read shared_blks_dirtied shared_blks_written
39
+ local_blks_hit local_blks_read local_blks_dirtied local_blks_written
40
+ temp_blks_read temp_blks_written
41
+ blk_read_time blk_write_time
42
+ )
43
+ end
44
+
45
+ def start
46
+ @conn = PG.connect(
47
+ host: @host,
48
+ dbname: 'postgres',
49
+ user: @username,
50
+ password: @password
51
+ )
52
+ @conn.type_map_for_results = PG::BasicTypeMapForResults.new @conn
53
+
54
+ @stop_flag = false
55
+ @thread = Thread.new(&method(:thread_main))
56
+ end
57
+
58
+ def shutdown
59
+ @stop_flag = true
60
+ $log.debug 'Waiting for thread to finish'
61
+ @thread.join
62
+ end
63
+
64
+ def thread_main
65
+ until @stop_flag
66
+ sleep 60
67
+
68
+ begin
69
+ me = MultiEventStream.new
70
+ begin
71
+ old_metrics = JSON.parse(IO.read(@state_file))
72
+ rescue => e
73
+ $log.info e
74
+ old_metrics = {}
75
+ end
76
+ new_metrics = {}
77
+
78
+ # More than one records of the same query string can exist
79
+ # because queries longer than xxx bbytes are truncated.
80
+ # Treat them as identical.
81
+ now = Engine.now
82
+ @conn.exec(<<-EOS
83
+ select query, #{@column_names.map{|col| "cast (sum(#{col}) as double precision) as #{col}"}.join(', ')} from pg_stat_statements group by query order by total_time desc
84
+ EOS
85
+ ).each do |row|
86
+ new_metrics['timestamp'] = now.to_f
87
+ query = row['query']
88
+ new_metrics[query] = {}
89
+
90
+ @column_names.each do |col|
91
+ new_metrics[query][col] = row[col]
92
+ row[col] = if !old_metrics[query].nil? && old_metrics[query][col].is_a?(Numeric)
93
+ val = (row[col] - old_metrics[query][col]) * 60 / (new_metrics['timestamp'] - old_metrics['timestamp'])
94
+ val >= 0 ? val : nil
95
+ end
96
+ end
97
+
98
+ # Calculate average values
99
+ if row['calls'].is_a?(Numeric) && row['calls'] != 0
100
+ row['avg_rows'] = row['rows'] / row['calls'] if row['rows'].is_a? Numeric
101
+ row['avg_time'] = row['total_time'] / row['calls'] if row['total_time'].is_a? Numeric
102
+ end
103
+
104
+ me.add(now, row)
105
+ end
106
+ @router.emit_stream(@tag, me)
107
+ IO.write(@state_file, new_metrics.to_json)
108
+
109
+ rescue => e
110
+ log.error 'unexpected error', error: e.message, error_class: e.class
111
+ log.error_backtrace e.backtrace
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-pg_stat
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yusuke Hagihara
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-01-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fluentd
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.12.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 0.12.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2'
33
+ - !ruby/object:Gem::Dependency
34
+ name: pg
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.19'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 0.19.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0.19'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 0.19.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: rake
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '12'
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '12'
67
+ description: PostgreSQL stat input plugin for Fleuentd
68
+ email: yusuke.hagihara@gmail.com
69
+ executables: []
70
+ extensions: []
71
+ extra_rdoc_files: []
72
+ files:
73
+ - ".gitignore"
74
+ - Gemfile
75
+ - README.md
76
+ - VERSION
77
+ - fluent-plugin-pg_stat.gemspec
78
+ - lib/fluent/plugin/in_pg_stat.rb
79
+ homepage: https://github.com/hagihala/fluent-plugin-pg_stat
80
+ licenses:
81
+ - Apache-2.0
82
+ metadata: {}
83
+ post_install_message:
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ requirements: []
98
+ rubyforge_project:
99
+ rubygems_version: 2.5.1
100
+ signing_key:
101
+ specification_version: 4
102
+ summary: PostgreSQL stat input plugin for Fleuentd
103
+ test_files: []