Created
July 19, 2016 16:25
-
-
Save crisidev/f21e6596444a55fc21662e8ac4ec9f70 to your computer and use it in GitHub Desktop.
Convert text-secure server metrics into a Prometheus readable format
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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