eznemo 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +25 -26
- data/eznemo.gemspec +2 -2
- data/lib/eznemo.rb +10 -2
- data/lib/eznemo/logger.rb +24 -0
- data/lib/eznemo/monitor.rb +1 -1
- data/lib/eznemo/monitor/ping.rb +1 -0
- data/lib/eznemo/mysql.rb +30 -12
- data/lib/eznemo/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 167ab32ba8c4cf65e9714b41289729a61942df54
|
4
|
+
data.tar.gz: b4f8ab53fff1342c65d339fc96c22474ede30f26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de094143e701ab83c769aa811e811db3b099748abb3d523bed7979818e1a45b1a3488e8a890501a79969cd8a77f7c4b295d18458f2de6a4e6af371d9ab4e89d2
|
7
|
+
data.tar.gz: 2ac35029e455ddfb589320ee12ea595130c8e35bfb2504cb08c7290f4861083cc02dcdba58f07306fd16b487cb00995a26659cd2d4bdd071811aa4664e940660
|
data/README.md
CHANGED
@@ -39,20 +39,23 @@ Config file.
|
|
39
39
|
---
|
40
40
|
:probe:
|
41
41
|
:name: Probe01
|
42
|
+
:logger: 'Logger.new(STDOUT)'
|
43
|
+
:log_level: 'Logger::WARN'
|
42
44
|
:datastore:
|
43
45
|
:type: :mysql # currently the only option
|
44
46
|
:queue_size: 20
|
47
|
+
:queue_interval: 60 # if present, queue_size will be ignored
|
45
48
|
:options:
|
46
49
|
:host: 127.0.0.1
|
47
50
|
:username: user
|
48
51
|
:password: paSsw0rd
|
49
52
|
:database: eznemo
|
50
53
|
:checks:
|
51
|
-
:tags:
|
54
|
+
:tags: # multiple tags are AND
|
52
55
|
- tag1
|
53
56
|
- tag2
|
54
57
|
:monitor:
|
55
|
-
:ping: # all optional
|
58
|
+
:ping: # below are all optional
|
56
59
|
:path: '/bin/ping'
|
57
60
|
:min_interval: 10
|
58
61
|
:timeout: 5
|
@@ -75,25 +78,25 @@ Config file.
|
|
75
78
|
}
|
76
79
|
```
|
77
80
|
|
78
|
-
###
|
81
|
+
### Tags
|
79
82
|
|
80
83
|
```ruby
|
81
84
|
{
|
82
85
|
check_id: 123, # from checks
|
83
|
-
|
84
|
-
timestamp: '2016-04-01 10:00:00 -0700',
|
85
|
-
status: true, # true means OK
|
86
|
-
response_ms: 0.012, # in milliseconds
|
87
|
-
status_desc: 'OK' # short description of the result
|
86
|
+
text: 'prod' # tag text
|
88
87
|
}
|
89
88
|
```
|
90
89
|
|
91
|
-
###
|
90
|
+
### Results
|
92
91
|
|
93
92
|
```ruby
|
94
93
|
{
|
94
|
+
timestamp: '2016-04-01 10:00:00 UTC',
|
95
95
|
check_id: 123, # from checks
|
96
|
-
|
96
|
+
probe: 'Probe01',
|
97
|
+
status: true, # true means OK
|
98
|
+
response_ms: 0.012, # in milliseconds
|
99
|
+
status_desc: 'OK' # short description of the result
|
97
100
|
}
|
98
101
|
```
|
99
102
|
|
@@ -110,26 +113,11 @@ CREATE TABLE `checks` (
|
|
110
113
|
`interval` int(11) NOT NULL COMMENT 'in seconds',
|
111
114
|
`type` varchar(255) NOT NULL DEFAULT '',
|
112
115
|
`state` tinyint(1) NOT NULL,
|
113
|
-
`options` varchar(255) DEFAULT
|
116
|
+
`options` varchar(255) DEFAULT NULL,
|
114
117
|
PRIMARY KEY (`id`),
|
115
118
|
CLUSTERING KEY `state` (`state`)
|
116
119
|
) ENGINE=TokuDB DEFAULT CHARSET=utf8;
|
117
120
|
|
118
|
-
CREATE TABLE `results` (
|
119
|
-
`id` int(11) NOT NULL AUTO_INCREMENT,
|
120
|
-
`check_id` int(11) NOT NULL,
|
121
|
-
`probe` varchar(255) NOT NULL DEFAULT '',
|
122
|
-
`timestamp` datetime NOT NULL COMMENT 'in utc',
|
123
|
-
`status` tinyint(1) NOT NULL,
|
124
|
-
`response_ms` float NOT NULL DEFAULT '0',
|
125
|
-
`status_desc` varchar(255) NOT NULL DEFAULT '',
|
126
|
-
PRIMARY KEY (`id`),
|
127
|
-
CLUSTERING KEY `check_id` (`check_id`),
|
128
|
-
KEY `probe` (`probe`),
|
129
|
-
KEY `timestamp` (`timestamp`),
|
130
|
-
KEY `status` (`status`)
|
131
|
-
) ENGINE=TokuDB DEFAULT CHARSET=utf8;
|
132
|
-
|
133
121
|
CREATE TABLE `tags` (
|
134
122
|
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
135
123
|
`check_id` int(11) NOT NULL,
|
@@ -138,4 +126,15 @@ CREATE TABLE `tags` (
|
|
138
126
|
KEY `check_id` (`check_id`),
|
139
127
|
CLUSTERING KEY `text` (`text`)
|
140
128
|
) ENGINE=TokuDB DEFAULT CHARSET=utf8;
|
129
|
+
|
130
|
+
CREATE TABLE `results` (
|
131
|
+
`timestamp` datetime NOT NULL COMMENT 'in utc',
|
132
|
+
`check_id` int(11) NOT NULL,
|
133
|
+
`probe` varchar(255) NOT NULL DEFAULT '',
|
134
|
+
`status` tinyint(1) NOT NULL,
|
135
|
+
`response_ms` float NOT NULL DEFAULT '0',
|
136
|
+
`status_desc` varchar(255) NOT NULL DEFAULT '',
|
137
|
+
PRIMARY KEY (`timestamp`, `check_id`, `probe`),
|
138
|
+
CLUSTERING KEY `check_id` (`check_id`)
|
139
|
+
) ENGINE=TokuDB DEFAULT CHARSET=utf8;
|
141
140
|
```
|
data/eznemo.gemspec
CHANGED
@@ -7,8 +7,8 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = EzNemo::Version
|
8
8
|
s.authors = ['Ken J.']
|
9
9
|
s.email = ['kenjij@gmail.com']
|
10
|
-
s.
|
11
|
-
s.
|
10
|
+
s.summary = %q{Simple network monitoring}
|
11
|
+
s.description = %q{Simple network monitoring implemented with Ruby.}
|
12
12
|
s.homepage = 'https://github.com/kenjij/eznemo'
|
13
13
|
s.license = 'MIT'
|
14
14
|
|
data/lib/eznemo.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'eznemo/logger'
|
1
2
|
require 'eznemo/config'
|
2
3
|
require 'eznemo/version'
|
3
4
|
require 'eventmachine'
|
@@ -19,16 +20,21 @@ module EzNemo
|
|
19
20
|
# Usually called by #self.run!
|
20
21
|
def initialize(opts)
|
21
22
|
c = EzNemo.load_config(opts[:config])
|
22
|
-
|
23
|
+
p = c[:probe]
|
24
|
+
EzNemo.logger = eval(p[:logger]) if p[:logger].class == String
|
25
|
+
logger = EzNemo.logger
|
26
|
+
logger.level = eval(p[:log_level]) if p[:log_level].class == String
|
27
|
+
logger.debug 'Loading datastore adapter...'
|
23
28
|
require "eznemo/#{c[:datastore][:type]}"
|
24
29
|
require 'eznemo/datastore'
|
25
|
-
|
30
|
+
logger.debug 'Loading monitoring plugins...'
|
26
31
|
require 'eznemo/monitor'
|
27
32
|
require 'eznemo/monitor/ping'
|
28
33
|
end
|
29
34
|
|
30
35
|
# Usually called by #self.run!
|
31
36
|
def run
|
37
|
+
logger = EzNemo.logger
|
32
38
|
ds = EzNemo.datastore
|
33
39
|
|
34
40
|
Signal.trap('INT') do
|
@@ -44,7 +50,9 @@ module EzNemo
|
|
44
50
|
end
|
45
51
|
|
46
52
|
EM.run do
|
53
|
+
logger.debug 'Loading checks...'
|
47
54
|
EzNemo.monitor.start_checks(ds.checks)
|
55
|
+
ds.start_loop
|
48
56
|
end
|
49
57
|
end
|
50
58
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
|
4
|
+
module EzNemo
|
5
|
+
|
6
|
+
def self.logger=(logger)
|
7
|
+
@logger = logger
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.logger
|
11
|
+
@logger ||= NullLogger.new()
|
12
|
+
end
|
13
|
+
|
14
|
+
class NullLogger < Logger
|
15
|
+
|
16
|
+
def initialize(*args)
|
17
|
+
end
|
18
|
+
|
19
|
+
def add(*args, &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/lib/eznemo/monitor.rb
CHANGED
data/lib/eznemo/monitor/ping.rb
CHANGED
data/lib/eznemo/mysql.rb
CHANGED
@@ -20,6 +20,7 @@ module EzNemo
|
|
20
20
|
@results = []
|
21
21
|
@queue_size = EzNemo.config[:datastore][:queue_size]
|
22
22
|
@queue_size ||= DEFAULT_QUEUE_SIZE
|
23
|
+
@queue_interval = EzNemo.config[:datastore][:queue_interval]
|
23
24
|
@opts = EzNemo.config[:datastore][:options]
|
24
25
|
@opts[:flags] = Mysql2::Client::MULTI_STATEMENTS
|
25
26
|
end
|
@@ -56,11 +57,24 @@ module EzNemo
|
|
56
57
|
final_ids
|
57
58
|
end
|
58
59
|
|
60
|
+
# Register EventMachine blocks
|
61
|
+
def start_loop
|
62
|
+
return unless @queue_interval
|
63
|
+
logger = EzNemo.logger
|
64
|
+
logger.info 'Registering MySQL EM block...'
|
65
|
+
EM.add_periodic_timer(@queue_interval) do
|
66
|
+
EzNemo.logger.debug 'Queue interval time arrived.'
|
67
|
+
write_results
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
59
71
|
# Stores a result; into queue first
|
60
72
|
# @param result [Hash] (see {EzNemo::Monitor#report})
|
61
73
|
def store_result(result)
|
62
74
|
@results << result
|
75
|
+
return if @queue_interval
|
63
76
|
if @results.count >= @queue_size
|
77
|
+
EzNemo.logger.debug 'Queue is full.'
|
64
78
|
write_results
|
65
79
|
end
|
66
80
|
end
|
@@ -69,16 +83,13 @@ module EzNemo
|
|
69
83
|
# @param sync [Boolean] use EM (async) if false
|
70
84
|
# @return [Object] Mysql2 client instance
|
71
85
|
def write_results(sync = false)
|
86
|
+
logger = EzNemo.logger
|
72
87
|
return nil if @results.empty?
|
73
88
|
if sync
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
Result.db.transaction do
|
78
|
-
@results.each { |r| r.save}
|
79
|
-
end
|
89
|
+
logger.debug 'Writing to DB...'
|
90
|
+
Result.db.transaction do
|
91
|
+
@results.each { |r| r.save}
|
80
92
|
end
|
81
|
-
thr.join
|
82
93
|
return true
|
83
94
|
else
|
84
95
|
db = emdatabase
|
@@ -86,9 +97,10 @@ module EzNemo
|
|
86
97
|
@results.each { |r| stmt << Result.dataset.insert_sql(r) + ';' }
|
87
98
|
defer = db.query(stmt)
|
88
99
|
defer.callback do
|
100
|
+
logger.debug 'Wrote to DB async.'
|
89
101
|
end
|
90
102
|
defer.errback do |r|
|
91
|
-
|
103
|
+
logger.error r.message
|
92
104
|
db.close if db.ping
|
93
105
|
end
|
94
106
|
end
|
@@ -98,11 +110,17 @@ module EzNemo
|
|
98
110
|
|
99
111
|
# Flush queue to storage
|
100
112
|
def flush
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
113
|
+
logger = EzNemo.logger
|
114
|
+
# Won't run after trap; run in another thread
|
115
|
+
thr = Thread.new do
|
116
|
+
logger.debug 'Spawned flushing thread.'
|
117
|
+
if write_results(true)
|
118
|
+
logger.info "Flushed."
|
119
|
+
else
|
120
|
+
logger.info "Nothing to flush."
|
121
|
+
end
|
105
122
|
end
|
123
|
+
thr.join
|
106
124
|
end
|
107
125
|
|
108
126
|
end
|
data/lib/eznemo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eznemo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ken J.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kajiki
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '4.0'
|
55
|
-
description: Simple network monitoring
|
55
|
+
description: Simple network monitoring implemented with Ruby.
|
56
56
|
email:
|
57
57
|
- kenjij@gmail.com
|
58
58
|
executables:
|
@@ -67,6 +67,7 @@ files:
|
|
67
67
|
- lib/eznemo.rb
|
68
68
|
- lib/eznemo/config.rb
|
69
69
|
- lib/eznemo/datastore.rb
|
70
|
+
- lib/eznemo/logger.rb
|
70
71
|
- lib/eznemo/monitor.rb
|
71
72
|
- lib/eznemo/monitor/ping.rb
|
72
73
|
- lib/eznemo/mysql.rb
|
@@ -94,5 +95,5 @@ rubyforge_project:
|
|
94
95
|
rubygems_version: 2.4.3
|
95
96
|
signing_key:
|
96
97
|
specification_version: 4
|
97
|
-
summary: Simple network monitoring
|
98
|
+
summary: Simple network monitoring
|
98
99
|
test_files: []
|