netdata-client 1.3.0 → 1.3.1
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/Rakefile +4 -4
- data/exe/netdatacli +4 -4
- data/lib/netdata/client/controller.rb +11 -61
- data/lib/netdata/client/helper/data_aggregator.rb +72 -0
- data/lib/netdata/client/helper/network.rb +4 -3
- data/lib/netdata/client/version.rb +1 -1
- data/lib/netdata/client.rb +10 -8
- data/netdata-client.gemspec +11 -11
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f135a517b6df6c479328589612bb49daaecd1146
|
4
|
+
data.tar.gz: 85847fd61b274f20155eb9dafdd10fcabbd4adf3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ea7479044223aa0a6f17639ddc3f3a017918d19181f3e6b121ad958c7b77751c4535abafcba1eace7b4bf947c1db9d53331504ec0f6e103047a5ca0c03e54e6
|
7
|
+
data.tar.gz: dc7916e2f0f0ece3c45e071b96345ab555ffdddfcaf9ab3f5caef990d191a3af6b298858da495453af22f3345eb3b785ee139865300d217a0f56083f1c38a4bd
|
data/Rakefile
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
3
|
|
4
4
|
Rake::TestTask.new(:test) do |t|
|
5
|
-
t.libs <<
|
6
|
-
t.libs <<
|
5
|
+
t.libs << 'test'
|
6
|
+
t.libs << 'lib'
|
7
7
|
t.test_files = FileList['test/**/*_test.rb']
|
8
8
|
end
|
9
9
|
|
data/exe/netdatacli
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
lib = File.expand_path('../../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
|
5
|
-
require
|
6
|
-
require
|
5
|
+
require 'netdata/client'
|
6
|
+
require 'optparse'
|
7
7
|
|
8
8
|
main = false
|
9
9
|
|
10
10
|
OptionParser.new do |opt|
|
11
|
-
# opt.banner =
|
11
|
+
# opt.banner = 'netdatacli [...flags]'
|
12
12
|
|
13
|
-
opt.on(
|
13
|
+
opt.on('-m', '--2min', 'Trigger the 2 minute actions') { |o| main = true }
|
14
14
|
end.parse!
|
15
15
|
|
16
16
|
client = Netdata::Client::Controller.new
|
@@ -3,7 +3,8 @@ module Netdata
|
|
3
3
|
class Controller
|
4
4
|
def initialize
|
5
5
|
@network = Helper::Network.new
|
6
|
-
@
|
6
|
+
@aggregator = Helper::DataAggregator.new
|
7
|
+
@config = ::YAML::load_file(File.expand_path('~/.netdatacli.yml'))
|
7
8
|
end
|
8
9
|
|
9
10
|
def report_interval_2_mins
|
@@ -13,22 +14,19 @@ module Netdata
|
|
13
14
|
return unless @config
|
14
15
|
|
15
16
|
@config["instances"].each do |url|
|
16
|
-
alarms = @network.get(
|
17
|
+
alarms = @network.get('alarms', url, {})
|
17
18
|
|
18
19
|
return unless alarms
|
19
20
|
|
20
|
-
alarms_resp = parse_alarms(JSON.parse(alarms.body))
|
21
|
-
|
22
|
-
# system CPU stats
|
23
|
-
cpu_value = get_cpu(url)
|
21
|
+
alarms_resp = @aggregator.parse_alarms(JSON.parse(alarms.body))
|
24
22
|
|
25
23
|
# CPU on a per-user basis
|
26
|
-
users_cpu_value_history, users_cpu_value, users_cpu_users = get_cpu_users(url)
|
24
|
+
users_cpu_value_history, users_cpu_value, users_cpu_users = @aggregator.get_cpu_users(url)
|
27
25
|
|
28
|
-
aggregator[alarms_resp[
|
29
|
-
aggregator[alarms_resp[
|
30
|
-
aggregator[alarms_resp[
|
31
|
-
aggregator[alarms_resp[
|
26
|
+
aggregator[alarms_resp['hostname']] = {}
|
27
|
+
aggregator[alarms_resp['hostname']][:cpu] = @aggregator.get_cpu(url)
|
28
|
+
aggregator[alarms_resp['hostname']][:users_cpu] = { users: users_cpu_users, value: users_cpu_value, history: users_cpu_value_history.select { |val| val > threshold } }
|
29
|
+
aggregator[alarms_resp['hostname']][:alarms] = alarms_resp unless alarms_resp['alarms'].nil?
|
32
30
|
end
|
33
31
|
|
34
32
|
pp aggregator
|
@@ -36,7 +34,7 @@ module Netdata
|
|
36
34
|
aggregator.each_pair do |host, data|
|
37
35
|
# new thread for each host so we can see mulitple notifications
|
38
36
|
Thread.new {
|
39
|
-
message =
|
37
|
+
message = ''
|
40
38
|
message += "CPU Warning - #{data[:cpu].round(2)}%\n" if data[:cpu] > threshold
|
41
39
|
message += "#{data[:users_cpu][:users].size} system users active (#{data[:users_cpu][:value].round(2)}% CPU)\n" if data[:users_cpu][:value] > threshold
|
42
40
|
message += "Alarms are ringing\n" if data[:alarms]
|
@@ -46,54 +44,6 @@ module Netdata
|
|
46
44
|
}.join
|
47
45
|
end
|
48
46
|
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
def parse_alarms(data)
|
53
|
-
out = data.dup
|
54
|
-
out["alarms"] = nil
|
55
|
-
|
56
|
-
return {} if data["alarms"].empty?
|
57
|
-
|
58
|
-
data['alarms'].each do |alarm|
|
59
|
-
alarm_name = alarm[0]
|
60
|
-
alarm_value = alarm[1]
|
61
|
-
out["alarms"] = alarm_value unless alarm_value["recipient"] == 'silent'
|
62
|
-
end
|
63
|
-
|
64
|
-
out
|
65
|
-
end
|
66
|
-
|
67
|
-
def get_cpu(url)
|
68
|
-
cpu_opts = {
|
69
|
-
"chart" => "system.cpu",
|
70
|
-
"format" => "array",
|
71
|
-
"points" => 54,
|
72
|
-
"group" => "average",
|
73
|
-
"options" => "absolute|jsonwrap|nonzero",
|
74
|
-
"after" => -540
|
75
|
-
}
|
76
|
-
cpu = @network.get("data", url, cpu_opts)
|
77
|
-
cpu_value = JSON.parse(cpu.body)["result"].first
|
78
|
-
end
|
79
|
-
|
80
|
-
def get_cpu_users(url)
|
81
|
-
users_cpu_opts = {
|
82
|
-
"chart" => "users.cpu",
|
83
|
-
"format" => "array",
|
84
|
-
"points" => 54,
|
85
|
-
"group" => "average",
|
86
|
-
"options" => "absolute|jsonwrap|nonzero",
|
87
|
-
"after" => -540
|
88
|
-
}
|
89
|
-
users_cpu = @network.get("data", url, users_cpu_opts)
|
90
|
-
users_cpu_resp = JSON.parse(users_cpu.body)
|
91
|
-
users_cpu_value = users_cpu_resp["result"].first
|
92
|
-
users_cpu_value_history = users_cpu_resp["result"][0..119]
|
93
|
-
users_cpu_users = users_cpu_resp["dimension_names"]
|
94
|
-
|
95
|
-
[users_cpu_value_history, users_cpu_value, users_cpu_users]
|
96
|
-
end
|
97
47
|
end
|
98
48
|
end
|
99
|
-
end
|
49
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Netdata
|
2
|
+
module Client
|
3
|
+
module Helper
|
4
|
+
# Organize and parse data for certain flags
|
5
|
+
class DataAggregator
|
6
|
+
# Initializer
|
7
|
+
def initialize
|
8
|
+
@network = Network.new
|
9
|
+
|
10
|
+
# CPU usage per-user request options
|
11
|
+
@users_cpu_opts = {
|
12
|
+
'chart' => 'users.cpu',
|
13
|
+
'format' => 'array',
|
14
|
+
'points' => 54,
|
15
|
+
'group' => 'average',
|
16
|
+
'options' => 'absolute|jsonwrap|nonzero',
|
17
|
+
'after' => -540
|
18
|
+
}
|
19
|
+
|
20
|
+
# raw CPU request options
|
21
|
+
@cpu_opts = {
|
22
|
+
'chart' => 'system.cpu',
|
23
|
+
'format' => 'array',
|
24
|
+
'points' => 54,
|
25
|
+
'group' => 'average',
|
26
|
+
'options' => 'absolute|jsonwrap|nonzero',
|
27
|
+
'after' => -540
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
# ...
|
32
|
+
# Params:
|
33
|
+
def parse_alarms(data)
|
34
|
+
out = data.dup
|
35
|
+
|
36
|
+
return { 'hostname' => data['hostname'] } if data['alarms'].empty?
|
37
|
+
|
38
|
+
out['alarms'] = nil
|
39
|
+
|
40
|
+
data['alarms'].each do |alarm|
|
41
|
+
alarm_value = alarm[1]
|
42
|
+
recipient = alarm_value['recipient']
|
43
|
+
out['alarms'] = alarm_value unless recipient == 'silent'
|
44
|
+
end
|
45
|
+
|
46
|
+
out
|
47
|
+
end
|
48
|
+
|
49
|
+
# ...
|
50
|
+
# Params:
|
51
|
+
def get_cpu(url)
|
52
|
+
cpu = @network.get('data', url, @cpu_opts)
|
53
|
+
|
54
|
+
JSON.parse(cpu.body)['result'].first
|
55
|
+
end
|
56
|
+
|
57
|
+
# ...
|
58
|
+
# Params:
|
59
|
+
def get_cpu_users(url)
|
60
|
+
users_cpu = @network.get('data', url, @users_cpu_opts)
|
61
|
+
|
62
|
+
users_cpu_resp = JSON.parse(users_cpu.body)
|
63
|
+
users_cpu_value = users_cpu_resp['result'].first
|
64
|
+
users_cpu_value_history = users_cpu_resp['result'][0..119]
|
65
|
+
users_cpu_users = users_cpu_resp['dimension_names']
|
66
|
+
|
67
|
+
[users_cpu_value_history, users_cpu_value, users_cpu_users]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module Netdata
|
2
2
|
module Client
|
3
3
|
module Helper
|
4
|
+
# Perform HTTP requests
|
4
5
|
class Network
|
5
6
|
# Access the configuration object instance externally
|
6
7
|
attr_accessor :config
|
@@ -9,7 +10,7 @@ module Netdata
|
|
9
10
|
# Params:
|
10
11
|
# +url+:: The URL you want to hit
|
11
12
|
# +key+:: The authentication key to pass via headers to the URL
|
12
|
-
def get(endpoint, url, args, version =
|
13
|
+
def get(endpoint, url, args, version = 'v1')
|
13
14
|
qs = build_qs(args)
|
14
15
|
req_url = "#{url}/api/#{version}/#{endpoint}?#{qs}"
|
15
16
|
|
@@ -20,7 +21,7 @@ module Netdata
|
|
20
21
|
# Params:
|
21
22
|
# +url+:: The URL you want to hit
|
22
23
|
# +key+:: The authentication key to pass via headers to the URL
|
23
|
-
def post(endpoint, url, args, version =
|
24
|
+
def post(endpoint, url, args, version = 'v1')
|
24
25
|
qs = build_qs(args)
|
25
26
|
req_url = "#{url}/api/#{version}/#{endpoint}?#{qs}"
|
26
27
|
|
@@ -56,7 +57,7 @@ module Netdata
|
|
56
57
|
# Params:
|
57
58
|
# +args+:: The hash
|
58
59
|
def build_qs(args)
|
59
|
-
args.map{|k, v| "#{k}=#{v}"}.join(
|
60
|
+
args.map { |k, v| "#{k}=#{v}" }.join('&')
|
60
61
|
end
|
61
62
|
end
|
62
63
|
end
|
data/lib/netdata/client.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
require 'yaml'
|
2
|
+
require 'json'
|
3
|
+
require 'net/http'
|
4
|
+
require 'notifaction'
|
5
|
+
require 'pp'
|
6
6
|
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
7
|
+
require 'netdata/client/controller'
|
8
|
+
require 'netdata/client/helper/network'
|
9
|
+
require 'netdata/client/helper/data_aggregator'
|
10
|
+
require 'netdata/client/version'
|
10
11
|
|
11
12
|
module Netdata
|
13
|
+
# Client module
|
12
14
|
module Client
|
13
15
|
# something...
|
14
16
|
end
|
data/netdata-client.gemspec
CHANGED
@@ -4,22 +4,22 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'netdata/client/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'netdata-client'
|
8
8
|
spec.version = Netdata::Client::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Ryan Priebe']
|
10
|
+
spec.email = ['rpriebe@me.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
12
|
+
spec.summary = 'Monitor your netdata instances, spawn OS notifications'
|
13
|
+
spec.homepage = 'http://github.com/aapis/netdata-client'
|
14
|
+
spec.license = 'MIT'
|
15
15
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
16
|
-
spec.bindir =
|
16
|
+
spec.bindir = 'exe'
|
17
17
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
18
|
-
spec.require_paths = [
|
18
|
+
spec.require_paths = ['lib']
|
19
19
|
|
20
20
|
spec.add_runtime_dependency 'notifaction'
|
21
21
|
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.12'
|
23
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
24
|
+
spec.add_development_dependency 'minitest', '~> 5.0'
|
25
25
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netdata-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Priebe
|
@@ -86,6 +86,7 @@ files:
|
|
86
86
|
- exe/netdatacli
|
87
87
|
- lib/netdata/client.rb
|
88
88
|
- lib/netdata/client/controller.rb
|
89
|
+
- lib/netdata/client/helper/data_aggregator.rb
|
89
90
|
- lib/netdata/client/helper/network.rb
|
90
91
|
- lib/netdata/client/version.rb
|
91
92
|
- netdata-client.gemspec
|