prometheus-mumble/mprom/server.py

86 lines
2.8 KiB
Python
Raw Normal View History

2016-05-24 04:39:09 +02:00
from __future__ import print_function
import sys
import prometheus_client as node
from contextlib import contextmanager
2016-05-25 17:20:22 +02:00
import argparse, time, logging
2016-05-24 04:39:09 +02:00
import Ice, Murmur
2016-05-25 17:20:22 +02:00
logger = logging.getLogger('mumble-prometheus')
2016-05-24 04:39:09 +02:00
@contextmanager
2016-05-25 17:20:22 +02:00
def ice_connect(host, port, secret=None):
2016-05-24 04:39:09 +02:00
prxstr = "Meta:tcp -h %s -p %d -t 1000" % (host, port)
2016-05-25 17:20:22 +02:00
props = Ice.createProperties(sys.argv)
props.setProperty("Ice.ImplicitContext", "Shared")
props.setProperty('Ice.Default.EncodingVersion', '1.0')
idata = Ice.InitializationData()
idata.properties = props
ic = Ice.initialize(idata)
if secret:
ic.getImplicitContext().put("secret", secret)
2016-05-24 04:39:09 +02:00
base = ic.stringToProxy(prxstr)
meta = Murmur.MetaPrx.checkedCast(base)
if not meta:
print('cannot establish connection', file=sys.stderr)
sys.exit(1)
yield meta
if ic:
ic.destroy()
def main():
parser = argparse.ArgumentParser(description='Prometheus statistics for a Mumble ICE interface')
2016-05-24 16:25:24 +02:00
parser.add_argument('-l', '--listen', help='Port to listen on', default=9123, type=int)
2016-05-24 04:39:09 +02:00
parser.add_argument('-H', '--host', help='Host of the Ice interface', default='127.0.0.1')
2016-05-24 16:25:24 +02:00
parser.add_argument('-p', '--port', help='Port of the Ice interface', default=6502, type=int)
parser.add_argument('-i', '--interval', help='Interval in seconds', default=60, type=int)
2016-05-25 17:20:22 +02:00
parser.add_argument('--secret', help='The read secret', default=None)
parser.add_argument('-v', '--verbose', help='Verbose', action='store_true')
2016-05-24 04:39:09 +02:00
args = parser.parse_args()
2016-05-24 16:25:24 +02:00
node.start_http_server(args.listen)
2016-05-24 04:39:09 +02:00
2016-05-24 16:25:36 +02:00
gauges = {
'users': node.Gauge('mumble_users_connected', 'Number of connected users',
['ice_server', 'server_id']),
'uptime': node.Gauge('mumble_uptime', 'Virtual uptime',
['ice_server', 'server_id']),
}
2016-05-25 17:20:22 +02:00
if args.verbose:
logging.basicConfig(level=logging.DEBUG)
else:
logging.basicConfig(level=logging.INFO)
ice_server = '%s:%d' % (args.host, args.port)
with ice_connect(args.host, args.port, args.secret) as meta:
while True:
logger.info('gathering info')
t1 = time.time()
2016-05-24 04:39:09 +02:00
for server in meta.getBootedServers():
2016-05-25 17:20:22 +02:00
g_user = len(server.getUsers())
g_uptime = server.getUptime()
logger.debug('mumble_user_connected: %d' % g_user)
logger.debug('mumble_uptime: %d' % g_uptime)
2016-05-24 16:25:36 +02:00
labels = {'server_id': server.id(), 'ice_server': ice_server}
2016-05-25 17:20:22 +02:00
gauges['users'].labels(labels).set(g_user)
gauges['uptime'].labels(labels).set(g_uptime)
2016-05-24 16:25:36 +02:00
2016-05-25 17:20:22 +02:00
time_to_wait = args.interval - (time.time() - t1)
if time_to_wait > 0:
time.sleep(time_to_wait)
2016-05-24 04:39:09 +02:00
return 0
if __name__ == '__main__':
sys.exit(main())