telemetry-snmp 0.1.0 → 0.2.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 +4 -4
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +5 -0
- data/config.ru +7 -2
- data/exe/snmp_collector +15 -3
- data/lib/telemetry/snmp/api.rb +18 -0
- data/lib/telemetry/snmp/collector.rb +101 -0
- data/lib/telemetry/snmp/data/default_opts.rb +10 -10
- data/lib/telemetry/snmp/data/migrations/011_device_locks.rb +19 -0
- data/lib/telemetry/snmp/data/models/device.rb +1 -0
- data/lib/telemetry/snmp/data/models/device_lock.rb +11 -0
- data/lib/telemetry/snmp/data.rb +1 -1
- data/lib/telemetry/snmp/publisher.rb +11 -11
- data/lib/telemetry/snmp/version.rb +1 -1
- data/lib/telemetry/snmp.rb +1 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b1cf78bbce21aa906630c1e4430ed67805d3fa1332664c0048976ea12c92746
|
4
|
+
data.tar.gz: 0365001cb5dd2dd1767c76234e485b18e0f4c5727743489459b69e1832a478bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7dbd63ecd438e885bc22080aed5cf5044a7344671600134d93d77d07c89d6a2065b3d1558cfd1b30e84b44e8a718d581ad08d6436ed4af852c16ec43f14715d3
|
7
|
+
data.tar.gz: f3377fc61d505f6b165f8d85709d2ea7471933f4d3c83ecb2f50d4360c2e992dbc547114d722f344b65a72b1f94db1f633ba445df3bd82780bd9563b6d11b0cd
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/config.ru
CHANGED
@@ -8,8 +8,13 @@ require 'sinatra'
|
|
8
8
|
require 'oj'
|
9
9
|
require 'multi_json'
|
10
10
|
|
11
|
+
ENV['telemetry_snmp_amqp_nodes'] = 'apvrs33012'
|
12
|
+
ENV['telemetry_snmp_amqp_username'] = 'snmp'
|
13
|
+
ENV['telemetry_snmp_amqp_password'] = 'snmp'
|
14
|
+
ENV['telemetry_snmp_amqp_port'] = '8080'
|
15
|
+
ENV['telemetry_snmp_amqp_vhost'] = 'telegraf'
|
16
|
+
|
11
17
|
require 'telemetry/snmp'
|
12
18
|
require 'telemetry/snmp/api'
|
13
|
-
|
14
|
-
Telemetry::Snmp::Data.start!
|
19
|
+
Telemetry::Snmp.bootstrap
|
15
20
|
run Telemetry::Snmp::API
|
data/exe/snmp_collector
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
ENV['telemetry.snmp.amqp.nodes'] = 'apvrs33012'
|
4
|
+
ENV['telemetry.snmp.amqp.username'] = 'snmp'
|
5
|
+
ENV['telemetry.snmp.amqp.password'] = 'snmp'
|
6
|
+
ENV['telemetry.snmp.amqp.port'] = '8080'
|
7
|
+
ENV['telemetry.snmp.amqp.vhost'] = 'telegraf'
|
8
|
+
|
3
9
|
require 'telemetry/snmp'
|
4
10
|
Telemetry::Snmp.bootstrap
|
5
11
|
|
@@ -9,8 +15,10 @@ trap('SIGINT') { @quit = true }
|
|
9
15
|
|
10
16
|
@quit = false
|
11
17
|
until @quit
|
18
|
+
sleep(1)
|
12
19
|
@lines = []
|
13
|
-
Telemetry::Snmp::Data::Model::Device.each do |row|
|
20
|
+
Telemetry::Snmp::Data::Model::Device.where(:active).each do |row|
|
21
|
+
break if @quit
|
14
22
|
next if row.values[:last_polled].to_i + row.values[:frequency] > Time.now.to_i
|
15
23
|
|
16
24
|
fields = {}
|
@@ -20,10 +28,13 @@ until @quit
|
|
20
28
|
env: row.values[:environment],
|
21
29
|
dc: row.values[:datacenter],
|
22
30
|
zone: row.values[:zone],
|
23
|
-
influxdb_node_group: 'snmp'
|
31
|
+
influxdb_node_group: 'snmp',
|
32
|
+
influxdb_database: 'snmp'
|
24
33
|
}
|
25
34
|
|
26
35
|
Telemetry::Snmp::Data::Model::OID.each do |oid_row|
|
36
|
+
break if @quit
|
37
|
+
|
27
38
|
oid_value = Telemetry::Snmp::Client.oid_value(row[:hostname], oid_row.values[:oid])
|
28
39
|
next if oid_value.nil?
|
29
40
|
next unless oid_value.is_a?(Integer) || oid_value.is_a?(Float)
|
@@ -34,7 +45,7 @@ until @quit
|
|
34
45
|
end
|
35
46
|
|
36
47
|
@lines.push Telemetry::Metrics::Parser.to_line_protocol(
|
37
|
-
measurement: '
|
48
|
+
measurement: 'palo_alto',
|
38
49
|
fields: fields,
|
39
50
|
tags: tags,
|
40
51
|
timestamp: (DateTime.now.strftime('%Q').to_i * 1000 * 1000)
|
@@ -48,6 +59,7 @@ until @quit
|
|
48
59
|
row.save
|
49
60
|
rescue StandardError => e
|
50
61
|
Telemetry::Logger.error "#{e.class}: #{e.message}"
|
62
|
+
Telemetry::Logger.error e.backtrace[0..20]
|
51
63
|
end
|
52
64
|
|
53
65
|
Telemetry::Snmp::Publisher.push_lines(@lines) unless @lines.empty?
|
data/lib/telemetry/snmp/api.rb
CHANGED
@@ -37,6 +37,20 @@ module Telemetry
|
|
37
37
|
response.body = Oj.dump(response.body, mode: :compat) unless response.body.is_a? String
|
38
38
|
end
|
39
39
|
|
40
|
+
get '/' do
|
41
|
+
{
|
42
|
+
version: Telemetry::Snmp::VERSION,
|
43
|
+
migration_version: Telemetry::Snmp::Data.migration_version
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
get '' do
|
48
|
+
{
|
49
|
+
version: Telemetry::Snmp::VERSION,
|
50
|
+
migration_version: Telemetry::Snmp::Data.migration_version
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
40
54
|
get '/version' do
|
41
55
|
{
|
42
56
|
version: Telemetry::Snmp::VERSION,
|
@@ -44,6 +58,10 @@ module Telemetry
|
|
44
58
|
}
|
45
59
|
end
|
46
60
|
|
61
|
+
get '/loop_devices' do
|
62
|
+
Telemetry::Snmp::Collector.loop_devices
|
63
|
+
end
|
64
|
+
|
47
65
|
namespace('/users') { register Telemetry::Snmp::Controller::Users }
|
48
66
|
namespace('/devices/creds') { register Telemetry::Snmp::Controller::DeviceCreds }
|
49
67
|
namespace('/devices') { register Telemetry::Snmp::Controller::Devices }
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module Telemetry
|
2
|
+
module Snmp
|
3
|
+
module Collector
|
4
|
+
class << self
|
5
|
+
def worker_name
|
6
|
+
"#{::Socket.gethostname.tr('.', '_')}.#{::Process.pid}.#{Thread.current.object_id}"
|
7
|
+
end
|
8
|
+
|
9
|
+
def loop_devices
|
10
|
+
Telemetry::Snmp::Data::Model::Device.where(:active).each do |row|
|
11
|
+
next if row.values[:last_polled].to_i + row.values[:frequency] > Time.now.to_i
|
12
|
+
next if device_locked?(row.values[:id])
|
13
|
+
|
14
|
+
collect(row.values[:id])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def unlock_expired_devices
|
19
|
+
Telemetry::Snmp::Data::Model::DeviceLock.each do |row|
|
20
|
+
next if row.values[:expires] < Sequel::CURRENT_TIMESTAMP
|
21
|
+
|
22
|
+
row.delete
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def device_locked?(device_id)
|
27
|
+
!Telemetry::Snmp::Data::Model::DeviceLock[device_id: device_id].nil?
|
28
|
+
end
|
29
|
+
|
30
|
+
def lock_device(device_id)
|
31
|
+
return false unless Telemetry::Snmp::Data::Model::DeviceLock[device_id: device_id].nil?
|
32
|
+
|
33
|
+
Telemetry::Snmp::Data::Model::DeviceLock.insert(
|
34
|
+
worker_name: worker_name,
|
35
|
+
device_id: device_id,
|
36
|
+
created: Sequel::CURRENT_TIMESTAMP,
|
37
|
+
expires: Sequel::CURRENT_TIMESTAMP
|
38
|
+
)
|
39
|
+
true
|
40
|
+
end
|
41
|
+
|
42
|
+
# noinspection RubyArgCount
|
43
|
+
def unlock_device(device_id)
|
44
|
+
device = Telemetry::Snmp::Data::Model::DeviceLock[device_id: device_id]
|
45
|
+
return true if device.nil?
|
46
|
+
|
47
|
+
device.delete
|
48
|
+
end
|
49
|
+
|
50
|
+
def collect(device_id)
|
51
|
+
lock_device(device_id)
|
52
|
+
row = Telemetry::Snmp::Data::Model::Device[device_id]
|
53
|
+
lines = []
|
54
|
+
fields = {}
|
55
|
+
tags = {
|
56
|
+
hostname: row.values[:hostname],
|
57
|
+
ip_address: row.values[:ip_address],
|
58
|
+
env: row.values[:environment],
|
59
|
+
dc: row.values[:datacenter],
|
60
|
+
zone: row.values[:zone],
|
61
|
+
influxdb_node_group: 'snmp',
|
62
|
+
influxdb_database: 'snmp'
|
63
|
+
}
|
64
|
+
|
65
|
+
Telemetry::Snmp::Data::Model::OID.each do |oid_row|
|
66
|
+
break if @quit
|
67
|
+
|
68
|
+
oid_value = Telemetry::Snmp::Client.oid_value(row[:hostname], oid_row.values[:oid])
|
69
|
+
next if oid_value.nil?
|
70
|
+
next unless oid_value.is_a?(Integer) || oid_value.is_a?(Float)
|
71
|
+
|
72
|
+
fields[oid_row.values[:name]] =
|
73
|
+
"#{Telemetry::Snmp::Client.oid_value(row[:hostname], oid_row.values[:oid])}i"
|
74
|
+
rescue StandardError => e
|
75
|
+
Telemetry::Logger.error "#{e.class}: #{e.message}"
|
76
|
+
end
|
77
|
+
|
78
|
+
lines.push Telemetry::Metrics::Parser.to_line_protocol(
|
79
|
+
measurement: 'palo_alto',
|
80
|
+
fields: fields,
|
81
|
+
tags: tags,
|
82
|
+
timestamp: (DateTime.now.strftime('%Q').to_i * 1000 * 1000)
|
83
|
+
)
|
84
|
+
|
85
|
+
walker = Telemetry::Snmp::Client.grab_oid_metrics(row.values[:hostname])
|
86
|
+
Telemetry::Logger.info "Pushing #{walker.count} lines for #{row.values[:hostname]}" unless walker.empty?
|
87
|
+
Telemetry::Snmp::Publisher.push_lines(walker) unless walker.empty?
|
88
|
+
|
89
|
+
row.update(last_polled: Sequel::CURRENT_TIMESTAMP)
|
90
|
+
row.save
|
91
|
+
|
92
|
+
Telemetry::Snmp::Publisher.push_lines(lines) unless lines.empty?
|
93
|
+
unlock_device(device_id)
|
94
|
+
rescue StandardError => e
|
95
|
+
Telemetry::Logger.exception(e, level: 'error')
|
96
|
+
unlock_device(device_id)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -19,52 +19,52 @@ module Telemetry
|
|
19
19
|
module_function :default_credentials
|
20
20
|
|
21
21
|
def adapter
|
22
|
-
ENV["#{env_key}
|
22
|
+
ENV["#{env_key}_adapter"] == 'postgres' ? 'postgres' : 'mysql2'
|
23
23
|
end
|
24
24
|
module_function :adapter
|
25
25
|
|
26
26
|
def username
|
27
|
-
ENV["#{env_key}
|
27
|
+
ENV["#{env_key}_username"] || 'root'
|
28
28
|
end
|
29
29
|
module_function :username
|
30
30
|
|
31
31
|
def password
|
32
|
-
ENV["#{env_key}
|
32
|
+
ENV["#{env_key}_password"] || nil
|
33
33
|
end
|
34
34
|
module_function :password
|
35
35
|
|
36
36
|
def database
|
37
|
-
ENV["#{env_key}
|
37
|
+
ENV["#{env_key}_database"] || 'telemetry_snmp'
|
38
38
|
end
|
39
39
|
module_function :database
|
40
40
|
|
41
41
|
def host
|
42
|
-
ENV["#{env_key}
|
42
|
+
ENV["#{env_key}_host"] || '127.0.0.1'
|
43
43
|
end
|
44
44
|
module_function :host
|
45
45
|
|
46
46
|
def port
|
47
|
-
ENV.key?("#{env_key}
|
47
|
+
ENV.key?("#{env_key}_port") ? ENV["#{env_key}_port"].to_i : 3306
|
48
48
|
end
|
49
49
|
module_function :port
|
50
50
|
|
51
51
|
def max_connections
|
52
|
-
ENV.key?("#{env_key}
|
52
|
+
ENV.key?("#{env_key}_max_connections") ? ENV["#{env_key}_max_connections"].to_i : 16
|
53
53
|
end
|
54
54
|
module_function :max_connections
|
55
55
|
|
56
56
|
def pool_timeout
|
57
|
-
ENV.key?("#{env_key}
|
57
|
+
ENV.key?("#{env_key}_pool_timeout") ? ENV["#{env_key}_pool_timeout"].to_i : 2
|
58
58
|
end
|
59
59
|
module_function :pool_timeout
|
60
60
|
|
61
61
|
def preconnect
|
62
|
-
ENV["#{env_key}
|
62
|
+
ENV["#{env_key}_preconnect"] || 'concurrently'
|
63
63
|
end
|
64
64
|
module_function :preconnect
|
65
65
|
|
66
66
|
def env_key
|
67
|
-
|
67
|
+
'telemetry_snmp_data'
|
68
68
|
end
|
69
69
|
module_function :env_key
|
70
70
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Sequel.migration do
|
2
|
+
change do
|
3
|
+
create_table(:device_locks) do
|
4
|
+
primary_key :id
|
5
|
+
String :worker_name, null: false
|
6
|
+
foreign_key :device_id, :devices, null: false, unique: true
|
7
|
+
|
8
|
+
DateTime :created
|
9
|
+
DateTime :updated
|
10
|
+
DateTime :expires
|
11
|
+
|
12
|
+
index :device_id
|
13
|
+
index :worker_name
|
14
|
+
index :created
|
15
|
+
index :updated
|
16
|
+
index :expires
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/telemetry/snmp/data.rb
CHANGED
@@ -21,8 +21,8 @@ module Telemetry
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def username
|
24
|
-
if ENV.key? '
|
25
|
-
ENV['
|
24
|
+
if ENV.key? 'telemetry_snmp_amqp_username'
|
25
|
+
ENV['telemetry_snmp_amqp_username']
|
26
26
|
elsif opts[:amqp].key? :username
|
27
27
|
opts[:amqp][:username]
|
28
28
|
else
|
@@ -31,16 +31,16 @@ module Telemetry
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def password
|
34
|
-
ENV['
|
34
|
+
ENV['telemetry_snmp_amqp_password'] || opts[:amqp][:password] || 'guest'
|
35
35
|
end
|
36
36
|
|
37
37
|
def vhost
|
38
|
-
ENV['
|
38
|
+
ENV['telemetry_snmp_amqp_vhost'] || opts[:amqp][:vhost] || 'telemetry'
|
39
39
|
end
|
40
40
|
|
41
41
|
def port
|
42
|
-
if ENV.key? '
|
43
|
-
ENV['
|
42
|
+
if ENV.key? 'telemetry_snmp_amqp_port'
|
43
|
+
ENV['telemetry_snmp_amqp_port'].to_i
|
44
44
|
elsif opts[:amqp].key? :port
|
45
45
|
opts[:amqp][:port]
|
46
46
|
elsif use_ssl?
|
@@ -51,8 +51,8 @@ module Telemetry
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def use_ssl?
|
54
|
-
if ENV.key? '
|
55
|
-
%w[1 true].include? ENV['
|
54
|
+
if ENV.key? 'telemetry_snmp_amqp_use_ssl'
|
55
|
+
%w[1 true].include? ENV['telemetry_snmp_amqp_use_ssl']
|
56
56
|
elsif opts[:amqp].key?(:use_ssl)
|
57
57
|
opts[:amqp][:use_ssl]
|
58
58
|
else
|
@@ -61,8 +61,8 @@ module Telemetry
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def nodes
|
64
|
-
if ENV.key?('
|
65
|
-
ENV['
|
64
|
+
if ENV.key?('telemetry_snmp_amqp_nodes')
|
65
|
+
ENV['telemetry_snmp_amqp_nodes'].split(',')
|
66
66
|
elsif opts[:amqp].key?(:nodes)
|
67
67
|
opts[:amqp][:nodes]
|
68
68
|
else
|
@@ -71,7 +71,7 @@ module Telemetry
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def exchange_name
|
74
|
-
ENV['
|
74
|
+
ENV['telemetry_snmp_amqp_exchange_name'] || opts[:amqp][:exchange_name] || 'telemetry.snmp'
|
75
75
|
end
|
76
76
|
|
77
77
|
def session
|
data/lib/telemetry/snmp.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: telemetry-snmp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Esity
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -319,6 +319,7 @@ files:
|
|
319
319
|
- lib/telemetry/snmp/auth.rb
|
320
320
|
- lib/telemetry/snmp/auth/defaults.rb
|
321
321
|
- lib/telemetry/snmp/client.rb
|
322
|
+
- lib/telemetry/snmp/collector.rb
|
322
323
|
- lib/telemetry/snmp/controllers/device_creds.rb
|
323
324
|
- lib/telemetry/snmp/controllers/devices.rb
|
324
325
|
- lib/telemetry/snmp/controllers/oid_groups.rb
|
@@ -337,8 +338,10 @@ files:
|
|
337
338
|
- lib/telemetry/snmp/data/migrations/008_create_walks_table.rb
|
338
339
|
- lib/telemetry/snmp/data/migrations/009_create_tag_name_column.rb
|
339
340
|
- lib/telemetry/snmp/data/migrations/010_create_user_audit_table.rb
|
341
|
+
- lib/telemetry/snmp/data/migrations/011_device_locks.rb
|
340
342
|
- lib/telemetry/snmp/data/models/device.rb
|
341
343
|
- lib/telemetry/snmp/data/models/device_cred.rb
|
344
|
+
- lib/telemetry/snmp/data/models/device_lock.rb
|
342
345
|
- lib/telemetry/snmp/data/models/oid.rb
|
343
346
|
- lib/telemetry/snmp/data/models/oid_group.rb
|
344
347
|
- lib/telemetry/snmp/data/models/oid_oid_groups.rb
|