Skip to content

Instantly share code, notes, and snippets.

@crisidev
Created July 19, 2016 16:25
Show Gist options
  • Save crisidev/f21e6596444a55fc21662e8ac4ec9f70 to your computer and use it in GitHub Desktop.
Save crisidev/f21e6596444a55fc21662e8ac4ec9f70 to your computer and use it in GitHub Desktop.
Convert text-secure server metrics into a Prometheus readable format
import sys
import time
import click
import backoff
import requests
from prometheus_client import start_http_server, Gauge
STATUS = {
'text_secure_server': {},
'text_secure_push_server': {},
}
@backoff.on_exception(backoff.expo, (requests.exceptions.Timeout,
requests.exceptions.ConnectionError,
requests.exceptions.RequestException,
requests.exceptions.ConnectTimeout,
requests.exceptions.HTTPError,
requests.exceptions.ReadTimeout,
requests.exceptions.Timeout,
requests.exceptions.TooManyRedirects))
def read_metrics(url):
r = requests.get(url)
if r.status_code == 200:
return r.json()
else:
click.echo("error collecting metrics {}: {}".format(url, r.status_code))
return {}
def register_metrics(metrics, group, service):
for serie, value in metrics.iteritems():
name = "{}_{}".format(service, serie.replace('.', '_').replace('-', '_').replace('$', '_').lower())
if not STATUS[service].get(name):
STATUS[service][name] = Gauge(name, "{}-{}-{}".format(service, group, serie), ['group', 'service'])
try:
if group in ('histograms', 'meters', 'timers'):
STATUS[service][name].labels(group, service).set(value.get('count', 0))
else:
STATUS[service][name].labels(group, service).set(value.get('value', 0))
except (ValueError, TypeError):
pass
@click.command()
@click.option('-s', '--text-secure-server-url', default=None)
@click.option('-p', '--push-server-url', default=None)
@click.option('-t', '--timeout', default=10)
@click.option('--port', default=8000)
def cli(text_secure_server_url, push_server_url, timeout, port):
if not text_secure_server_url or not push_server_url:
click.echo("see --help")
sys.exit(1)
start_http_server(port)
while True:
if text_secure_server_url:
text_secure_metrics = read_metrics(text_secure_server_url)
register_metrics(text_secure_metrics.get('gauges'), 'gauges', 'text_secure_server')
register_metrics(text_secure_metrics.get('counters'), 'counters', 'text_secure_server')
register_metrics(text_secure_metrics.get('histograms'), 'histograms', 'text_secure_server')
register_metrics(text_secure_metrics.get('meters'), 'meters', 'text_secure_server')
register_metrics(text_secure_metrics.get('timers'), 'timers', 'text_secure_server')
if push_server_url:
push_server_metrics = read_metrics(push_server_url)
register_metrics(push_server_metrics.get('gauges'), 'gauges', 'text_secure_push_server')
register_metrics(push_server_metrics.get('counters'), 'counters', 'text_secure_push_server')
register_metrics(push_server_metrics.get('histograms'), 'histograms', 'text_secure_push_server')
register_metrics(push_server_metrics.get('meters'), 'meters', 'text_secure_push_server')
register_metrics(push_server_metrics.get('timers'), 'timers', 'text_secure_push_server')
time.sleep(timeout)
if __name__ == '__main__':
cli()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment