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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +3 -0
- data/README.md +3 -0
- data/VERSION +1 -0
- data/fluent-plugin-pg_stat.gemspec +22 -0
- data/lib/fluent/plugin/in_pg_stat.rb +116 -0
- metadata +103 -0
checksums.yaml
ADDED
@@ -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
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
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: []
|