quark 0.2.4 → 0.2.5
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/dist/collectd-quark.py +126 -0
- metadata +22 -21
@@ -0,0 +1,126 @@
|
|
1
|
+
#!/bin/false
|
2
|
+
#===============================================================================
|
3
|
+
# collectd-quark - a write plugin to forward collectd metrics to a Quark server
|
4
|
+
#
|
5
|
+
# SOURCE
|
6
|
+
# https://github.com/ghetzel/quark
|
7
|
+
#
|
8
|
+
# AUTHOR
|
9
|
+
# Gary Hetzel <garyhetzel@gmail.com>
|
10
|
+
#===============================================================================
|
11
|
+
import collectd
|
12
|
+
import json
|
13
|
+
import sys
|
14
|
+
import os
|
15
|
+
import re
|
16
|
+
import subprocess
|
17
|
+
import socket
|
18
|
+
import time
|
19
|
+
import urllib2
|
20
|
+
|
21
|
+
ACTIONS = ['exec']
|
22
|
+
PLUGIN_NAME='quark'
|
23
|
+
|
24
|
+
quark_hostname = '127.0.0.1'
|
25
|
+
quark_port = 12161
|
26
|
+
quark_socket = None
|
27
|
+
quark_mode = 'tcp'
|
28
|
+
quark_prefix = ''
|
29
|
+
|
30
|
+
# -----------------------------------------------------------------------------
|
31
|
+
# CALLBACK: config()
|
32
|
+
# processes the collectd.conf configuration stanza for this plugin
|
33
|
+
#
|
34
|
+
def config(c):
|
35
|
+
global quark_hostname, quark_port, quark_socket, quark_mode, quark_prefix
|
36
|
+
|
37
|
+
for ci in c.children:
|
38
|
+
if ci.key == 'Hostname':
|
39
|
+
quark_hostname = ci.values[0]
|
40
|
+
elif ci.key == 'Port':
|
41
|
+
quark_port = int(ci.values[0])
|
42
|
+
elif ci.key == 'Socket':
|
43
|
+
quark_socket = ci.values[0]
|
44
|
+
elif ci.key == 'Mode':
|
45
|
+
quark_mode = ci.values[0]
|
46
|
+
elif ci.key == 'Prefix':
|
47
|
+
quark_prefix = ci.values[0]
|
48
|
+
|
49
|
+
if not quark_mode:
|
50
|
+
raise Exception('Must specify a Mode: socket,tcp,udp,http')
|
51
|
+
|
52
|
+
|
53
|
+
# -----------------------------------------------------------------------------
|
54
|
+
# CALLBACK: collectd write()
|
55
|
+
# this is what collectd calls when it receives a new metric observation
|
56
|
+
#
|
57
|
+
def write(vl, data=None):
|
58
|
+
global quark_prefix
|
59
|
+
|
60
|
+
plugin = vl.plugin + ('-'+vl.plugin_instance if len(vl.plugin_instance) > 0 else '')
|
61
|
+
type = vl.type + ('-'+vl.type_instance if len(vl.type_instance) > 0 else '')
|
62
|
+
metric = quark_prefix + vl.host + '.' + plugin + ('.'+type if len(type) > 0 else '')
|
63
|
+
|
64
|
+
for i in vl.values:
|
65
|
+
observe = push_metric(vl, metric, i)
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
# -----------------------------------------------------------------------------
|
70
|
+
# push_metric
|
71
|
+
# pushes a new metric observation onto a host/metric-keyed stack (checkstack)
|
72
|
+
# also performs the value check (calls check_value) and stores the status code
|
73
|
+
# finally, determines whether this observation is in violation based on the
|
74
|
+
# threshold configuration
|
75
|
+
#
|
76
|
+
# returns:
|
77
|
+
# the observation record as stored in checkstack (for convenience)
|
78
|
+
#
|
79
|
+
def push_metric(vlist, metric, value):
|
80
|
+
global quark_hostname, quark_port, quark_socket, quark_mode
|
81
|
+
rv = None
|
82
|
+
tm = vlist.time
|
83
|
+
if tm == 0:
|
84
|
+
tm = time.time()
|
85
|
+
|
86
|
+
tm = int(tm*1000)
|
87
|
+
|
88
|
+
payload = "OBSERVE %s %s %s" % (metric, value, tm)
|
89
|
+
|
90
|
+
if quark_mode == 'tcp':
|
91
|
+
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
92
|
+
s.connect((quark_hostname, quark_port))
|
93
|
+
s.send(payload)
|
94
|
+
rv = s.recv(1024)
|
95
|
+
s.close()
|
96
|
+
|
97
|
+
elif quark_mode == 'udp':
|
98
|
+
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
99
|
+
s.sendto(payload, (quark_hostname, quark_port))
|
100
|
+
|
101
|
+
elif quark_mode == 'socket':
|
102
|
+
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
103
|
+
s.connect(quark_socket)
|
104
|
+
s.send(payload)
|
105
|
+
rv = s.recv(1024)
|
106
|
+
s.close()
|
107
|
+
|
108
|
+
elif quark_mode == 'http':
|
109
|
+
rv = urllib2.urlopen("http://%s:%s/observe/%s/%s/%s" % (quark_hostname, quark_port, metric, value, tm)).read()
|
110
|
+
|
111
|
+
if not rv is None:
|
112
|
+
rv = json.loads(rv)
|
113
|
+
|
114
|
+
return rv
|
115
|
+
|
116
|
+
def shutdown():
|
117
|
+
print "Stopping collectd-quark"
|
118
|
+
|
119
|
+
|
120
|
+
# -----------------------------------------------------------------------------
|
121
|
+
# Register Callbacks
|
122
|
+
# -----------------------------------------------------------------------------
|
123
|
+
#collectd.register_init(init)
|
124
|
+
collectd.register_config(config)
|
125
|
+
collectd.register_write(write)
|
126
|
+
collectd.register_shutdown(shutdown)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quark
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2014-05-06 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
16
|
-
requirement: &
|
16
|
+
requirement: &23712220 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - =
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.7.9
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *23712220
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: eventmachine
|
27
|
-
requirement: &
|
27
|
+
requirement: &23711680 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.0.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *23711680
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: redis
|
38
|
-
requirement: &
|
38
|
+
requirement: &23710960 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 3.0.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *23710960
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: hiredis
|
49
|
-
requirement: &
|
49
|
+
requirement: &23710440 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 0.5.2
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *23710440
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: em-synchrony
|
60
|
-
requirement: &
|
60
|
+
requirement: &23710000 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 1.0.3
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *23710000
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: em-websocket
|
71
|
-
requirement: &
|
71
|
+
requirement: &23709540 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 0.5.1
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *23709540
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: hashlib
|
82
|
-
requirement: &
|
82
|
+
requirement: &23709100 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 0.0.35
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *23709100
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: sinatra
|
93
|
-
requirement: &
|
93
|
+
requirement: &23725000 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :runtime
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *23725000
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: sinatra-cross_origin
|
104
|
-
requirement: &
|
104
|
+
requirement: &23724480 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :runtime
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *23724480
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: thin
|
115
|
-
requirement: &
|
115
|
+
requirement: &23723820 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,7 +120,7 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :runtime
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *23723820
|
124
124
|
description: A small service for logging and retrieving timeseries metrics into a
|
125
125
|
Redis server
|
126
126
|
email: garyhetzel@gmail.com
|
@@ -146,6 +146,7 @@ files:
|
|
146
146
|
- lib/quark/subscription.rb
|
147
147
|
- lib/quark/server.rb
|
148
148
|
- lib/quark/base_server.rb
|
149
|
+
- dist/collectd-quark.py
|
149
150
|
- bin/quark
|
150
151
|
homepage: https://github.com/ghetzel/quark
|
151
152
|
licenses: []
|