122 lines
3.2 KiB
Python
122 lines
3.2 KiB
Python
#!/usr/bin/env python
|
|
""" fedmsg-service-collectd.py -- produce collectd stats on fedmsg daemons """
|
|
|
|
import json
|
|
import os
|
|
import pprint
|
|
import socket
|
|
import sys
|
|
import time
|
|
import zmq
|
|
|
|
|
|
#hostname = socket.gethostname().split('.')[0]
|
|
hostname = socket.gethostname() # Use FQDN, I guess..
|
|
|
|
|
|
def print_consumer(service, consumer):
|
|
timestamp = int(time.time())
|
|
print "PUTVAL %s/%s/queue_length-%s interval=5 %i:%i" % (
|
|
hostname,
|
|
service,
|
|
'%s_backlog' % consumer['name'],
|
|
timestamp,
|
|
consumer['backlog']
|
|
)
|
|
print "PUTVAL %s/%s/gauge-%s interval=5 %i:%i" % (
|
|
hostname,
|
|
service,
|
|
'%s_exceptions' % consumer['name'],
|
|
timestamp,
|
|
consumer['exceptions']
|
|
)
|
|
# These got introduced in a later version of moksha, so not every host has them
|
|
if 'headcount_in' in consumer:
|
|
print "PUTVAL %s/%s/gauge-%s interval=5 %i:%i" % (
|
|
hostname,
|
|
service,
|
|
'%s_in' % consumer['name'],
|
|
timestamp,
|
|
consumer['headcount_in']
|
|
)
|
|
|
|
if 'headcount_out' in consumer:
|
|
print "PUTVAL %s/%s/gauge-%s interval=5 %i:%i" % (
|
|
hostname,
|
|
service,
|
|
'%s_out' % consumer['name'],
|
|
timestamp,
|
|
consumer['headcount_out']
|
|
)
|
|
|
|
# And these got introduced even later
|
|
if 'times' in consumer:
|
|
maxval = 1000 * max(consumer['times'] or [0])
|
|
minval = 1000 * min(consumer['times'] or [0])
|
|
|
|
avgval = 0
|
|
if consumer['times']:
|
|
avgval = 1000 * sum(consumer['times']) / len(consumer['times'])
|
|
|
|
print "PUTVAL %s/%s/response_time-%s interval=5 %i:%i" % (
|
|
hostname,
|
|
service,
|
|
'%s_min' % consumer['name'],
|
|
timestamp,
|
|
minval,
|
|
)
|
|
print "PUTVAL %s/%s/response_time-%s interval=5 %i:%i" % (
|
|
hostname,
|
|
service,
|
|
'%s_max' % consumer['name'],
|
|
timestamp,
|
|
maxval,
|
|
)
|
|
print "PUTVAL %s/%s/response_time-%s interval=5 %i:%i" % (
|
|
hostname,
|
|
service,
|
|
'%s_avg' % consumer['name'],
|
|
timestamp,
|
|
avgval,
|
|
)
|
|
|
|
|
|
def print_producer(service, producer):
|
|
timestamp = int(time.time())
|
|
print "PUTVAL %s/%s/gauge-%s interval=5 %i:%i" % (
|
|
hostname,
|
|
service,
|
|
'%s_exceptions' % producer['name'],
|
|
timestamp,
|
|
producer['exceptions']
|
|
)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
service = "{{ process }}"
|
|
fname = '/var/run/fedmsg/monitoring-%s.socket' % service
|
|
|
|
if not os.path.exists(fname):
|
|
print "UNKNOWN - %s does not exist" % fname
|
|
sys.exit(3)
|
|
|
|
connect_to = "ipc:///%s" % fname
|
|
|
|
ctx = zmq.Context()
|
|
s = ctx.socket(zmq.SUB)
|
|
s.connect(connect_to)
|
|
|
|
s.setsockopt(zmq.SUBSCRIBE, '')
|
|
|
|
try:
|
|
while True:
|
|
msg = s.recv()
|
|
msg = json.loads(msg)
|
|
for consumer in msg['consumers']:
|
|
if consumer['initialized']:
|
|
print_consumer(service, consumer)
|
|
for producer in msg['producers']:
|
|
if producer['initialized']:
|
|
print_producer(service, producer)
|
|
except KeyboardInterrupt:
|
|
pass
|