riemann-babbler 1.0.8.8 → 1.1.0pre2
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.
- data/.gitignore +1 -0
- data/Gemfile +1 -2
- data/Gemfile.lock +2 -6
- data/README.md +8 -0
- data/Rakefile +13 -0
- data/bin/riemann-babbler +3 -4
- data/config.yml +1 -3
- data/ext/sysinfo/extconf.rb +3 -0
- data/ext/sysinfo/sysinfo.c +476 -0
- data/ext/sysinfo/sysinfo.h +2 -0
- data/lib/riemann/{babbler.rb → babbler/plugin.rb} +9 -8
- data/lib/riemann/babbler/plugins/cpu.rb +1 -5
- data/lib/riemann/babbler/plugins/{cpu_fan.rb → cpufan.rb} +2 -2
- data/lib/riemann/babbler/plugins/{cpu_temp.rb → cputemp.rb} +2 -2
- data/lib/riemann/babbler/plugins/disk.rb +4 -8
- data/lib/riemann/babbler/plugins/exim4.rb +1 -1
- data/lib/riemann/babbler/plugins/http.rb +2 -2
- data/lib/riemann/babbler/plugins/mdadm.rb +2 -2
- data/lib/riemann/babbler/plugins/{mega_cli.rb → megacli.rb} +1 -1
- data/lib/riemann/babbler/plugins/memory.rb +8 -22
- data/lib/riemann/babbler/plugins/net.rb +3 -23
- data/lib/riemann/babbler/plugins/netstat.rb +15 -0
- data/lib/riemann/babbler/plugins/nginx.rb +12 -3
- data/lib/riemann/babbler/plugins/runit.rb +3 -5
- data/lib/riemann/babbler/support/monkey_patches.rb +3 -3
- data/lib/riemann/babbler/support/plugin_helpers.rb +1 -21
- data/lib/riemann/babbler/sysinfo.rb +1 -0
- data/lib/riemann/{babbler/version.rb → version.rb} +1 -1
- data/lib/{riemann/babbler/start.rb → start.rb} +4 -5
- data/riemann-babbler.gemspec +7 -6
- data/spec/default.rb +3 -2
- metadata +21 -51
- data/lib/riemann/babbler/plugins/net_stat.rb +0 -33
- data/lib/riemann/babbler/plugins/status_file.rb +0 -23
- data/lib/riemann/babbler/plugins/tw_cli.rb +0 -22
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -8,8 +8,6 @@ GEM
|
|
|
8
8
|
yamler (>= 0.1.0)
|
|
9
9
|
diff-lcs (1.2.2)
|
|
10
10
|
ffi (1.4.0)
|
|
11
|
-
file-tail (1.0.12)
|
|
12
|
-
tins (~> 0.5)
|
|
13
11
|
logger (1.2.8)
|
|
14
12
|
method_source (0.8.1)
|
|
15
13
|
mime-types (1.21)
|
|
@@ -35,11 +33,10 @@ GEM
|
|
|
35
33
|
rspec-expectations (2.13.0)
|
|
36
34
|
diff-lcs (>= 1.1.3, < 2.0)
|
|
37
35
|
rspec-mocks (2.13.0)
|
|
36
|
+
sequel (3.46.0)
|
|
38
37
|
slop (3.4.3)
|
|
39
38
|
sys-filesystem (1.1.0)
|
|
40
39
|
ffi
|
|
41
|
-
sys-proctable (0.9.3)
|
|
42
|
-
tins (0.8.0)
|
|
43
40
|
trollop (2.0)
|
|
44
41
|
yamler (0.1.0)
|
|
45
42
|
|
|
@@ -49,7 +46,6 @@ PLATFORMS
|
|
|
49
46
|
DEPENDENCIES
|
|
50
47
|
awesome_print
|
|
51
48
|
configatron
|
|
52
|
-
file-tail
|
|
53
49
|
logger
|
|
54
50
|
net-ping
|
|
55
51
|
pry
|
|
@@ -57,6 +53,6 @@ DEPENDENCIES
|
|
|
57
53
|
rest-client
|
|
58
54
|
riemann-client
|
|
59
55
|
rspec
|
|
56
|
+
sequel
|
|
60
57
|
sys-filesystem
|
|
61
|
-
sys-proctable
|
|
62
58
|
trollop
|
data/README.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
[](https://travis-ci.org/vadv/riemann-babbler)
|
|
2
2
|
|
|
3
|
+
### Beware!
|
|
4
|
+
Currently I'm working on c-ext from zabbix.
|
|
5
|
+
It's not all fully working :)
|
|
6
|
+
Use stable gem please!
|
|
7
|
+
```
|
|
8
|
+
gem "riemann-babbler", "~> 1.0.7.3"
|
|
9
|
+
```
|
|
10
|
+
|
|
3
11
|
### Install
|
|
4
12
|
```
|
|
5
13
|
gem install riemann-babbler
|
data/Rakefile
CHANGED
|
@@ -1 +1,14 @@
|
|
|
1
|
+
require 'rspec/core/rake_task'
|
|
1
2
|
require 'bundler/gem_tasks'
|
|
3
|
+
|
|
4
|
+
RSpec::Core::RakeTask.new('spec')
|
|
5
|
+
task :build do
|
|
6
|
+
Dir.chdir('ext/sysinfo') do
|
|
7
|
+
output = `ruby extconf.rb`
|
|
8
|
+
raise output unless $? == 0
|
|
9
|
+
output = `make`
|
|
10
|
+
raise output unless $? == 0
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
task :spec => :build
|
data/bin/riemann-babbler
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
-
#
|
|
2
|
+
#encoding: utf-8
|
|
3
3
|
|
|
4
4
|
require 'trollop'
|
|
5
5
|
require 'configatron'
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
require '
|
|
9
|
-
require 'riemann/babbler/start'
|
|
7
|
+
require File.expand_path('../../lib/riemann/version', __FILE__)
|
|
8
|
+
require File.expand_path('../../lib/start', __FILE__)
|
|
10
9
|
|
|
11
10
|
opts = Trollop::options do
|
|
12
11
|
version "Riemann babbler #{Riemann::Babbler::VERSION}"
|
data/config.yml
CHANGED
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
#include "sysinfo.h"
|
|
2
|
+
#include <ruby.h>
|
|
3
|
+
#include <sys/sysinfo.h>
|
|
4
|
+
#include <sys/statvfs.h>
|
|
5
|
+
|
|
6
|
+
/* Begin FS Part */
|
|
7
|
+
static void get_fs_size_stat(const char *fs, uint64_t *total, uint64_t *free,
|
|
8
|
+
uint64_t *used, double *pfree, double *pused)
|
|
9
|
+
{
|
|
10
|
+
struct statvfs s;
|
|
11
|
+
|
|
12
|
+
if (0 != statvfs(fs, &s))
|
|
13
|
+
rb_raise(rb_eRuntimeError, "statvfs call");
|
|
14
|
+
|
|
15
|
+
if (total)
|
|
16
|
+
*total = (uint64_t)s.f_blocks * s.f_frsize;
|
|
17
|
+
if (free)
|
|
18
|
+
*free = (uint64_t)s.f_bavail * s.f_frsize;
|
|
19
|
+
if (used)
|
|
20
|
+
*used = (uint64_t)(s.f_blocks - s.f_bfree) * s.f_frsize;
|
|
21
|
+
if (pfree)
|
|
22
|
+
{
|
|
23
|
+
if (0 != s.f_blocks - s.f_bfree + s.f_bavail)
|
|
24
|
+
*pfree = (double)(100.0 * s.f_bavail) /
|
|
25
|
+
(s.f_blocks - s.f_bfree + s.f_bavail);
|
|
26
|
+
else
|
|
27
|
+
*pfree = 0;
|
|
28
|
+
}
|
|
29
|
+
if (pused)
|
|
30
|
+
{
|
|
31
|
+
if (0 != s.f_blocks - s.f_bfree + s.f_bavail)
|
|
32
|
+
*pused = 100.0 - (double)(100.0 * s.f_bavail) /
|
|
33
|
+
(s.f_blocks - s.f_bfree + s.f_bavail);
|
|
34
|
+
else
|
|
35
|
+
*pused = 0;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static int VFS_FS_USED(VALUE self, VALUE mount)
|
|
40
|
+
{
|
|
41
|
+
uint64_t value = 0;
|
|
42
|
+
get_fs_size_stat(RSTRING_PTR(mount), NULL, NULL, &value, NULL, NULL);
|
|
43
|
+
return INT2NUM(value);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
static int VFS_FS_TOTAL(VALUE self, VALUE mount)
|
|
47
|
+
{
|
|
48
|
+
uint64_t value = 0;
|
|
49
|
+
get_fs_size_stat(RSTRING_PTR(mount), &value, NULL, NULL, NULL, NULL);
|
|
50
|
+
return INT2NUM(value);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static int VFS_FS_FREE(VALUE self, VALUE mount)
|
|
54
|
+
{
|
|
55
|
+
uint64_t value = 0;
|
|
56
|
+
get_fs_size_stat(RSTRING_PTR(mount), NULL, &value, NULL, NULL, NULL);
|
|
57
|
+
return INT2NUM(value);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static int VFS_FS_PFREE(VALUE self, VALUE mount)
|
|
61
|
+
{
|
|
62
|
+
double value = 0;
|
|
63
|
+
get_fs_size_stat(RSTRING_PTR(mount), NULL, NULL, NULL, &value, NULL);
|
|
64
|
+
return rb_float_new(value);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static int VFS_FS_PUSED(VALUE self, VALUE mount)
|
|
68
|
+
{
|
|
69
|
+
double value = 0;
|
|
70
|
+
get_fs_size_stat(RSTRING_PTR(mount), NULL, NULL, NULL, NULL, &value);
|
|
71
|
+
return INT2NUM(value);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* ---------- INODE ---------- */
|
|
75
|
+
union _val {
|
|
76
|
+
unsigned long long ul_val;
|
|
77
|
+
double d_val;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
static void get_fs_inodes_stat(const char *fs, int type,union _val * val)
|
|
81
|
+
{
|
|
82
|
+
struct statvfs s;
|
|
83
|
+
if ( statvfs( fs, &s) != 0 )
|
|
84
|
+
{
|
|
85
|
+
rb_raise(rb_eRuntimeError, "statvfs call");
|
|
86
|
+
}
|
|
87
|
+
switch(type)
|
|
88
|
+
{
|
|
89
|
+
case 1: val->ul_val = (unsigned long long )(s.f_files); break;
|
|
90
|
+
case 2: val->ul_val = (unsigned long long )(s.f_favail); break;
|
|
91
|
+
case 3: val->ul_val = (unsigned long long )(s.f_files - s.f_favail); break;
|
|
92
|
+
case 4:
|
|
93
|
+
if (0 != s.f_files){
|
|
94
|
+
val->d_val = (100.0 * (s.f_files - s.f_favail)) / s.f_files;
|
|
95
|
+
} else
|
|
96
|
+
*(double *)val = 0;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static int VFS_FS_INODE_PUSED(VALUE self, VALUE mount)
|
|
102
|
+
{
|
|
103
|
+
union _val val;
|
|
104
|
+
get_fs_inodes_stat(RSTRING_PTR(mount), 4, &val );
|
|
105
|
+
return rb_float_new(val.d_val);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
static int VFS_FS_INODE_USED(VALUE self, VALUE mount)
|
|
109
|
+
{
|
|
110
|
+
union _val val;
|
|
111
|
+
get_fs_inodes_stat(RSTRING_PTR(mount), 3, &val );
|
|
112
|
+
return INT2NUM(val.ul_val);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
static int VFS_FS_INODE_FREE(VALUE self, VALUE mount)
|
|
116
|
+
{
|
|
117
|
+
union _val val;
|
|
118
|
+
get_fs_inodes_stat(RSTRING_PTR(mount), 2, &val );
|
|
119
|
+
return INT2NUM(val.ul_val);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
static int VFS_FS_INODE_TOTAL(VALUE self, VALUE mount)
|
|
123
|
+
{
|
|
124
|
+
union _val val;
|
|
125
|
+
get_fs_inodes_stat(RSTRING_PTR(mount), 1, &val );
|
|
126
|
+
return INT2NUM(val.ul_val);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* End FS Part */
|
|
130
|
+
|
|
131
|
+
/* Begin Memory Part */
|
|
132
|
+
static int VM_MEMORY_CACHED(VALUE self)
|
|
133
|
+
{
|
|
134
|
+
FILE *f;
|
|
135
|
+
char *t;
|
|
136
|
+
char c[MAX_STRING_LEN];
|
|
137
|
+
uint64_t res = 0;
|
|
138
|
+
|
|
139
|
+
if(NULL == (f = fopen("/proc/meminfo","r") ))
|
|
140
|
+
{
|
|
141
|
+
rb_raise(rb_eRuntimeError, "fail to read /proc/meminfo");
|
|
142
|
+
}
|
|
143
|
+
while(NULL!=fgets(c,MAX_STRING_LEN,f))
|
|
144
|
+
{
|
|
145
|
+
if(strncmp(c,"Cached:",7) == 0)
|
|
146
|
+
{
|
|
147
|
+
t=(char *)strtok(c," ");
|
|
148
|
+
t=(char *)strtok(NULL," ");
|
|
149
|
+
sscanf(t, FS_UI64, &res );
|
|
150
|
+
t=(char *)strtok(NULL," ");
|
|
151
|
+
|
|
152
|
+
if(strcasecmp(t,"kb")) res <<= 10;
|
|
153
|
+
else if(strcasecmp(t, "mb")) res <<= 20;
|
|
154
|
+
else if(strcasecmp(t, "gb")) res <<= 30;
|
|
155
|
+
else if(strcasecmp(t, "tb")) res <<= 40;
|
|
156
|
+
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
fclose(f);
|
|
161
|
+
return INT2NUM(res);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
static int VM_MEMORY_BUFFERS(VALUE self)
|
|
165
|
+
{
|
|
166
|
+
struct sysinfo info;
|
|
167
|
+
if( 0 == sysinfo(&info))
|
|
168
|
+
{
|
|
169
|
+
return INT2NUM(info.bufferram);
|
|
170
|
+
}
|
|
171
|
+
else
|
|
172
|
+
rb_raise(rb_eRuntimeError, "sysinfo call");
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
static int VM_MEMORY_SHARED(VALUE self)
|
|
176
|
+
{
|
|
177
|
+
struct sysinfo info;
|
|
178
|
+
if( 0 == sysinfo(&info))
|
|
179
|
+
{
|
|
180
|
+
return INT2NUM(info.sharedram);
|
|
181
|
+
}
|
|
182
|
+
else
|
|
183
|
+
rb_raise(rb_eRuntimeError, "sysinfo call");
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
static int VM_MEMORY_TOTAL(VALUE self)
|
|
187
|
+
{
|
|
188
|
+
struct sysinfo info;
|
|
189
|
+
if( 0 == sysinfo(&info))
|
|
190
|
+
{
|
|
191
|
+
return INT2NUM(info.totalram);
|
|
192
|
+
}
|
|
193
|
+
else
|
|
194
|
+
rb_raise(rb_eRuntimeError, "sysinfo call");
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
static int VM_MEMORY_FREE(VALUE self)
|
|
198
|
+
{
|
|
199
|
+
struct sysinfo info;
|
|
200
|
+
if( 0 == sysinfo(&info))
|
|
201
|
+
{
|
|
202
|
+
return INT2NUM(info.freeram);
|
|
203
|
+
}
|
|
204
|
+
else
|
|
205
|
+
rb_raise(rb_eRuntimeError, "sysinfo call");
|
|
206
|
+
}
|
|
207
|
+
static int VM_MEMORY_AVAILABLE(VALUE self)
|
|
208
|
+
{
|
|
209
|
+
struct sysinfo info;
|
|
210
|
+
if( 0 == sysinfo(&info))
|
|
211
|
+
{
|
|
212
|
+
return INT2NUM(info.freeram + info.bufferram + VM_MEMORY_CACHED(self));
|
|
213
|
+
}
|
|
214
|
+
else
|
|
215
|
+
rb_raise(rb_eRuntimeError, "sysinfo call");
|
|
216
|
+
}
|
|
217
|
+
/* End Memory Part */
|
|
218
|
+
|
|
219
|
+
/* Begin Net Part */
|
|
220
|
+
typedef struct
|
|
221
|
+
{
|
|
222
|
+
uint64_t ibytes;
|
|
223
|
+
uint64_t ipackets;
|
|
224
|
+
uint64_t ierr;
|
|
225
|
+
uint64_t idrop;
|
|
226
|
+
uint64_t obytes;
|
|
227
|
+
uint64_t opackets;
|
|
228
|
+
uint64_t oerr;
|
|
229
|
+
uint64_t odrop;
|
|
230
|
+
uint64_t colls;
|
|
231
|
+
}
|
|
232
|
+
net_stat_t;
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
static void get_net_stat(const char *if_name, net_stat_t *result)
|
|
236
|
+
{
|
|
237
|
+
char line[MAX_STRING_LEN];
|
|
238
|
+
char name[MAX_STRING_LEN];
|
|
239
|
+
|
|
240
|
+
uint64_t tmp = 0;
|
|
241
|
+
|
|
242
|
+
FILE *f;
|
|
243
|
+
char *p;
|
|
244
|
+
|
|
245
|
+
if(NULL != (f = fopen("/proc/net/dev","r") ))
|
|
246
|
+
{
|
|
247
|
+
while(fgets(line,MAX_STRING_LEN,f) != NULL)
|
|
248
|
+
{
|
|
249
|
+
p = strstr(line,":");
|
|
250
|
+
if(p) p[0]='\t';
|
|
251
|
+
|
|
252
|
+
if(sscanf(line,"%s\t" FS_UI64 "\t" FS_UI64 "\t" FS_UI64 "\t" FS_UI64 "\t" FS_UI64 "\t"
|
|
253
|
+
FS_UI64 "\t" FS_UI64 "\t" FS_UI64 "\t \
|
|
254
|
+
" FS_UI64 "\t" FS_UI64 "\t" FS_UI64 "\t" FS_UI64 "\t" FS_UI64 "\t"
|
|
255
|
+
FS_UI64 "\t" FS_UI64 "\t" FS_UI64 "\n",
|
|
256
|
+
name,
|
|
257
|
+
&(result->ibytes), /* bytes */
|
|
258
|
+
&(result->ipackets), /* packets */
|
|
259
|
+
&(result->ierr), /* errs */
|
|
260
|
+
&(result->idrop), /* drop */
|
|
261
|
+
&(tmp), /* fifo */
|
|
262
|
+
&(tmp), /* frame */
|
|
263
|
+
&(tmp), /* compressed */
|
|
264
|
+
&(tmp), /* multicast */
|
|
265
|
+
&(result->obytes), /* bytes */
|
|
266
|
+
&(result->opackets), /* packets*/
|
|
267
|
+
&(result->oerr), /* errs */
|
|
268
|
+
&(result->odrop), /* drop */
|
|
269
|
+
&(tmp), /* fifo */
|
|
270
|
+
&(result->colls), /* icolls */
|
|
271
|
+
&(tmp), /* carrier */
|
|
272
|
+
&(tmp) /* compressed */
|
|
273
|
+
) == 17)
|
|
274
|
+
{
|
|
275
|
+
if(strncmp(name, if_name, MAX_STRING_LEN) == 0)
|
|
276
|
+
{
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
fclose(f);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
int NET_IF_IN(VALUE self, VALUE my_if_name, VALUE my_mode)
|
|
286
|
+
{
|
|
287
|
+
net_stat_t ns;
|
|
288
|
+
|
|
289
|
+
char *if_name = RSTRING_PTR(my_if_name);
|
|
290
|
+
char *mode = RSTRING_PTR(my_mode);
|
|
291
|
+
|
|
292
|
+
get_net_stat(if_name, &ns);
|
|
293
|
+
if(strncmp(mode, "bytes", MAX_STRING_LEN) == 0)
|
|
294
|
+
{
|
|
295
|
+
return INT2NUM(ns.ibytes);
|
|
296
|
+
}
|
|
297
|
+
else if(strncmp(mode, "packets", MAX_STRING_LEN) == 0)
|
|
298
|
+
{
|
|
299
|
+
return INT2NUM(ns.ipackets);
|
|
300
|
+
}
|
|
301
|
+
else if(strncmp(mode, "errors", MAX_STRING_LEN) == 0)
|
|
302
|
+
{
|
|
303
|
+
return INT2NUM(ns.ierr);
|
|
304
|
+
}
|
|
305
|
+
else if(strncmp(mode, "dropped", MAX_STRING_LEN) == 0)
|
|
306
|
+
{
|
|
307
|
+
return INT2NUM(ns.idrop);
|
|
308
|
+
}
|
|
309
|
+
else
|
|
310
|
+
rb_raise(rb_eRuntimeError, "give me mode");
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
int NET_IF_OUT(VALUE self, VALUE my_if_name, VALUE my_mode)
|
|
314
|
+
{
|
|
315
|
+
net_stat_t ns;
|
|
316
|
+
|
|
317
|
+
char *if_name = RSTRING_PTR(my_if_name);
|
|
318
|
+
char *mode = RSTRING_PTR(my_mode);
|
|
319
|
+
|
|
320
|
+
get_net_stat(if_name, &ns);
|
|
321
|
+
|
|
322
|
+
if (strncmp(mode, "bytes", MAX_STRING_LEN) == 0)
|
|
323
|
+
{
|
|
324
|
+
return INT2NUM(ns.obytes);
|
|
325
|
+
}
|
|
326
|
+
else if(strncmp(mode, "packets", MAX_STRING_LEN) == 0)
|
|
327
|
+
{
|
|
328
|
+
return INT2NUM(ns.opackets);
|
|
329
|
+
}
|
|
330
|
+
else if(strncmp(mode, "errors", MAX_STRING_LEN) == 0)
|
|
331
|
+
{
|
|
332
|
+
return INT2NUM(ns.oerr);
|
|
333
|
+
}
|
|
334
|
+
else if(strncmp(mode, "dropped", MAX_STRING_LEN) == 0)
|
|
335
|
+
{
|
|
336
|
+
return INT2NUM(ns.odrop);
|
|
337
|
+
}
|
|
338
|
+
else
|
|
339
|
+
rb_raise(rb_eRuntimeError, "give me mode");
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
int NET_IF_TOTAL(VALUE self, VALUE my_if_name, VALUE my_mode)
|
|
343
|
+
{
|
|
344
|
+
net_stat_t ns;
|
|
345
|
+
|
|
346
|
+
char *if_name = RSTRING_PTR(my_if_name);
|
|
347
|
+
char *mode = RSTRING_PTR(my_mode);
|
|
348
|
+
|
|
349
|
+
get_net_stat(if_name, &ns);
|
|
350
|
+
if(strncmp(mode, "bytes", MAX_STRING_LEN) == 0)
|
|
351
|
+
{
|
|
352
|
+
return INT2NUM(ns.obytes + ns.ibytes);
|
|
353
|
+
}
|
|
354
|
+
else if(strncmp(mode, "packets", MAX_STRING_LEN) == 0)
|
|
355
|
+
{
|
|
356
|
+
return INT2NUM(ns.opackets + ns.ipackets);
|
|
357
|
+
}
|
|
358
|
+
else if(strncmp(mode, "errors", MAX_STRING_LEN) == 0)
|
|
359
|
+
{
|
|
360
|
+
return INT2NUM(ns.oerr + ns.ierr);
|
|
361
|
+
}
|
|
362
|
+
else if(strncmp(mode, "dropped", MAX_STRING_LEN) == 0)
|
|
363
|
+
{
|
|
364
|
+
return INT2NUM(ns.odrop + ns.idrop);
|
|
365
|
+
}
|
|
366
|
+
else
|
|
367
|
+
rb_raise(rb_eRuntimeError, "give me mode");
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
int NET_IF_COLLISIONS(VALUE self, VALUE my_if_name)
|
|
371
|
+
{
|
|
372
|
+
net_stat_t ns;
|
|
373
|
+
char *if_name = RSTRING_PTR(my_if_name);
|
|
374
|
+
|
|
375
|
+
get_net_stat(if_name, &ns);
|
|
376
|
+
return INT2NUM(ns.odrop);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/* End Net Part */
|
|
380
|
+
|
|
381
|
+
/* Begin Cpu Part */
|
|
382
|
+
int SYSTEM_CPU_SWITCHES(VALUE self)
|
|
383
|
+
{
|
|
384
|
+
char line[MAX_STRING_LEN], name[32];
|
|
385
|
+
uint64_t value = 0;
|
|
386
|
+
FILE *f;
|
|
387
|
+
|
|
388
|
+
if (NULL == (f = fopen("/proc/stat", "r")))
|
|
389
|
+
rb_raise(rb_eRuntimeError, "Can't open /proc/stat");
|
|
390
|
+
|
|
391
|
+
while (NULL != fgets(line, sizeof(line), f))
|
|
392
|
+
{
|
|
393
|
+
if (2 != sscanf(line, "%s " FS_UI64, name, &value))
|
|
394
|
+
continue;
|
|
395
|
+
|
|
396
|
+
if (0 == strcmp(name, "ctxt"))
|
|
397
|
+
{
|
|
398
|
+
return INT2NUM(value);
|
|
399
|
+
break;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
fclose(f);
|
|
403
|
+
}
|
|
404
|
+
/* End Cpu Part */
|
|
405
|
+
|
|
406
|
+
void Init_sysinfo(void) {
|
|
407
|
+
|
|
408
|
+
VALUE mSI = rb_define_module("SysInfo");
|
|
409
|
+
VALUE mFS = rb_define_module_under(mSI, "FS");
|
|
410
|
+
VALUE cBlock = rb_define_class_under(mFS, "Block", rb_cObject);
|
|
411
|
+
VALUE cInode = rb_define_class_under(mFS, "Inode", rb_cObject);
|
|
412
|
+
VALUE cMem = rb_define_class_under(mSI, "Memory", rb_cObject);
|
|
413
|
+
VALUE cNet = rb_define_class_under(mSI, "Net", rb_cObject);
|
|
414
|
+
VALUE cCpu = rb_define_class_under(mSI, "Cpu", rb_cObject);
|
|
415
|
+
|
|
416
|
+
rb_define_singleton_method(cBlock,
|
|
417
|
+
"used", VFS_FS_USED, 1);
|
|
418
|
+
|
|
419
|
+
rb_define_singleton_method(cBlock,
|
|
420
|
+
"free", VFS_FS_FREE, 1);
|
|
421
|
+
|
|
422
|
+
rb_define_singleton_method(cBlock,
|
|
423
|
+
"total", VFS_FS_TOTAL, 1);
|
|
424
|
+
|
|
425
|
+
rb_define_singleton_method(cBlock,
|
|
426
|
+
"pfree", VFS_FS_PFREE, 1);
|
|
427
|
+
|
|
428
|
+
rb_define_singleton_method(cBlock,
|
|
429
|
+
"pused", VFS_FS_PUSED, 1);
|
|
430
|
+
|
|
431
|
+
rb_define_singleton_method(cInode,
|
|
432
|
+
"used", VFS_FS_INODE_USED, 1);
|
|
433
|
+
|
|
434
|
+
rb_define_singleton_method(cInode,
|
|
435
|
+
"free", VFS_FS_INODE_FREE, 1);
|
|
436
|
+
|
|
437
|
+
rb_define_singleton_method(cInode,
|
|
438
|
+
"total", VFS_FS_INODE_TOTAL, 1);
|
|
439
|
+
|
|
440
|
+
rb_define_singleton_method(cInode,
|
|
441
|
+
"pused", VFS_FS_INODE_PUSED, 1);
|
|
442
|
+
|
|
443
|
+
rb_define_singleton_method(cMem,
|
|
444
|
+
"cached", VM_MEMORY_CACHED, 0);
|
|
445
|
+
|
|
446
|
+
rb_define_singleton_method(cMem,
|
|
447
|
+
"buffers", VM_MEMORY_BUFFERS, 0);
|
|
448
|
+
|
|
449
|
+
rb_define_singleton_method(cMem,
|
|
450
|
+
"shared", VM_MEMORY_SHARED, 0);
|
|
451
|
+
|
|
452
|
+
rb_define_singleton_method(cMem,
|
|
453
|
+
"total", VM_MEMORY_TOTAL, 0);
|
|
454
|
+
|
|
455
|
+
rb_define_singleton_method(cMem,
|
|
456
|
+
"free", VM_MEMORY_FREE, 0);
|
|
457
|
+
|
|
458
|
+
rb_define_singleton_method(cMem,
|
|
459
|
+
"avaiable", VM_MEMORY_AVAILABLE, 0);
|
|
460
|
+
|
|
461
|
+
rb_define_singleton_method(cNet,
|
|
462
|
+
"in", NET_IF_IN, 2);
|
|
463
|
+
|
|
464
|
+
rb_define_singleton_method(cNet,
|
|
465
|
+
"out", NET_IF_OUT, 2);
|
|
466
|
+
|
|
467
|
+
rb_define_singleton_method(cNet,
|
|
468
|
+
"total", NET_IF_TOTAL, 2);
|
|
469
|
+
|
|
470
|
+
rb_define_singleton_method(cNet,
|
|
471
|
+
"collisions", NET_IF_COLLISIONS, 1);
|
|
472
|
+
|
|
473
|
+
rb_define_singleton_method(cCpu,
|
|
474
|
+
"switches", SYSTEM_CPU_SWITCHES, 0);
|
|
475
|
+
|
|
476
|
+
}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
#encoding: utf-8
|
|
2
2
|
|
|
3
|
-
require '
|
|
3
|
+
require File.expand_path('../support/plugin_helpers', __FILE__)
|
|
4
4
|
require 'riemann/client'
|
|
5
5
|
require 'open3'
|
|
6
6
|
require 'timeout'
|
|
7
7
|
require 'rest_client'
|
|
8
8
|
require 'socket'
|
|
9
9
|
require 'net/ping'
|
|
10
|
-
require '
|
|
11
|
-
require 'riemann/babbler/
|
|
10
|
+
require 'sequel'
|
|
11
|
+
require 'riemann/babbler/sysinfo'
|
|
12
|
+
require File.expand_path('../support/monkey_patches', __FILE__)
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
# Базовое описание плагина
|
|
@@ -65,9 +66,9 @@ module Riemann
|
|
|
65
66
|
def report_with_diff(event)
|
|
66
67
|
current_metric = event[:metric]
|
|
67
68
|
if @storage.has_key?(event[:service])
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
next if @storage[ event[:service] ].nil?
|
|
70
|
+
next if current_metric + @storage[ event[:service] ] > 2**64
|
|
71
|
+
event[:metric] = current_metric - @storage[ event[:service] ]
|
|
71
72
|
end
|
|
72
73
|
@storage[ event[:service] ] = current_metric
|
|
73
74
|
event.delete(:as_diff)
|
|
@@ -100,7 +101,7 @@ module Riemann
|
|
|
100
101
|
if plugin.run.nil?
|
|
101
102
|
true
|
|
102
103
|
else
|
|
103
|
-
plugin.run ? true : false
|
|
104
|
+
plugin.run == true ? true : false
|
|
104
105
|
end
|
|
105
106
|
end
|
|
106
107
|
|
|
@@ -2,17 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
class Riemann::Babbler::Cpu < Riemann::Babbler
|
|
4
4
|
|
|
5
|
-
def desc
|
|
6
|
-
"#{shell('ps -eo pcpu,pid,cmd --sort -pcpu | head -3').chomp}"
|
|
7
|
-
end
|
|
8
|
-
|
|
9
5
|
def init
|
|
10
6
|
@old_cpu = Hash.new
|
|
11
7
|
end
|
|
12
8
|
|
|
13
9
|
def collect
|
|
14
10
|
array = Array.new
|
|
15
|
-
description =
|
|
11
|
+
description = 'Cpu usage'
|
|
16
12
|
File.read('/proc/stat').split("\n").each do |cpu_line|
|
|
17
13
|
|
|
18
14
|
# проверяем есть строчка /cpu\d+/ или /cpu / и сграбливаем это в переменную
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
class Riemann::Babbler::
|
|
1
|
+
class Riemann::Babbler::Cpufan < Riemann::Babbler
|
|
2
2
|
|
|
3
3
|
def init
|
|
4
4
|
plugin.set_default(:service, 'cpufan')
|
|
@@ -13,7 +13,7 @@ class Riemann::Babbler::CpuFan < Riemann::Babbler
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def collect
|
|
16
|
-
{ :service => plugin.service, :metric => shell(plugin.cmd).to_i, :description =>
|
|
16
|
+
{ :service => plugin.service, :metric => shell(plugin.cmd).to_i, :description => "CPU Fan Speed" }
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
class Riemann::Babbler::
|
|
1
|
+
class Riemann::Babbler::Cputemp < Riemann::Babbler
|
|
2
2
|
|
|
3
3
|
def init
|
|
4
4
|
plugin.set_default(:service, 'cputemp')
|
|
@@ -13,7 +13,7 @@ class Riemann::Babbler::CpuTemp < Riemann::Babbler
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def collect
|
|
16
|
-
{ :service => plugin.service, :metric => shell(plugin.cmd).to_i, :description =>
|
|
16
|
+
{ :service => plugin.service, :metric => shell(plugin.cmd).to_i, :description => "CPU Temperature" }
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
end
|
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
class Riemann::Babbler::Disk < Riemann::Babbler
|
|
4
4
|
|
|
5
|
-
require 'sys/filesystem'
|
|
6
|
-
include Sys
|
|
7
|
-
|
|
8
5
|
NOT_MONITORING_FS = %w(sysfs nfs devpts squashfs proc devtmpfs)
|
|
9
6
|
|
|
10
7
|
def collect
|
|
@@ -18,13 +15,12 @@ class Riemann::Babbler::Disk < Riemann::Babbler
|
|
|
18
15
|
end
|
|
19
16
|
disk = Array.new
|
|
20
17
|
monit_points.each do |point|
|
|
21
|
-
point_stat = Filesystem.stat point
|
|
22
18
|
human_point = point == '/' ? '/root' : point
|
|
23
19
|
human_point = human_point.gsub(/^\//, '').gsub(/\//, '_')
|
|
24
|
-
disk << { :service => plugin.service + " #{human_point} % block", :description => "Disk usage #{point}, %", :metric =>
|
|
25
|
-
disk << { :service => plugin.service + " #{human_point} % inode", :description => "Disk usage #{point}, inodes %", :metric =>
|
|
26
|
-
disk << { :service => plugin.service + " #{human_point} abs free", :description => "Disk free #{point}, B", :metric =>
|
|
27
|
-
disk << { :service => plugin.service + " #{human_point} abs total", :description => "Disk space #{point}, B", :metric =>
|
|
20
|
+
disk << { :service => plugin.service + " #{human_point} % block", :description => "Disk usage #{point}, %", :metric => SysInfo::FS::Block.pused(point) }
|
|
21
|
+
disk << { :service => plugin.service + " #{human_point} % inode", :description => "Disk usage #{point}, inodes %", :metric => SysInfo::FS::Inode.pused(point)}
|
|
22
|
+
disk << { :service => plugin.service + " #{human_point} abs free", :description => "Disk free #{point}, B", :metric => SysInfo::FS::Block.total(point), :state => 'ok'}
|
|
23
|
+
disk << { :service => plugin.service + " #{human_point} abs total", :description => "Disk space #{point}, B", :metric => SysInfo::FS::Inode.total(point), :state => 'ok'}
|
|
28
24
|
end
|
|
29
25
|
disk
|
|
30
26
|
end
|
|
@@ -13,7 +13,7 @@ class Riemann::Babbler::Exim4 < Riemann::Babbler
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def collect
|
|
16
|
-
{ :service => plugin.service, :metric => shell(plugin.cmd).to_i, :description =>
|
|
16
|
+
{ :service => plugin.service, :metric => shell(plugin.cmd).to_i, :description => "Exim4: count frozen mails" }
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
end
|
|
@@ -24,9 +24,9 @@ class Riemann::Babbler::Http < Riemann::Babbler
|
|
|
24
24
|
command += " --max-time #{plugin.max_time} --fail"
|
|
25
25
|
command += " #{plugin.url} -o /dev/null"
|
|
26
26
|
|
|
27
|
-
out = shell(command)
|
|
27
|
+
out = shell(command)
|
|
28
28
|
|
|
29
|
-
if out != plugin.http_code
|
|
29
|
+
if out.to_i != plugin.http_code
|
|
30
30
|
metric = 1
|
|
31
31
|
else
|
|
32
32
|
metric = 0
|
|
@@ -14,8 +14,8 @@ class Riemann::Babbler::Mdadm < Riemann::Babbler
|
|
|
14
14
|
file = File.read('/proc/mdstat').split("\n")
|
|
15
15
|
status = Array.new
|
|
16
16
|
file.each_with_index do |line, index|
|
|
17
|
-
next unless line.include?
|
|
18
|
-
device = file[index-1].split(
|
|
17
|
+
next unless line.include? "_"
|
|
18
|
+
device = file[index-1].split(":")[0].strip
|
|
19
19
|
status << { :service => plugin.service + " #{device}", :metric => 1, :description => "mdadm failed device #{device}" }
|
|
20
20
|
end
|
|
21
21
|
status
|
|
@@ -12,7 +12,7 @@ class Riemann::Babbler::MegaCli < Riemann::Babbler
|
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def collect
|
|
15
|
-
{:service => plugin.service, :metric => shell(plugin.cmd).to_i, :description =>
|
|
15
|
+
{:service => plugin.service, :metric => shell(plugin.cmd).to_i, :description => "MegaCli status" }
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
end
|
|
@@ -3,31 +3,17 @@
|
|
|
3
3
|
class Riemann::Babbler::Memory < Riemann::Babbler
|
|
4
4
|
|
|
5
5
|
def collect
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
info[x[0]] = x[1].to_i
|
|
9
|
-
info
|
|
10
|
-
}
|
|
11
|
-
free = m['MemFree'].to_i * 1024
|
|
12
|
-
cached =m['Cached'].to_i * 1024
|
|
13
|
-
buffers =m['Buffers'].to_i * 1024
|
|
14
|
-
total = m['MemTotal'].to_i * 1024
|
|
15
|
-
used = total - free
|
|
16
|
-
free_bc = free + buffers + cached
|
|
17
|
-
|
|
6
|
+
total = SysInfo::Memory.total
|
|
7
|
+
free_bc = SysInfo::Memory.free + SysInfo::Memory.buffers + SysInfo::Memory.cached
|
|
18
8
|
fraction = 1 - (free_bc.to_f / total)
|
|
19
|
-
swap_fraction = m['SwapTotal'] == 0 ? 0 : 1 - m['SwapFree'].to_f/m['SwapTotal']
|
|
20
|
-
|
|
21
|
-
desc = "#{shell('ps -eo pmem,pid,cmd --sort -pmem | head -3').chomp}"
|
|
22
9
|
[
|
|
23
10
|
{ :service => plugin.service + ' % free', :description => 'Memory usage, %', :metric => fraction.round(2) * 100 },
|
|
24
|
-
{ :service => plugin.service + '
|
|
25
|
-
{ :service => plugin.service + ' abs
|
|
26
|
-
{ :service => plugin.service + ' abs
|
|
27
|
-
{ :service => plugin.service + ' abs
|
|
28
|
-
{ :service => plugin.service + ' abs
|
|
29
|
-
{ :service => plugin.service + ' abs
|
|
30
|
-
{ :service => plugin.service + ' abs free_bc', :description => "Memory usage with cache и buffers (kB)\n\n #{desc}", :metric => free_bc , :state => 'ok' }
|
|
11
|
+
{ :service => plugin.service + ' abs free', :description => "Memory free (Bytes)", :metric => SysInfo::Memory.free, :state => 'ok' },
|
|
12
|
+
{ :service => plugin.service + ' abs total', :description => "Memory total (Bytes)", :metric => total, :state => 'ok' },
|
|
13
|
+
{ :service => plugin.service + ' abs cached', :description => "Memory usage, cached (Bytes)", :metric => SysInfo::Memory.cached, :state => 'ok' },
|
|
14
|
+
{ :service => plugin.service + ' abs buffers', :description => "Memory usage, buffers (Bytes)", :metric => SysInfo::Memory.buffers, :state => 'ok' },
|
|
15
|
+
{ :service => plugin.service + ' abs used', :description => "Memory usage, used (Bytes)", :metric => SysInfo::Memory.total - SysInfo::Memory.free , :state => 'ok' },
|
|
16
|
+
{ :service => plugin.service + ' abs free_bc', :description => "Memory usage with cache и buffers (Bytes)", :metric => free_bc , :state => 'ok' }
|
|
31
17
|
]
|
|
32
18
|
end
|
|
33
19
|
|
|
@@ -1,21 +1,5 @@
|
|
|
1
1
|
class Riemann::Babbler::Net < Riemann::Babbler
|
|
2
2
|
|
|
3
|
-
WORDS = ['rx bytes',
|
|
4
|
-
'rx packets',
|
|
5
|
-
'rx errs',
|
|
6
|
-
'rx drop',
|
|
7
|
-
'rx fifo',
|
|
8
|
-
'rx frame',
|
|
9
|
-
'rx compressed',
|
|
10
|
-
'rx multicast',
|
|
11
|
-
'tx bytes',
|
|
12
|
-
'tx packets',
|
|
13
|
-
'tx drops',
|
|
14
|
-
'tx fifo',
|
|
15
|
-
'tx colls',
|
|
16
|
-
'tx carrier',
|
|
17
|
-
'tx compressed']
|
|
18
|
-
|
|
19
3
|
def collect
|
|
20
4
|
f = File.read('/proc/net/dev')
|
|
21
5
|
status = Array.new
|
|
@@ -23,13 +7,9 @@ class Riemann::Babbler::Net < Riemann::Babbler
|
|
|
23
7
|
iface = line.split(':')[0].strip
|
|
24
8
|
iface.gsub!(/\./, '_')
|
|
25
9
|
next unless line =~ /(\w*)\:\s*([\s\d]+)\s*/
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
$2.split(/\s+/).map { |str| str.to_i }
|
|
30
|
-
).each do |service, value|
|
|
31
|
-
status << { :service => service, :metric => value, :as_diff => true}
|
|
32
|
-
end
|
|
10
|
+
status << { :service => "#{plugin.service} #{iface} bytes out", :metric => SysInfo::Net.out(iface, 'bytes'), :as_diff => true }
|
|
11
|
+
status << { :service => "#{plugin.service} #{iface} bytes in", :metric => SysInfo::Net.in(iface, 'bytes'), :as_diff => true }
|
|
12
|
+
status << { :service => "#{plugin.service} #{iface} bytes errors", :metric => SysInfo::Net.total(iface, 'errors'), :state => 'ok' }
|
|
33
13
|
end
|
|
34
14
|
status
|
|
35
15
|
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class Riemann::Babbler::Netstat < Riemann::Babbler
|
|
2
|
+
|
|
3
|
+
def init
|
|
4
|
+
plugin.set_default(:service, 'netstat')
|
|
5
|
+
plugin.set_default(:interval, 60)
|
|
6
|
+
plugin.set_default(:port, 80)
|
|
7
|
+
plugin.states.set_default(:warning, 300)
|
|
8
|
+
plugin.states.set_default(:critical, 400)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def collect
|
|
12
|
+
count = shell("netstat -nat4 | egrep -e ':#{plugin.port}\s' | grep ESTA | wc -l").to_i
|
|
13
|
+
{:service => "#{plugin.service} tcp #{plugin.port}", :metric => count, :description => "count established connects: #{count} to port #{plugin.port}"}
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
class Riemann::Babbler::Nginx < Riemann::Babbler
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
NGINX_STATUS_1 = [
|
|
4
|
+
'accepts',
|
|
5
|
+
'handled',
|
|
6
|
+
'requests'
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
NGINX_STATUS_2 = [
|
|
10
|
+
'reading',
|
|
11
|
+
'writing',
|
|
12
|
+
'waiting'
|
|
13
|
+
]
|
|
5
14
|
|
|
6
15
|
def init
|
|
7
16
|
plugin.set_default(:service, 'nginx')
|
|
@@ -21,7 +30,7 @@ class Riemann::Babbler::Nginx < Riemann::Babbler
|
|
|
21
30
|
status << { :service => plugin.service + " #{NGINX_STATUS_1[index]}", :metric => value.to_i, :as_diff => true }
|
|
22
31
|
end
|
|
23
32
|
# line[0]: Active connections: XXXX
|
|
24
|
-
status << { :service => plugin.service +
|
|
33
|
+
status << { :service => plugin.service + " active", :metric => lines[0].split(":")[1].strip.to_i }
|
|
25
34
|
# lines[3]: Reading: 0 Writing: 1 Waiting: 0
|
|
26
35
|
lines[3].scan(/\d+/).each_with_index do |value, index|
|
|
27
36
|
status << { :service => plugin.service + " #{NGINX_STATUS_2[index]}", :metric => value.to_i }
|
|
@@ -15,16 +15,14 @@ class Riemann::Babbler::Runit < Riemann::Babbler
|
|
|
15
15
|
status = Array.new
|
|
16
16
|
Dir.glob('/etc/service/*').each do |srv|
|
|
17
17
|
next if plugin.not_monit.include? srv
|
|
18
|
-
human_srv = ' ' + srv.gsub(/\/etc\/service\//,
|
|
18
|
+
human_srv = ' ' + srv.gsub(/\/etc\/service\//,"")
|
|
19
19
|
stat_file = File.join(srv, 'supervise', 'stat')
|
|
20
20
|
next unless File.exists? stat_file
|
|
21
21
|
if File.read( stat_file ).strip == 'run'
|
|
22
|
-
@status_history.delete human_srv
|
|
22
|
+
@status_history.delete "human_srv"
|
|
23
23
|
status << {:service => plugin.service + human_srv , :state => 'ok', :description => "runit service #{human_srv} running"}
|
|
24
24
|
else
|
|
25
|
-
if @status_history.include? human_srv
|
|
26
|
-
status << {:service => plugin.service + human_srv , :state => 'critical', :description => "runit service #{human_srv} not running"}
|
|
27
|
-
end
|
|
25
|
+
status << {:service => plugin.service + human_srv , :state => 'critical', :description => "runit service #{human_srv} not running"} if @status_history.include? human_srv
|
|
28
26
|
@status_history << human_srv unless @status_history.include? human_srv
|
|
29
27
|
end
|
|
30
28
|
end
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
module Beefcake
|
|
2
2
|
class Buffer
|
|
3
3
|
|
|
4
|
-
def initialize(buf=
|
|
4
|
+
def initialize(buf="")
|
|
5
5
|
if buf.respond_to?(:force_encoding)
|
|
6
|
-
self.buf = buf.force_encoding(
|
|
6
|
+
self.buf = buf.force_encoding("BINARY")
|
|
7
7
|
else
|
|
8
8
|
self.buf = buf
|
|
9
9
|
end
|
|
@@ -12,7 +12,7 @@ module Beefcake
|
|
|
12
12
|
def append_string(s)
|
|
13
13
|
append_uint64(s.length)
|
|
14
14
|
if s.respond_to?(:force_encoding)
|
|
15
|
-
self << s.force_encoding(
|
|
15
|
+
self << s.force_encoding("BINARY")
|
|
16
16
|
else
|
|
17
17
|
self << s
|
|
18
18
|
end
|
|
@@ -43,25 +43,6 @@ module Riemann
|
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
def file_grep(filename, regexp, max_lines=100)
|
|
47
|
-
readed_lines = 0
|
|
48
|
-
lines = Array.new
|
|
49
|
-
begin
|
|
50
|
-
Timeout::timeout(plugin_timeout) do
|
|
51
|
-
File::Tail::Logfile.open(file, :backward => 0) do |log|
|
|
52
|
-
log.tail do |line|
|
|
53
|
-
readed_lines += 1
|
|
54
|
-
lines << line if line.match?(regexp)
|
|
55
|
-
return lines if readed_lines >= max_lines
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
rescue => e
|
|
60
|
-
helper_error("#{e.class} #{e}\n#{e.backtrace.join "\n"}")
|
|
61
|
-
end
|
|
62
|
-
return lines
|
|
63
|
-
end
|
|
64
|
-
|
|
65
46
|
def tcp_port_aviable?(ip, port)
|
|
66
47
|
begin
|
|
67
48
|
Timeout::timeout(plugin_timeout) do
|
|
@@ -74,9 +55,8 @@ module Riemann
|
|
|
74
55
|
end
|
|
75
56
|
end
|
|
76
57
|
rescue Timeout::Error
|
|
77
|
-
return false
|
|
78
58
|
end
|
|
79
|
-
false
|
|
59
|
+
return false
|
|
80
60
|
end
|
|
81
61
|
|
|
82
62
|
# http rest
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'sysinfo/sysinfo'
|
|
@@ -2,8 +2,8 @@ require 'yaml'
|
|
|
2
2
|
require 'logger'
|
|
3
3
|
require 'resolv'
|
|
4
4
|
|
|
5
|
-
require 'riemann/babbler/support/deep_merge'
|
|
6
|
-
require 'riemann/babbler'
|
|
5
|
+
require File.expand_path('../riemann/babbler/support/deep_merge', __FILE__)
|
|
6
|
+
require File.expand_path('../riemann/babbler/plugin', __FILE__)
|
|
7
7
|
|
|
8
8
|
class Riemann::Babbler::Starter
|
|
9
9
|
|
|
@@ -37,7 +37,7 @@ class Riemann::Babbler::Starter
|
|
|
37
37
|
logger.warn "Can't load config file #{opts[:config]}"
|
|
38
38
|
Hash.new
|
|
39
39
|
end
|
|
40
|
-
config_default = YAML.load_file( File.expand_path('
|
|
40
|
+
config_default = YAML.load_file( File.expand_path('../../config.yml', __FILE__) )
|
|
41
41
|
config_from_file = config_default.deep_merge( config_file )
|
|
42
42
|
config.configure_from_hash config_from_file
|
|
43
43
|
end
|
|
@@ -61,7 +61,7 @@ class Riemann::Babbler::Starter
|
|
|
61
61
|
|
|
62
62
|
def load_plugins
|
|
63
63
|
plugins = Array.new
|
|
64
|
-
default_plugins_dir = File.expand_path('../plugins/', __FILE__)
|
|
64
|
+
default_plugins_dir = File.expand_path('../riemann/babbler/plugins/', __FILE__)
|
|
65
65
|
Dir.glob( default_plugins_dir + '/*.rb') do |file|
|
|
66
66
|
plugins << file
|
|
67
67
|
end
|
|
@@ -140,7 +140,6 @@ class Riemann::Babbler::Starter
|
|
|
140
140
|
def start_plugins!
|
|
141
141
|
plugin_threads = started_plugins.map do |plugin|
|
|
142
142
|
Thread.new {
|
|
143
|
-
logger.unknown "Start plugin #{plugin}"
|
|
144
143
|
plugin.new( config, logger, $riemann ).run
|
|
145
144
|
}
|
|
146
145
|
end
|
data/riemann-babbler.gemspec
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
|
-
require File.expand_path('../lib/riemann/
|
|
2
|
+
require File.expand_path('../lib/riemann/version', __FILE__)
|
|
3
3
|
|
|
4
4
|
Gem::Specification.new do |s|
|
|
5
5
|
s.name = 'riemann-babbler'
|
|
@@ -7,19 +7,20 @@ Gem::Specification.new do |s|
|
|
|
7
7
|
s.authors = ['Vasiliev D.V.']
|
|
8
8
|
s.email = %w(vadv.mkn@gmail.com)
|
|
9
9
|
s.homepage = 'https://github.com/vadv/riemann-babbler'
|
|
10
|
-
s.summary = %q{
|
|
11
|
-
s.description = %q{
|
|
10
|
+
s.summary = %q{Riemann health checker.}
|
|
11
|
+
s.description = %q{Some plugins manager for riemann.}
|
|
12
12
|
s.licenses = %w(MIT)
|
|
13
13
|
|
|
14
14
|
s.add_dependency('riemann-client')
|
|
15
15
|
s.add_dependency('configatron')
|
|
16
16
|
s.add_dependency('logger')
|
|
17
17
|
s.add_dependency('trollop')
|
|
18
|
-
s.add_dependency('sys-filesystem')
|
|
18
|
+
#s.add_dependency('sys-filesystem')
|
|
19
19
|
s.add_dependency('rest-client')
|
|
20
20
|
s.add_dependency('net-ping')
|
|
21
|
-
s.add_dependency('
|
|
22
|
-
|
|
21
|
+
s.add_dependency('sequel')
|
|
22
|
+
|
|
23
|
+
s.extensions = ['ext/sysinfo/extconf.rb']
|
|
23
24
|
|
|
24
25
|
s.files = `git ls-files`.split("\n")
|
|
25
26
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/spec/default.rb
CHANGED
metadata
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: riemann-babbler
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 1.1.0pre2
|
|
5
|
+
prerelease: 5
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
8
8
|
- Vasiliev D.V.
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2013-
|
|
12
|
+
date: 2013-06-26 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: riemann-client
|
|
@@ -75,22 +75,6 @@ dependencies:
|
|
|
75
75
|
- - ! '>='
|
|
76
76
|
- !ruby/object:Gem::Version
|
|
77
77
|
version: '0'
|
|
78
|
-
- !ruby/object:Gem::Dependency
|
|
79
|
-
name: sys-filesystem
|
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
|
81
|
-
none: false
|
|
82
|
-
requirements:
|
|
83
|
-
- - ! '>='
|
|
84
|
-
- !ruby/object:Gem::Version
|
|
85
|
-
version: '0'
|
|
86
|
-
type: :runtime
|
|
87
|
-
prerelease: false
|
|
88
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
89
|
-
none: false
|
|
90
|
-
requirements:
|
|
91
|
-
- - ! '>='
|
|
92
|
-
- !ruby/object:Gem::Version
|
|
93
|
-
version: '0'
|
|
94
78
|
- !ruby/object:Gem::Dependency
|
|
95
79
|
name: rest-client
|
|
96
80
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -124,23 +108,7 @@ dependencies:
|
|
|
124
108
|
- !ruby/object:Gem::Version
|
|
125
109
|
version: '0'
|
|
126
110
|
- !ruby/object:Gem::Dependency
|
|
127
|
-
name:
|
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
|
129
|
-
none: false
|
|
130
|
-
requirements:
|
|
131
|
-
- - ! '>='
|
|
132
|
-
- !ruby/object:Gem::Version
|
|
133
|
-
version: '0'
|
|
134
|
-
type: :runtime
|
|
135
|
-
prerelease: false
|
|
136
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
137
|
-
none: false
|
|
138
|
-
requirements:
|
|
139
|
-
- - ! '>='
|
|
140
|
-
- !ruby/object:Gem::Version
|
|
141
|
-
version: '0'
|
|
142
|
-
- !ruby/object:Gem::Dependency
|
|
143
|
-
name: sys-proctable
|
|
111
|
+
name: sequel
|
|
144
112
|
requirement: !ruby/object:Gem::Requirement
|
|
145
113
|
none: false
|
|
146
114
|
requirements:
|
|
@@ -155,12 +123,13 @@ dependencies:
|
|
|
155
123
|
- - ! '>='
|
|
156
124
|
- !ruby/object:Gem::Version
|
|
157
125
|
version: '0'
|
|
158
|
-
description:
|
|
126
|
+
description: Some plugins manager for riemann.
|
|
159
127
|
email:
|
|
160
128
|
- vadv.mkn@gmail.com
|
|
161
129
|
executables:
|
|
162
130
|
- riemann-babbler
|
|
163
|
-
extensions:
|
|
131
|
+
extensions:
|
|
132
|
+
- ext/sysinfo/extconf.rb
|
|
164
133
|
extra_rdoc_files: []
|
|
165
134
|
files:
|
|
166
135
|
- .gitignore
|
|
@@ -172,29 +141,31 @@ files:
|
|
|
172
141
|
- Rakefile
|
|
173
142
|
- bin/riemann-babbler
|
|
174
143
|
- config.yml
|
|
175
|
-
-
|
|
144
|
+
- ext/sysinfo/extconf.rb
|
|
145
|
+
- ext/sysinfo/sysinfo.c
|
|
146
|
+
- ext/sysinfo/sysinfo.h
|
|
147
|
+
- lib/riemann/babbler/plugin.rb
|
|
176
148
|
- lib/riemann/babbler/plugins/cpu.rb
|
|
177
|
-
- lib/riemann/babbler/plugins/
|
|
178
|
-
- lib/riemann/babbler/plugins/
|
|
149
|
+
- lib/riemann/babbler/plugins/cpufan.rb
|
|
150
|
+
- lib/riemann/babbler/plugins/cputemp.rb
|
|
179
151
|
- lib/riemann/babbler/plugins/disk.rb
|
|
180
152
|
- lib/riemann/babbler/plugins/dummy.rb
|
|
181
153
|
- lib/riemann/babbler/plugins/exim4.rb
|
|
182
154
|
- lib/riemann/babbler/plugins/http.rb
|
|
183
155
|
- lib/riemann/babbler/plugins/la.rb
|
|
184
156
|
- lib/riemann/babbler/plugins/mdadm.rb
|
|
185
|
-
- lib/riemann/babbler/plugins/
|
|
157
|
+
- lib/riemann/babbler/plugins/megacli.rb
|
|
186
158
|
- lib/riemann/babbler/plugins/memory.rb
|
|
187
159
|
- lib/riemann/babbler/plugins/net.rb
|
|
188
|
-
- lib/riemann/babbler/plugins/
|
|
160
|
+
- lib/riemann/babbler/plugins/netstat.rb
|
|
189
161
|
- lib/riemann/babbler/plugins/nginx.rb
|
|
190
162
|
- lib/riemann/babbler/plugins/runit.rb
|
|
191
|
-
- lib/riemann/babbler/plugins/status_file.rb
|
|
192
|
-
- lib/riemann/babbler/plugins/tw_cli.rb
|
|
193
|
-
- lib/riemann/babbler/start.rb
|
|
194
163
|
- lib/riemann/babbler/support/deep_merge.rb
|
|
195
164
|
- lib/riemann/babbler/support/monkey_patches.rb
|
|
196
165
|
- lib/riemann/babbler/support/plugin_helpers.rb
|
|
197
|
-
- lib/riemann/babbler/
|
|
166
|
+
- lib/riemann/babbler/sysinfo.rb
|
|
167
|
+
- lib/riemann/version.rb
|
|
168
|
+
- lib/start.rb
|
|
198
169
|
- riemann-babbler.gemspec
|
|
199
170
|
- spec/config.yml
|
|
200
171
|
- spec/default.rb
|
|
@@ -214,16 +185,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
214
185
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
215
186
|
none: false
|
|
216
187
|
requirements:
|
|
217
|
-
- - ! '
|
|
188
|
+
- - ! '>'
|
|
218
189
|
- !ruby/object:Gem::Version
|
|
219
|
-
version:
|
|
190
|
+
version: 1.3.1
|
|
220
191
|
requirements: []
|
|
221
192
|
rubyforge_project:
|
|
222
193
|
rubygems_version: 1.8.23
|
|
223
194
|
signing_key:
|
|
224
195
|
specification_version: 3
|
|
225
|
-
summary:
|
|
196
|
+
summary: Riemann health checker.
|
|
226
197
|
test_files:
|
|
227
198
|
- spec/config.yml
|
|
228
199
|
- spec/default.rb
|
|
229
|
-
has_rdoc:
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
class Riemann::Babbler::NetStat < Riemann::Babbler
|
|
2
|
-
|
|
3
|
-
def init
|
|
4
|
-
plugin.set_default(:service, 'netstat')
|
|
5
|
-
plugin.set_default(:interval, 5)
|
|
6
|
-
plugin.set_default(:ports, [80, 3994])
|
|
7
|
-
plugin.states.set_default(:warning, nil)
|
|
8
|
-
plugin.states.set_default(:critical, nil)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def get_conn_count
|
|
12
|
-
filter = nil
|
|
13
|
-
plugin.ports.each do |port|
|
|
14
|
-
if filter == nil
|
|
15
|
-
filter = "\\( src *:#{port}"
|
|
16
|
-
else
|
|
17
|
-
filter += " or src *:#{port}"
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
filter += " \\) and not dst 127.0.0.1:*"
|
|
21
|
-
cmd = "ss -t -4 -n state established " + filter + " | wc -l"
|
|
22
|
-
shell(cmd).to_i - 1
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def collect
|
|
26
|
-
count = get_conn_count()
|
|
27
|
-
{
|
|
28
|
-
:service => "#{plugin.service} tcp #{plugin.ports.join(', ')}",
|
|
29
|
-
:metric => count,
|
|
30
|
-
:description => "count established connects: #{count} to ports #{plugin.ports.join(', ')}"
|
|
31
|
-
}
|
|
32
|
-
end
|
|
33
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
class Riemann::Babbler::StatusFile < Riemann::Babbler
|
|
2
|
-
|
|
3
|
-
def init
|
|
4
|
-
plugin.set_default(:service, 'check state file')
|
|
5
|
-
plugin.states.set_default(:critical, 1)
|
|
6
|
-
plugin.set_default(:file, '/var/tmp/error.txt')
|
|
7
|
-
plugin.set_default(:interval, 60)
|
|
8
|
-
plugin.set_default(:max_lines, 100)
|
|
9
|
-
plugin.set_default(:report_lines, 5)
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def collect
|
|
13
|
-
return [] unless File.exists? plugin.file
|
|
14
|
-
content = File.read(plugin.file).split("\n").delete_if {|x| x.strip.empty? }
|
|
15
|
-
{
|
|
16
|
-
:service => plugin.service + " #{plugin.file}",
|
|
17
|
-
:description => content.last(plugin.report_lines).join("\n"),
|
|
18
|
-
:metric => content.count
|
|
19
|
-
}
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
end
|
|
23
|
-
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
class Riemann::Babbler::TwCli < Riemann::Babbler
|
|
2
|
-
|
|
3
|
-
def init
|
|
4
|
-
plugin.set_default(:service, 'twcli')
|
|
5
|
-
plugin.set_default(:cmd, "/usr/sbin/tw_cli /$(/usr/sbin/tw_cli show | grep ^c | cut -f1 -d' ') show | egrep '^[upb]' | grep -v ' OK ' | grep -v ' VERIFYING ' | grep -v ' VERIFY-PAUSED ' | wc -l")
|
|
6
|
-
plugin.states.set_default(:critical, 1)
|
|
7
|
-
plugin.set_default(:interval, 300)
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def run_plugin
|
|
11
|
-
File.exists? '/usr/sbin/tw_cli'
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def collect
|
|
15
|
-
{
|
|
16
|
-
:service => plugin.service,
|
|
17
|
-
:metric => shell(plugin.cmd).to_i,
|
|
18
|
-
:description => 'Hardware raid tw_cli status'
|
|
19
|
-
}
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
end
|